當前位置:
首頁 > 知識 > 如何使用 Android Things 和 TensorFlow 在物聯網上應用機器學習

如何使用 Android Things 和 TensorFlow 在物聯網上應用機器學習

如何使用 Android Things 和 TensorFlow 在物聯網上應用機器學習


編譯自: https://www.survivingwithandroid.com/2018/03/apply-machine-learning-iot-using-android-things-tensorflow.html

作者: Francesco Azzola

譯者: qhwdw

探索如何將 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。

物聯網上的機器學習是最熱門的話題之一。要給機器學習一個最簡單的定義,可能就是 維基百科上的定義 :


機器學習是計算機科學中,讓計算機不需要顯式編程就能去「學習」(即,逐步提升在特定任務上的性能)使用數據的一個領域。

換句話說就是,經過訓練之後,那怕是它沒有針對它們進行特定的編程,這個系統也能夠預測結果。另一方面,我們都知道物聯網和聯網設備的概念。其中前景最看好的領域之一就是如何在物聯網上應用機器學習,構建專家系統,這樣就能夠去開發一個能夠「學習」的系統。此外,還可以使用這些知識去控制和管理物理對象。在深入了解 Android Things 的細節之前,你應該先將其安裝在你的設備上。如果你是第一次使用 Android Things,你可以閱讀一下這篇 如何在你的設備上安裝 Android Things 的教程。

這裡有幾個應用機器學習和物聯網產生重要價值的領域,以下僅提到了幾個有趣的領域,它們是:

  • 在工業物聯網(IIoT)中的預見性維護
  • 消費物聯網中,機器學習可以讓設備更智能,它通過調整使設備更適應我們的習慣

在本教程中,我們希望去探索如何使用 Android Things 和 TensorFlow 在物聯網上應用機器學習。這個 Adnroid Things 物聯網項目的基本想法是,探索如何去構建一個能夠識別前方道路上基本形狀(比如箭頭)並控制其道路方向的無人駕駛汽車。我們已經介紹了 如何使用 Android Things 去構建一個無人駕駛汽車 ,因此,在開始這個項目之前,我們建議你去閱讀那個教程。

這個機器學習和物聯網項目包含如下的主題:

  • 如何使用 Docker 配置 TensorFlow 環境
  • 如何訓練 TensorFlow 系統
  • 如何使用 Android Things 去集成 TensorFlow
  • 如何使用 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 環境,可以掛載一些在使用項目期間使用的目錄。


如何訓練 TensorFlow 去識別圖像

在 Android Things 系統能夠識別圖像之前,我們需要去訓練 TensorFlow 引擎,以使它能夠構建它的模型。為此,我們需要去收集一些圖像。正如前面所言,我們需要使用箭頭來控制 Android Things 無人駕駛汽車,因此,我們至少要收集四種類型的箭頭:

  • 向上的箭頭
  • 向下的箭頭
  • 向左的箭頭
  • 向右的箭頭

為訓練這個系統,需要使用這四類不同的圖像去創建一個「知識庫」。在 /tf-data 目錄下創建一個名為 images 的目錄,然後在它下面創建如下名字的四個子目錄:

  • up-arrow
  • down-arrow
  • left-arrow
  • right-arrow

現在,我們去找圖片。我使用的是 Google 圖片搜索,你也可以使用其它的方法。為了簡化圖片下載過程,你可以安裝一個 Chrome 下載插件,這樣你只需要點擊就可以下載選定的圖片。別忘了多下載一些圖片,這樣訓練效果更好,當然,這樣創建模型的時間也會相應增加。

擴展閱讀

  • 如何使用 API 去集成 Android Things
  • 如何與 Firebase 一起使用 Android Things

打開瀏覽器,開始去查找四種箭頭的圖片:

如何使用 Android Things 和 TensorFlow 在物聯網上應用機器學習

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 目錄下發現如下的兩個文件:

  1. retrained_graph.pb
  2. 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 以及如何生成模型的更多細節,請查看官方文檔以及這篇 教程 。


如何使用 Android Things 和 TensorFlow 在物聯網上應用機器學習

TensorFlow 的數據模型準備就緒之後,我們繼續下一步:如何將 Android Things 與 TensorFlow 集成到一起。為此,我們將這個任務分為兩步來完成:

  1. 硬體部分,我們將把電機和其它部件連接到 Android Things 開發板上
  2. 實現這個應用程序

Android Things 示意圖

在深入到如何連接外圍部件之前,先列出在這個 Android Things 項目中使用到的組件清單:

  1. Android Things 開發板(樹莓派 3)
  2. 樹莓派攝像頭
  3. 一個 LED 燈
  4. LN298N 雙 H 橋電機驅動模塊(連接控制電機)
  5. 一個帶兩個輪子的無人駕駛汽車底盤

我不再重複 如何使用 Android Things 去控制電機 了,因為在以前的文章中已經講過了。

下面是示意圖:

如何使用 Android Things 和 TensorFlow 在物聯網上應用機器學習

Integrating Android Things with IoT

上圖中沒有展示攝像頭。最終成果如下圖:

如何使用 Android Things 和 TensorFlow 在物聯網上應用機器學習

Integrating Android Things with TensorFlow

使用 TensorFlow 實現 Android Things 應用程序

最後一步是實現 Android Things 應用程序。為此,我們可以復用 Github 上名為 TensorFlow 圖片分類器示例 的示例代碼。開始之前,先克隆 Github 倉庫,這樣你就可以修改源代碼。

這個 Android Things 應用程序與原始的應用程序是不一樣的,因為:

  1. 它不使用按鈕去開啟攝像頭圖像捕獲
  2. 它使用了不同的模型
  3. 它使用一個閃爍的 LED 燈來提示,攝像頭將在 LED 停止閃爍後拍照
  4. 當 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 在物聯網上應用機器學習。我們使用圖片去控制無人駕駛汽車的移動。



via: https://www.survivingwithandroid.com/2018/03/apply-machine-learning-iot-using-android-things-tensorflow.html

作者: Francesco Azzola 譯者: qhwdw 校對: wxy

本文由 LCTT 原創編譯, Linux中國 榮譽推出


點擊「了解更多」可訪問文內鏈接

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Linux技術 的精彩文章:

3 款 Linux 桌面的日記程序
命令行中的世界盃

TAG:Linux技術 |