Ubuntu16.04/16.10下Tensorflow demo在Android上的移植

来源:互联网 发布:js自定义回调函数 编辑:程序博客网 时间:2024/05/23 19:16

这是我的第一篇博客,在参考别人的博客进行安装的过程中,针对我的平台系统,遇到了很多的问题,在这里写出我的实践历程以及所遇到的问题。
对于给予借鉴的博主的文章,在这里表达感谢。
对于此博文,如有写的不好之处或者有误的地方,因为本人水平有限,以及遇到的问题的局限性,不能一一兼顾,请给予谅解,并希望得到好的建议,对于好的建议我会加以修改,谢谢!
本博文为作者原创,转载请注明出处,谢谢!

Linux环境和Android平台
1. Ubuntu 16.04/16.10
2. Vivo手机
3. Android 5.1
Tensorflow 环境安装(对于仅限Tensorflow demo 在Android平台上的移植可以不装)
安装具体流程可以借鉴以下两个博客
http://www.linuxidc.com/Linux/2016-11/137561.htm
http://blog.csdn.net/zhaoyu106/article/details/52793183/
!!注意,具体安装流程可以参照以上两个博客中的任何一个,Linux系统可能不一样,但安装方式大同小异。但最重要的是要主要第二个博客中提到的gcc版本降级的问题,
因为暂时tensorflow GPU只能在gcc 5.0及以下版本中正常使用。

Android平台移植具体流程

 1.安装 Java 1.8 2.安装 bazel 3.下载tensorflow源码 4.安装 Android SDK 5.安装 Android NDK 6.下载tensorflow 模型 7.开启手机开发这模式,安装adb 8.bazel编译,下载到Android手机 9.实测结果

1.安装 Java 1.8

$ sudo apt-get installsoftware-properties-common$ sudo add-apt-repositoryppa:webupd8team/java$ sudo apt-get update$ sudo apt-get installoracle-java8-installer

装好后,配置Java环境变量,将下面的内容添加到/etc/environment:

$JAVA_HOME="/usr/lib/jvm/java-8-oracle"

最好能够找一个网络稳定,又快的网,又不会花很多时间。作者自己在安装的过程中就是因为用了一个非常慢的网,下了很长时间,而且有一次还因为卡顿,直接终止掉下载,然后重新下载的时候,就报各种错误。因为中途停止下载,所以会有记录和残留。我的方法是清除掉已经下载的,卸载得非常干净后,重新下载就可以了。
遇到如下的报错:

Download done.sha256summismatchjdk-8u131-linux-x64.tar.gzOracle JDK 8 isNOT installed.dpkg:清理时出错: 子进程 已安装 post-installation脚本 返回了错误号 1在处理时有错误发生: oracle-java8-installer

解决方法如下:
终端输入 ps -aux ,列出进程。找到含有apt‘-get的进程,直接sudo kill PID。解决。
强制解锁,命令

$ sudo rm/var/cache/apt/archives/lock$ sudo rm /var/lib/dpkg/lock$ sudo kill 4250$ sudo lsof/var/cache/debconf/config.dat$ sudo apt-get remove orcacle-java8-installer* #卸除掉所有相关的东西$ sudo apt-get autoremove$ sudo apt-getautoclean$ sudo apt-get clean

以上的指令对于中途终止安装过程中后遇到的问题应该都可以解决的。解决后,重新安装java1.8即可。

2.安装 bazel

$ echo "deb [arch=amd64]http://storage.googleapis.com/bazel-apt stable jdk1.8" |  sudo tee /etc/apt/sources.list.d/bazel.list$ curlhttps://bazel.io/bazel-release.pub.gpg | sudo apt-key add -$ sudo apt-get update&& sudo apt-get install bazel$ sudo apt-get upgrade bazel

对于详细的说明可以参考 bazel 的官方文档。

3.下载tensorflow源码

$ cd ~/ #进入到用户目录下$ git clone https://github.com/tensorflow/tensorflow.git #从github上克隆github源码。没有git和git   环境的Linux环境的读者,请先自行安装

4.安装 Android SDK(Software Development Kit)

$ wget https://dl.google.com/android/android-sdk_r24.4.1-linux.tgz$ tar xvzf android-sdk_r24.4.1-linux.tgz-C ~/tensorflow #解压到tensorflow源码的文件下,只是方便管理,其他目录也可以。

5.安装 Android NDK(Native Development Kit)

$ wget https://dl.google.com/android/repository/android-ndk-r12b-linux-x86_64.zip$ unzipandroid-ndk-r12b-linux-x86_64.zip -d ~/tensorflow  #必须保证ndk为至少r12

6.下载tensorflow 模型

$ cd ~/tensorflow$wgethttps://storage.googleapis.com/download.tensorflow.org/models/inception5h.zip-O/tmp/inception5h.zip$ wgethttp://storage.googleapis.com/download.tensorflow.org/models/mobile_multibox_v1a.zip-O/tmp/mobile_multibox_vla.zip$wgethttp://storage.googleapis.com/download.tensorflow.org/models/stylize_v1.zip-O/tmp/stylize_v1.zip$ unzip /tmp/inception5h.zip-dtensorflow/examples/android/assets/$ unzip/tmp/mobile_multibox_vla.zip -dtensorflow/examples/android/assets/$ unzip/tmp/stylize_v1.zip-dtensorflow/examples/android/assets/

