這是我的第一篇部落格,在參考別人的部落格進行安裝的過程中,針對我的平台系統,遇到了很多的問題,在這裡寫出我的實踐曆程以及所遇到的問題。
對於給予借鑒的博主的文章,在這裡表達感謝。
對於此博文,如有寫的不好之處或者有誤的地方,因為本人水平有限,以及遇到的問題的局限性,不能一一兼顧,請給予諒解,並希望得到好的建議,對於好的建議我會加以修改,謝謝。
本博文為作者原創,轉載請註明出處,謝謝。
Linux環境和Android平台
1. Ubuntu 16.04/16.10
2. Vivo手機
3. Android 5.1
Tensorflow 環境安裝(對於僅限Tensorflow demo 在Android平台上的移植可以不裝)
安裝具體流程可以借鑒以下兩個部落格
http://www.linuxidc.com/Linux/2016-11/137561.htm
http://blog.csdn.net/zhaoyu106/article/details/52793183/
。。注意,具體安裝流程可以參照以上兩個部落格中的任何一個,Linux系統可能不一樣,但安裝方式大同小異。但最重要的是要主要第二個部落格中提到的gcc版本降級的問題,
因為暫時tensorflow GPU只能在gcc 5.0及以下版本中正常使用。
Android平台移植具體流程
1.安裝 Java 1.8 2.安裝 bazel 3.下載tensorflow源碼 4.安裝 Android SDK 5.安裝 Android NDK 6.下載tensorflow 模型 7.開啟手機開發這模式,安裝adb 8.bazel編譯,下載到Android手機 9.實測結果
1.安裝 Java 1.8
$ sudo apt-get installsoftware-properties-common$ sudo add-apt-repositoryppa:webupd8team/java$ sudo apt-get update$ sudo apt-get installoracle-java8-installer
裝好後,配置Java環境變數,將下面的內容添加到/etc/environment:
$JAVA_HOME="/usr/lib/jvm/java-8-oracle"
最好能夠找一個網路穩定,又快的網,又不會花很多時間。作者自己在安裝的過程中就是因為用了一個非常慢的網,下了很長時間,而且有一次還因為卡頓,直接終止掉下載,然後重新下載的時候,就報各種錯誤。因為中途停止下載,所以會有記錄和殘留。我的方法是清除掉已經下載的,卸載得非常乾淨後,重新下載就可以了。
遇到如下的報錯:
Download done.sha256summismatchjdk-8u131-linux-x64.tar.gzOracle JDK 8 isNOT installed.dpkg:清理時出錯: 子進程 已安裝 post-installation指令碼 返回了錯誤號碼 1在處理時有錯誤發生: oracle-java8-installer
解決方案如下:
終端輸入 ps -aux ,列出進程。找到含有apt‘-get的進程,直接sudo kill PID。解決。
強制解鎖,命令
$ sudo rm/var/cache/apt/archives/lock$ sudo rm /var/lib/dpkg/lock$ sudo kill 4250$ sudo lsof/var/cache/debconf/config.dat$ sudo apt-get remove orcacle-java8-installer* #卸載掉所有相關的東西$ sudo apt-get autoremove$ sudo apt-getautoclean$ sudo apt-get clean
以上的指令對於中途終止安裝過程中後遇到的問題應該都可以解決的。解決後,重新安裝java1.8即可。
2.安裝 bazel
$ echo "deb [arch=amd64]http://storage.googleapis.com/bazel-apt stable jdk1.8" | sudo tee /etc/apt/sources.list.d/bazel.list$ curlhttps://bazel.io/bazel-release.pub.gpg | sudo apt-key add -$ sudo apt-get update&& sudo apt-get install bazel$ sudo apt-get upgrade bazel
對於詳細的說明可以參考 bazel 的官方文檔。
3.下載tensorflow源碼
$ cd ~/ #進入到使用者目錄下$ git clone https://github.com/tensorflow/tensorflow.git #從github上複製github源碼。沒有git和git 環境的Linux環境的讀者,請先自行安裝
4.安裝 Android SDK(Software Development Kit)
$ wget https://dl.google.com/android/android-sdk_r24.4.1-linux.tgz$ tar xvzf android-sdk_r24.4.1-linux.tgz-C ~/tensorflow #解壓到tensorflow源碼的檔案下,只是方便管理,其他目錄也可以。
5.安裝 Android NDK(Native Development Kit)
$ wget https://dl.google.com/android/repository/android-ndk-r12b-linux-x86_64.zip$ unzipandroid-ndk-r12b-linux-x86_64.zip -d ~/tensorflow #必須保證ndk為至少r12
6.下載tensorflow 模型
$ cd ~/tensorflow$wgethttps://storage.googleapis.com/download.tensorflow.org/models/inception5h.zip-O/tmp/inception5h.zip$ wgethttp://storage.googleapis.com/download.tensorflow.org/models/mobile_multibox_v1a.zip-O/tmp/mobile_multibox_vla.zip$wgethttp://storage.googleapis.com/download.tensorflow.org/models/stylize_v1.zip-O/tmp/stylize_v1.zip$ unzip /tmp/inception5h.zip-dtensorflow/examples/android/assets/$ unzip/tmp/mobile_multibox_vla.zip -dtensorflow/examples/android/assets/$ unzip/tmp/stylize_v1.zip-dtensorflow/examples/android/assets/
以上下載了三個模型。
下載的模型連結隨著tensorflow android 項目版本的更新可能會有變動,具體版本對應的連結請參考tensorflow根目錄下的WORKSPACE檔案,它其中標明了當前項目版本對應的模型下載連結。
解壓完畢後,開啟//tensorflow/examples/android/BUILD檔案,找到以 android_binary 開頭的那段代碼片,將assets = [ ] 內以@開頭的三句代碼用#號 注釋掉,如下圖已經標註需要注釋掉部分所示。
android_binary( name = "tensorflow_demo", srcs = glob([ "src/**/*.java", ]), #Package assets from assets dir as well asall model targets. Remove undesiredmodels #(and corresponding Activities in source)to reduce APK size. #Modified by Hedlen 03/06/2017 ###需要注釋掉的地方######## assets = [ "//tensorflow/examples/android/assets:asset_files", ":external_assets", ], assets_dir = "", ###到這裡結束############ custom_package ="org.tensorflow.demo", inline_constants = 1, manifest = "AndroidManifest.xml", manifest_merger = "legacy", resource_files =glob(["res/**"]), tags = [ "manual", "notap", ], deps = [ ":tensorflow_native_libs", "//tensorflow/contrib/android:android_tensorflow_inference_java", ],)
。。 注意 :如果不注釋掉該段內容,即使手動將模型放在assets檔案中,使用bazel編譯時間也會重新下載模型。
修改 WORKSPACE
$ gedit ~/tensorflow/WORKSPACE
在我的安裝的版本下的WORKSPACE的內容是:
# Uncomment and update thepaths in theseentries to build the Android demo.android_sdk_repository( name = "androidsdk", api_level = 26, #Ensure that you have thebuild_tools_version below installed in the #SDK manager as it updates periodically. build_tools_version = "25.0.0", #Replace with path to Android SDK on yoursystem path ="/home/qw/tensorflow/android-sdk-linux",)## Android NDK r12b isrecommended (highermay cause issues with Bazel)android_ndk_repository( name="androidndk", path="/home/qw/tensorflow/android-ndk-r12b", #This needs to be 14 or higher to compileTensorFlow. #Note that the NDK version is not the APIlevel. #api_level=14 api_level=24)
反注釋 android_sdk_repository和 android_ndk_repository部分,用上面的內容替換。
以上內容我已經反注釋了。
注意。。 針對這裡的版本問題,比如SDK版本可以在~/android-sdk-linux的路徑下的platforms 和build-tools檔案夾下可以查看對應版本號碼。
我安裝的Android SDK 對應安裝的build-tools 檔案夾下只有一個版本26.0.0,在後面的bael 編譯過程中會報錯 Error: Missing input file .~/26.0.0檔案下缺失檔案apksigner.jar。後來通過安裝Android Studio 重新下載了25.0.0版本(檔案內帶有apksigner.jar ,應該是簽名發布用)的build-tools 並添加到~/android-sdk-linux的路徑下build-tools檔案夾,並修改WORKSPACE檔案的對應的build-tools版本為25.0.0後面,錯誤得到解決。
注意。。 需要將下的檔案中的內容 改成:
defnativeBuildSystem = 'none'defbazelLocation = '/usr/bin/bazel'
可以參考 Android SDK & NDK (https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/android/README.md)
一開始的路徑是/usr/bin/local/bazel,對於我的電腦是/usr/bin/bazel,對於不知道bazel路徑的讀者,可以用
$locate bazel
查看本機電腦的bazel的路徑
7.開啟手機開發這模式,安裝adb(Android Debug Bridge)
安裝adb
$ sudoapt-get install adb
開啟Android手機開發人員模式並允許調試不同手機設定不一樣,請具體參考各手機的開啟檔案。
adb 檢測串連狀態
$ sudoadb devices
顯示如下即為正常串連:
Listof devices attachedxxxx device
8.bazel編譯,下載到Android手機
$ cd~/tensorflow #進入tensorflow源碼的路徑下,編譯才行,如果不進入該目錄下需要指定絕對路徑$bazel build //tensorflow/examples/android:tensorflow_demo
編譯成功後會有如下結果:
bazel-bin/tensorflow/examples/android/tensorflow_demo_deploy.jarbazel-bin/tensorflow/examples/android/tensorflow_demo_unsigned.apkbazel-bin/tensorflow/examples/android/tensorflow_demo.apk
如果沒有以上的結果,或者中間有報錯,請檢查如WORKSPACE等檔案的配置是否正確。
將apk檔案下載到Android手機:
$ adb install -r bazel-bin/tensorflow/examples/android/tensorflow_demo.apk
安裝過程中會提示是否安裝,選擇OK即可。
在手機上會安裝三個apk,具體如下圖
9.實測結果
TF Classify
TF Detect
TF Stylize
10.總結
這是我的第一篇部落格,因為第一寫,花費了很多時間,而且寫得並不是很好。但以後會繼續完善和改正。對於這篇部落格當中的應用,在自己玩了有段時間tensorflow,現正在做一個paper複現,在github上開源。已經做得差不多了,現在就想將自己訓練好的模型移植到Android上,看看在實際的情境,檢驗下自己模型的準確性。