入門教程-在Arduino上進行機器學習
Arduino團隊的Sandeep Mistry&Dominic Pajak的客座帖子。git
Arduino的任務是讓機器學習變得簡單,任何人均可以使用。在過去的幾個月裏,咱們一直在與TensorFlow Lite團隊合做,並很高興向您展現咱們的合做成果:將TensorFlow Lite Micro應用於Arduino Nano 33 BLE Sense。在本文中,咱們將向您展現如何安裝和運行幾個新的TensorFlow Lite Micro示例,這些示例如今能夠在Arduino庫管理器( Arduino Library Manager)中找到。github
下面的第一個教程將向您展現如何在Arduino板上安裝一個神經網絡來識別簡單的語音命。web
示例1:運行預先訓練的 micro_speech 示例編程
接下來,咱們將介紹一個更深刻的教程,您可使用該教程來訓練您本身的自定義手勢識別模型,使用Colab中的TensorFlow爲Arduino建立手勢識別模型。本材料基於Sandep Mistry和Don Coleman舉辦的實踐研討會,該研討會的更新版本現已在線。瀏覽器
例2:訓練你本身的手勢分類模型網絡
若是你之前有過Arduino的經驗,你能夠在幾個小時內完成這些教程。若是你對微控制器(microcontrollers)還不太熟悉,可能須要更長的時間。機器學習
咱們很高興與你們分享一些最初的例子和教程,並看看您將從這裏構建什麼。咱們開始吧!編輯器
注:如下項目基於TensorFlow Lite for Microscular,目前在TensorFlow repo中進行實驗。這仍然是一個新興的領域!ide
微控制器(Microcontrollers)和TinyML
微控制器,如Arduino板上使用的微控制器,是低成本、單芯片、獨立的計算機系統。它們是隱藏在數十億件平常用品中的隱形電腦,如可穿戴設備、無人機、3D打印機、玩具、電飯煲、智能插頭、電動滑板車、洗衣機。鏈接這些設備的趨勢是所謂物聯網的一部分。學習
Arduino是一個開源平臺和社區,致力於讓每一個人均可以訪問微控制器應用程序開發。咱們使用的主板有一個Arm Cortex-M4微控制器,運行頻率爲64MHz,內存爲1MB,內存爲256KB。與雲、PC或移動設備相比,這是很小的,但以微控制器標準來看是合理的。
Arduino Nano 33 BLE感應板比一片口香糖還小
可能有一些實際緣由須要在微控制器上壓縮ML,包括:
-
功能-但願智能設備在本地快速運行(獨立於互聯網)
-
成本-用簡單、低成本的硬件實現這一點
-
隱私-不想在外部共享全部傳感器數據
-
效率-更小的設備形狀係數,能量收集或更長的電池壽命
有一個最終目標,咱們正在朝着這個目標努力,這是很是重要的:
- 機器學習可使微控制器對具備嵌入式開發背景的開發者開放
在機器學習方面,可使用一些技術將神經網絡模型擬合到內存受限的設備(如微控制器)中。其中一個關鍵步驟是將權重從浮點量化爲8位整數。這也有助於使推斷更快地計算,而且更適用於較低的時鐘速率設備。
TinyML是一個新興的領域,還有不少工做要作——但使人興奮的是,它有一個巨大的未經探索的應用空間。數以億計的微控制器和各類各樣的傳感器結合在一塊兒,在將來可能會帶來一些很是有創意和價值的微型ML應用。
你須要開始作什麼
-
一條鏈接Arduino板和臺式機的微型USB電纜。
-
要爲您的電路板編程,您可使用arduino Web編輯器或安裝Arduino IDE。咱們將在下一節詳細介紹如何設置這些
Arduino Nano 33 BLE Sense具備多種車載傳感器,這意味着可能用於一些涼爽的微型ML應用:
-
語音-數字麥克風
-
運動-9軸IMU(加速度計、陀螺儀、磁強計)
-
環境-溫度、溼度和壓力
-
光-亮度、顏色和物體距離
與經典的Arduino Uno不一樣,該板將微控制器與板載傳感器結合在一塊兒,這意味着您能夠在不須要額外硬件或接線的狀況下處理許多用例。該板也足夠小,能夠用於終端應用,如可穿戴設備。顧名思義,它具備藍牙LE鏈接,所以您能夠將數據(或推斷結果)發送到筆記本電腦、移動應用程序或其餘BLE板和外圍設備。
提示:U盤上的傳感器
經過USB鏈接BLE Sense板是一種簡單的方式,能夠捕獲數據並將多個傳感器添加到單板計算機中,而無需額外佈線或硬件,例如,這是對Raspberry Pi的一個很好的補充。
TensorFlow Lite for Microcontrollers示例
如今,TensorFlow Lite for Microcontrollers的示例已經打包並經過Arduino庫管理器提供,這樣就能夠在Arduino上include並運行它們。在本節中,咱們將向您展現如何運行它們。例如:
-
micro_speech — 使用車載麥克風的語音識別。
-
magic_wand — 使用機載_IMU_進行手勢識別。
-
person_detection — 使用外部ArduCam攝像頭進行人身檢測。
有關示例的更多背景信息,您能夠查看tensorflow存儲庫中的源代碼。這些例子中的模型是之前訓練過的。下面的教程將向您展現如何在Arduino上部署和運行它們。在下一節中,咱們將討論培訓。
如何使用Arduino Create web編輯器運行示例
使用USB電纜將Arduino Nano 33 BLE Sense鏈接到桌面計算機後,您將可以使用Arduino Create web編輯器在板上編譯並運行如下TensorFlow示例:
從Arduino_TensorFlowLite庫編譯一個示例
聚焦語音識別實例:micro_speech
使用Arduino板的第一步是讓LED閃爍。在這裏,咱們將經過使用TensorFlow Lite Micro識別語音關鍵字來實現。它有一個簡單的「是」和「否」的詞彙表記住這個模型是在一個只有256KB內存的微控制器上本地運行的,因此不要指望商業語音助手的級別精度, 它沒有互聯網鏈接,而且只有2000倍的本地內存可用。
注意,電路板也能夠用電池供電。因爲Arduino能夠鏈接到電機、執行器等,這爲語音控制項目提供了潛力。
運行micro_speech示例
如何使用Arduino IDE運行示例
或者,您可使用ArduinoIDE應用程序嘗試相同的推理示例
首先,按照下一節中的說明設置Arduino IDE。
在Arduino IDE中,您將看到經過Arduino IDE中的**File > Examples> Arduino_TensorFlowLite **菜單提供的示例.
選擇一個示例,草圖將打開。要compile、upload和運行板上的示例,請單擊箭頭圖標:
對於更喜歡命令行的高級用戶,還有arduino-cli。
爲Arduino訓練TensorFlow Lite Micro模型
Arduino Nano 33 BLE感應板的手勢分類,輸出爲表情符號
接下來,咱們將使用ML使Arduino板可以識別手勢。咱們將從Arduino Nano 33 BLE Sense board中捕獲運動數據,將其導入TensorFlow以訓練模型,並將生成的分類器部署到board上。
本教程的想法基於Charlie Gerard的《使用Arduino和Tensorflow.js進行身體運動的街頭拳擊手》。*在Charlie的例子中,電路板將全部傳感器數據從Arduino傳輸到另外一臺機器,該機器在Tensorflow.js中執行手勢分類。咱們經過在Arduino板上執行手勢分類來進一步理解和表達它。咱們使用的Arduino Nano 33 BLE感應板有一個更強大的Arm Cortex-M4處理器和一個板上IMU,所以這在咱們的案例中更容易實現。
咱們已經修改了下面的教程,所以不須要額外的硬件採樣從檢測板的移動開始。本教程的原始版本添加了一個實驗板和一個硬件按鈕來按下以觸發採樣。若是你想進入一個小硬件,你能夠遵循這個版本。
設置Arduino IDE
按照如下步驟設置Arduino IDE應用程序,該應用程序用於將推理模型上載到您的電路板,並在下一節中從電路板下載培訓數據。與使用Arduino Create web編輯器相比,還須要執行一些步驟,由於咱們須要在Arduino IDE中下載並安裝特定的板和庫。
-
從https://arduino.cc/downloads下載並安裝Arduino IDE
-
打開剛纔安裝的Arduino應用程序
-
_在_Arduino IDE菜單中,選擇 Tools > Board > Boards Manager
-
搜索「Nano BLE」並點擊 install 將其安裝到板子上
-
安裝須要幾分鐘時間。
-
完成後,關閉Boards Manager窗口。
-
如今轉到 Library Manager Tools > Manage Libraries
-
搜索並安裝 Arduino_TensorFlowLite 庫
-
下一步搜索並安裝 Arduino_LSM9DS1 庫。
-
最後,將micro-USB電纜插入主板和計算機。
-
選擇電路板 Tools > Board > Arduino Nano 33 BLE
-
選擇端口 Tools > Port > COM5 (Arduino Nano 33 BLE)
-
請注意,計算機上的實際端口名可能不一樣
若是須要幫助,Arduino網站上有更詳細的入門和故障排除指南
來自Arduino板的流式傳感器數據(Streaming sensor data)
首先,咱們須要獲取一些訓練數據。您能夠從Arduino板上捕獲傳感器數據日誌,所用USB電纜與筆記本電腦或PC程序板相同。
Arduino板運行小型應用程序(也稱爲_草圖)_,這些應用程序由*.ino*格式的Arduino源代碼編譯而成,並使用Arduino IDE或Arduino建立程序編程到板上。
咱們將使用一個預先製做的草圖 IMU_Capture.ino ,它執行如下操做:
-
監控電路板的加速度計和陀螺儀
-
觸發檢測電路板顯著線性加速度的採樣窗口
-
以119Hz採樣1秒,經過USB輸出CSV格式數據
-
迴圈並監視下一個手勢
咱們選擇從電路板讀取的傳感器、採樣率、觸發閾值,以及咱們是否將數據流輸出爲CSV、JSON、二進制或其餘格式,均可以在Arduino上運行的草圖中自定義。在數據輸出到日誌以前,還能夠在設備上執行信號預處理和過濾,咱們能夠在另外一個博客中討論這個問題。如今,您只需上傳草圖並開始採樣。
要在Arduino IDE中使用此草圖對電路板進行編程:
-
下載 IMU_Capture.ino並在Arduino IDE中打開它
-
用 Sketch>upload 編譯並上傳到板上
從Arduino板可視化實時傳感器數據日誌
完成後,咱們如今能夠看到從板上下來的數據。咱們尚未捕獲數據 這只是讓您瞭解傳感器數據捕獲是如何觸發的,以及採樣窗口有多長。這將有助於收集訓練樣本。
-
在Arduino IDE中,打開串行繪圖儀 Tools > Serial Plotter
-
若是出現主板不可用的錯誤,請從新選擇端口:
-
Tools > Port > portname (Arduino Nano 33 BLE)
-
拿起板子,練習你的擊打和彎曲動做
-
你只會在一秒鐘的窗口中看到它的樣本,而後等待下一個手勢。
-
您應該能夠看到傳感器數據捕獲的實時圖形(請參見下面的GIF)
Arduino IDE串行繪圖儀將顯示從板輸出的CSV數據的實時圖形
完成後,請確保關閉「串行繪圖儀」窗口-這很重要,不然下一步沒法工做。
獲取手勢訓練數據
要將數據捕獲爲CSV日誌並upload到TensorFlow,可使用 Arduino IDE > Tools > Serial Monitor 來查看數據並將其導出到桌面計算機:
-
經過按下頂部的白色小按鈕重置電路板
-
一隻手撿起木板(稍後撿起會觸發取樣)
-
在Arduino IDE中,打開串行監視器 Tools > Serial Monitor
-
若是您遇到主板不可用的錯誤,請從新選擇端口:
-
Tools > Port > portname (Arduino Nano 33 BLE)
-
用手中的板作一個打孔手勢(作這個動做時要當心!)
-
以足夠快的速度向外擊打以觸發捕捉
-
緩慢回到空檔位置,以避免再次觸發捕捉
-
重複手勢捕捉步驟10次或更屢次以收集更多數據
-
將串行控制檯中的數據複製並粘貼到名爲
punch.csv
的新文本文件中 -
清除控制檯窗口輸出並重覆上述全部步驟,此次在名爲
flex.csv
的文件中使用flex手勢 -
使向內彎曲足夠快,以觸發每次緩慢返回的捕獲
注意,兩個csv文件的第一行應該包含字段aX
、aY
、aZ
、gX
、gY
、gZ
Linux提示:若是您願意,能夠將傳感器日誌輸出從Arduino直接重定向到命令行上的.csv文件。關閉串行繪圖儀/串行監視器窗口時使用:
$ cat /dev/cu.usbmodem[nnnnn] > sensorlog.csv
在 TensorFlow 中訓練
咱們將使用Google Colab使用咱們在上一節中從Arduino板收集的數據來訓練咱們的機器學習模型。Colab提供了一個Jupyter筆記本,容許咱們在web瀏覽器中運行TensorFlow培訓。
Arduino手勢識別訓練codelab
Codelab將引導您完成如下步驟:
-
設置Python環境
-
上傳
punch.csv
和flex.csv
數據 -
分析和準備數據
-
創建和訓練模型
-
將訓練模型轉換爲TensorFlow Lite
-
在Arduino頭文件中編碼模型
codelab的最後一步是生成要下載的model.h文件,並將其包含在下一節的Arduino IDE手勢分類器項目中:
讓咱們打開Colab的notebook,在單元格中瀏覽步驟 — arduino_tinyml_workshop.ipynb
Classifying IMU Data
接下來,咱們將使用剛剛在Arduino IDE項目的上一節中從Colab下載的model.h文件:
-
在Arduino IDE中打開IMU_Classifier.ino
-
在IDE中建立一個新的選項卡。當被問到
model.h
時
-
打開
model.h
選項卡並粘貼到從Colab下載的版本中 -
上傳草圖: Sketch > Upload
-
打開串行監視器:Tools > Serial Monitor
-
作些手勢
-
每一個手勢的置信度(confidence)將打印到串行監視器上(0 = low confidence, 1 = high confidence)
恭喜你,你剛剛爲Arduino訓練了第一個ML應用程序!
爲了增長樂趣,Emoji_Button.ino示例演示瞭如何在Linux和macOS中建立打印Emoji字符的USB鍵盤。嘗試將Emoji_Button.ino示例與IMU_Classifier.ino草圖結合起來,建立一個手勢控制的Emoji鍵盤 👊.