0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

【tinyML】使用EdgeImpulse讓您的Arduino可以辨識手勢!

jf_cVC5iyAO ? 來源:易心Microbit編程 ? 作者:易心Microbit編程 ? 2022-12-06 11:12 ? 次閱讀

1 認識 wio terminal

Wio Terminal 是一款專門用于 IoTTinyML 的多功能開發(fā)板 – 包含了 ATSAMD51P19 芯片并以 ARMCortex-M4F 為核心 (20MHz),已支持多種針對微控制器的 ML推論框架。

本開發(fā)板已包含:

?光傳感器(模擬)

?麥克風

?可自定義按鈕 x 3

?4 英吋彩色LCD

?加速度傳感器

?Grove 接頭 x 2,可連接多達300種 Grove 傳感器

就軟件面來說, Arduino IDE 已可用于開發(fā)各種支持 Edge Impulse 與 Tensorflow Lite 的微控制器裝置來進行神經(jīng)網(wǎng)絡(luò)訓(xùn)練與推論,或者您也可以玩玩看另一款熱門的開發(fā)環(huán)境 platformIO 也可以玩玩看。EdgeImpulse 是一款針對邊緣運算裝置 x 機器學習的簡單易用的 coding free 開發(fā)環(huán)境。用戶可透過網(wǎng)頁接口就可以完成整個 tinyML 作業(yè)流程,從數(shù)據(jù)收集、數(shù)據(jù)處理、訓(xùn)練神經(jīng)網(wǎng)絡(luò)到導(dǎo)出部署,一條龍?。?/p>

本文將示范如何把 wio terminal 所收集到的手勢資料 (光傳感器數(shù)值變化) 上傳到 Edge Impulse,完成上述流程之后再放回到 wio terminal 來執(zhí)行脫機 ML 推論,超好玩又富有學習意義!

如何辨識手勢

在此的假設(shè)為,不同的手勢在光傳感器上方晃動時,會產(chǎn)生可區(qū)別的時序數(shù)據(jù)(time series data),我們就是要把這些數(shù)據(jù)送到 Edge Impulse 網(wǎng)站來處理、學習,并匯出一個 wio terminal 可執(zhí)行推論的神經(jīng)網(wǎng)絡(luò)模型文件!

可想而知,如果用傳統(tǒng)的做法就很難去定義,怎樣的 pattern 可以一體適用各種不同的手勢都可以有不錯的辨識效果。(后續(xù)各位在收數(shù)據(jù)的時候就知道,同一種手勢的 time series 數(shù)據(jù)形狀差異很大?。?/p>

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 當作一般 arduno 使用的話,經(jīng)我實測使用 Arudino 1.8.X 沒有問題

請在 File → Preference → Additional Baord url 字段中填入:

9e9e68f6-7473-11ed-8abf-dac502259ad0.png

完成之后就可以透過 Tools → Board → Boardmanager,輸出“Wio”來安裝 wio terminal 相關(guān)套件,點選 INSTALL:

9eb5de50-7473-11ed-8abf-dac502259ad0.png

完成就可以看到 Wio Terminal 相關(guān)選項

9edc0198-7473-11ed-8abf-dac502259ad0.png

2-2 安裝 node.js 與 edgeimpulse 相關(guān)工具

根據(jù)您的平臺安裝 Node.js 1.0 以上版本,完成之后開啟 cmd 輸入以下指令來安裝 edge-impulse-cli:

npm install -g edge-impulse-cli

9ef91058-7473-11ed-8abf-dac502259ad0.png

3 透過 edge cli 上傳傳感器數(shù)據(jù)到 EdgeImpulse

請新增一個 Arduino項目,輸入以下程序代碼上傳到 wio terminal,會透過 serial 把光傳感器數(shù)據(jù)傳給 edge cli,再上傳到 Edge Impulse 網(wǎng)站的指定項目(當然是您的賬號)

由 FREQUENCY_HZ 40 可知,我們會在 1000 ms (1秒鐘) 的時間長度取得 40 筆光傳感器數(shù)據(jù),并以這一段時間中的亮度變化作為指定的手勢,也預(yù)設(shè)石頭 與 布 的手勢差異是可以被學習出來的。

#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 之后輸入以下指令,會請您登入 edge Impulse 的賬號密碼并詢問以下事項:

?裝置所連接的 COM port

?命名數(shù)據(jù)字段:如下圖的 light

由下圖可以看到您的裝置 ID: 01FE…這一段,就是透過這個 ID 來識別您的裝置。

edge-impulse-data-forwarder

9f189c3e-7473-11ed-8abf-dac502259ad0.png

Edge Impulse – 登入與設(shè)定裝置

這一段最辛苦啦,幾乎所有的設(shè)定都是在 Edge Impulse 網(wǎng)站上完成,但說真的已經(jīng)省很多事情了。

請先建立一個 Edge Impulse 賬號并登入。為了怕各位迷路,我會用顏色來標注現(xiàn)在是在哪一個 tab。以下是登入后的主畫面,也就是畫面左側(cè)– Dashboard,可以看到項目相關(guān)設(shè)定。

9f3f3ee8-7473-11ed-8abf-dac502259ad0.png

左側(cè)– Device

裝置基本設(shè)定,可以看到本賬號下的所有裝置,可以點選右側(cè)… 來編輯裝置設(shè)定或刪除裝置

9f6bfe4c-7473-11ed-8abf-dac502259ad0.png

Edge Impulse – 收資料

這里要收資料,請確認您的 wio terminal 已經(jīng)上傳上述 arduino sketch 來準備傳數(shù)據(jù),否則數(shù)據(jù)當然無法上傳到 Edge Impulse網(wǎng)站。

請點選左側(cè)– Data acquisition

中間的 collected data 一開始當然不會有東西,因為還沒開始上傳數(shù)據(jù)。請于畫面右側(cè)這樣設(shè)定:

?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 時間)

