如果你关注我的前一篇帖子,并按照其中的内容实践,你可能已经学会了如何在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
原文发布时间为:2016-11-12
本文来自云栖社区合作伙伴“大数据文摘”,了解相关信息可以关注“bigdatadigest”微信公众号