91
技術社區[雲棲]
在安卓上運行TensorFlow:讓深度學習進入移動端
如果你關注我的前一篇帖子,並按照其中的內容實踐,你可能已經學會了如何在Linux上安裝一個GPU加速的TensorFlow,並構建了你自己的圖像分類器。老實講,在筆記本上對圖片進行分類是很花時間的:需要下載分類用的圖片,並在終端裏輸入很多行命令來運行分類。
不過,盡管沒有很多的公開資料,好消息是你也可以在有攝像頭的手機上運行TensofrFlow的Inception分類器,甚至是你自定義的分類器。然後你隻要把攝像頭對準你希望做分類的東西,TensorFlow就會告訴你它認為這是什麼東西。TensorFlow是可以在iOS和樹莓派上麵運行,不過在這個教程裏,我會介紹如何在安卓設備上運行TensorFlow。
我會一步一步地介紹如何在安卓設備上運行定製化的圖片分類器。實現這個功能需要很多步驟,而且其他地方沒有這樣的介紹,隻能通過反複地查看TensorFlow的GitHub論壇。我希望這篇帖子能幫你避免很多的麻煩。
◆ ◆ ◆
下載安卓的SDK和NDK
你可以在係統終端裏用下麵的命令下載安卓SDK並解壓縮到你的TensorFlow目錄裏。
$ 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編譯工具。我在開始為安卓5.1.1版下載開始後關掉了這個終端。
$ cd ~/tensorflow/android-sdk-linux
$ tools/android update sdk –no-ui
隨後你需要用下麵的命令下載安卓NDK,並解壓:
$ wget https://dl.google.com/android/repository/android-ndk-r12b-linux-x86_64.zip
$ unzip android-ndk-r12b-linux-x86_64.zip -d ~/tensorflow
◆ ◆ ◆
下載Inception
$ 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文件
為了使用安卓工具編譯我們的應用,需要修改WORKSPACE文件。
$ gedit ~/tensorflow/WORKSPACE
你可以拷貝下麵的代碼,並替換掉你的WORKSPACE文件裏的相應行。
android_sdk_repository(
name = “androidsdk”,
api_level = 24,
build_tools_version = “24.0.3”,
path = “android-sdk-linux”)
android_ndk_repository(
name=”androidndk”,
path=”android-ndk-r12b”,
api_level=21)
◆ ◆ ◆
開啟USB調試和adb工具
為了能用adb工具,你必須把你的手機設置成開發模式,並開啟USB調試功能。在開啟前,確認你的手機沒有通過USB和電腦連接,然後進行如下操作:
-
進入“設置”-“通用”-“我的手機”
-
進入“軟件信息”並連續按“版本號”7次
-
這樣就開啟了一個計數器,並會告訴你什麼時候你的手機已經進入了開發模式
-
進入“設置”-“通用”-“開發選項”
-
開啟USB調試
每一個安卓手機都是不同的,我的安卓版LG G4手機就必須在PTP模式下才能使用adb。你需要在設置後通過把手機連到電腦上來確認調試模式已經開啟。當連接後手機上出現“允許USB調試”,確保你選擇的是“總是允許從這個電腦”,並按下OK。
為了測試調試設置是否成功,可以把手機連上電腦,並用下麵的命令安裝adb,並測試設備:
$ sudo apt-get install android-tools-adb
$ adb devices
你應該能看到類似於下麵的響應內容:
◆ ◆ ◆
編譯APK
$ cd ~/tensorflow
$ bazel build //tensorflow/examples/android:tensorflow_demo
◆ ◆ ◆
安裝APK
這一步是唯一的我無法客觀測試的步驟。每個安卓設備都不一樣。如果你在這一步中碰到什麼問題,我建議你升級安卓到6.0版。對於我朋友的Moto G手機,就必須把下麵的命令裏麵的–g選項去掉:
$ adb install -r -g bazel-bin/tensorflow/examples/android/tensorflow_demo.apk
至此,你就可以在安卓設備上使用TensorFlow和Inception分類器了。我發現最有趣的是這個分類器偶爾出錯的時候。需要注意的是,原版的Inception分類器隻能識別ImageNet挑戰裏出現的1000種圖片分類。
◆ ◆ ◆
使用定製化的圖片分類器
為了能對我們自己的圖片來做分類,我們必須先用我們移動設備的圖片文件數據重新訓練,並把訓練結果放入assets目錄
首先我們要編譯圖片訓練優化器:
$ 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
◆ ◆ ◆
把訓練後的標簽放入assets目錄
$ 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
◆ ◆ ◆
重新安裝APL
$ adb install -r -g bazel-bin/tensorflow/examples/android/tensorflow_demo.apk
好的,到這時候我們就可以在安卓設備上使用定製化的分類器了!研究人員和愛好者可以利用這個技術來想出更多的點子並付諸實驗。例如我想到的一個點子:就是讓分類器能學會通過識別不健康的葉子來發現營養不良或者有植物病的植物。如果你想了解如何進一步壓縮圖片文件,以及在iPhone上做同樣的事,你可以關注這裏的Pete Warden的教程。
原文發布時間為:2016-11-12
本文來自雲棲社區合作夥伴“大數據文摘”,了解相關信息可以關注“BigDataDigest”微信公眾號
最後更新:2017-05-31 12:02:14