9fa1f024-7473-11ed-8abf-dac502259ad0.png

上傳多筆數(shù)據(jù)之后的畫面如下,在此請讓您所要辨識的 label 的數(shù)據(jù)筆數(shù)盡量相等,反正上傳也不會很麻煩,每一筆數(shù)據(jù)右側(cè)的… 都可以點選來編輯數(shù)據(jù)屬性或刪除該筆數(shù)據(jù)。

9fd55414-7473-11ed-8abf-dac502259ad0.png

最后請點選 train / test split 來設(shè)定訓(xùn)練/測試數(shù)據(jù)的分配比例,完成每一項的必要設(shè)定之后,前面會亮起綠色燈,才能進到下一步。

a00a3008-7473-11ed-8abf-dac502259ad0.png

Edge Impulse – 訓(xùn)練模型

左側(cè)– impulse design / Create impulse

根據(jù) EdgeImpulse 本身的定義,impulse 是指一個 pipeline,您會在此設(shè)定關(guān)于 raw data 處理方式、如何處理(processing block)、如何學習(learning block),這樣才算是一個完整的流程。

以我們的手勢辨識范例,在此是長度為一秒鐘的光傳感器數(shù)據(jù),所以屬于 time series data。在此請把 window size 與 window increase 分別設(shè)為 1000, 50ms,F(xiàn)requency 會自動帶入 wio terminal Arduino 碼設(shè)定中所的頻率 (40Hz),這里就不用動。

a044c95c-7473-11ed-8abf-dac502259ad0.png

點選 [Add a processing block] ,選單中選擇 Raw data,就會新增這個block。

請在其中選擇 Input axes 也就是所要處理的數(shù)據(jù),在此只有一筆,就是 light。不同型態(tài)的數(shù)據(jù)可能會用到更多 processing block,之后再慢慢說明。

a0779ada-7473-11ed-8abf-dac502259ad0.png

接著點選 [Add a learningblock] ,選單中選擇 Classification (Keras),就會新增這個 block。fafa Input feature 選擇 Raw data,輸出會自動帶出 2 (paper,rock) 也就是 data acquisition 時所設(shè)定的 label 名稱。

a0b5acc6-7473-11ed-8abf-dac502259ad0.png

本區(qū)設(shè)定完成如下圖,最后點選 Save Impulse 就完成了。

a0d86ba8-7473-11ed-8abf-dac502259ad0.png

Edge Impulse – 原始數(shù)據(jù)產(chǎn)生特征

左側(cè)– impulse design / Raw data

在此要針對原始數(shù)據(jù)產(chǎn)生特征,先看到 Parameters 卷標,到時候要把 Raw feature 這一段復(fù)制到最后匯出的 arduino sketch 才能順利執(zhí)行推論。

a10d9b3e-7473-11ed-8abf-dac502259ad0.png

接著按下 Generate features 標簽,跑完會看到如右圖的數(shù)據(jù)特征分布,這一段就完成了。

a13a70e6-7473-11ed-8abf-dac502259ad0.png

Edge Impulse – 訓(xùn)練模型

左側(cè)– impulse design / NNclassifier

本段要設(shè)定神經(jīng)網(wǎng)絡(luò)架構(gòu),可以自己定義神經(jīng)網(wǎng)絡(luò)架構(gòu),在此我新增了兩個 Dense 密集連接層,分別使用 20, 10 個神經(jīng)元,相當小巧。另外兩個參數(shù)如下設(shè)定:

?Number of training cycles: 看過一遍所有數(shù)據(jù)稱為一次,在此設(shè)定 500

?Learning rate: 神經(jīng)網(wǎng)絡(luò)收斂的速度,這個數(shù)值通常非常小,在此設(shè)定 0.0001

