歡迎你們前往騰訊雲+社區,獲取更多騰訊海量技術實踐乾貨哦~html
本文由 將來守護者發表於 雲+社區專欄
本項目探討如何將機器學習(Machine learning)應用到物聯網(IoT,Internet of Things)中。咱們將使用 Android Things 做爲咱們的物聯網平臺,而且採用 Google TensorFlow 做爲咱們的機器學習引擎。現在,機器學習與物聯網都是技術話題中的大熱門。下面是維基百科上對機器學習的一個簡單定義:java
機器學習是計算機科學中的一個領域,它使計算機系統可以利用數據進行 「學習」(即逐步提升特定任務的性能),而不須要進行顯式編程(Explicitly programmed)。python
換句話說,在進行訓練步驟之後,系統就能夠預測結果(即便這不是專門爲這些結果進行編程的)。另外一方面,咱們都瞭解物聯網以及鏈接設備的概念。最有前途的話題之一即是如何將機器學習應用於物聯網之中,以構建可以 「學習」 的專家系統。此外,該系統會運用這些知識來控制和管理實物。android
下面列舉一些應用到機器學習,以及物聯網能產生重要價值的領域:git
在本教程中,咱們將探索如何使用 Android Things 和 TensorFlow 將機器學習應用到物聯網中。這一 Android Things 物聯網項目背後的基本思想就是,探索如何構建一個可以識別一些基本形狀(好比箭頭)並被控制的機器人小車(Robot car)。咱們已經介紹過如何使用 Android Things 構建機器人小車,我建議您在開始此項目以前先閱讀那篇教程。github
本次機器學習和物聯網項目主要涵蓋如下主題:docker
本項目衍生自 Android Things TensorFlow 圖像分類器。編程
咱們開始吧!瀏覽器
在開始以前,咱們有必要先安裝並配置好 TensorFlow 環境。我並不是機器學習專家,因此我須要找一些速成的東西並準備好使用,以便咱們能夠構建 TensorFlow 圖像分類器。所以,咱們可使用 Docker 來運行一個搭載了 TensorFlow 的映像。照着如下步驟進行:bash
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)一些咱們將在項目中使用到的目錄。
在 Android Things 系統可以識別圖像以前,咱們有必要先訓練 TensorFlow 引擎,以構建其模型。以此爲由,收集一些圖片是有必要的。如前所述,咱們但願使用箭頭來控制 Android Things 機器人小車 —— 因此咱們必須收集至少四種類型的箭頭:
爲訓練該系統,咱們有必要對這四種不一樣的圖像類別建立一個「知識庫」。在 /tf-data 中一個名爲 images 的目錄下建立四個目錄,命名以下:
如今是時候去搜集圖像資源了。我使用的是 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 中應有兩個文件:
第一個文件包含咱們的模型,這是 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 的細節,以及如何生成模型,請查看官方文檔和這個教程。
一旦 TensorFlow 數據模型準備就緒,咱們就能夠進入下一步:如何集成 Android Things 與 TensorFlow。爲達成這一目的,咱們能夠將此任務分爲兩步:
在深刻探討如何鏈接外圍設備以前,咱們先看看下面這個 Android Things 項目中使用的組件列表:
我不在此介紹如何使用 Android Things 控制電機,由於咱們已經在以前的文章中介紹過這一點。
如下是原理圖:
上圖中,相機組件並未表現出來。其最終的結果以下:
最後一步即是實現 Android Things 應用程序。爲此,咱們能夠重用 GitHub 上名爲 TensorFlow 圖像分類器示例的示例項目。在開始以前,先克隆 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 將機器學習應用到物聯網中。咱們可使用圖像控制機器人小車,並根據顯示的圖像移動機器人小車。
相關閱讀
【每日課程推薦】機器學習實戰!快速入門在線廣告業務及CTR相應知識
此文已由做者受權騰訊雲+社區發佈,更多原文請點擊
搜索關注公衆號「雲加社區」,第一時間獲取技術乾貨,關注後回覆1024 送你一份技術課程大禮包!
海量技術實踐經驗,盡在雲加社區!