https://www.survivingwithandroid.com/2018/03/apply-machine-learning-iot-using-android-things-tensorflow.html
作者 | Francesco Azzola
譯者 | qhwdw 共計翻譯:140 篇 貢獻時間:270 天
探索如何將 Android Things 與 Tensorflow 整合起來,以及如何應用機器學習到物聯網系統上。學習如何在裝有 Android Things 的樹莓派上使用 Tensorflow 進行圖片分類。
這個專案探索瞭如何將機器學習應用到物聯網上。具體來說,物聯網平臺我們將使用 Android Things,而機器學習引擎我們將使用 Google TensorFlow。
現如今,Android Things 處於名為 Android Things 1.0 的穩定版本,已經可以用在生產系統中了。如你可能已經知道的,樹莓派是一個可以支援 Android Things 1.0 做開發和原型設計的平臺。本教程將使用 Android Things 1.0 和樹莓派,當然,你可以無需修改程式碼就能換到其它所支援的平臺上。這個教程是關於如何將機器學習應用到物聯網的,這個物聯網平臺就是 Android Things Raspberry Pi。
物聯網上的機器學習是最熱門的話題之一。要給機器學習一個最簡單的定義,可能就是 維基百科上的定義[1]:
機器學習是電腦科學中,讓計算機不需要顯式程式設計就能去“學習”(即,逐步提升在特定任務上的效能)使用資料的一個領域。
換句話說就是,經過訓練之後,那怕是它沒有針對它們進行特定的程式設計,這個系統也能夠預測結果。另一方面,我們都知道物聯網和聯網裝置的概念。其中前景最看好的領域之一就是如何在物聯網上應用機器學習,構建專家系統,這樣就能夠去開發一個能夠“學習”的系統。此外,還可以使用這些知識去控制和管理物理物件。在深入瞭解 Android Things 的細節之前,你應該先將其安裝在你的裝置上。如果你是第一次使用 Android Things,你可以閱讀一下這篇如何在你的裝置上安裝 Android Things[2] 的教程。
這裡有幾個應用機器學習和物聯網產生重要價值的領域,以下僅提到了幾個有趣的領域,它們是:
在本教程中,我們希望去探索如何使用 Android Things 和 TensorFlow 在物聯網上應用機器學習。這個 Adnroid Things 物聯網專案的基本想法是,探索如何去構建一個能夠識別前方道路上基本形狀(比如箭頭)並控制其道路方向的無人駕駛汽車。我們已經介紹了 如何使用 Android Things 去構建一個無人駕駛汽車[3],因此,在開始這個專案之前,我們建議你去閱讀那個教程。
這個機器學習和物聯網專案包含如下的主題:
這個專案起源於 Android Things TensorFlow 影象分類器[4]。
我們開始吧!
如何使用 Tensorflow 影象識別
在開始之前,需要安裝和配置 TensorFlow 環境。我不是機器學習方面的專家,因此,我需要找到一些快速而能用的東西,以便我們可以構建 TensorFlow 影象識別器。為此,我們使用 Docker 去執行一個 TensorFlow 映象。以下是操作步驟:
1、 克隆 TensorFlow 倉庫:
git clone https://github.com/tensorflow/tensorflow.git
cd /tensorflow
git checkout v1.5.0
2、 建立一個目錄(/tf-data
),它將用於儲存這個專案中使用的所有檔案。
3、 執行 Docker:
docker run -it \
--volume /tf-data:/tf-data \
--volume /tensorflow:/tensorflow \
--workdir /tensorflow tensorflow/tensorflow:1.5.0 bash
使用這個命令,我們執行一個互動式 TensorFlow 環境,可以掛載一些在使用專案期間使用的目錄。
如何訓練 TensorFlow 去識別影象
在 Android Things 系統能夠識別影象之前,我們需要去訓練 TensorFlow 引擎,以使它能夠構建它的模型。為此,我們需要去收集一些影象。正如前面所言,我們需要使用箭頭來控制 Android Things 無人駕駛汽車,因此,我們至少要收集四種型別的箭頭:
為訓練這個系統,需要使用這四類不同的影象去建立一個“知識庫”。在 /tf-data
目錄下建立一個名為 images
的目錄,然後在它下麵建立如下名字的四個子目錄:
up-arrow
down-arrow
left-arrow
right-arrow
現在,我們去找圖片。我使用的是 Google 圖片搜尋,你也可以使用其它的方法。為了簡化圖片下載過程,你可以安裝一個 Chrome 下載外掛,這樣你只需要點選就可以下載選定的圖片。別忘了多下載一些圖片,這樣訓練效果更好,當然,這樣建立模型的時間也會相應增加。
擴充套件閱讀
開啟瀏覽器,開始去查詢四種箭頭的圖片:
TensorFlow image classifier
每個類別我下載了 80 張圖片。不用管圖片檔案的副檔名。
為所有類別的圖片做一次如下的操作(在 Docker 介面下):
python /tensorflow/examples/image_retraining/retrain.py \
--bottleneck_dir=tf_files/bottlenecks \
--how_many_training_steps=4000 \
--output_graph=/tf-data/retrained_graph.pb \
--output_labels=/tf-data/retrained_labels.txt \
--image_dir=/tf-data/images
這個過程你需要耐心等待,它需要花費很長時間。結束之後,你將在 /tf-data
目錄下發現如下的兩個檔案:
retrained_graph.pb
retrained_labels.txt
第一個檔案包含了 TensorFlow 訓練過程產生的結果模型,而第二個檔案包含了我們的四個圖片類相關的標簽。
如何測試 Tensorflow 模型
如果你想去測試這個模型,去驗證它是否能按預期工作,你可以使用如下的命令:
python scripts.label_image \
--graph=/tf-data/retrained-graph.pb \
--image=/tf-data/images/[category]/[image_name.jpg]
最佳化模型
在 Android Things 專案中使用我們的 TensorFlow 模型之前,需要去最佳化它:
python /tensorflow/python/tools/optimize_for_inference.py \
--input=/tf-data/retrained_graph.pb \
--output=/tf-data/opt_graph.pb \
--input_names="Mul" \
--output_names="final_result"
那個就是我們全部的模型。我們將使用這個模型,把 TensorFlow 與 Android Things 整合到一起,在物聯網或者更多工上應用機器學習。標的是使用 Android Things 應用程式智慧識別箭頭圖片,並反應到接下來的無人駕駛汽車的方向控制上。
如果你想去瞭解關於 TensorFlow 以及如何生成模型的更多細節,請檢視官方檔案以及這篇 教程[7]。
如何使用 Android Things 和 TensorFlow 在物聯網上應用機器學習
TensorFlow 的資料模型準備就緒之後,我們繼續下一步:如何將 Android Things 與 TensorFlow 整合到一起。為此,我們將這個任務分為兩步來完成:
Android Things 示意圖
在深入到如何連線外圍部件之前,先列出在這個 Android Things 專案中使用到的元件清單:
我不再重覆 如何使用 Android Things 去控制電機[3] 了,因為在以前的文章中已經講過了。
下麵是示意圖:
Integrating Android Things with IoT
上圖中沒有展示攝像頭。最終成果如下圖:
Integrating Android Things with TensorFlow
使用 TensorFlow 實現 Android Things 應用程式
最後一步是實現 Android Things 應用程式。為此,我們可以復用 Github 上名為 TensorFlow 圖片分類器示例[4] 的示例程式碼。開始之前,先克隆 Github 倉庫,這樣你就可以修改原始碼。
這個 Android Things 應用程式與原始的應用程式是不一樣的,因為:
為了讓 LED 閃爍,使用如下的程式碼:
private Handler blinkingHandler = new Handler();
private Runnable blinkingLED = new Runnable() {
@Override
public void run() {
try {
// If the motor is running the app does not start the cam
if (mc.getStatus())
return ;
Log.d(TAG, "Blinking..");
mReadyLED.setValue(!mReadyLED.getValue());
if (currentValue <= NUM_OF_TIMES) {
currentValue++;
blinkingHandler.postDelayed(blinkingLED,
BLINKING_INTERVAL_MS);
}
else {
mReadyLED.setValue(false);
currentValue = 0;
mBackgroundHandler.post(mBackgroundClickHandler);
}
} catch (IOException e) {
e.printStackTrace();
}
}
};
當 LED 停止閃爍後,應用程式將捕獲圖片。
現在需要去關心如何根據檢測到的圖片去控制電機。修改這個方法:
@Override
public void onImageAvailable(ImageReader reader) {
final Bitmap bitmap;
try (Image image = reader.acquireNextImage()) {
bitmap = mImagePreprocessor.preprocessImage(image);
}
final List<Classifier.Recognition> results =
mTensorFlowClassifier.doRecognize(bitmap);
Log.d(TAG,
"Got the following results from Tensorflow: " + results);
// Check the result
if (results == null || results.size() == 0) {
Log.d(TAG, "No command..");
blinkingHandler.post(blinkingLED);
return ;
}
Classifier.Recognition rec = results.get(0);
Float confidence = rec.getConfidence();
Log.d(TAG, "Confidence " + confidence.floatValue());
if (confidence.floatValue() < 0.55) {
Log.d(TAG, "Confidence too low..");
blinkingHandler.post(blinkingLED);
return ;
}
String command = rec.getTitle();
Log.d(TAG, "Command: " + rec.getTitle());
if (command.indexOf("down") != -1)
mc.backward();
else if (command.indexOf("up") != -1)
mc.forward();
else if (command.indexOf("left") != -1)
mc.turnLeft();
else if (command.indexOf("right") != -1)
mc.turnRight();
}
在這個方法中,當 TensorFlow 傳回捕獲的圖片匹配到的可能的標簽之後,應用程式將比較這個結果與可能的方向,並因此來控制電機。
最後,將去使用前面建立的模型了。複製 assets
檔案夾下的 opt_graph.pb
和 reatrained_labels.txt
去替換現在的檔案。
開啟 Helper.java
並修改如下的行:
public static final int IMAGE_SIZE = 299;
private static final int IMAGE_MEAN = 128;
private static final float IMAGE_STD = 128;
private static final String LABELS_FILE = "retrained_labels.txt";
public static final String MODEL_FILE = "file:///android_asset/opt_graph.pb";
public static final String INPUT_NAME = "Mul";
public static final String OUTPUT_OPERATION = "output";
public static final String OUTPUT_NAME = "final_result";
執行這個應用程式,並給攝像頭展示幾種箭頭,以檢查它的反應。無人駕駛汽車將根據展示的箭頭進行移動。
總結
教程到此結束,我們講解瞭如何使用 Android Things 和 TensorFlow 在物聯網上應用機器學習。我們使用圖片去控制無人駕駛汽車的移動。
via: https://www.survivingwithandroid.com/2018/03/apply-machine-learning-iot-using-android-things-tensorflow.html
作者:Francesco Azzola[9] 譯者:qhwdw 校對:wxy
本文由 LCTT 原創編譯,Linux中國 榮譽推出