让深度学习进入移动端:在安卓上运行 TensorFlow
1 新智元推荐
作者: Justin Francis
新智元启动新一轮大招聘 :COO、执行总编、主编、高级编译、主笔、运营总监、客户经理、咨询总监、行政助理等 9 大岗位全面开放。
简历投递:j obs@aiera.com.cn
HR 微信: 13552313024
新智元为COO和执行总编提供最高超百万的年薪激励;为骨干员工提供最完整的培训体系、 高于业界平均水平的工资和奖金。
加盟新智元,与人工智能业界领袖携手改变世界。
【新智元导读】 想了解如何使用TensorFlow来运行你的机器学习工作流,请关注谷歌的Eli Bixby和Amy Unruh在2016年11月1到2日于旧金山举办的培训课程。
不过,尽管没有很多的公开资料,好消息是你也可以在有摄像头的手机上运行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
你应该能看到类似于下面的响应内容:
编译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
重新安装APK
$ adb install -r -g bazel-bin/tensorflow/examples/android/tensorflow_demo.apk
好的,到这时候我们就可以在安卓设备上使用定制化的分类器了!研究人员和爱好者可以利用这个技术来想出更多的点子并付诸实验。例如我想到的一个点子:就是让分类器能学会通过识别不健康的叶子来发现营养不良或者有植物病的植物。如果你想了解如何进一步压缩图片文件,以及在iPhone上做同样的事,你可以关注这里的Pete Warden的 教程 。
希望我已经能激励到你,让你等不及开始要想出一些新点子了。请关注我的 Twitter 账号 @wagonhelm 或主题 #TensorFlow,并分享你的想法。
Justin Francis
Justin居住在加拿大西海岸的一个小农场。这个农场专注于朴门道德和设计的农艺。在此之前,他是一个非营利性社区合作社自行车商店的创始人和教育者。在过去的两年中,他住在一艘帆船上,全职探索和体验加拿大的乔治亚海峡。但现在他的主要精力都放在了学习机器学习。
新智元启动新一轮大招聘 :COO、执行总编、主编、高级编译、主笔、运营总监、客户经理、咨询总监、行政助理等 9 大岗位全面开放。
简历投递:j obs@aiera.com.cn
HR 微信: 13552313024
新智元为COO和执行总编提供最高超百万的年薪激励;为骨干员工提供最完整的培训体系、 高于业界平均水平的工资和奖金。
加盟新智元,与人工智能业界领袖携手改变世界。
更多招聘信息,请点击阅读原文查看。