天天看点

机器学习:如何在安卓上集成TensorFlow

机器学习:如何在安卓上集成TensorFlow

我们都知道,谷歌有一个开源库叫做tensorflow,可被用在安卓系统中实现机器学习。换言之,tensorflow是谷歌为机器智能提供的一个开源软件库。

我在网络上搜寻了很久,都没有找到在安卓上搭建tensorflow的简单的方法或实例。仔细查阅许多资料以后,我终于可以搭建它了。于是,我决定把我搭建的过程写出来,这样其他人就不必再浪费时间了。

这篇文章是写给那些熟悉机器学习并且知道怎样为机器学习搭建模型的人的(在这个示例中我会使用一个预训练模型)。近期,我会写一系列关于机器学习的文章,这样每个人都能够学到如何为机器学习搭建模型。

从搭建安卓上的机器学习模型过程讲起

我们需要知道的几个要点:

tensorflow的核心是用c++编写的;

为了在安卓上搭建tensorflow,我们需要用jni(java本地接口)来调用c++函数,比如说loadmodel,getpredictions,等等;

我们会用到.so(shared object,即共享对象)文件,它是c++编译文件;还会用到jar文件,它由能够调用本地c++的java api组成。之后,我们就可以调用java api轻松地把事情做好;

所以我们需要jar(java api)和一个.so(c++编译)文件;

我们必须要有一个预训练模型文件和一个用于分类的标签文件。

我们会做以下的目标检测:

机器学习:如何在安卓上集成TensorFlow

编译jar和.so文件

注意:--recurse-submodules对于提取子模块(pull submodules)很重要。

在这里(https://developer.android.com/ndk/downloads/older_releases.html#ndk-12b-downloads)下载ndk。

下载安卓sdk,或者,我们也可以从android studio sdk提供路径。

安装bazel(https://bazel.build/versions/master/docs/install.html)。bazel是tensorflow的主要编译系统。

现在,编辑工作空间(workspace),我们可以在早先克隆的tesnsorflow根路径中找到工作空间(workspace)文件。

机器学习:如何在安卓上集成TensorFlow

我们的sdk和ndk路径就跟下面一样:

机器学习:如何在安卓上集成TensorFlow

然后编译生成.so文件:

将armeabi-v7a换成我们所需要的目标架构。

库会被放置在:

机器学习:如何在安卓上集成TensorFlow

编译java副本:

机器学习:如何在安卓上集成TensorFlow

我们可以在这里找到jar文件:

机器学习:如何在安卓上集成TensorFlow

现在我们有了jar和.so文件。你也可以从下面的工程中直接提取使用我已经建立好的.so文件和jar。

我已经在这里(https://github.com/mindorksopensource/androidtensorflowmachinelearningexample)创建了一个完整可运行的示例应用。

但是,我们需要预训练模型和标签文件。

在这个例子中,我们会使用google预训练模型,它实现了在一张给定的照片上做目标检测。

解压缩zip文件,我们就会得到imagenet_comp_graph_label.strings.txt(目标标签)以及tensorflow_inception_graph.pb(预训练模型)。

现在,在android studio上创建安卓示例工程吧。

将imagenet_comp_graph_label.strings.txt(目标标签)以及tensorflow_inception_graph.pb放进assets文件夹。

将libandroid_tensorflow_inference_java.jar放进lib文件夹,单击右键,添加库。

机器学习:如何在安卓上集成TensorFlow

在主目录新建一个jnilibs文件夹并且将libtensorflow_inference.so放到jnilibs/armeabi-v7a文件夹中。

现在,我们就可以调用tensorflow java api了。

tensorflow java api通过tensorflowinferenceinterface类开放了所有需要的方法。

现在,我们可以用模型路径调用tensorflow java api并且加载它了。

然后,我们可以输入一张图片来获取预测结果。

如果想要体会完整的流程,克隆这个项目(https://github.com/mindorksopensource/androidtensorflowmachinelearningexample),搭建并运行它吧。

如果你在搭建这个项目的过程中有任何问题的话,联系我,我会非常乐意帮助你。

happy coding:)

读者问答

q:我很疑惑要怎么连接到‘so’库?也没有任何一行像’system.loadlibray’的代码?

a:system.loadlibrary已经写在tensorflow jar中了。

q:所以这是一个c++应用还是java应用啊?你用的是什么语言?

a:这是一个用java语言编写的安卓应用,它通过java本地接口(jni: java native interface)调用c++做预测(机器学习)。

原文发布时间为:2017-04-27

本文来自云栖社区合作伙伴“大数据文摘”,了解相关信息可以关注“bigdatadigest”微信公众号