tensorflow 幾個android demo源碼環(huán)境搭建
說明
tensorflow上有幾個example,本文重點(diǎn)關(guān)注其在android上的應(yīng)用狭归,源碼在gitHub上有,這個apk是什么樣子熄诡,大家可以通過點(diǎn)擊這里進(jìn)行下載吮成。
系統(tǒng)要求
- 如果需要獨(dú)立的庫,需要分開構(gòu)建tensorflow的源碼
- 物體追蹤以及YUV轉(zhuǎn)RGB在
libtensorflow_demo.so
中 - android5.0 ( API21 )及以上
幾個例子的說明
這個apk安裝完成后會有3個圖標(biāo)办成,啟動不同的Activity對應(yīng)不同的demo,每個demo都可以通過音量鍵來開啟和關(guān)閉后臺信息搂漠。
-
TF Classify:
啟動頁面為
/src/org/tensorflow/demo/ClassifierActivity.java
,其作用是啟動相機(jī)迂卢,自動識別出相機(jī)預(yù)覽框中的物體。 -
TF Detect
啟動頁面為
/src/org/tensorflow/demo/DetectorActivity.java
桐汤,使用深度神經(jīng)網(wǎng)絡(luò)模型進(jìn)行運(yùn)行物體檢測而克。 TF Stylize
啟動頁面為src/org/tensorflow/demo/StylizeActivity.java
,實(shí)時將相機(jī)的預(yù)覽界面處理成特定畫風(fēng)。
新版本apk的下載
最新版本的apk資源怔毛,可以訪問https://ci.tensorflow.org/view/Nightly/job/nightly-android/ 员萍,點(diǎn)擊view節(jié)點(diǎn)下面的output,點(diǎn)擊tensorflow_demo.apk進(jìn)行下載拣度。
好了碎绎,以上是一些基本的介紹,現(xiàn)在我們開始下載demo的源碼抗果,進(jìn)行編譯筋帖。
1. 安裝tensorflow
關(guān)于tensorflow的安裝,可以直接前往官方文檔地址https://www.tensorflow.org/install/ 冤馏,也可以參照我之前寫的博客 http://www.reibang.com/p/5b4e961f010f 日麸,此處不再贅述。
2. 安裝構(gòu)建工具bazel
bazel的安裝宿接,比較簡單赘淮,可以直接參考官方文檔https://bazel.build/versions/master/docs/install.html ,但值得注意的是睦霎,bazel目前還不支持在window上構(gòu)建Android,官方說的是后期可以支持gradle走诞。
博主用的是ubuntu副女,比較方便,簡單提一下蚣旱。
- 需要ubuntu14.04及以上
- 需要JDK 8碑幅,如果沒安裝請運(yùn)行
sudo apt-get install openjdk-8-jdk
- 添加APT庫
echo "deb [arch=amd64] http://storage.googleapis.com/bazel-apt stable jdk1.8" | sudo tee /etc/apt/sources.list.d/bazel.list`
curl https://bazel.build/bazel-release.pub.gpg | sudo apt-key add -
- 安裝bazel
sudo apt-get update && sudo apt-get install bazel
如果只是要更新戴陡,則運(yùn)行
sudo apt-get upgrade bazel
3. 下載源碼
好了,終于到了下載源碼部分了沟涨,首先恤批,新建一個文件夾,比如AI裹赴,然后進(jìn)入到AI文件夾喜庞,使用git下載代碼。
git clone --recurse-submodules https://github.com/tensorflow/tensorflow.git
注意:--recurse-submodules
參數(shù)是用來防止后面出現(xiàn)的protobuf錯誤的棋返。
4. 配置本地環(huán)境
載好源碼后延都,會出現(xiàn)一個tensorflow的文件夾,這里面放著所有tensorflow的源碼睛竣,但是我們要關(guān)注的源碼位于..\AI\tensorflow\tensorflow\examples\android目錄下晰房。
1. 修改WORKSPACE文件
因?yàn)楸镜丨h(huán)境的不同,因此我們需要先修改/tensorflow目錄下的WORKSPACE文件,找到如下一段代碼射沟,對應(yīng)配置好你的sdk版本以及位置殊者,還有ndk的版本和位置,并且去掉注釋:
# 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 = "25.0.2",
# # Replace with path to Android SDK on your system
# path = "<PATH_TO_SDK>",
#)
#
# Android NDK r12b is recommended (higher may cause issues with Bazel)
#android_ndk_repository(
# name="androidndk",
# path="<PATH_TO_NDK>",
# # This needs to be 14 or higher to compile TensorFlow.
# # Note that the NDK version is not the API level.
# api_level=14)
比如我的就修改成了:
android_sdk_repository(
name = "androidsdk",
# 設(shè)置成你安裝sdk的最高版本验夯,對應(yīng)修改manifest.xml以及gradle的target
api_level = 23,
# Ensure that you have the build_tools_version below installed in the
# SDK manager as it updates periodically.
build_tools_version = "25.0.3",
# Replace with path to Android SDK on your system
path = "/home/cxq/android-sdk-linux",
)
# 推薦使用r12版本猖吴,更高的版本可能會造成bazel出錯
android_ndk_repository(
name="androidndk",
path="/home/cxq/android-sdk-linux/ndk-bundle",
# This needs to be 14 or higher to compile TensorFlow.
# Note that the NDK version is not the API level.
api_level=14)
注意:
- api_level需要設(shè)置成你本地sdk最高的版本,推薦23及以上簿姨,在android:build.gradle 以及AndroidManifest.xml也對應(yīng)修改targetSdkVersion
- ndk的版本距误,推薦使用r12,否則bazel編譯的時候會報(bào)錯扁位。
2. 構(gòu)建
進(jìn)入到AI/tensorflow目錄下准潭,輸入以下命令:
bazel build -c opt //tensorflow/examples/android:tensorflow_demo
如果有報(bào)protocol buffers的相關(guān)錯誤,運(yùn)行git submodule update --init
命令域仇,并且確保WORKSPACE文件配置對了
3. 安裝apk
開啟手機(jī)的調(diào)試模式刑然,運(yùn)行:
adb install -r bazel-bin/tensorflow/examples/android/tensorflow_demo.apk
4. 使用Android Studio
可以在Android Studio中直接打開tensorflow/examples/android,但是需要配置好你的gradle暇务、sdk泼掠、ndk
- gradle必須要在3.3以上版本
- build_tool_version需要指定在25以上
- 配置好你的ndk
- 很重要:在android:build.gradle 中配置好你的bazel路徑,默認(rèn)的是如下的:
def bazelLocation = '/usr/local/bin/bazel'
但是在該路徑下并沒有bazel垦细,因此會報(bào)如下錯誤:
Error:Execution failed for task ':buildNativeBazel'.
A problem occurred starting process 'command '/usr/local/bin/bazel''
此時只需要把路徑改成你的bazel路徑就好择镇,比如我的是:
def bazelLocation = '/usr/bin/bazel'
這樣配置完畢后,就能直接在AS中使用run去運(yùn)行了括改。