谷歌翻译api_翻译:TensorFlow on Android APP 示例

本文翻译自原文:

Android TensorFlow Machine Learning Example​blog.mindorks.com
349fd8bc37da7f3831b82a9d0e44d053.png

翻译部分借助谷歌或有道翻译帮助,再经过我人工修改完成,其中有误之处还请多指正。

以下正文开始。


TensorFlow是谷歌提供的用于机器学习的开源软件库。

我(指作者)在互联网上搜索了很多,但是没有找到一个简单的方法或者例子来在Android上构建使用TensorFlow的APP。在浏览了许多资源之后,我学会了如何构建它。然后,我决定把整个过程写出来,这样就不会占用你们的时间了。

作者新作:TensorFlow-Lite on Android 示例

https://github.com/amitshekhariitbhu/Android-TensorFlow-Lite-Example​github.com

本文所用的分类器例子,源于谷歌官方的TensorFlow示例。

本文是为那些已经熟悉机器学习,并已了解如何构建机器学习模型的人准备的(对于本文的例子,我将使用一个预先训练好的模型)。很快,我将写一系列关于机器学习的文章,这样每个人都可以学习如何建立机器学习的模型。

作者修改:现在已经不需要按下面那些步骤来构建TensorFlow调用库,因为该库现在可以通过Maven直接下载。Check this pull request

让我们从Android的构建过程开始

以下是我们应该知道的:

TensorFlow的核心是用C++编写。 为了构建Android,我们必须使用 JNI (Java本地接口/Java Native Interface) 来调用C++函数,如loadModelgetprediction等。 我们需要一个.so文件,它是一个C++编译产生的二进制文件,还有一个.jar文件,它由调用本地C++函数的JAVA API组成。然后,我们将调用JAVA API来轻松完成任务。 因此,我们需要 .jar (Java API) 和 .So (C++编译) 文件 我们必须有预先训练好的一个模型文件和用于说明分类标签的文件(可以是txt)

我们将建立如下的对象检测APP:

ec7fb8ab14e7f84d1934aa2d02315685.png

构建.jar.So文件

git clone --recurse-submodules  https://github.com/tensorflow/tensorflow.git
注意: --recurse-submodules命令很重要,它拉取了仓库的子模块。

here 下载 Android NDK(Android Studio 3.x支持自动下载NDK)。

用Android Studio下载Android SDK,或者可以给Android Studio手动指定SDK路径。

here 安装BazelBazel是构建Tensorflow的官方构建工具。

现在,配置工程文件的环境,我们可以在之前克隆的TensorFlow的根目录中找到WORKSPACE文件。

# Uncomment and update the paths in these entries to build the Android demo.
#android_sdk_repository(
#    name = "androidsdk",
#    api_level = 23,
#    build_tools_version = "25.0.1",
#    # Replace with path to Android SDK on your system
#    path = "<PATH_TO_SDK>",
#)
#
#android_ndk_repository(
#    name="androidndk",
#    path="<PATH_TO_NDK>",
#    api_level=14)

下面是我们的SDK和NDK路径:

android_sdk_repository(
    name = "androidsdk",
    api_level = 23,
    build_tools_version = "25.0.1",
    # Replace with path to Android SDK on your system
    path = "/Users/amitshekhar/Library/Android/sdk/",
)

android_ndk_repository(
    name="androidndk",
    path="/Users/amitshekhar/Downloads/android-ndk-r13/",
    api_level=14)

然后执行如下命令来构建.so文件。

bazel build -c opt //tensorflow/contrib/android:libtensorflow_inference.so 
   --crosstool_top=//external:android/crosstool 
   --host_crosstool_top=@bazel_tools//tools/cpp:toolchain 
   --cpu=armeabi-v7a
在这里要用我们想要的测试机型的架构来替换armeabi-v7a,如aarch64等。

执行bazel-bin后,动态库将输出于如下的路径:

bazel-bin/tensorflow/contrib/android/libtensorflow_inference.so

要构建Java版本可以执行如下输出:

bazel build //tensorflow/contrib/android:android_tensorflow_inference_java

jar文件最后可以输出在:

bazel-bin/tensorflow/contrib/android/libandroid_tensorflow_inference_java.jar

(推荐使用TensorFlow官网所推荐的构建命令来进行构建,不必按照如下命令来执行,因为此文写于2018年,当时TF版本约为1.4左右,现在的TF版本已经是2.4了。)

现在我们有jarso文件了。(作者)已经构建了so文件和jar文件,可以直接从下面的仓库中使用。(作者)在Github创建了这个完整的示例应用程序仓库:

https://github.com/MindorksOpenSource/AndroidTensorFlowMachineLearningExample​github.com

但是,我们仍然需要准备预先训练好的模型和标签文件。

本例中,我们将使用谷歌所提供的一个预训练好的pb模型对给定图像进行目标检测。

可以从这里下载模型:

here​storage.googleapis.com

解压缩这个zip文件,我们将得到

imagenet_comp_graph_label_strings.txt (标签文件)tensorflow_inception_graph.pb (预训练好的模型)

现在,在Android Studio中创建一个Android示例Project,把上面那两个文件放入assets文件夹中。

libandroid_tensorflow_inference_java.jar放在libs文件夹中,右键单击并选择添加为库。

compile files('libs/libandroid_tensorflow_inference_java.jar')

在主目录中创建jniLibs文件夹,并把libtensorflow_inference.so放在jniLibs/armeabi-v7a/文件夹中。

现在,我们能调用TensorFlow Java API了。TensorFlow Java API 通过TensorFlowInferenceInterface类公开了所有必需的方法。

现在,我们必须使用模型路径调用TensorFlow Java API并加载它,然后就可以输入图像来进行预测了。

要查看整个APP运行的内容,请克隆整个项目(链接在前面给了),构建然后运行即可。

作者更新:使用TensorFlow为Android创建自定义模型:

Creating Custom Model For Android Using TensorFlow​blog.mindorks.com
d94c669d7a308ef0fb710cb24911a704.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值