Tensorflow 在 Android 平台的移植
Ubuntu 14.04
这里假定 Ubuntu 14.04 系统上还没有 Android 开发环境。
安装 Java 1.8
$ sudo apt-get install software-properties-common
$ sudo add-apt-repository ppa:webupd8team/java
$ sudo apt-get update
$ sudo apt-get install oracle-java8-installer
配置 Java 环境变量,将下面的内容添加到 /etc/environment
:
JAVA_HOME="/usr/lib/jvm/java-8-oracle"
安装 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.io/bazel-release.pub.gpg | sudo apt-key add -
$ sudo apt-get update && sudo apt-get install bazel
$ sudo apt-get upgrade bazel
详细的说明可以参考 bazel 的官方文档。
下载 tensorflow
$ cd ~/
$ git clone https://github.com/tensorflow/tensorflow.git
之后的步骤基本来自 TensorFlow on Android 的翻译:
下载解压 Android SDK
$ wget https://dl.google.com/android/android-sdk_r24.4.1-linux.tgz
$ tar xvzf android-sdk_r24.4.1-linux.tgz -C ~/tensorflow
更新 SDK:
$ cd ~/tensorflow/android-sdk-linux
# 如果希望在熟悉的 SDK Manager 中进行操作,可以去掉下面命令中的 --no-ui
$ tools/android update sdk --no-ui
下载解压 NDK
$ wget https://dl.google.com/android/repository/android-ndk-r12b-linux-x86_64.zip
$ unzip android-ndk-r12b-linux-x86_64.zip -d ~/tensorflow
下载 tensorflow 的 model
$ cd ~/tensorflow
$ wget https://storage.googleapis.com/download.tensorflow.org/models/inception5h.zip -O /tmp/inception5h.zip
$ unzip /tmp/inception5h.zip -d tensorflow/examples/android/assets/
修改 WORKSPACE
$ gedit ~/tensorflow/WORKSPACE
反注释 android_sdk_repository
和 android_ndk_repository
部分,用下面的内容替换:
android_sdk_repository(
name = "androidsdk",
api_level = 24,
build_tools_version = "24.0.3",
# Replace with path to Android SDK on your system
path = "/home/ross/Downloads/android-sdk-linux",
)
android_ndk_repository(
name="androidndk",
path="/home/ross/Downloads/android-ndk-r12b",
api_level=24)
编译 tensorflow 的 Android Demo App:
$ 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
INFO: Elapsed time: 109.114s, Critical Path: 37.45s
Android Demo 分析
整个 Demo 的目录结构和使用 Jni 的 Android 工程是相同的,在 ~/tensorflow/tensorflow/examples/android/jni
目录下,放着 native 的代码:
├── imageutils_jni.cc
├── __init__.py
├── rgb2yuv.cc
├── rgb2yuv.h
├── yuv2rgb.cc
└── yuv2rgb.h
Java interface 相关的 Java 类在 https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/android
目录里面,可以考虑将其直接集成到自己的项目中。
Demo 所需的 native 实现在 https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/android/jni
目录里面。
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/android/src/org/tensorflow/demo/TensorFlowImageListener.java
里面定义了用到的 tensorflow model,protobuf 格式,识别结果的 labels 等:
private static final Logger LOGGER = new Logger();
private static final boolean SAVE_PREVIEW_BITMAP = false;
private static final String MODEL_FILE = "file:///android_asset/tensorflow_inception_graph.pb";
private static final String LABEL_FILE =
"file:///android_asset/imagenet_comp_graph_label_strings.txt";
private static final int NUM_CLASSES = 1001;
private static final int INPUT_SIZE = 224;
private static final int IMAGE_MEAN = 117;
如果想使用自己的模型,使用 tensorflow 解决其他的问题,通过修改上面提到的代码和模块来完成。TensorFlow on Android 文章就提到了具体的步骤。
最后,Tensorflow 也支持移植到 iOS 应用中,可以参考 TalkingData SDK Team 的技术博客文章 iOS 开发迎来机器学习的春天--- TensorFlow。
Ubuntu下安装tensorflow.
$ sudo apt-get install python-pip python-dev
-
Ensure proper protobuf dependencies by issuing one of the following commands:
$ sudo pip uninstall tensorflow # for Python 2.7 $ sudo pip3 uninstall tensorflow # for Python 3.n
-
Install TensorFlow by invoking one of the following commands:
$ pip install tensorflow # Python 2.7; CPU support (no GPU support) $ pip3 install tensorflow # Python 3.n; CPU support (no GPU support) $ pip install tensorflow-gpu # Python 2.7; GPU support $ pip3 install tensorflow-gpu # Python 3.n; GPU support
-
Run a short TensorFlow program
Invoke python from your shell as follows:
$ python
Then, enter the following short program inside the python interactive shell:
>>> import tensorflow as tf >>> hello = tf.constant('Hello, TensorFlow!') >>> sess = tf.Session() >>> print(sess.run(hello))
If the system outputs the following, then you are ready to begin running TensorFlow programs:
Hello, TensorFlow!