如果你关注我的前一篇帖子,并按照其中的内容实践,你可能已经学会了如何在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
你应该能看到类似于下面的响应内容:
编译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的教程。
希望我已经能激励到你,让你等不及开始要想出一些新点子了。请关注我的推特账号@wagonhelm或主题#TensorFlow,并分享你的想法。