您好,登錄后才能下訂單哦!
這篇文章主要介紹怎么使用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 圖像識別器。為此,我們使用 Docker 去運行一個 TensorFlow 鏡像。以下是操作步驟:
1、 克隆 TensorFlow 倉庫:
git clone https://github.com/tensorflow/tensorflow.gitcd /tensorflowgit 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 環境,可以掛載一些在使用項目期間使用的目錄。
在 Android Things 系統能夠識別圖像之前,我們需要去訓練 TensorFlow 引擎,以使它能夠構建它的模型。為此,我們需要去收集一些圖像。正如前面所言,我們需要使用箭頭來控制 Android Things 無人駕駛汽車,因此,我們至少要收集四種類型的箭頭:
向上的箭頭
向下的箭頭
向左的箭頭
向右的箭頭
為訓練這個系統,需要使用這四類不同的圖像去創建一個“知識庫”。在 /tf-data
目錄下創建一個名為 images
的目錄,然后在它下面創建如下名字的四個子目錄:
up-arrow
down-arrow
left-arrow
right-arrow
現在,我們去找圖片。我使用的是 Google 圖片搜索,你也可以使用其它的方法。為了簡化圖片下載過程,你可以安裝一個 Chrome 下載插件,這樣你只需要點擊就可以下載選定的圖片。別忘了多下載一些圖片,這樣訓練效果更好,當然,這樣創建模型的時間也會相應增加。
擴展閱讀
如何使用 API 去集成 Android Things
如何與 Firebase 一起使用 Android Things
打開瀏覽器,開始去查找四種箭頭的圖片:
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 訓練過程產生的結果模型,而第二個文件包含了我們的四個圖片類相關的標簽。
如果你想去測試這個模型,去驗證它是否能按預期工作,你可以使用如下的命令:
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 以及如何生成模型的更多細節,請查看官方文檔以及這篇 教程。
TensorFlow 的數據模型準備就緒之后,我們繼續下一步:如何將 Android Things 與 TensorFlow 集成到一起。為此,我們將這個任務分為兩步來完成:
硬件部分,我們將把電機和其它部件連接到 Android Things 開發板上
實現這個應用程序
在深入到如何連接外圍部件之前,先列出在這個 Android Things 項目中使用到的組件清單:
Android Things 開發板(樹莓派 3)
樹莓派攝像頭
一個 LED 燈
LN298N 雙 H 橋電機驅動模塊(連接控制電機)
一個帶兩個輪子的無人駕駛汽車底盤
我不再重復 如何使用 Android Things 去控制電機 了,因為在以前的文章中已經講過了。
下面是示意圖:
Integrating Android Things with IoT
上圖中沒有展示攝像頭。最終成果如下圖:
Integrating Android Things with TensorFlow
***一步是實現 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 停止閃爍后,應用程序將捕獲圖片。
現在需要去關心如何根據檢測到的圖片去控制電機。修改這個方法:
@Overridepublic 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在物聯網上應用機器學習”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。