今天上 Github,发现 Tensorflow 的 Android demo又更新了,除了基本的修改以外,又增加了一个图像风格迁移的安卓demo,而且还增加了Android Studio 的编译支持。
迫不及待的移植到手机上试了一下。在安装的过程中,发现了以前文章中的几处小错误。特地跑来更正。
同时将风格迁移的demo一并增加到原文中。
原文如下:
本文是TensorFlow官网教程:将 TensorFlow 深度学习模型,移植到安卓手机,进行物体识别、行人检测和图像风格迁移的一个具体实现过程。(教程主页见: https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/android/)
该教程一共实现了三个简单的深度学习模型移植:
1、TF Classify: 实时物体分类
2、TF Detect: 实时行人检测
3、TF Stylize: 实时图像风格迁移
具体使用的模型和算法可以参考上面的官方链接,我这里只谈移植过程,算法就不讲啦。
该教程提供了 Android、iOS、Raspberry Pi三种手机操作系统的支持。我只实现了Android移植,所以本文以Android移植为例。
我的电脑环境
笔记本:ThinkPad T450 X86_64
显卡:主显 Intel HD Graphics 5500 ; 独显 NVIDIA GT 940M
系统环境:Ubuntu14.04 64位、Windows7 64位 双系统
CUDA 版本: 8.0
cudnn 版本: v5.1
TensorFlow版本: master
Bazel版本: 0.4.3
安卓手机: 联想 PB2-690N
一、下载 TensorFlow 项目源码
如果想实现将TensorFlow训练的模型移植到安卓手机,首先需要下载tensorflow的项目源码。
TensorFlow项目源码下载地址:https://github.com/tensorflow/tensorflow
注意!
TensorFlow的源码 r0.12版本中只包含 TF-Classify一个模型的实现,需下载master版本才能包含全部的三个模型实现。
在项目中,android demo的源码位置是
//tensorflow/examples/android
二、安装Bazel
电脑还需要安装Bazel,这个我在源码安装TensorFlow的时候就已经装好,还没装的同学可以参考我的另一篇文章,文中前半部分有写如何安装Bazel。
Ubuntu14.04 源代码安装 TensorFlow r0.12 详细教程(http://www.linuxdiyf.com/linux/27915.html)
三、安装 SDK
1、下载SDK,并将其解压到从github下载的tensorflow源代码根目录下
(注:其实可以安装在任意目录下,我这里以安装在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
2、更新SDK和安装 SDK build tools
$ cd ~/tensorflow/android-sdk-linux
$ sudo tools/android update sdk --no-ui
(注:不加sudo 会报错,提示failed to fetch URL)
四、安装 NDK
下载 NDK,解压到tensorflow根目录下
(注:其实可以安装在任意目录下,我这里以安装在tensorflow目录为例。)
$ wget https://dl.google.com/android/repositor/android-ndk-r12b-linux-x86_64.zip
$ unzip android-ndk-r12b-linux-x86_64.zip -d ~/tensorflow
五、修改 WORKSPACE 文件
在tensorflow的根目录下,找到WORKSPACE文件。打开文件, 上方有两段包含 android_sdk_repository和 android_ndk_repository的内容(该段内容已经加了#被注释掉了),将这两段内容在文件中复制一遍,并将复制后的内容反注释掉。然后:
a) 分别将sdk path和 ndk path更改为自己安装的SDK和NDK路径(例如我的是tensorflow根目录下的相对路径)
b) 将sdk api level更改为自己电脑中安装的最高版本
c) 将sdk的build_tools_version更改为自己安装的版本
其他保持不变
六、下载模型 (可选)
andriod demo源码是不包含训练好的tensorflow模型的,但是在编译时需要模型。模型一共有三个,分别对应物体识别、行人检测和图像风格迁移。
在Bazel编译时,可以不用手动下载模型,因为在文件//tensorflow/examples/android/BUILD中设定了自动下载模型的操作。
但是如果使用Android Studio等其他方式编译,则不会运行BUILD文件中的自动下载操作。
手动下载模型zip文件:
$ curl -L https://storage.googleapis.com/download.tensorflow.org/models/inception5h.zip -o /tmp/inception5h.zip
$ curl -L https://storage.googleapis.com/download.tensorflow.org/models/mobile_multibox_v1.zip -o /tmp/mobile_multibox_v1.zip
$ curl -L https://storage.googleapis.com/download.tensorflow.org/models/mobile_multibox_v1.zip -o /tmp/stylize_v1.zip
将上述三个zip文件分别解压到文件夹:
//tensorflow/examples/android/assets
解压完毕后,打开//tensoeflow/examples/android/BUILD文件,找到以 android_binary 开头的那段代码片,将 assets = [ ] 内以@开头的三句代码用#号 注释掉,如下图黄色部分所示
如果不注释掉该段内容,即使手动将模型放在assets文件中,使用bazel编译时也会重新下载模型。
七、连接安卓手机
1、安装 adb
$ sudo apt-get install android-tools-adb
2、将手机设置为debug模式
打开安卓手机,找到 usb debugging 按钮,我的手机是:
setting-general-developer options-enable USB debugging
(每个手机可能具体的不太一样)
然后手机通过USB数据线连接电脑,此时手机屏幕会提示:
allow USB debugging?
勾选 always allow from this computer,然后点击ok。(之后再连接则不会提示)
3、从电脑端检查 手机是否连接成功
$adb devices
则会输出连接的设备
List of devices:
xxxx, device
前面是ID号,后面是连接状态。
我遇到的问题是,List of devices 输出显示:xxx, offline。
这样是不行的,往下执行编译会不通过。瞎捣鼓了一通,最后按如下的方式解决了问题:
cd 切换到sdk安装路径下的 build_tools文件夹,运行
$ adb kill-server
$ sudo adb start-server
(网上说的原因是 要以root权限启动 adb)
然后运行$ adb devices,就ok啦。如下图所示
八、编译并安装 apk文件
1、编译生成 apk文件
$ cd ~/tensorflow
$ bazel build //tensorflow/examples/android:tensorflow_demo
成功之后会看到提示生成了如下三个文件
bazel-bin/tensorflow/examples/android/tensorflow_demo_deploy.jar
bazel-bin/tensorflow/examples/android/tensorflow_demo_unsigned.apk
bazel-bin/tensorflow/examples/android/tensorflow_demo.apk
然后在 bazel-bin/tensorflow/examples/android/目录下你会找到生成的三个文件
2、向安卓手机安装apk文件
$ adb install -r -g bazel-bin/tensorflow/examples/android/tensorflow_demo.apk
安装的过程中,手机屏幕会弹出提示 是否安装该软件?是否允许访问摄像头之类的等等。如下图所示
安装完毕后,就可以在手机桌面看到两个黄色的图标,名字分别是TF Classify、TF Detect和TF 。如下图所示。
点击相应软件,就可以运行啦。下面演示一下效果。
软件实测
1、首先是 TF Classify。
屏幕对准物体,上方会显示识别结果。实时性很强,基本没有延迟
2、再来试一下 TF Detect
屏幕会实时框出检测到的人员,拿个模特测试一下。
恩,说明活体检测有待提高呀
3、TF stylize
将手机对准屏幕,软件可以实时的将摄像头拍摄到的内容转换为艺术图片风格
点击下方的图片,还可以进行风格的切换。