天天看點

tensorflow 移植到android平台

我的書:

tensorflow 移植到android平台

淘寶購買連結

當當購買連結

京東購買連結

本文基于

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)

tensorflow 移植到android平台

安裝完後最後一列由not installed變為installed。

###法二android studio方法

如下圖打開sdk manager

tensorflow 移植到android平台

在SDK platforms裡選則API23,在SDK tools裡選中24.0.3.最新的26編譯會出錯。

tensorflow 移植到android平台

##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

tensorflow 移植到android平台

###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
           
tensorflow 移植到android平台

編譯jar包

bazel build //tensorflow/contrib/android:android_tensorflow_inference_java
jar包所在目錄是:
bazel-bin/tensorflow/contrib/android/libandroid_tensorflow_inference_java.jar
           
tensorflow 移植到android平台

把編譯好的包拷貝如下目錄:

[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
           
tensorflow 移植到android平台

黑色是識别結果,白色反映了網絡結構和各個子產品的耗時以及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