歡迎大家前往騰訊雲+社群,獲取更多騰訊海量技術實踐乾貨哦~
本專案探討如何將機器學習(Machine learning)應用到物聯網(IoT,Internet of Things)中。我們將使用 Android Things 作為我們的物聯網平臺,並且採用 Google TensorFlow 作為我們的機器學習引擎。如今,機器學習與物聯網都是技術話題中的大熱門。下面是維基百科上對機器學習的一個簡單定義:
機器學習是電腦科學中的一個領域,它使計算機系統能夠利用資料進行 “學習”(即逐步提高特定任務的效能),而不需要進行顯式程式設計(Explicitly programmed)。
換句話說,在進行訓練步驟以後,系統就可以預測結果(即使這不是專門為這些結果進行程式設計的)。另一方面,我們都瞭解物聯網以及連線裝置的概念。最有前途的話題之一便是如何將機器學習應用於物聯網之中,以構建能夠 “學習” 的專家系統。此外,該系統會運用這些知識來控制和管理實物。
下面列舉一些應用到機器學習,以及物聯網能產生重要價值的領域:
- 預測維護(Predictive maintenance)中的工業物聯網(IIoT,Industrial IoT)。
- 在消費者物聯網(Consumer IoT)中,機器學習可以使裝置變得更加智慧化,從而適應我們的習慣。
在本教程中,我們將探索如何使用 Android Things 和 TensorFlow 將機器學習應用到物聯網中。這一 Android Things 物聯網專案背後的基本思想就是,探索如何構建一個能夠識別一些基本形狀(比如箭頭)並被控制的機器人小車(Robot car)。我們已經介紹過如何使用 Android Things 構建機器人小車,我建議您在開始此專案之前先閱讀那篇教程。
本次機器學習和物聯網專案主要涵蓋以下主題:
- 如何使用 Docker 配置 TensorFlow 環境
- 如何訓練 TensorFlow 系統
- 如何整合 TensorFlow 與 Android Things
- 如何使用 TensorFlow 輸出結果來控制機器人小車
本專案衍生自 Android Things TensorFlow 影像分類器。
我們開始吧!
如何在 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 環境並增加(Mount)一些我們將在專案中使用到的目錄。
如何訓練 TensorFlow
在 Android Things 系統能夠識別影像之前,我們有必要先訓練 TensorFlow 引擎,以構建其模型。以此為由,收集一些圖片是有必要的。如前所述,我們希望使用箭頭來控制 Android Things 機器人小車 —— 所以我們必須收集至少四種型別的箭頭:
- 向上箭頭
- 向下箭頭
- 左箭頭
- 右箭頭
為訓練該系統,我們有必要對這四種不同的影像類別建立一個“知識庫”。在 /tf-data 中一個名為 images 的目錄下建立四個目錄,命名如下:
- up-arrow
- down-arrow
- left-arrow
- right-arrow
現在是時候去搜集影像資源了。我使用的是 Google 圖片搜尋,您也可以使用其他方法進行蒐集。為了簡化圖片下載過程,您應該安裝 Chrome 外掛,它能夠一鍵下載所有圖片。可別忘了,您下載的影像越多,其訓練過程(Training process)越好(即使建立模型的時間可能會有所增加)。
開啟瀏覽器,開始查詢以下四類影像:
每個類別我分別下載了 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]
複製程式碼
優化模型
在能夠使用這個 TensorFlow 模型到 Android Things 專案中之前,我們有必要優化它:
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"
複製程式碼
這就是我們的模型。我們將使用此模型將機器學習應用於物聯網(即整合 Android Things 與 TensorFlow)。其目標是為 Android Things 應用提供智慧識別箭頭影像,並作出相應反應,從而控制機器人小車的方向。
如果您想了解更多關於 TensorFlow 的細節,以及如何生成模型,請檢視官方文件和這個教程。
如何使用 Android Things 和 TensorFlow 將機器學習應用到物聯網中
一旦 TensorFlow 資料模型準備就緒,我們就可以進入下一步:如何整合 Android Things 與 TensorFlow。為達成這一目的,我們可以將此任務分為兩步:
- 硬體部分,我們將電機和其他外圍裝置(Peripheral)連線到 Android Things 板上
- 實現應用程式
Android Things 原理圖
在深入探討如何連線外圍裝置之前,我們先看看下面這個 Android Things 專案中使用的元件列表:
- Android Things 板(樹莓派 3,Raspberry Pi 3)
- 樹莓派相機
- 一個 LED 燈
- LN298N 雙H橋(用以控制電機)
- 帶兩個輪子的機器人小車底盤
我不在此介紹如何使用 Android Things 控制電機,因為我們已經在之前的文章中介紹過這一點。
以下是原理圖:
上圖中,相機元件並未表現出來。其最終的結果如下:
基於 TensorFlow 實現 Android Things App
最後一步便是實現 Android Things 應用程式。為此,我們可以重用 GitHub 上名為 TensorFlow 影像分類器示例的示例專案。在開始之前,先克隆 GitHub 倉庫,以便您可以修改原始碼。
該 Android Things 應用與原來的應用有所不同,在於:
- 它不使用按鈕來啟動相機捕捉影像
- 它使用不同的模型
- 它使用一個閃爍的 LED 進行通知,攝像機在 LED 停止閃爍後拍攝照片
- 它在 TensorFlow 檢測到影像(箭頭)時控制電機。此外,在從步驟 3 開始迴圈之前,先開啟電機 5 秒
要處理閃爍的 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 將機器學習應用到物聯網中。我們可以使用影像控制機器人小車,並根據顯示的影像移動機器人小車。
此文已由作者授權騰訊雲+社群釋出,更多原文請點選
搜尋關注公眾號「雲加社群」,第一時間獲取技術乾貨,關注後回覆1024 送你一份技術課程大禮包!
海量技術實踐經驗,盡在雲加社群!