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