原文地址:https://blog.csdn.net/shichaog/article/details/73551029
本文基于
https://github.com/MindorksOpenSource/AndroidTensorFlowMachineLearningExample
下载和安装jdk,ndk和sdk
下载
JDK下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
我选择的是jdk-8u131-linux-x64.tar.gz
下载后解压到/opt目录下,我的解压后目录如下:
gsc@X250:/opt/jdk1.8.0_131$ pwd
/opt/jdk1.8.0_131
配置
gsc@X250:/opt/jdk1.8.0_131$ vim ~/.bashrc
在文件末尾加上如下内容
export JAVA_HOME=/opt/jdk1.8.0_131
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
Android SDK安装
法一SDK安装
下载DSK
$ 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版本和buildtools版本
$ cd ~/tensorflow/android-sdk-linux
$ tools/android update sdk --no-ui
选中build-tools版本24.0.3和Android 6.0(API 23)
安装完后最后一列由not installed变为installed。
法二android studio方法
如下图打开sdk manager
在SDK platforms里选则API23,在SDK tools里选中24.0.3.最新的26编译会出错。
NDK安装
使用r12b,r12b可以支持armv7和armv8的编译,不要使用最新的。
$ wget https://dl.google.com/android/repository/android-ndk-r12b-linux-x86_64.zip
$ unzip android-ndk-r12b-linux-x86_64.zip -d ~/tensorflow
下载感知模型
$ 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文件
按如下方式修改
# Uncomment and update the paths in these entries to build the Android demo.
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 = "24.0.3",
# Replace with path to Android SDK on your system
path = "android-sdk-linux",
)
# Android NDK r12b is recommended (higher may cause issues with Bazel)
android_ndk_repository(
name="androidndk",
path="/home/gsc/android-ndk-r12b",
# This needs to be 14 or higher to compile TensorFlow.
# Note that the NDK version is not the API level.
api_level=21)
编译APK
32位编译
$ cd ~/tensorflow
$ bazel build //tensorflow/examples/android:tensorflow_demo
demo 编译不支持64位armv8
64位编译(demo并不支持该选项)
编译so库
bazel build -c opt //tensorflow/contrib/android:libtensorflow_inference.so \
--crosstool_top=//external:android/crosstool \
--host_crosstool_top=@bazel_tools//tools/cpp:toolchain \
--cpu=arm64-v8a
so库所在目录是:
bazel-bin/tensorflow/contrib/android/libtensorflow_inference.so
编译jar包
bazel build //tensorflow/contrib/android:android_tensorflow_inference_java
jar包所在目录是:
bazel-bin/tensorflow/contrib/android/libandroid_tensorflow_inference_java.jar
把编译好的包拷贝如下目录:
gsc@X250:~/Android/APP/AndroidTensorFlowMachineLearningExample$
./app/src/main/jniLibs/armeabi-v7a/libtensorflow_inference.so
./app/libs/libandroid_tensorflow_inference_java.jar
安装APK
$ adb install -r -g bazel-bin/tensorflow/examples/android/tensorflow_demo.apk
- 1
黑色是识别结果,白色反映了网络结构和各个模块的耗时以及cpu利用率情况。
使用自己的分类器
这个分类器是谷歌的,大约能够识别一千种图片,如果想只识别人脸等的应用,就需要使用自己的分类器了。
编译图优化器
$ cd ~/tensorflow
$ bazel build tensorflow/python/tools:optimize_for_inference
优化图
$ bazel-bin/tensorflow/python/tools/optimize_for_inference \
--input=tf_files/retrained_graph.pb \
--output=tensorflow/examples/android/assets/retrained_graph.pb
--input_names=Mul \
--output_names=final_result
将标签拷贝到asset目录
$ cp ~/tensorflow/tf_files/retrained_labels.txt ~/tensorflow/tensorflow/examples/android/assets/
编辑TensorflowImageListener.java
$ gedit ~/tensorflow/tensorflow/examples/android/src/org/tensorflow/demo/TensorFlowImageListener.java
根据模型实际情况修改如下几行
private static final int INPUT_SIZE = 299;
private static final int IMAGE_MEAN = 128;
private static final float IMAGE_STD = 128;
private static final String INPUT_NAME = "Mul:0";
private static final String OUTPUT_NAME = "final_result:0";
private static final String MODEL_FILE = "file:///android_asset/retrained_graph.pb";
private static final String LABEL_FILE = "file:///android_asset/retrained_labels.txt";
编译和安装apk
$ cd ~/tensorflow
$ bazel build //tensorflow/examples/android:tensorflow_demo
$ adb install -r -g bazel-bin/tensorflow/examples/android/tensorflow_demo.apk