最近这两天探索将TensorFlow移植到Android上的问题,跑了下官方的Demo
参考了http://blog.csdn.net/masa_fish/article/details/54097796
由于环境的不一致,遇到了各种坑,现在将其写下来,以做记忆
1、下载代码
第一步当然是下载代码
项目在github上的地址:https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/android
git下载代码:
git clone --recurse-submodules https://github.com/tensorflow/tensorflow.git
--recurse-submodules
这个必须添加
Demo在源码中的位置:tensorflow/examples/android 2、安装Bazel
官网介绍安装的网站:https://docs.bazel.build/versions/master/install.html
我的系统是ubuntu14.04,也不想研究Bazel的代码,就没有下载源码编译安装
第一步,安装JDK8
执行:
sudo apt-get install openjdk-8-jdk
Ubuntu 14.04 执行下面命令:
sudo add-apt-repository ppa:webupd8team/java sudo apt-get update && sudo apt-get install oracle-java8-installer 第二步,添加Bazel作为一个包资源 echo "deb [arch=amd64] http://storage.googleapis.com/bazel-apt stable jdk1.8" | sudo tee /etc/apt/sources.list.d/bazel.list curl https://bazel.build/bazel-release.pub.gpg | sudo apt-key add - 第三步,安装 sudo apt-get update && sudo apt-get install bazel 第四步,更新 sudo apt-get upgrade bazel
3、安装SDK与NDK
去官网下载,然后放到项目目录下,下载地址自行百度
配置位置,在项目根目录下找到WORKSPACE这个文件,打开
找到android_sdk_repository与android_ndk_repository这个两个配置项,本来它们是被注释掉的,把它们打开
然后修改path属性指向相应的目录,修改使用的版本信息等
android_sdk_repository(
name = "androidsdk",
api_level = 26,
# 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 = "android-sdk-linux",
)
android_ndk_repository(
name="androidndk",
path="android-ndk-r14b",
# 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)
这里讲下,这里遇到的两个坑。
1、NDK的版本问题,这里不能用最新的NDK,最大只支持到14,但也不要小于10。我就是去官网下了个最新的,然后编译各种c++头文件找不到,崩溃
2、NDK对cmake的版本有要求,我的ubuntu14.04系统的cmake是2.8的,但ndk_r14最小要求3.6版本,所以又去官网下了个最新的3.9版本才可以
4、模型下载问题
源码项目下的编译,每次清空重新编译,都会重新下载下模型文件。这很浪费时间,可以如下改下:
打开文件tensorflow/examples/android/BUILD,把下面红色内容注释掉,即在编译的时候不再下载文件了
android_binary(
name = "tensorflow_demo",
srcs = glob([
"src/**/*.java",
]),
# Package assets from assets dir as well as all model targets. Remove undesired models
# (and corresponding Activities in source) to reduce APK size.
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",
],
)
手动下载模型文件,并解压到assert目录,执行下面的shell
BASE_URL=https://storage.googleapis.com/download.tensorflow.org/models
for MODEL_ZIP in inception5h.zip ssd_mobilenet_v1_android_export.zip stylize_v1.zip
do
curl -L ${BASE_URL}/${MODEL_ZIP} -o /tmp/${MODEL_ZIP}
unzip /tmp/${MODEL_ZIP} -d tensorflow/examples/android/assets/
done
5、编译
bazel build -c opt //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
上述命令编译出来的是armv7版本的,只可以在arm手机上跑,我的模拟器是x86的还是无法运行,后来找到项目里其实有编译的脚本,式了下还是可以用的
编译其它cpu版本的软件:
打开脚本文件tensorflow/tools/ci_build/builds/android.sh
将里面的--fat_apk_cpu=x86_64修改为你需要的,然后编译
编译所有cpu支持版本软件:
执行脚本tensorflow/tools/ci_build/builds/android_full.sh