1 認識 wio terminal
Wio Terminal 是一款專門用于 IoT 與 TinyML 的多功能開發(fā)板 – 包含了 ATSAMD51P19 芯片并以 ARMCortex-M4F 為核心 (20MHz),已支持多種針對微控制器的 ML推論框架。
本開發(fā)板已包含:
?麥克風
?可自定義按鈕 x 3
?4 英吋彩色LCD
?加速度傳感器
?Grove 接頭 x 2,可連接多達300種 Grove 傳感器
就軟件面來說, Arduino IDE 已可用于開發(fā)各種支持 Edge Impulse 與 Tensorflow Lite 的微控制器裝置來進行神經網絡訓練與推論,或者您也可以玩玩看另一款熱門的開發(fā)環(huán)境 platformIO 也可以玩玩看。EdgeImpulse 是一款針對邊緣運算裝置 x 機器學習的簡單易用的 coding free 開發(fā)環(huán)境。用戶可透過網頁接口就可以完成整個 tinyML 作業(yè)流程,從數(shù)據(jù)收集、數(shù)據(jù)處理、訓練神經網絡到導出部署,一條龍啊!
本文將示范如何把 wio terminal 所收集到的手勢資料 (光傳感器數(shù)值變化) 上傳到 Edge Impulse,完成上述流程之后再放回到 wio terminal 來執(zhí)行脫機 ML 推論,超好玩又富有學習意義!
如何辨識手勢
在此的假設為,不同的手勢在光傳感器上方晃動時,會產生可區(qū)別的時序數(shù)據(jù)(time series data),我們就是要把這些數(shù)據(jù)送到 Edge Impulse 網站來處理、學習,并匯出一個 wio terminal 可執(zhí)行推論的神經網絡模型文件!
可想而知,如果用傳統(tǒng)的做法就很難去定義,怎樣的 pattern 可以一體適用各種不同的手勢都可以有不錯的辨識效果。(后續(xù)各位在收數(shù)據(jù)的時候就知道,同一種手勢的 time series 數(shù)據(jù)形狀差異很大?。?/p>
2 PC端設定
2-1 設定 Arduino IDE 2.0
根據(jù)原廠文件,請使用 Arduino IDE 1.9 以上,所以我直接使用 2.0,請根據(jù)您的操作系統(tǒng)版本取得對應的 Arduino 2.0 IDE。
注意!編譯 Edge Impulse 匯出檔案才需要用到 Arduino IDE 1.9以上,如果是把 wio terminal 當作一般 arduno 使用的話,經我實測使用 Arudino 1.8.X 沒有問題
請在 File → Preference → Additional Baord url 字段中填入:
完成之后就可以透過 Tools → Board → Boardmanager,輸出“Wio”來安裝 wio terminal 相關套件,點選 INSTALL:
完成就可以看到 Wio Terminal 相關選項
2-2 安裝 node.js 與 edgeimpulse 相關工具
根據(jù)您的平臺安裝 Node.js 1.0 以上版本,完成之后開啟 cmd 輸入以下指令來安裝 edge-impulse-cli:
npm install -g edge-impulse-cli
3 透過 edge cli 上傳傳感器數(shù)據(jù)到 EdgeImpulse
請新增一個 Arduino項目,輸入以下程序代碼上傳到 wio terminal,會透過 serial 把光傳感器數(shù)據(jù)傳給 edge cli,再上傳到 Edge Impulse 網站的指定項目(當然是您的賬號)
由 FREQUENCY_HZ 40 可知,我們會在 1000 ms (1秒鐘) 的時間長度取得 40 筆光傳感器數(shù)據(jù),并以這一段時間中的亮度變化作為指定的手勢,也預設石頭 與 布 的手勢差異是可以被學習出來的。
#define FREQUENCY_HZ 40
#define INTERVAL_MS (1000 / (FREQUENCY_HZ))
void setup() {
Serial.begin(115200);
Serial.println("Started");
}
void loop() {
static unsigned long last_interval_ms = 0;
float light;
if (millis() > last_interval_ms + INTERVAL_MS) {
last_interval_ms = millis();
light = analogRead(WIO_LIGHT); //讀取 wio 光傳感器模擬腳位
Serial.println(light);
}
}
刻錄完成之后 wio terminal 就擺著,接著要透過 edge cli 來上傳數(shù)據(jù)到 edge Impulse 網站
開啟 cmd 之后輸入以下指令,會請您登入 edge Impulse 的賬號密碼并詢問以下事項:
?裝置所連接的 COM port
?命名數(shù)據(jù)字段:如下圖的 light
由下圖可以看到您的裝置 ID: 01FE…這一段,就是透過這個 ID 來識別您的裝置。
edge-impulse-data-forwarder
Edge Impulse – 登入與設定裝置
這一段最辛苦啦,幾乎所有的設定都是在 Edge Impulse 網站上完成,但說真的已經省很多事情了。
請先建立一個 Edge Impulse 賬號并登入。為了怕各位迷路,我會用顏色來標注現(xiàn)在是在哪一個 tab。以下是登入后的主畫面,也就是畫面左側– Dashboard,可以看到項目相關設定。
左側– Device
裝置基本設定,可以看到本賬號下的所有裝置,可以點選右側… 來編輯裝置設定或刪除裝置
Edge Impulse – 收資料
這里要收資料,請確認您的 wio terminal 已經上傳上述 arduino sketch 來準備傳數(shù)據(jù),否則數(shù)據(jù)當然無法上傳到 Edge Impulse網站。
請點選左側– Data acquisition
中間的 collected data 一開始當然不會有東西,因為還沒開始上傳數(shù)據(jù)。請于畫面右側這樣設定:
?Label: rock (石頭)/ paper (布) -> 要辨識多少種手勢都沒問題,端看您愿意花多少時間去收數(shù)據(jù)而已。
?Sensor: Sensor with 1 axes (light)
?sample length(ms): 1000
?Frequency (39Hz) 這里自動帶入 arduino sketch 的 FREQUENCY_HZ,不用改
好了之后,按下右下角的 Start sampling,這時候請準備好您的手在 wio terminal 的光傳感器擺好手勢并晃動。取得資料,就會在畫面中間多一筆新的數(shù)據(jù)出來,點選該筆數(shù)據(jù)就可以看到他形狀(光傳感器讀數(shù) vs 時間)
上傳多筆數(shù)據(jù)之后的畫面如下,在此請讓您所要辨識的 label 的數(shù)據(jù)筆數(shù)盡量相等,反正上傳也不會很麻煩,每一筆數(shù)據(jù)右側的… 都可以點選來編輯數(shù)據(jù)屬性或刪除該筆數(shù)據(jù)。
最后請點選 train / test split 來設定訓練/測試數(shù)據(jù)的分配比例,完成每一項的必要設定之后,前面會亮起綠色燈,才能進到下一步。
Edge Impulse – 訓練模型
左側– impulse design / Create impulse
根據(jù) EdgeImpulse 本身的定義,impulse 是指一個 pipeline,您會在此設定關于 raw data 處理方式、如何處理(processing block)、如何學習(learning block),這樣才算是一個完整的流程。
以我們的手勢辨識范例,在此是長度為一秒鐘的光傳感器數(shù)據(jù),所以屬于 time series data。在此請把 window size 與 window increase 分別設為 1000, 50ms,F(xiàn)requency 會自動帶入 wio terminal Arduino 碼設定中所的頻率 (40Hz),這里就不用動。
點選 [Add a processing block] ,選單中選擇 Raw data,就會新增這個block。
請在其中選擇 Input axes 也就是所要處理的數(shù)據(jù),在此只有一筆,就是 light。不同型態(tài)的數(shù)據(jù)可能會用到更多 processing block,之后再慢慢說明。
接著點選 [Add a learningblock] ,選單中選擇 Classification (Keras),就會新增這個 block。fafa Input feature 選擇 Raw data,輸出會自動帶出 2 (paper,rock) 也就是 data acquisition 時所設定的 label 名稱。
本區(qū)設定完成如下圖,最后點選 Save Impulse 就完成了。
Edge Impulse – 原始數(shù)據(jù)產生特征
左側– impulse design / Raw data
在此要針對原始數(shù)據(jù)產生特征,先看到 Parameters 卷標,到時候要把 Raw feature 這一段復制到最后匯出的 arduino sketch 才能順利執(zhí)行推論。
接著按下 Generate features 標簽,跑完會看到如右圖的數(shù)據(jù)特征分布,這一段就完成了。
Edge Impulse – 訓練模型
左側– impulse design / NNclassifier
本段要設定神經網絡架構,可以自己定義神經網絡架構,在此我新增了兩個 Dense 密集連接層,分別使用 20, 10 個神經元,相當小巧。另外兩個參數(shù)如下設定:
?Number of training cycles: 看過一遍所有數(shù)據(jù)稱為一次,在此設定 500
?Learning rate: 神經網絡收斂的速度,這個數(shù)值通常非常小,在此設定 0.0001
當然功能不止這樣啦,點選 [Add an extra layer],可以看到以下 keras 層,要加入卷積層也是可以的,別急,之后都可以玩玩看的。
設定好架構之后,點選下方的 [Start training] 就會開始訓練,過程中沒有寫一行程序代碼,真的很方便!右側可以看到訓練過程中的輸出訊息。
第一次訓練完的 accuracy / loss 只有 75%, 0.65,差強人意
我又上傳了一些手勢數(shù)據(jù),用同樣的架構再跑一次,accuracy 就到 100%了!當然 loss 0.62 很高啦,不過這之后可以慢慢調,先繼續(xù)下去吧
Edge Impulse – 測試神經網絡模型成效
網站左側,選擇Live Classification
先不急著匯出,先上傳一筆數(shù)據(jù)玩玩看,可以上傳懸心數(shù)據(jù),或是從既有數(shù)據(jù)來看看
左下角可以看到 PAPERS 0.52, ROCK 0.48,這當然不是一個很好的結果,就需要回頭去調整數(shù)據(jù),或是修正更好的神經網絡架構
Edge Impulse – 導出神經網絡模型
網站左側,選擇 Deployment
會列出目前可匯出的平臺,請點選 Arduino,另外也可以看到 NVIDIA tensorRT,各種選項愈來愈完整,非常棒。
同一個頁面往下拉,使用預設設定 Quantized (int8),接著選擇 Build。
看到這張圖就沒問題了, .zip 檔不用解壓縮,等等直接匯入 Arduino IDE 即可。
Arduino 匯入之后開始使用
開啟 Arduino IDE,選擇 Sketch → Include Library → Add .ZIP library 匯入上一步取得的 .zip
完成之后就可以在File 選到這個范例,請開啟其中的 static buffer
請到 Edge Impulse 網站,選擇 Impusle design / Raw data,復制 Raw features 到您的樣板項目中,有一個復制符號可以直接按,這里的數(shù)據(jù)數(shù)量就會等于 Frequency,以本范例來說就是 40。
貼到您的 Arduino 范例中的 features[] 數(shù)組中,這樣就可以了。
接著上傳程序到 wio termnial ,就可以從 serial monitor 看到每一次的推論結果,happy making!!
審核編輯:湯梓紅
-
傳感器
+關注
關注
2545文章
50448瀏覽量
751077 -
開發(fā)板
+關注
關注
25文章
4898瀏覽量
97061 -
Arduino
+關注
關注
187文章
6457瀏覽量
186503 -
TinyML
+關注
關注
0文章
42瀏覽量
1211
原文標題:【tinyML】使用 EdgeImpulse 讓您的 Arduino 可以辨識手勢!
文章出處:【微信號:易心Microbit編程,微信公眾號:易心Microbit編程】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論