引言
tensorflow官方在安卓端实现了4个demo,分别是classify,detect,stylize,speech。而我们要做的是,在ubuntu环境下,将这几个demo成功移植到安卓手机上。
最近几天,参考教程无数,踩坑无数,因此懒惰如我,也想写篇教程记录一下,供后来人参考。目前(2019.07.22)github上已经更新到r2.0版本,和以前的多少会有变化,也是很多教程部分不适用的地方。
各种环境准备和搭建
- java8安装
- android studio安装
- sdk安装
- ndk安装
- bazel安装
我自己移植成功的环境版本如下:Ubuntu16.04,java 1.8.0.221,android studio 3.x, sdk26.1.1 (API 25),ndk r10b,bazel 0.28.0 .
按上面的流程一步一步走,没有严格的顺序,有的可先可后。具体步骤网上都有很多优秀教程可查,这里重点说装好环境后的android demo实现。
关于环境搭建可以参考这篇博客
(https://blog.csdn.net/masa_fish/article/details/54097796)
移植过程
在网上的很多tensorflow安卓移植教程中,都会出现下面这一步:反注释workspace中的ndk和sdk版本的内容,相信和我一样看了很多教程的人都清楚。
他们的教程中如下:
在tensorflow的根目录下,找到WORKSPACE文件。打开文件, 上方有两段包含 android_sdk_repository和 android_ndk_repository的内容(该段内容已经加了#被注释掉了),将这两段内容在文件中复制一遍,并将复制后的内容反注释掉。然后:
但是实际上,目前的tensorflow版本中的WORKSPACE文件已经没有包含android_sdk_repository和android_ndk_repository这些语句,更谈不上注释和更改WORKSPACE文件中的这些内容。
所以我们在搭建好环境之后的具体步骤应该如何?
1、首先,github上下载源码
没安装git的也可以手动download,然后解压到指定目录,我的是解压在和android studio安装的同一个目录下。
the simplest way to compile the demo app yourself, and try out changes to the project code is to use AndroidStudio. Simply set this android directory as the project root.
上面是官方文档中的说明:最简单的编译方式是用AndroidStudio,将android目录设置成工程目录。
2、修改build.gradle文件
Then edit the build.gradle file and change the value of nativeBuildSystem to ‘none’ so that the project is built in the simplest way possible:
然后将build.gradle中的nativeBuildSystem改为none,即 def nativeBuildSystem = 'none’
再把里面的 jcenter() 修改成 jcenter { url “http://jcenter.bintray.com” }
3、修改download-models.gradle文件
先把 jcenter() 修改成 jcenter { url "http://jcenter.bintray.com" }
然后接下来下载模型可选择预先下载好,或者让程序帮你下载好。
Install Model Files (optional)
The TensorFlow GraphDefs that contain the model definitions and weights are not packaged in the repo because of their size. They are downloaded automatically and packaged with the APK by Bazel via a new_http_archive defined in WORKSPACE during the build process, and by Gradle via download-models.gradle.
Optional: If you wish to place the models in your assets manually, remove all of the model_files entries from the assets list in tensorflow_demo found in the BUILD file. Then download and extract the archives yourself to the assets directory in the source tree:
我们的demo里面要用到4个模型文件。在下面的download-models.gradle文件中,当工程编译时会自动帮我们下载好这四个模型
def models = ['inception_v1.zip',
'object_detection/ssd_mobilenet_v1_android_export.zip',
'stylize_v1.zip',
'speech_commands_conv_actions.zip']
...
...
...
task downloadFile(type: Download){
for (f in models) {
src "${MODEL_URL}/" + f
}
dest new File(project.ext.TMP_DIR)
overwrite true
}
当然我们也可以手动下载,如果自动下载不成功的话。手动下载的网址就在这个代码块的for循环里面拼接组成。例如:下载模型inception_v1.zip,下载地址为:(https://storage.googleapis.com/download.tensorflow.org/models/inception_v1.zip)
其他网址就在最后更改模型名字即可。
我这里一开始想要手动下载,但是下载失败,然后就让程序自动下载了。
自动下载的模型在/tensorflow-master/tensorflow/examples/android/gradleBuild/downloads/inception_v1.zip目录下。这里的grade build好像是自动生成的。
4、编译运行
做好上面的事情以后,编译build工程,如果编译没有问题,运行在模拟器上或者真机上都可以。
当然事情肯定不会一帆风顺,在Android studio上会出现各种各样的错误,要有耐心去查找去解决,最好在保证AndroidStudio可以跑出一个正确的HelloWorld Activity demo之后再来尝试上述操作。
5、运行结果如下
6、总结
总的来说和以前的其他教程差异比较大,自始至终修改的demo文件只有两个grade文件,无须修改workspace和build等文件内容。另外在其他地方踩了很多坑,才最终实现,但是说来话长,有疑问可以留言问我。
`