a1673edc-7473-11ed-8abf-dac502259ad0.png

當然功能不止這樣啦,點選 [Add an extra layer],可以看到以下 keras 層,要加入卷積層也是可以的,別急,之后都可以玩玩看的。

a19c636e-7473-11ed-8abf-dac502259ad0.png

設(shè)定好架構(gòu)之后,點選下方的 [Start training] 就會開始訓(xùn)練,過程中沒有寫一行程序代碼,真的很方便!右側(cè)可以看到訓(xùn)練過程中的輸出訊息。

a1e4a08e-7473-11ed-8abf-dac502259ad0.png

第一次訓(xùn)練完的 accuracy / loss 只有 75%, 0.65,差強人意

a20ed1c4-7473-11ed-8abf-dac502259ad0.png

我又上傳了一些手勢數(shù)據(jù),用同樣的架構(gòu)再跑一次,accuracy 就到 100%了!當然 loss 0.62 很高啦,不過這之后可以慢慢調(diào),先繼續(xù)下去吧

a23d81f4-7473-11ed-8abf-dac502259ad0.png

Edge Impulse – 測試神經(jīng)網(wǎng)絡(luò)模型成效

網(wǎng)站左側(cè),選擇Live Classification

先不急著匯出,先上傳一筆數(shù)據(jù)玩玩看,可以上傳懸心數(shù)據(jù),或是從既有數(shù)據(jù)來看看

左下角可以看到 PAPERS 0.52, ROCK 0.48,這當然不是一個很好的結(jié)果,就需要回頭去調(diào)整數(shù)據(jù),或是修正更好的神經(jīng)網(wǎng)絡(luò)架構(gòu)

a26d5654-7473-11ed-8abf-dac502259ad0.png

Edge Impulse – 導(dǎo)出神經(jīng)網(wǎng)絡(luò)模型

網(wǎng)站左側(cè),選擇 Deployment

會列出目前可匯出的平臺,請點選 Arduino,另外也可以看到 NVIDIA tensorRT,各種選項愈來愈完整,非常棒。

a2c2466e-7473-11ed-8abf-dac502259ad0.png

同一個頁面往下拉,使用預(yù)設(shè)設(shè)定 Quantized (int8),接著選擇 Build。

a2ee3bb6-7473-11ed-8abf-dac502259ad0.png

看到這張圖就沒問題了, .zip 檔不用解壓縮,等等直接匯入 Arduino IDE 即可。

a3419b30-7473-11ed-8abf-dac502259ad0.png

Arduino 匯入之后開始使用

開啟 Arduino IDE,選擇 Sketch → Include Library → Add .ZIP library 匯入上一步取得的 .zip

a365cb36-7473-11ed-8abf-dac502259ad0.png

完成之后就可以在File 選到這個范例,請開啟其中的 static buffer

a37b9b50-7473-11ed-8abf-dac502259ad0.png

請到 Edge Impulse 網(wǎng)站,選擇 Impusle design / Raw data,復(fù)制 Raw features 到您的樣板項目中,有一個復(fù)制符號可以直接按,這里的數(shù)據(jù)數(shù)量就會等于 Frequency,以本范例來說就是 40。

a3afb804-7473-11ed-8abf-dac502259ad0.png

貼到您的 Arduino 范例中的 features[] 數(shù)組中,這樣就可以了。

a3e80ed4-7473-11ed-8abf-dac502259ad0.png

接著上傳程序到 wio termnial ,就可以從 serial monitor 看到每一次的推論結(jié)果,happy making!!

a40e19b2-7473-11ed-8abf-dac502259ad0.png

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 傳感器
    +關(guān)注

    關(guān)注

    2542

    文章

    50236

    瀏覽量

    750033
  • 開發(fā)板
    +關(guān)注

    關(guān)注

    25

    文章

    4834

    瀏覽量

    96820
  • Arduino
    +關(guān)注

    關(guān)注

    187

    文章

    6455

    瀏覽量

    186345
  • TinyML
    +關(guān)注

    關(guān)注

    0

    文章

    42

    瀏覽量

    1200

原文標題:【tinyML】使用 EdgeImpulse 讓您的 Arduino 可以辨識手勢!

