(四)在安卓上运行Tensorflow C++可执行文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(四)在安卓上运行Tensorflow C++可执行文件相关的知识,希望对你有一定的参考价值。

参考技术A 此时会在build下生成一个文件可执行文件cpptest,通过:

把这个文件和liner.pb文件一起放入已root的手机的data目录下,然后

这样就在手机上运行了模型liner.pb

在安卓上运行TensorFlow:让深度学习进入移动端



本文授权转自OReillyData



在安卓上运行TensorFlow:让深度学习进入移动端


如果你关注我的前一篇帖子,并按照其中的内容实践,你可能已经学会了如何在Linux上安装一个GPU加速的TensorFlow,并构建了你自己的图像分类器。老实讲,在笔记本上对图片进行分类是很花时间的:需要下载分类用的图片,并在终端里输入很多行命令来运行分类。


不过,尽管没有很多的公开资料,好消息是你也可以在有摄像头的手机上运行TensofrFlow的Inception分类器,甚至是你自定义的分类器。然后你只要把摄像头对准你希望做分类的东西,TensorFlow就会告诉你它认为这是什么东西。TensorFlow是可以在iOS和树莓派上面运行,不过在这个教程里,我会介绍如何在安卓设备上运行TensorFlow。


我会一步一步地介绍如何在安卓设备上运行定制化的图片分类器。实现这个功能需要很多步骤,而且其他地方没有这样的介绍,只能通过反复地查看TensorFlow的GitHub论坛。我希望这篇帖子能帮你避免很多的麻烦。


◆ 

下载安卓的SDK和NDK


你可以在系统终端里用下面的命令下载安卓SDK并解压缩到你的TensorFlow目录里。

$ wget https://dl.google.com/android/android-sdk_r24.4.1-linux.tgz

$ tar xvzf android-sdk_r24.4.1-linux.tgz -C ~/tensorflow


还需要下载一些额外的SDK编译工具。我在开始为安卓5.1.1版下载开始后关掉了这个终端

$ cd ~/tensorflow/android-sdk-linux

$ tools/android update sdk –no-ui


随后你需要用下面的命令下载安卓NDK,并解压:

$ wget https://dl.google.com/android/repository/android-ndk-r12b-linux-x86_64.zip

$ unzip android-ndk-r12b-linux-x86_64.zip -d ~/tensorflow


◆ 

下载Inception


$ cd ~/tensorflow

$ wget https://storage.googleapis.com/download.tensorflow.org/models/inception5h.zip -O /tmp/inception5h.zip

$ unzip /tmp/inception5h.zip -d tensorflow/examples/android/assets/


◆ 

修改WORKSPACE文件


为了使用安卓工具编译我们的应用,需要修改WORKSPACE文件。

$ gedit ~/tensorflow/WORKSPACE


你可以拷贝下面的代码,并替换掉你的WORKSPACE文件里的相应行。

android_sdk_repository(

name = “androidsdk”,

api_level = 24,

build_tools_version = “24.0.3”,

path = “android-sdk-linux”)

android_ndk_repository(

name=”androidndk”,

path=”android-ndk-r12b”,

api_level=21)


◆ 

开启USB调试和adb工具


为了能用adb工具,你必须把你的手机设置成开发模式,并开启USB调试功能。在开启前,确认你的手机没有通过USB和电脑连接,然后进行如下操作:

  • 进入“设置”-“通用”-“我的手机”

  • 进入“软件信息”并连续按“版本号”7次

  • 这样就开启了一个计数器,并会告诉你什么时候你的手机已经进入了开发模式

  • 进入“设置”-“通用”-“开发选项”

  • 开启USB调试


每一个安卓手机都是不同的,我的安卓版LG G4手机就必须在PTP模式下才能使用adb。你需要在设置后通过把手机连到电脑上来确认调试模式已经开启。当连接后手机上出现“允许USB调试”,确保你选择的是“总是允许从这个电脑”,并按下OK。


为了测试调试设置是否成功,可以把手机连上电脑,并用下面的命令安装adb,并测试设备:


$ sudo apt-get install android-tools-adb

$ adb devices


你应该能看到类似于下面的响应内容:


在安卓上运行TensorFlow:让深度学习进入移动端


◆ 

编译APK


$ cd ~/tensorflow

$ bazel build //tensorflow/examples/android:tensorflow_demo


◆ 

安装APK


这一步是唯一的我无法客观测试的步骤。每个安卓设备都不一样。如果你在这一步中碰到什么问题,我建议你升级安卓到6.0版。对于我朋友的Moto G手机,就必须把下面的命令里面的–g选项去掉:


