在安卓上執行TensorFlow:讓深度學習進入移動端

OReillyData發表於2016-11-07

編者注:想了解如何使用TensorFlow來執行你的機器學習工作流,請關注谷歌的Eli Bixby和Amy Unruh在2016年11月1到2日於舊金山舉辦的培訓課程。

如果你關注我的前一篇帖子,並按照其中的內容實踐,你可能已經學會了如何在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

你應該能看到類似於下面的響應內容:

640?wx_fmt=jpeg

 編譯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

重新安裝APK

$ adb install -r -g bazel-bin/tensorflow/examples/android/tensorflow_demo.apk

好的,到這時候我們就可以在安卓裝置上使用定製化的分類器了!研究人員和愛好者可以利用這個技術來想出更多的點子並付諸實驗。例如我想到的一個點子:就是讓分類器能學會通過識別不健康的葉子來發現營養不良或者有植物病的植物。如果你想了解如何進一步壓縮圖片檔案,以及在iPhone上做同樣的事,你可以關注這裡的Pete Warden的教程

希望我已經能激勵到你,讓你等不及開始要想出一些新點子了。請關注我的推特賬號@wagonhelm或主題#TensorFlow,並分享你的想法。

640?wx_fmt=jpeg

Justin Francis

Justin居住在加拿大西海岸的一個小農場。這個農場專注於樸門道德和設計的農藝。在此之前,他是一個非營利性社群合作社自行車商店的創始人和教育者。在過去的兩年中,他住在一艘帆船上,全職探索和體驗加拿大的喬治亞海峽。但現在他的主要精力都放在了學習機器學習。

640?wx_fmt=png

相關文章