文章出處:【微信號:易心Microbit編程,微信公眾號:易心Microbit編程】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    什么是TinyML?微型機器學習

    神經(jīng)網(wǎng)絡(luò)實例的可視化。另一方面,TinyML 可以被定義為機器學習的一個子領(lǐng)域,該領(lǐng)域致力于在資源和能力受限的設(shè)備上實現(xiàn)機器學習應(yīng)用程序。TinyML 的目標是以一種極端的方式將機器學習帶到邊緣,電池供電
    發(fā)表于 04-12 10:20

    基于Arduino創(chuàng)建一個手勢控制車

    描述如何制作手勢控制機器人|| #MadeWithArduino(發(fā)射器)嘿,歡迎回到一個新項目。所以今天我們將學習使用Arduino創(chuàng)建一個手勢控制車。這里我將分享項目發(fā)射器部分的詳細教程,我還分
    發(fā)表于 06-22 06:55

    arduino手勢控制小車

    描述arduino手勢控制車
    發(fā)表于 08-09 06:51

    基于arduino設(shè)計的手勢控制小車

    基于arduino手勢控制小車
    發(fā)表于 09-25 06:06

    使用Arduino和PAJ7620手勢傳感器制作手勢控制機器人

    使用Arduino和PAJ7620手勢傳感器制作手勢控制機器人,簡單程序即可實現(xiàn)。小小的傳感器可以識別各種手勢。它采用內(nèi)置的空間傳感器,
    發(fā)表于 09-27 06:17

    arduino手勢控制車

    電子發(fā)燒友網(wǎng)站提供《arduino手勢控制車.zip》資料免費下載
    發(fā)表于 07-26 10:29 ?1次下載
    <b class='flag-5'>arduino</b><b class='flag-5'>手勢</b>控制車

    手勢識別:用于8位微控制器的TinyML

    電子發(fā)燒友網(wǎng)站提供《手勢識別:用于8位微控制器的TinyML.zip》資料免費下載
    發(fā)表于 10-24 10:52 ?3次下載
    <b class='flag-5'>手勢</b>識別:用于8位微控制器的<b class='flag-5'>TinyML</b>

    使用TinyMLArduino Nano 33 BLE計算閱讀時間

    電子發(fā)燒友網(wǎng)站提供《使用TinyMLArduino Nano 33 BLE計算閱讀時間.zip》資料免費下載
    發(fā)表于 10-28 16:50 ?1次下載
    使用<b class='flag-5'>TinyML</b>和<b class='flag-5'>Arduino</b> Nano 33 BLE計算閱讀時間

    使用Open cv python(手勢)和arduino控制Led

    電子發(fā)燒友網(wǎng)站提供《使用Open cv python(手勢)和arduino控制Led.zip》資料免費下載
    發(fā)表于 10-28 10:19 ?4次下載
    使用Open cv python(<b class='flag-5'>手勢</b>)和<b class='flag-5'>arduino</b>控制Led

    帶有EdgeImpulse的基于視覺的手勢控制無人機

    電子發(fā)燒友網(wǎng)站提供《帶有EdgeImpulse的基于視覺的手勢控制無人機.zip》資料免費下載
    發(fā)表于 11-14 10:47 ?0次下載
    帶有<b class='flag-5'>EdgeImpulse</b>的基于視覺的<b class='flag-5'>手勢</b>控制無人機

    什么是TinyML?它可以(也不能)用于什么?

    FPGA一直以低功耗、可重構(gòu)的特點在各個領(lǐng)域內(nèi)應(yīng)用,同時也可以大大增加物聯(lián)網(wǎng)應(yīng)用環(huán)境,所以在FPGA上應(yīng)用TinyML是否是FPGA方便的最佳應(yīng)用?我們接下來分析一下TinyML的特點再來總結(jié)。
    的頭像 發(fā)表于 11-28 10:25 ?6636次閱讀

    Arduino手勢手套

    電子發(fā)燒友網(wǎng)站提供《Arduino手勢手套.zip》資料免費下載
    發(fā)表于 12-21 14:17 ?1次下載
    <b class='flag-5'>Arduino</b><b class='flag-5'>手勢</b>手套

    基于Arduino UNO的手勢控制伺服電機

    電機旋轉(zhuǎn) 180 度。通過跟蹤,伺服器只會在食指抬起而其他手指保持閉合時才會轉(zhuǎn)動。這可以在具有多個伺服器的許多項目中實現(xiàn),但在這種情況下,我們堅持使用一個伺服器。伺服電機伺服是一種只能旋轉(zhuǎn)180度的減速電機。它是通過從Arduin
    發(fā)表于 12-21 11:26 ?0次下載

    Arduino手勢控制LED亮度

    電子發(fā)燒友網(wǎng)站提供《Arduino手勢控制LED亮度.zip》資料免費下載
    發(fā)表于 01-31 14:47 ?1次下載
    <b class='flag-5'>Arduino</b><b class='flag-5'>手勢</b>控制LED亮度

    使用Esp32和TinyML進行手勢分類

    電子發(fā)燒友網(wǎng)站提供《使用Esp32和TinyML進行手勢分類.zip》資料免費下載
    發(fā)表于 06-15 11:43 ?2次下載
    使用Esp32和<b class='flag-5'>TinyML</b>進行<b class='flag-5'>手勢</b>分類