特邀博文 / Dominic Pajak 和 Sandeep Mistry,來自 Arduino 團隊
Arduino 肩負着讓任何人均可輕松使用機器學習的使命。去年前,我們宣布 TensorFlow Lite Micro 可以在 Arduino 庫管理器中使用。這樣便可使用一些現成的炫酷 ML 示例,例如語音識别、簡單的機器視覺,甚至是端到端手勢識别訓練教程。如需全面了解背景資訊,我們建議您閱讀這篇文章。
在本文中,我們将帶您了解一個更為簡單的端到端教程:使用 TensorFlow Lite Micro 庫,以及 Arduino Nano 33 BLE Sense 的色度計和近接感測器傳感器來分類對象。為此,我們将在開發闆上運作一個小型神經網絡。
運作 TensorFlow Lite Micro 的 Arduino BLE 33 Nano Sense
Tiny ML 的理念是在裝置上用較少的資源(更小巧的外形、更少的能耗和更低成本的晶片)完成更多的工作。若與傳感器在同一塊開發闆上運作推理,無論是對隐私還是電池續航時間都大有裨益,且意味着無需連網即可完成推理。
我們在電路闆上安裝了近接感應器,這意味着我們可以即時讀取開發闆前方對象的深度,而無需使用攝像頭,也無需通過機器視覺來确定某個對象是否為目标對象。
在本教程中,當對象足夠近時,我們可以對顔色進行采樣,此時的闆載 RGB 傳感器可以看作是一個 1 像素的彩色攝像頭。雖然此方法存在一定限制,但卻讓我們隻需使用少量資源便可快速分類對象。請注意,實際上您可以在裝置端運作完整的基于 CNN 的視覺模型。這塊特殊的 Arduino 開發闆配有一個闆載色度計,是以我們認為以此方式開始示範不僅有趣,還極具指導意義。
- 基于 CNN 的視覺模型http://cs231n.github.io/convolutional-networks/
我們将展示一個簡單但完整的端到端 TinyML 應用,無需深厚的 ML 或嵌入式背景就可以快速實作。此處所涉内容包括資料采集、訓練和分類器部署。我們介紹的是一個示範應用,您可連接配接一個外部攝像頭,在此基礎上進行改進和完善。我們希望您能了解我們提供的工具能夠實作什麼,這裡隻是為您提供了一個起點。
您需要具備的條件
- Arduino BLE 33 Nano Sense
- 一根 Micro USB 線
- 裝有 Web 浏覽器的桌面裝置/筆記本電腦
- 幾個具有不同顔色的對象
Arduino 開發闆簡介
我們所使用的 Arduino BLE 33 Nano Sense 開發闆配備 Arm Cortex-M4 微控制器,該控制器運作着 mbedOS,并具備多個闆載傳感器,包括數字麥克風、加速度計、陀螺儀,以及溫度、濕度、壓力、光線、顔色和近接感應器。
雖然該微控制器按照雲或移動标準來看非常微小,但其功能非常強大,足以運作 TensorFlow Lite Micro 模型并對來自闆載傳感器的傳感器資料進行分類。
設定 Arduino Create 網頁編輯器
在本教程中,我們将使用 Arduino Create 網頁編輯器,一款基于雲端的 Arduino 開發闆程式設計工具。您需要注冊一個免費帳戶來使用,然後安裝一個插件允許浏覽器通過 USB 線與 Arduino 開發闆進行通信。
您可以按照 入門指南的說明進行快速設定,這些說明将引導您完成以下操作:
- 下載下傳并安裝插件
- 登入或注冊免費帳号
- 入門指南https://create.arduino.cc/getting-started/plugin?page=1
(請注意,您也可以使用 Arduino IDE 桌面應用,相關設定說明可以在之前的教程中找到)
拍攝訓練資料
現在,我們将采集用于在 TensorFlow 中訓練模型所需的資料。首先,選擇幾種顔色不同的對象。在這裡,我們将使用水果,但您可以使用任何您喜歡的其他對象。
設定 Arduino,以便采集資料
接下來,我們将使用 Arduino Create 對 Arduino 開發闆進行程式設計,讓其運作
object_color_capture.ino
應用,該應用可以采集附近對象的顔色資料樣本。開發闆會通過 USB 線将顔色資料以 CSV 日志形式發送至您的桌面裝置。
如需将
object_color_capture.ino
應用加載到 Arduino 開發闆,請執行以下操作:
- 通過 USB 線将開發闆連接配接到筆記本電腦或 PC
- Arduino 開發闆需連接配接 Micro USB 公口
- 點選此連結,在 Arduino Create 中打開
。object_color_capture.ino
- 連結https://create.arduino.cc/editor/TensorFlowExamples/ca761558-13ed-4190-baee-89ced06147c3/preview
您的浏覽器将打開 Arduino Create 網頁應用(參見上方的 GIF 圖)
點按“OPEN IN WEB EDITOR”(在網頁編輯器中打開)
- 對于現有使用者,此按鈕将被标記為“ADD TO MY SKETCHBOOK”(添加至我的 Sketchbook)
點選 Upload & Save(上傳并儲存)
- 此操作需要等待一會兒才能完成
- 您會看到開發闆上的黃燈在閃爍,說明其正在“接受程式設計”
打開序列槽 Monitor(螢幕)
- 此操作會打開網頁應用左側的 Monitor 面闆
- 現在,當對象在開發闆頂部附近時,您将會在此處看到 CSV 格式的顔色資料
将每個對象的資料采集至 CSV 檔案中
我們會針對每一個要分類的對象采集一些顔色資料。我們隻針對每個類快速采集一個示例,這樣做顯然無法訓練通用模型,但我們仍然可以通過手頭的對象來快速驗證概念!
例如,我們正在對一個 蘋果進行采樣:
- 使用頂部的白色小按鈕重置開發闆。
- 除非您想對手指采樣,否則請確定其遠離傳感器!
- Arduino Create 中的 Monitor 将提示“Serial Port Unavailable”(串行端口不可用),提示時間為一分鐘
- 然後,您應該會看到序列槽螢幕的頂部出現
字樣Red,Green,Blue
- 将開發闆的正面朝向蘋果。
- 開發闆隻有在檢測到有對象靠近傳感器且照明充足(開燈或靠近窗戶)時,才會執行采樣
- 在對象表面來回移動開發闆,采集顔色變化
- 您會看到 RGB 顔色值以逗号分隔的資料形式顯示在序列槽螢幕中。
- 采集對象的樣本(持續幾秒鐘)
- 從 Monitor 複制此日志資料,并将其粘貼到文本編輯器中
- 提示:取消勾選底部 AUTOSCROLL(自動滾動)對應的複選框,即可停止文字移動
- 将檔案另存為 apple.csv
- 使用頂部的白色小按鈕重置開發闆。
重複執行上述操作,以采集其他對象并儲存日志資訊(例如 banana.csv、orange.csv)。注意:每個 .csv 檔案的第一行均應顯示為:
Red,Green,Blue
如果您未在頂部看到此内容,則隻需将其複制并粘貼到代碼行的上方。
訓練模型
現在,我們将借助 colab,使用您在上一節中采集的資料來訓練 ML 模型。
- 首先,在 colab 中打開 Jupyter Notebook
- 按照 colab 中的說明操作
- 上傳您的 *.csv 檔案
- 解析并準備資料
- 使用 Keras 訓練模型
- 輸出 TensorFlowLite Micro 模型
- 下載下傳此模型以在 Arduino 上運作分類器
- colabhttps://colab.research.google.com/github/arduino/ArduinoTensorFlowLiteTutorials/blob/master/FruitToEmoji/FruitToEmoji.ipynb
完成上述步驟後,您應該已經下載下傳了可以在 Arduino 開發闆上運作對象分類的
model.h
檔案!
Colab 會引導您将 .csv 檔案拖放入檔案視窗,結果如上圖所示
Colab 會對 Arduino 開發闆采集的标準化顔色樣本進行繪制
将 TFLM 模型編寫到 Arduino 開發闆
最後,我們會對上一階段訓練得到的模型進行編譯,然後使用 Arduino Create 将其上傳至 Arduino 開發闆。
- 打開 Classify_Object_Color.ino
- Classify_Object_Color.ino https://create.arduino.cc/editor/TensorFlowExamples/8508c70f-5155-4e3b-b982-c5f6bd36ea5c/preview
您的浏覽器将打開 Arduino Create 網頁應用:
- 點選 OPEN IN WEB EDITOR(在網頁編輯器中打開)按鈕
- 使用 Import File to Sketch(将檔案導入 Sketch)導入從 colab 下載下傳的
檔案:model.h
導入從 colab 下載下傳的 model.h 檔案
model.h 标簽頁應如上所示
- 編譯并将應用上傳至 Arduino 開發闆
- 此操作需要等待一會兒才能完成
- 完成後,您将在 Monitor 中看到以下消息:
- 将 Arduino 的 RGB 傳感器放在您訓練的對象旁邊
- 您将在 Monitor 中看到分類結果輸出:
Arduino Create Monitor 中的分類器輸出
您也可以編輯 object_color_classifier.ino sketch 以輸出顔文字來替代名字(我們在代碼注釋中保留了 unicode!),您可以關閉 Arduino Create 所在的網頁浏覽器标簽頁,重置開發闆并輸入
cat /cu/usb.modem[n]
,在 Mac OS X 或 Linux 終端中檢視這些表情符号。
從 Arduino 序列槽輸出到 linux 終端并使用 ANSI 突出顯示的結果,以及 unicode 表情符号
結論
至此,我們了解了一個在 Arduino 上運作的機器學習的快速端到端的示範。這個架構也可用于對不同傳感器進行采樣,以及訓練更為複雜的模型。對于按顔色分類對象的任務,我們還可以在更多條件下采集更多示例樣本,以泛化該模型。
在未來的研究當中,我們還會探索如何運作裝置端 CNN。與此同時,我們希望于您而言,這将會是一個有趣而精彩的項目。請盡情體驗 TinyML 帶來的樂趣吧!
點‘在看’讓我看到你的 AI ❤️~