如果你关注我的前一篇帖子,并按照其中的内容实践,你可能已经学会了如何在 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
$ 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 目录
首先我们要编译图片训练优化器:
$ 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
重新安装 APL
好的,到这时候我们就可以在安卓设备上使用定制化的分类器了!研究人员和爱好者可以利用这个技术来想出更多的点子并付诸实验。例如我想到的一个点子:就是让分类器能学会通过识别不健康的叶子来发现营养不良或者有植物病的植物。