一、下载tensorflow项目源码
如果像实现将tensorflow训练的模型移植到安卓手机,首先使用如下代码下载tensorflow的项目源码
git clone --recurse-submoduls https://github.com/tensorflow/tensorflow.git 注意--recurse-submoduls 是为了防止一些protobuf的编译问题。
二、安装bazel
参考自己的 ubuntu源码安装cpu版tensorflow教程。
三、准备工作
1、下载NDK,并将其解压到从github上下载的tensorflow源代码的根目录下(注:其实可以安装在任意目录下,这里以安装在tensorflow下举例),ndk的版本要12及以上,推荐使用r12版本,太高可能会导致bazel出错
wget https://dl.google.com/android/repositor/android-ndk-r12b-linux-x86_64.zip这个好像是源网址,但是被墙了,用wget下载的文件,默认文件是保存在当前的工作路径下。
www.androiddevtools.cn这个网址是一个中文网站,Android SDK Tools--->NDK--->可以下载需要的NDK版本(720M)
下载后.zip文件会存到/root/下载目录底下,把它复制到主文件夹下,可以指定它解压到我自己建立的/tensorflow/ndk目录底下。
unzip android-ndk-r12b-linux-x86_64.zip -d ~/tensorflow/ndk
2、安装SDK,SDK也可以选择在安装Android Studio的时候安装,
首先下载并解压sdk tools
www.androiddevtools.cn-->Android SDK Tools-->SDK TOOLS-->androiddk_r24.4.1-linux.tgz下载,将下载后的.tgz文件放在主文件夹下
运行下面代码解压到我指定的路径/tensorflow/sdk中
tar xvzf android-sdk_r24.4.1-linux.tgz -C ~/tensorflow/sdk
3、然后更新sdk,更新的时候会自动安装SDK build tools
cd /root/tensorflow/sdk/android-sdk-linux
sudo tools/android update sdk --no-ui(这个指令会自动下载安装很多个android-XX,占用内存)
sudo tools/android update sdk通过这个我竟然打开了Android SDK manager,在里面可以选择我想下载的版本。
4、修改NDK和SDK的环境变量(修改workspace文件)
在tensorflow的根目录下找到WORKSPACE文件并打开
#android_sdk_repository(
# name = "androidsdk",
# api_level = 23,
# # Ensure that you have the build_tools_version below installed in the
# # SDK manager as it updates periodically.
# build_tools_version = "26.0.1",
# # Replace with path to Android SDK on your system
# path = "<PATH_TO_SDK>",
name = "androidsdk",
api_level = 23,
# Ensure that you have the build_tools_version below installed in the
# SDK manager as it updates periodically.
build_tools_version = "23.0.1",
# Replace with path to Android SDK on your system
path = "/root/tensorflow/sdk/android-sdk-linux",
)
#android_ndk_repository(
# name="androidndk",
# path="<PATH_TO_NDK>",
# # This needs to be 14 or higher to compile TensorFlow.
# # Please specify API level to >= 21 to build for 64-bit
# # archtectures or the Android NDK will automatically select biggest
# # API level that it supports without notice.
# # Note that the NDK version is not the API level.
# api_level=14)
name="androidndk",
path="/root/tensorflow/ndk/android-ndk-r12b",
# This needs to be 14 or higher to compile TensorFlow.
# Please specify API level to >= 21 to build for 64-bit
# archtectures or the Android NDK will automatically select biggest
# API level that it supports without notice.
# Note that the NDK version is not the API level.
api_level=21)
# Please add all new TensorFlow dependencies in workspace.bzl.
四、下载模型,android demo码源(可选,第四步可以直接跳过哦)
tensorflowr0.12码源版本自带了一个tensorflow_demo:TF-classify,在项目中,android demo 的位置是//tensorflow/examples/android
但是android demo码源是不包含训练好的tensorflow模型的,但是在编译的时候需要模型,模型一共有三个,分别对应物体识别TF Classify,行人检测TF Detect和图像风格迁移TF Stylize。(最新版的模型还增加了一个语音识别 TF Speech)
在bazel编译时,可以不用手动下载模型,因为在文件//tensorflow/examples/android/BUILD中设定了自动下载模型的操作,bazel编译apk文件时会自动下载。
但是如果使用的是Andriod studio等其他的方式进行编译时不会运行BAZEL中的自动下载操作。
手动下载模型zip文件:。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
五、连接安卓手机
1、安装adb
(sudo) apt-get install android-tools-adb
2、将手机设置为 usb debugging按钮,然后手机通过usb线连接到电脑
3、从电脑端检查手机是否连接成功
adb devices
出现:
List of devices attached
D8YDU15722003144(ID号) offline(连接状态)
offline是不行的,通过以下办法解决:
切换到sdk安装路径下的build_tools文件夹:
cd /root/tensorflow/sdk/android-sdk-linux/tools
运行:
adb kill-server
sudo adb start-server(要以root权限启动adb),注意此时手机上的弹窗,允许手机调试。
再通过 adb devices检查
出现:
List of devices attached
D8YDU15722003144(ID号) devices(连接状态)
表明手机连接成功。
六、编译并安装apk文件
1、编译生成apk文件
cd ~/tensorflow
bazel build //tensorflow/examples/android:tensorflow_demo
出现错误:
1、
ERROR: /root/tensorflow/tensorflow/core/kernels/BUILD:4798:1: C++ compilation of rule '//tensorflow/core/kernels:android_tensorflow_kernels' failed (Exit 1).
Target //tensorflow/examples/android:tensorflow_demo failed to build
尝试:
sudo apt-get install lib32ncurses5 lib32stdc++6
2、
ERROR: /root/tensorflow/WORKSPACE:20:1: no such package '@androidsdk//': Android SDK api level 24 was requested but it is not installed in the Android SDK at /root/tensorflow/sdk/android-sdk-linux. The api levels found were [27, 26, 25]. Please choose an available api level or install api level 24 from the Android SDK Manager. and referenced by '//external:android/sdk'.
ERROR: Analysis of target '//tensorflow/examples/android:tensorflow_demo' failed; build aborted: Loading failed.
3、
ERROR: /root/.cache/bazel/_bazel_root/efb88f6336d9c4a18216fb94287b8d97/external/protobuf_archive/BUILD:135:1: C++ compilation of rule '@protobuf_archive//:protobuf' failed (Exit 1).
external/protobuf_archive/src/google/protobuf/wrappers.pb.cc:2975:1: fatal error: error writing to /tmp/ccGM1UiM.s: No space left on device
} // namespace google
4、
CONFLICT: asset:WORKSPACE is provided with ambiguous priority from:
external/stylize/WORKSPACE
external/speech_commands/WORKSPACE
CONFLICT: asset:WORKSPACE is provided with ambiguous priority from:
external/mobile_ssd/WORKSPACE
external/inception5h/WORKSPACE
INFO: From Compiling external/protobuf_archive/src/google/protobuf/io/coded_stream.cc:
external/protobuf_archive/src/google/protobuf/io/coded_stream.cc: In member function 'google::protobuf::int64 google::protobuf::io::CodedInputStream::ReadVarint32Fallback(google::protobuf::uint32)':
external/protobuf_archive/src/google/protobuf/io/coded_stream.cc:420:12: warning: 'temp' may be used uninitialized in this function [-Wmaybe-uninitialized]
上面出现的错误没有找到具体的解决方案,但是还是要装上64位ubuntu中缺少的部分32位库文件
编译成功后会提示生成如下三个文件:
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
2、向安卓手机安装apk文件
adb install -r -g bazel-bin/tensorflow/examples/android/tensorflow_demo.apk
报错:error:unknown option -g
查看adb使用详细文档,adb install 后面跟的一些可选参数来控制安装APK的行为,可用参数及含义如下:
-r:允许覆盖安装
-g:授予所有运行时权限
运行:adb install bazel-bin/tensorflow/examples/android/tensorflow_demo.apk安装成功!!!这个我也没想通!**********此处是2017年11月8日*************
七、参考教程
http://www.cnblogs.com/greentomlee/p/5656467.html
blog.csdn.net/masa_fish/article/details/54097796此教程中有TensorFlow官网教程:将 TensorFlow 深度学习模型,移植到安卓手机,进行物体识别、行人检测和图像风格迁移的一个具体实现过程,它在github上,但是不知道为什么连接不能复制粘贴过来。
接下来要安装好Android Studio,通过Android Studio把tensorflow demo移植到安卓手机上。可是我的电脑内存报警了!!要不要重装系统呢?还是折腾个扩容工具????又心塞塞。。。。。。。。。。。。
//以下步骤还没有亲测过。。。
四、安装Android Studio
1、首先下载Android Studio安装包,官网下载地址:dl.google...又被墙了,CSDN下载了一个,放在主文件夹下
2、将下载的android studio...zip文件解压到自己要安装的路径下面
unzip android-studio-ide-141.1890965-linux.zip -d ~/AndroidStudio
然后进入路径:
cd AndroidStudio/android-studio/bin
运行 ./studio.sh 则会看到android studio启动,如果启动失败检查一下studio.sh是否有可执行权限
在弹窗中选默认的 i do have a previous version of studio...
弹出问题窗口:unable to access android sdk add on list:这是因为没有检测到系统中有sdk而且我下载的android studio的版本也没有自带sdk
解决办法是:在androidstudio的安装目录下找到:bin\idea.properities文件,在文件的末尾添加一行disable.android.first.run=true
然后顺利进入了welcome to android studio界面
五、修改配置文件gradle
打开/root/tensorflow/tensorflow/examples/android下的build.gradle文件
1、将def bazelLocation = '/usr/local/bin/bazel'代码更改为自己的bazel安装路径