本項目探討如何將機(jī)器學(xué)習(xí)(Machine learning)應(yīng)用到物聯(lián)網(wǎng)(IoT,Internet of Things)中。我們將使用 Android Things 作為我們的物聯(lián)網(wǎng)平臺,并且采用 Google TensorFlow 作為我們的機(jī)器學(xué)習(xí)引擎。如今,機(jī)器學(xué)習(xí)與物聯(lián)網(wǎng)都是技術(shù)話題中的大熱門。
下面是維基百科上對機(jī)器學(xué)習(xí)的一個簡單定義:
機(jī)器學(xué)習(xí)是計算機(jī)科學(xué)中的一個領(lǐng)域,它使計算機(jī)系統(tǒng)能夠利用數(shù)據(jù)進(jìn)行 “學(xué)習(xí)”(即逐步提高特定任務(wù)的性能),而不需要進(jìn)行顯式編程(Explicitly programmed)。
換句話說,在進(jìn)行訓(xùn)練步驟以后,系統(tǒng)就可以預(yù)測結(jié)果(即使這不是專門為這些結(jié)果進(jìn)行編程的)。另一方面,我們都了解物聯(lián)網(wǎng)以及連接設(shè)備的概念。最有前途的話題之一便是如何將機(jī)器學(xué)習(xí)應(yīng)用于物聯(lián)網(wǎng)之中,以構(gòu)建能夠 “學(xué)習(xí)” 的專家系統(tǒng)。此外,該系統(tǒng)會運用這些知識來控制和管理實物。
下面列舉一些應(yīng)用到機(jī)器學(xué)習(xí),以及物聯(lián)網(wǎng)能產(chǎn)生重要價值的領(lǐng)域:
-
預(yù)測維護(hù)(Predictive maintenance)中的工業(yè)物聯(lián)網(wǎng)(IIoT,Industrial IoT)。
-
在消費者物聯(lián)網(wǎng)(Consumer IoT)中,機(jī)器學(xué)習(xí)可以使設(shè)備變得更加智能化,從而適應(yīng)我們的習(xí)慣。
在本教程中,我們將探索如何使用 Android Things 和 TensorFlow 將機(jī)器學(xué)習(xí)應(yīng)用到物聯(lián)網(wǎng)中。這一 Android Things 物聯(lián)網(wǎng)項目背后的基本思想就是,探索如何構(gòu)建一個能夠識別一些基本形狀(比如箭頭)并被控制的機(jī)器人小車(Robot car)。我們已經(jīng)介紹過如何使用 Android Things 構(gòu)建機(jī)器人小車,我建議您在開始此項目之前先閱讀那篇教程。
本次機(jī)器學(xué)習(xí)和物聯(lián)網(wǎng)項目主要涵蓋以下主題:
-
如何使用 Docker 配置 TensorFlow 環(huán)境
-
如何訓(xùn)練 TensorFlow 系統(tǒng)
-
如何集成 TensorFlow 與 Android Things
-
如何使用 TensorFlow 輸出結(jié)果來控制機(jī)器人小車
本項目衍生自 Android Things TensorFlow 圖像分類器。
我們開始吧!
如何在 Tensorflow 中創(chuàng)建一個圖像分類器
在開始之前,我們有必要先安裝并配置好 TensorFlow 環(huán)境。我并非機(jī)器學(xué)習(xí)專家,所以我需要找一些速成的東西并準(zhǔn)備好使用,以便我們可以構(gòu)建 TensorFlow 圖像分類器。因此,我們可以使用 Docker 來運行一個搭載了 TensorFlow 的映像。照著以下步驟進(jìn)行:
1. 克隆 TensorFlow 倉庫:
gitclonehttps://github.com/tensorflow/tensorflow.git cd/tensorflow gitcheckoutv1.5.0
2. 創(chuàng)建一個目錄(/tf-data),該目錄將保存我們在項目中需要用到的所有文件。
3. 運行 Docker:
dockerrun-it\--volume/tf-data:/tf-data\--volume/tensorflow:/tensorflow\ --workdir/tensorflowtensorflow/tensorflow:1.5.0bash
使用這些命令,我們就可以運行一個交互式 TensorFlow 環(huán)境并增加(Mount)一些我們將在項目中使用到的目錄。
如何訓(xùn)練 TensorFlow
在 Android Things 系統(tǒng)能夠識別圖像之前,我們有必要先訓(xùn)練 TensorFlow 引擎,以構(gòu)建其模型。以此為由,收集一些圖片是有必要的。如前所述,我們希望使用箭頭來控制 Android Things 機(jī)器人小車 —— 所以我們必須收集至少四種類型的箭頭:
-
向上箭頭
-
向下箭頭
-
左箭頭
-
右箭頭
為訓(xùn)練該系統(tǒng),我們有必要對這四種不同的圖像類別創(chuàng)建一個“知識庫”。在 /tf-data 中一個名為 images 的目錄下創(chuàng)建四個目錄,命名如下:
-
up-arrow
-
down-arrow
-
left-arrow
-
right-arrow
現(xiàn)在是時候去搜集圖像資源了。我使用的是 Google 圖片搜索,您也可以使用其他方法進(jìn)行搜集。為了簡化圖片下載過程,您應(yīng)該安裝 Chrome 插件,它能夠一鍵下載所有圖片。可別忘了,您下載的圖像越多,其訓(xùn)練過程(Training process)越好(即使創(chuàng)建模型的時間可能會有所增加)。
打開瀏覽器,開始查找以下四類圖像:
每個類別我分別下載了 80 張圖。我并不關(guān)心圖片的擴(kuò)展。
一旦所有類別都有其圖像,請按照以下步驟操作(在 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 中應(yīng)有兩個文件:
-
retrained_graph.pb
-
retrained_labels.txt
第一個文件包含我們的模型,這是 TensorFlow 訓(xùn)練過程的結(jié)果。而第二個文件則包含了與我們的四個圖像類別相關(guān)的標(biāo)簽。
如何測試 Tensorflow 模型
如果你想測試模型,以檢查一切是否正常,你可以使用以下命令:
pythonscripts.label_image\ --graph=/tf-data/retrained-graph.pb\ --image=/tf-data/images/[category]/[image_name.jpg]
優(yōu)化模型
在能夠使用這個 TensorFlow 模型到 Android Things 項目中之前,我們有必要優(yōu)化它:
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"
這就是我們的模型。我們將使用此模型將機(jī)器學(xué)習(xí)應(yīng)用于物聯(lián)網(wǎng)(即集成 Android Things 與 TensorFlow)。其目標(biāo)是為 Android Things 應(yīng)用提供智能識別箭頭圖像,并作出相應(yīng)反應(yīng),從而控制機(jī)器人小車的方向。
如果您想了解更多關(guān)于 TensorFlow 的細(xì)節(jié),以及如何生成模型,請查看官方文檔和這個教程。
如何使用 Android Things 和 TensorFlow 將機(jī)器學(xué)習(xí)應(yīng)用到物聯(lián)網(wǎng)中
一旦 TensorFlow 數(shù)據(jù)模型準(zhǔn)備就緒,我們就可以進(jìn)入下一步:如何集成 Android Things 與 TensorFlow。為達(dá)成這一目的,我們可以將此任務(wù)分為兩步:
-
硬件部分,我們將電機(jī)和其他外圍設(shè)備(Peripheral)連接到 Android Things 板上
-
實現(xiàn)應(yīng)用程序
Android Things 原理圖
在深入探討如何連接外圍設(shè)備之前,我們先看看下面這個 Android Things 項目中使用的組件列表:
我不在此介紹如何使用 Android Things 控制電機(jī),因為我們已經(jīng)在之前的文章中介紹過這一點。
以下是原理圖:
上圖中,相機(jī)組件并未表現(xiàn)出來。其最終的結(jié)果如下:
基于 TensorFlow 實現(xiàn) Android Things App
最后一步便是實現(xiàn) Android Things 應(yīng)用程序。為此,我們可以重用 GitHub 上名為 TensorFlow 圖像分類器示例的示例項目。在開始之前,先克隆 GitHub 倉庫,以便您可以修改源代碼。
該 Android Things 應(yīng)用與原來的應(yīng)用有所不同,在于:
-
它不使用按鈕來啟動相機(jī)捕捉圖像
-
它使用不同的模型
-
它使用一個閃爍的 LED 進(jìn)行通知,攝像機(jī)在 LED 停止閃爍后拍攝照片
-
它在 TensorFlow 檢測到圖像(箭頭)時控制電機(jī)。此外,在從步驟 3 開始循環(huán)之前,先打開電機(jī) 5 秒
要處理閃爍的 LED,請使用以下代碼:
privateHandlerblinkingHandler=newHandler();privateRunnableblinkingLED=newRunnable(){ @Overridepublicvoidrun(){ try{ //Ifthemotorisrunningtheappdoesnotstartthecam 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(); ???} ??}};
當(dāng) LED 停止閃爍時,應(yīng)用程序?qū)⒉东@圖像。
現(xiàn)在有必要關(guān)注如何根據(jù)檢測到的圖像來控制電機(jī)。修改方法如下:
@OverridepublicvoidonImageAvailable(ImageReaderreader){ finalBitmapbitmap; try(Imageimage=reader.acquireNextImage()){ bitmap=mImagePreprocessor.preprocessImage(image); } finalListresults= mTensorFlowClassifier.doRecognize(bitmap); Log.d(TAG, "GotthefollowingresultsfromTensorflow:"+results); //Checktheresult if(results==null||results.size()==0){ Log.d(TAG,"Nocommand.."); blinkingHandler.post(blinkingLED); return; } Classifier.Recognitionrec=results.get(0); Floatconfidence=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();}
在這種方法中,當(dāng) TensorFlow 返回匹配捕獲圖像的可能標(biāo)簽后,應(yīng)用程序會將結(jié)果與可能的方向進(jìn)行比較,從而控制電機(jī)。
最后,是時候使用在剛開始時創(chuàng)建的模型了。拷貝 assets 文件夾下的 opt_graph.pb 與 reatrained_labels.txt 文件,并替換現(xiàn)有文件。
打開 Helper.java 并修改以下幾行:
publicstaticfinalintIMAGE_SIZE=299;privatestaticfinalintIMAGE_MEAN=128;privatestaticfinalfloatIMAGE_STD=128;privatestaticfinalStringLABELS_FILE="retrained_labels.txt";publicstaticfinalStringMODEL_FILE="file:///android_asset/opt_graph.pb";publicstaticfinalStringINPUT_NAME="Mul";publicstaticfinalStringOUTPUT_OPERATION="output";publicstaticfinalStringOUTPUT_NAME="final_result";
運行應(yīng)用程序,試試向相機(jī)展示箭頭,并檢查結(jié)果。機(jī)器人小車必須按照所示的箭頭進(jìn)行移動。
小結(jié)
在本教程的最后,我們介紹了如何運用 Android Things 與 TensorFlow 將機(jī)器學(xué)習(xí)應(yīng)用到物聯(lián)網(wǎng)中。我們可以使用圖像控制機(jī)器人小車,并根據(jù)顯示的圖像移動機(jī)器人小車。
-
機(jī)器學(xué)習(xí)
+關(guān)注
關(guān)注
66文章
8441瀏覽量
133087 -
IOT
+關(guān)注
關(guān)注
187文章
4230瀏覽量
197623 -
tensorflow
+關(guān)注
關(guān)注
13文章
329瀏覽量
60631 -
Android Things
+關(guān)注
關(guān)注
0文章
10瀏覽量
4203
發(fā)布評論請先 登錄
相關(guān)推薦
宇樹科技在物聯(lián)網(wǎng)方面
物聯(lián)網(wǎng)就業(yè)有哪些高薪崗位?
安科瑞EIOT能源物聯(lián)網(wǎng)平臺如何應(yīng)用到連鎖門店中
![安科瑞EIOT能源<b class='flag-5'>物</b><b class='flag-5'>聯(lián)網(wǎng)</b>平臺如何<b class='flag-5'>應(yīng)用到</b>連鎖門店<b class='flag-5'>中</b>](https://file1.elecfans.com//web3/M00/04/66/wKgZPGdzjjWAe4eSAACVBKEh1ZA490.jpg)
zeta在機(jī)器學(xué)習(xí)中的應(yīng)用 zeta的優(yōu)缺點分析
物聯(lián)網(wǎng)學(xué)習(xí)路線來啦!
socket在物聯(lián)網(wǎng)中的應(yīng)用案例
什么是物聯(lián)網(wǎng)技術(shù)?
如何將TRIZ的“最終理想解”應(yīng)用到機(jī)器人電機(jī)控制設(shè)計中?
如何將人工智能應(yīng)用到效能評估工具中去解決
機(jī)器學(xué)習(xí)中的數(shù)據(jù)分割方法
機(jī)器學(xué)習(xí)在數(shù)據(jù)分析中的應(yīng)用
[天拓四方]4G MQTT網(wǎng)關(guān)在物聯(lián)網(wǎng)應(yīng)用中的優(yōu)勢探討
如何將人工智能應(yīng)用到戰(zhàn)略評估系統(tǒng)中去做
淺談基于無線物聯(lián)網(wǎng)的建筑能耗監(jiān)測系統(tǒng)探討
![淺談基于無線<b class='flag-5'>物</b><b class='flag-5'>聯(lián)網(wǎng)</b>的建筑能耗監(jiān)測系統(tǒng)<b class='flag-5'>探討</b>](https://file1.elecfans.com//web2/M00/C0/4C/wKgZomXUVMCAeR4-AACT6OqLDHo184.png)
如何將增量旋轉(zhuǎn)編碼器與Arduino連接
![<b class='flag-5'>如何將</b>增量旋轉(zhuǎn)編碼器與Arduino連接](https://file1.elecfans.com/web2/M00/BE/85/wKgaomWsepSAWIAfAABv5e2I5S8036.png)
評論