我的書:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs4WOXl1bOdVYv50MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL0YzN0MzN1QTMwIDNwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
淘寶購買連結
當當購買連結
京東購買連結
本文基于
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目錄下,我的解壓後目錄如下:
[email protected]:/opt/jdk1.8.0_131$ pwd
/opt/jdk1.8.0_131
###配置
[email protected]:/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 \
[email protected]_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
把編譯好的包拷貝如下目錄:
[email protected]:~/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
黑色是識别結果,白色反映了網絡結構和各個子產品的耗時以及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