作者:Felix
SensiML
SensiML 是一個 IoT 機器學習解決方案供應商,提供數種不同的軟體用以擷取資料、建立模型與測試驗證。由於其提供的軟體功能完整使用便利,並且能佈署 TinyML 模型在多種不同的中低階微控制器上,也能彈性搭配各類感測器(如IMU、麥克風等)進行收集資料,不管是在商業開發或社群上都備受好評。從下圖可以看到官方規畫的工作流包含訊號擷取、資料標記、建立模型、原始碼生成與測試驗整等五個流程,並且搭配 Data Capture Lab, Analytics Studio, Test APP 軟體進行操作。因此在開始之前必須先註冊 SensiML 帳號,並且下載 PC 端軟體 SensiML Data Capture Lab 作為擷取感測資料之用。雖然 SesniML 是商業解決方案,但也有提供社群版本讓開發者可以進行實驗。此外官方也支援多種不同的硬體開發板,如 Arduino Nano 33 BLE Sense, Arduino Nicla Sense ME, M5Stack M5StickC PLUS, Nordic Thingy, Raspberry Pi 等等,甚至連八位元的 Microchip Technology AVR128DA48 Curiosity 也能使用。本篇將會實際藉由 M5StickC PLUS 範例來體驗 SesiML 的 TinyML 功能。
怎麼玩?
首先到 sensiML M5StickC Plus 說明頁面下載範例程式韌體,將其解壓縮後會有一個名為 ”SensiML-Unified-M5StickC-PLUS-Flash-Utility” 的資料夾,進入該資料夾點擊滑鼠右鍵,選擇 **”在終端機中開啟”。**此時在終端機輸入 “flash-sensiml.bat COM35” (COM35 為筆者的 M5StickC 接上電腦後,裝置管理員所顯示的Com Port 序號,請自行替換為各自的序列埠編號),此腳本會執行 esptool.py 程式,並將 SensiML 的範例程式燒錄到開發版中。即便在電腦中沒有安裝 Arduino IDE 或是 Espressif IDF 皆可以完成範例程式的燒錄。
燒錄完成後可以看到 StickC+ 上方的畫面顯示韌體相關資訊,並且可以透過開發板上的兩個按鍵設定不同功能(PGM Mode),在此範例韌體上可以選擇 GAME(遊戲)、DCL-AccGyr(資料擷取-加速度與陀螺儀) 與 DCL-Acc(資料擷取-加速度) 三種模式。
若是選擇遊戲模式將會啟動一個魔杖遊戲(wizard wand),螢幕上面會依序出現不同字母,使用者將按壓開發板上的”M5按鈕”不放,並且畫出對應的英文字母。AI模型會判讀在按鈕按住的過程中三軸感測器所偵測到的數值是否為該字母,若在有限時間內順利完成所有字母的指令,則完成通關!這遊戲可以讓初次接觸 TinyML 的朋友們做個體驗,原來微控制器透過三軸加速度的偵測可以完成手勢的識別,算是相當有趣!
Data Capture Lab
體驗完 SensiML 的 TinyML 遊戲,接下來才真正要進入重頭戲,使用 M5StickC+ 收集資料並且訓練 TinyML 模型。開始之前我們需要將 M5StickC+ 連上 Wi-Fi 網路,方便跟電腦端的 Data Capture Lab(以下簡稱為 DCL) 連線。打開終端機軟體(或是 Arduino IDE 中的序列埠視窗),選擇對應的 com port 並將鮑率(baud rate) 設定成 500000,輸入 “setwifi=ssid,passwd” 來修改 M5StickC+ 上的網路設定。完成後重新啟動 M5StickC+ 將會顯示其 Wi-Fi IP 位置。
此時在電腦上開啟 DCL 應用程式並建立新的專案,在 Device Plugin 設定中選擇 M5Stack 的 M5StickC Plus。
接著會跳出對話框確認詳細資訊,包含對應的韌體、連線方式、感測器摘要等等,確認後直接選擇下一步。
接著則會設定感測器抓取的組態,預設用 250 取樣率,並同步抓取加速度、陀螺儀與觸發(按鈕)的輸入資料。完成後點選下一步,最後給定一個設定檔名稱便完成了感測器抓取設定了。
完成後會進入DCL 的主畫面,留意畫面中間上方的模式,預設為 “Label Explorer” 標籤查閱模式,需要點選 “Switch Modes” 按鈕切換為 “Capture” 資料抓取模式。隨後在中間下方找到 M5StickC Plus 的欄位,三個點的圖示,選擇 “Connection Settings” 設定連線方式。
在 Connection Method 欄位選擇 “Wi-Fi”, IP Address 欄位則填入 M5StickC Plus LCD 畫面上所顯示的 IP 位置,完成後點選 “Done” 按鈕。回到主畫面後點選 “Connect” 按鈕,DCL 程式會和 M5StickC Plus 進行連線,並且將感測器數值即時抓回來電腦端顯示於畫面上。
完成後在 DCL 左側會以視覺化的方式顯示由 M5StickC Plus 回傳的感測器即時資訊,稍微晃動一下即可看到數值的變化。接著在右側欄位設定好所要儲存的檔案名稱,筆者的設定採用日期加上時間作為檔名,格式則是CSV。最後只要按下右下角的 “Start Recording” 按鈕,就會開始採樣感測器的數值。如同之前的文章,筆者將 M5StickC Plus 用橡皮筋套在食指上,並且做出點擊與揮動的動作,並個別重複做數十次,作為訓練用的資料。記錄完成後按下 “Stop Recording” 則會停止記錄,DCL 不但會儲存成本地端的檔案,同時也會將檔案上傳到 SensiML 的雲端,方便後續進行資料標記。
Analytics Studio
在 DCL 完成資料採集後可以前往 Analytics Studio (以下簡稱AS)網頁,進行線上的資料標註及模型訓練。從網頁上輸入已註冊的帳號密碼登入後,系統會自動叫出從 DCL 上建立的專案,進入專案後可以點選左側選單欄位中的 ”Data Manager” , 裡面也會出現前面在 DCL 採樣的所有 CSV 檔案。接著就是要進行標註資料的動作了,點選採樣檔案後即可進入標註頁面(如下圖)。
資料標註資料的方式也相當直覺,在介面中點選右方的 “Create” 按鈕,接著在視覺化的感測器數值圖框選區段,並套用特標籤(此時也可以自行新增標籤)。重複執行前述動作並完成所有的資料標註後就能進行到下一階段-”Prepare Data”。在 “Prepare Data” 階段需要建立資料篩選器 Query,每一個 Query 可以指定要匯入哪些感測資料與哪些標籤等,完成後會建立一個快取(Cache),這個快取就會是待會要訓練模型所使用的資料集了!在完成 Query 後可以查閱目前此 Query 的資料內容列表與統計圖表(如下圖)。
接著就能進入到 “Build Model” 建立 TinyML 模型的階段了,在這選單裡面有幾種訓練模型的流水線pipeline 範本可以套用,包含語音熱辭、震動訊號分類、動作識別、手勢識別、語音分類等,筆者建議新手可以從幾個中挑選最接近專案需求的範本做使用,設定上較為簡易也比較不會產生問題。當然也可以選擇 “Create New Pipeline” 自行建立 AutoML 的流水線。
Pipeline 流水線包含Query、Segmenter、Feature Generator、Validation等,逐一設定完成後即可以點選右上方的 ”RUN PIPELINE” 進行模型的訓練。順利的話大約一小時的時間即可產出 TinyML 模型了! 免費的 Community Plan 每個月有三個小時的模型訓練時間可以使用,以筆者跑一次 AutoML 訓練大約會耗費 0.5 小時的運算時間,推估大約可以執行六次的訓練,但實際狀況還是會依據 pipeline 流水線的複雜度與資料量而定。
模型驗證與評估
在等待一段時間過後,模型已建立完成,這時頁面上會同時產生數個模型,其大小、參數量、準確度可能都會有所不同,這是因為 autoML 會同時嘗試用不同的演算法來獲得最佳的結果,開發者可以自行從中挑選模型進行評估或是下載。
回到電腦端的 DCL 程式,用前述的方式與 M5StickC Plus 開發版進行連接,在左側主畫面可以顯示感測器的即時資訊。接著在右側上方頁籤選擇 “Test Model”,並在 Knowledge Pack 下方找到 “Connect” 按鈕並點選,此時會彈出一個列表將稍早訓練好的所有模型逐一列出,從中挑選一個要進行測試的模型點選 “Select“。接著 DCL 左側即時讀取到的感測數據,將會依據模型判讀的結果,將其套上色塊,用以表示模型最終的分類結果。筆者重複使用 M5StickC Plus 驗證 “click” 與 “wave” 兩個動態,發現準確度相當高,甚至和筆者之前實作 TensorFlow Lite for microcontroller 相比可說是有過之而無不及!
如果覺得模型的效果滿意,想要佈署到實際裝置上,可以回到 AS 介面中的 “Explore Model” 選單,在列表中找到合適的模型點選 ”下載圖示”,系統便會導引選擇編譯器或是開發板,將模型程式進行編譯後下載。不過在免費的版本裡只能夠以靜態 library 的方式下載,若想要完整的 source code 則必須付費才能夠擁有了!
社群專案
在 Hackster 上也有不少使用 SenseiML 所製作的 TinyML 專案,一位 Thomas Garcia 的開發者使用三軸加速度計與三軸陀螺儀感測器,搭配 SAMD21 微控制器,實作偵測電風扇震動狀態的 TinyML 專案。透過不同風速大小時,電風扇所產生的振動頻率於幅度有所不同,可以得知目前在哪一種檔位。除此之外,有了常規模型之後,日後也有機會將異常狀態加入判讀,這同時也是目前做工具機震動異常的原理!
相較於多數 TinyML 專案使用 IMU 或是麥克風做為感測器,Hackster 上的一位 Naveen 開發者則是使用了智慧插座套件 M5Stack Socket Kit 作為電壓電流感測器,搭配樹莓派實作了 TinyML 應用,可以推論出目前線路上使用的負載有哪些。
小結- 生態系日益成熟的 TinyML 方案
本篇雖僅是做初步的 SensiML 體驗,但卻能看到不管是軟體工具、技術文件、硬體支援的完整度相當高,但也由於訓練設定參數相當多,對於入門者來說需花費不少心力做探索。回頭看 SensiML 耕耘 TinyML 領域迄今也超過了10年,在 2019 被晶片製造商 QuickLogic 收購後開始有機會跟各晶片廠陸續產生合作機會,目前也與數家微控制器大廠如 Microchip、Nordic、NXP 成為合作夥伴,這也有助於產品開發的系統廠加速推展 TinyML 的應用,也許在不久之後就能開始看到內部搭載 SensiML 的消費性電子或是家電設備了!
Maker 玩 AI 系列專欄用深入淺出的方式,介紹 Maker 容易入門的 AI 軟硬體工具,並且以實際案例引領上手。有好用的 AI 軟硬體也歡迎留言討論喔!