以上下载了三个模型。

下载的模型链接随着tensorflow android 项目版本的更新可能会有变动,具体版本对应的链接请参考tensorflow根目录下的WORKSPACE文件,它其中标明了当前项目版本对应的模型下载链接。
解压完毕后,打开//tensorflow/examples/android/BUILD文件,找到以 android_binary 开头的那段代码片,将assets = [ ] 内以@开头的三句代码用#号 注释掉,如下图已经标注需要注释掉部分所示。

android_binary(   name = "tensorflow_demo",   srcs = glob([       "src/**/*.java",   ]),    #Package assets from assets dir as well asall model targets. Remove undesiredmodels    #(and corresponding Activities in source)to reduce APK size.   #Modified by Hedlen 03/06/2017   ###需要注释掉的地方########   assets = [        "//tensorflow/examples/android/assets:asset_files",      ":external_assets",   ],   assets_dir = "",    ###到这里结束############   custom_package ="org.tensorflow.demo",   inline_constants = 1,   manifest = "AndroidManifest.xml",   manifest_merger = "legacy",   resource_files =glob(["res/**"]),   tags = [       "manual",       "notap",   ],    deps = [       ":tensorflow_native_libs",      "//tensorflow/contrib/android:android_tensorflow_inference_java",   ],)

!! 注意 :如果不注释掉该段内容,即使手动将模型放在assets文件中,使用bazel编译时也会重新下载模型。
修改 WORKSPACE

$ gedit ~/tensorflow/WORKSPACE

在我的安装的版本下的WORKSPACE的内容是:

# Uncomment and update thepaths in theseentries to build the Android demo.android_sdk_repository(   name = "androidsdk",   api_level = 26,    #Ensure that you have thebuild_tools_version below installed in the    #SDK manager as it updates periodically.   build_tools_version = "25.0.0",    #Replace with path to Android SDK on yoursystem   path ="/home/qw/tensorflow/android-sdk-linux",)## Android NDK r12b isrecommended (highermay cause issues with Bazel)android_ndk_repository(   name="androidndk",  path="/home/qw/tensorflow/android-ndk-r12b",    #This needs to be 14 or higher to compileTensorFlow.    #Note that the NDK version is not the APIlevel.   #api_level=14   api_level=24)

反注释 android_sdk_repository和 android_ndk_repository部分,用上面的内容替换。
以上内容我已经反注释了。
注意!! 针对这里的版本问题,比如SDK版本可以在~/android-sdk-linux的路径下的platforms 和build-tools文件夹下可以查看对应版本号。
我安装的Android SDK 对应安装的build-tools 文件夹下只有一个版本26.0.0,在后面的bael 编译过程中会报错 Error: Missing input file .~/26.0.0文件下缺失文件apksigner.jar。后来通过安装Android Studio 重新下载了25.0.0版本(文件内带有apksigner.jar ,应该是签名发布用)的build-tools 并添加到~/android-sdk-linux的路径下build-tools文件夹,并修改WORKSPACE文件的对应的build-tools版本为25.0.0后面,错误得到解决。
注意!! 需要将下的文件中的内容 改成:

defnativeBuildSystem = 'none'defbazelLocation = '/usr/bin/bazel'
可以参考 Android SDK & NDK (https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/android/README.md) 

一开始的路径是/usr/bin/local/bazel,对于我的电脑是/usr/bin/bazel,对于不知道bazel路径的读者,可以用

$locate bazel 

查看本地计算机的bazel的路径

7.开启手机开发这模式,安装adb(Android Debug Bridge)

安装adb

$ sudoapt-get install adb

打开Android手机开发者模式并允许调试不同手机设置不一样,请具体参考各手机的打开方式。
adb 检测连接状态

$ sudoadb devices

显示如下即为正常连接:

Listof devices attachedxxxx   device

8.bazel编译,下载到Android手机

$ cd~/tensorflow  #进入tensorflow源码的路径下,编译才行,如果不进入该目录下需要指定绝对路径$bazel build //tensorflow/examples/android:tensorflow_demo

编译成功后会有如下结果:

bazel-bin/tensorflow/examples/android/tensorflow_demo_deploy.jarbazel-bin/tensorflow/examples/android/tensorflow_demo_unsigned.apkbazel-bin/tensorflow/examples/android/tensorflow_demo.apk

如果没有以上的结果,或者中间有报错,请检查如WORKSPACE等文件的配置是否正确。

将apk文件下载到Android手机:

$ adb install -r bazel-bin/tensorflow/examples/android/tensorflow_demo.apk

安装过程中会提示是否安装,选择OK即可。
在手机上会安装三个apk,具体如下图

9.实测结果

TF Classify

TF Detect

TF Stylize

10.总结

这是我的第一篇博客,因为第一写,花费了很多时间,而且写得并不是很好。但以后会继续完善和改正。对于这篇博客当中的应用,在自己玩了有段时间tensorflow,现正在做一个paper复现,在github上开源。已经做得差不多了,现在就想将自己训练好的模型移植到Android上,看看在实际的场景,检验下自己模型的准确性。

阅读全文
0 0
原创粉丝点击