$ adb install -r -g bazel-bin/tensorflow/examples/android/tensorflow_demo.apk


至此,你就可以在安卓设备上使用TensorFlow和Inception分类器了。我发现最有趣的是这个分类器偶尔出错的时候。需要注意的是,原版的Inception分类器只能识别ImageNet挑战里出现的1000种图片分类。


◆ 

使用定制化的图片分类器


为了能对我们自己的图片来做分类,我们必须先用我们移动设备的图片文件数据重新训练,并把训练结果放入assets目录


首先我们要编译图片训练优化器:

$ cd ~/tensorflow

$ bazel build tensorflow/python/tools:optimize_for_inference


然后再用这个训练优化器对我们自己的图片数据做训练:

$ bazel-bin/tensorflow/python/tools/optimize_for_inference \

–input=tf_files/retrained_graph.pb \

–output=tensorflow/examples/android/assets/retrained_graph.pb

–input_names=Mul \

–output_names=final_result


◆ 

把训练后的标签放入assets目录


$ cp ~/tensorflow/tf_files/retrained_labels.txt ~/tensorflow/tensorflow/examples/android/assets/


◆ 

编辑TensorflowImageListener.java


$ gedit ~/tensorflow/tensorflow/examples/android/src/org/tensorflow/demo/TensorFlowImageListener.java


我们需要编辑这个文件以能识别我们自己的图片:替换下面这些行的参数所对应的变量值并保存(如果你想回退到原有的文件内容,你可以在找到备份文件):


private static final int INPUT_SIZE = 299;

private static final int IMAGE_MEAN = 128;

private static final float IMAGE_STD = 128;

private static final String INPUT_NAME = “Mul:0”;

private static final String OUTPUT_NAME = “final_result:0”;

private static final String MODEL_FILE = “file:///android_asset/retrained_graph.pb”;

private static final String LABEL_FILE = “file:///android_asset/retrained_labels.txt”;


◆ 

重新编译APK


$ cd ~/tensorflow

$ bazel build //tensorflow/examples/android:tensorflow_demo


◆ 

重新安装APL


$ adb install -r -g bazel-bin/tensorflow/examples/android/tensorflow_demo.apk

好的,到这时候我们就可以在安卓设备上使用定制化的分类器了!研究人员和爱好者可以利用这个技术来想出更多的点子并付诸实验。例如我想到的一个点子:就是让分类器能学会通过识别不健康的叶子来发现营养不良或者有植物病的植物。如果你想了解如何进一步压缩图片文件,以及在iPhone上做同样的事,你可以关注这里的Pete Warden的


希望我已经能激励到你,让你等不及开始要想出一些新点子了。请关注我的推特账号@wagonhelm主题#TensorFlow,并分享你的想法。



在安卓上运行TensorFlow:让深度学习进入移动端

Justin Francis

Justin居住在加拿大西海岸的一个小农场。这个农场专注于朴门道德和设计的农艺。在此之前,他是一个非营利性社区合作社自行车商店的创始人和教育者。在过去的两年中,他住在一艘帆船上,全职探索和体验加拿大的乔治亚海峡。但现在他的主要精力都放在了学习机器学习。


摘自OReillyData

在安卓上运行TensorFlow:让深度学习进入移动端


在安卓上运行TensorFlow:让深度学习进入移动端 


在安卓上运行TensorFlow:让深度学习进入移动端

 
   
   
 
关于转载
如需转载,请在开篇显著位置注明作者和出处(转自:大数据文摘| bigdatadigest),并在文章结尾放置大数据文摘醒目二维码。无原创标识文章请按照转载要求编辑,可直接转载,转载后请将转载链接发送给我们;有原创标识文章,请发送【文章名称-待授权公众号名称及ID】给我们申请白名单授权。未经许可的转载以及改编者,我们将依法追究其法律责任。联系邮箱:zz@bigdatadigest.cn。

◆ ◆ 

往期精彩文章推荐,点击图片可阅读

面向软件工程师的机器学习每日学习计划 | 附大量资料



以上是关于(四)在安卓上运行Tensorflow C++可执行文件的主要内容,如果未能解决你的问题,请参考以下文章

Tensorflow 在 C++ 中导出和运行图的不同方法

Android Tensorflow Lite C++ .SO 库未在运行时链接

01--Java语言概述与开发环境 最适合入门的Java教程

在linux上安装运行安卓系统

01-Java语言概述与开发环境 最适合入门的Java教程

如何在 C++ 代码中运行 Yolov5 tensorflow model.pb?