目錄
準備
使用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,速度還是不錯的。
下一篇介紹如何將自己做的分類網絡在手機中實現。