本文翻译自原文:
Android TensorFlow Machine Learning Exampleblog.mindorks.com![349fd8bc37da7f3831b82a9d0e44d053.png](https://i-blog.csdnimg.cn/blog_migrate/91e87e85cb639d1ab1278797a97fa2f3.jpeg)
翻译部分借助谷歌或有道翻译帮助,再经过我人工修改完成,其中有误之处还请多指正。
以下正文开始。
TensorFlow是谷歌提供的用于机器学习的开源软件库。
我(指作者)在互联网上搜索了很多,但是没有找到一个简单的方法或者例子来在Android上构建使用TensorFlow的APP。在浏览了许多资源之后,我学会了如何构建它。然后,我决定把整个过程写出来,这样就不会占用你们的时间了。
作者新作:TensorFlow-Lite on Android 示例:
https://github.com/amitshekhariitbhu/Android-TensorFlow-Lite-Examplegithub.com本文所用的分类器例子,源于谷歌官方的TensorFlow示例。
本文是为那些已经熟悉机器学习,并已了解如何构建机器学习模型的人准备的(对于本文的例子,我将使用一个预先训练好的模型)。很快,我将写一系列关于机器学习的文章,这样每个人都可以学习如何建立机器学习的模型。
作者修改:现在已经不需要按下面那些步骤来构建TensorFlow调用库,因为该库现在可以通过Maven直接下载。Check this pull request
让我们从Android的构建过程开始
以下是我们应该知道的:
TensorFlow的核心是用C++编写。 为了构建Android,我们必须使用JNI (Java本地接口/Java Native Interface)
来调用C++函数,如loadModel
,getprediction
等。 我们需要一个.so
文件,它是一个C++编译产生的二进制文件,还有一个.jar
文件,它由调用本地C++函数的JAVA API组成。然后,我们将调用JAVA API来轻松完成任务。 因此,我们需要.jar
(Java API) 和.So
(C++编译) 文件 我们必须有预先训练好的一个模型文件和用于说明分类标签的文件(可以是txt)
我们将建立如下的对象检测APP:
![ec7fb8ab14e7f84d1934aa2d02315685.png](https://i-blog.csdnimg.cn/blog_migrate/793fe9ae994a1ab9db664d6e049f81d4.jpeg)
构建.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 安装Bazel
。Bazel
是构建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了。)
现在我们有jar
和so
文件了。(作者)已经构建了so
文件和jar
文件,可以直接从下面的仓库中使用。(作者)在Github创建了这个完整的示例应用程序仓库:
但是,我们仍然需要准备预先训练好的模型和标签文件。
本例中,我们将使用谷歌所提供的一个预训练好的pb模型对给定图像进行目标检测。
可以从这里下载模型:
herestorage.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 TensorFlowblog.mindorks.com![d94c669d7a308ef0fb710cb24911a704.png](https://i-blog.csdnimg.cn/blog_migrate/572adbf27a553c41ec950204fc792a12.jpeg)