將分類網絡應用在android中 part1,編譯tensorflow android例子

目錄

準備

使用android-studio編譯

使用bazel編譯

 

準備

如果需要了解如何將tensorflow的分類網絡編譯進android應用,我想先從google提供的例子着手應該是最好的方式。

首先我們需要下載tensorflow的代碼,官方推薦是用--recurse-submodules來下載,否則可能有些protobuf會出現編譯問題

git clone --recurse-submodules https://github.com/tensorflow/tensorflow.git

使用android-studio編譯

使用這種方法你需要有一定android開發應該的基礎,否則配置android-studio估計也要花費一段時間。所以我們默認電腦中已經裝好了可以使用的android-studio。

啓動android-studio,打開./tensorflow/examples/android這個工程。

接着修改build.gradle文件,將nativeBuildSystem設置爲none

// set to 'bazel', 'cmake', 'makefile', 'none'
def nativeBuildSystem = 'none'

檢查build.gradle中是否有設置compile 'org.tensorflow:tensorflow-android:+',如果沒有就需要加上。

dependencies {
    if (nativeBuildSystem == 'cmake' || nativeBuildSystem == 'none') {
        compile 'org.tensorflow:tensorflow-android:+'
    }
}

接着build工程,就會自動下載下面這些models。

def models = ['inception_v1.zip',
              'object_detection/ssd_mobilenet_v1_android_export.zip',
              'stylize_v1.zip',
              'speech_commands_conv_actions.zip']

但是有一個問題,這些models需要在google服務器上下載,所以可能會被牆,需要合理使用網絡。

https://storage.googleapis.com/download.tensorflow.org/models

編譯完成後可以直接安裝進手機查看效果。

使用bazel編譯

另一種方式就是用bazel編譯apk。

首先需要下載android SDK,並且解壓進tenserflow目錄

$ wget https://dl.google.com/android/android-sdk_r24.4.1-linux.tgz
$ tar xvzf android-sdk_r24.4.1-linux.tgz -C ~/tensorflow

接着安裝build-tools

$ cd ~/tensorflow/android-sdk-linux
$ tools/android update sdk --no-ui

然後下載NDK

$ wget https://dl.google.com/android/repository/android-ndk-r14b-linux-x86_64.zip
$ unzip android-ndk-r14b-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/

安裝brazel,可以參考官網進行安裝,安裝地址

修改WORKSPACE文件,build_tools_version的版本可以看一下android-sdk-linux/build-tools下面有什麼版本,如果版本低於26後面編譯會報錯。

# Uncomment and update the paths in these entries to build the Android demo.
android_sdk_repository(
    name = "androidsdk",
    api_level = 28,
    # Ensure that you have the build_tools_version below installed in the
    # SDK manager as it updates periodically.
    build_tools_version = "28.0.2",
    # 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=25)

最後用bazel編譯APK即可

$ cd ~/tensorflow
$ bazel build //tensorflow/examples/android:tensorflow_demo

編譯的時候如果報錯如下,只需要將tensorflow/examples/android/BUILD中android_binary裏面的manifest_merger = "legacy"刪掉即可,並不會影響後面的編譯。

ubuntu@ubuntu:/local/share/DeepLearning/tensorflow$ bazel build //tensorflow/examples/android:tensorflow_demo
ERROR: /local/share/DeepLearning/tensorflow/tensorflow/examples/android/BUILD:64:1: //tensorflow/examples/android:tensorflow_demo: no such attribute 'manifest_merger' in 'android_binary' rule
ERROR: error loading package 'tensorflow/examples/android': Package 'tensorflow/examples/android' contains errors
INFO: Elapsed time: 0.192s
INFO: 0 processes.
FAILED: Build did NOT complete successfully (1 packages loaded)

編譯成功後可以看到在bazel-bin下面生成了一系列的文件

ubuntu@ubuntu:/local/share/DeepLearning/tensorflow/bazel-bin/tensorflow/examples/android$ ls
_dx                                   libtensorflow_demo.jar.dex.zip-2.params        tensorflow_demo.ap_                  tensorflow_demo_processed_manifest                    tensorflow_demo_symbols
_javac                                libtensorflow_demo.jar_desugared.jar           tensorflow_demo.apk                  tensorflow_demo_resources.jar                         tensorflow_demo_unsigned.apk
libtensorflow_demo-native-header.jar  libtensorflow_demo.jar_desugared.jar-2.params  tensorflow_demo.srcjar               tensorflow_demo_resources.jar.dex.zip
libtensorflow_demo.jar                libtensorflow_demo.jar_manifest_proto          tensorflow_demo_deploy.jar           tensorflow_demo_resources.jar.dex.zip-2.params
libtensorflow_demo.jar-2.params       libtensorflow_demo.jdeps                       tensorflow_demo_deploy.jar-2.params  tensorflow_demo_resources.jar_desugared.jar
libtensorflow_demo.jar.dex.zip        proguard                                       tensorflow_demo_files                tensorflow_demo_resources.jar_desugared.jar-2.params

安裝tensorflow_demo.apk進手機,可以用adb命令安裝,也可以直接將apk拷貝到手機中,在手機上點擊apk安裝。

安裝成功後手機上會出現4個應用,TF Classify, TF Detect, TF Stylize, TF speech.

試了一下TF Classify,速度還是不錯的。

下一篇介紹如何將自己做的分類網絡在手機中實現。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章