天天看点

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

在安卓上运行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

$ 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”微信公众号