資料介紹
描述
介紹
在這個(gè)項(xiàng)目中,我將展示一種開始使用 TinyML 的簡單方法:在Arduino板上實(shí)現(xiàn)機(jī)器學(xué)習(xí)模型,同時(shí)創(chuàng)建一些很酷的東西:基于加速度計(jì)的手勢識(shí)別系統(tǒng)。
為了使實(shí)驗(yàn)更簡單,該系統(tǒng)設(shè)計(jì)為僅識(shí)別兩種手勢:出拳和彎曲動(dòng)作(在數(shù)據(jù)科學(xué)領(lǐng)域,二元分類)。
這個(gè)實(shí)驗(yàn)的最大挑戰(zhàn)是試圖在一個(gè)非常小的設(shè)備上運(yùn)行預(yù)測模型:一個(gè) 8 位微控制器。為此,您可以使用Neuton。
Neuton是一個(gè) TinyML 框架。它允許在沒有任何編碼和一點(diǎn)機(jī)器學(xué)習(xí)經(jīng)驗(yàn)的情況下自動(dòng)構(gòu)建神經(jīng)網(wǎng)絡(luò),并將它們嵌入到小型計(jì)算設(shè)備中。它支持8位、16位和32 位微控制器。
實(shí)驗(yàn)分為三個(gè)步驟:
- 捕獲訓(xùn)練數(shù)據(jù)集
- 使用Neuton訓(xùn)練模型
- 在Arduino上部署和運(yùn)行模型
設(shè)置
手勢識(shí)別系統(tǒng)由以下部分組成:
- 微控制器:Arduino Mega 2560
- 加速度計(jì)傳感器:GY-521模塊此模塊圍繞InvenSense MPU-6050構(gòu)建:傳感器在單個(gè) IC 中包含 3 軸 MEMS 加速度計(jì)和 3 軸 MEMS 陀螺儀。它的操作非常精確,因?yàn)樗總€(gè)通道精確的數(shù)字轉(zhuǎn)換器。它可以同時(shí)捕捉X、Y和Z軸的值。與 MCU 的通信使用I2C接口進(jìn)行。
GY-521 由Arduino Mega 電源部分的5V和GND引腳供電,而對于數(shù)據(jù)通信,則使用I2C引腳(引腳 20 和引腳 21)。其余引腳是可選的,對于此應(yīng)用無用。
要驗(yàn)證 GY-521 模塊是否正確供電,請連接Arduino板的 USB 電纜并檢查安裝在傳感器板上的 LED 是否亮起。
驗(yàn)證傳感器電源后,通過下載Adafruit MPU6050 Arduino 庫并打開“繪圖儀”示例檢查I2C通信是否正常工作。
將示例草圖上傳到Arduino板上,打開Tools菜單中的“ Serial Plotter ” ,在baud下拉菜單中設(shè)置115200 ,然后“搖動(dòng)”sensor板。預(yù)期結(jié)果如下:
現(xiàn)在,系統(tǒng)已準(zhǔn)備好收集加速度計(jì)和陀螺儀數(shù)據(jù)。
1. 捕獲訓(xùn)練數(shù)據(jù)
構(gòu)建預(yù)測模型的第一步是收集足夠的運(yùn)動(dòng)測量值。這組測量值稱為訓(xùn)練數(shù)據(jù)集,它將用于訓(xùn)練Neuton神經(jīng)網(wǎng)絡(luò)構(gòu)建器。
實(shí)現(xiàn)這一點(diǎn)的最簡單方法是通過捕獲加速度和陀螺儀測量并將結(jié)果存儲(chǔ)在文件中來重復(fù)多次相同的兩個(gè)動(dòng)作(沖壓和彎曲)。為此,您創(chuàng)建一個(gè)專用于傳感器數(shù)據(jù)采集的Arduino草圖。該程序?qū)@取每個(gè)運(yùn)動(dòng)的測量值,并將在串行端口控制臺(tái)上打印傳感器測量值輸出。
您將執(zhí)行至少 60 個(gè)動(dòng)作:第一個(gè)動(dòng)作 ( punch ) 30 個(gè),第二個(gè)動(dòng)作 ( flex ) 30 個(gè)。對于每個(gè)動(dòng)作,您將在 1 秒的時(shí)間窗口內(nèi)獲得 50 個(gè)加速度和 50 個(gè)陀螺儀測量值(采樣時(shí)間:20ms —50Hz )。在這個(gè)實(shí)驗(yàn)中,60 個(gè)動(dòng)作就足夠了。通過增加運(yùn)動(dòng)測量的數(shù)量,您可以提高模型的預(yù)測能力。但是,大型數(shù)據(jù)集可能會(huì)導(dǎo)致模型過擬合。沒有“正確”的數(shù)據(jù)集大小,但建議采用“反復(fù)試驗(yàn)”的方法。
Arduino草圖的串行端口輸出將根據(jù)Neutontraining 數(shù)據(jù)集要求進(jìn)行格式化。
下面,用于創(chuàng)建數(shù)據(jù)集的Arduino程序:
- IMU 傳感器初始化和 CSV 標(biāo)頭生成:
#define NUM_SAMPLES 50
Adafruit_MPU6050 mpu;
void setup() {
// init serial port
Serial.begin(115200);
while (!Serial) {
delay(10);
}
// init IMU sensor
if (!mpu.begin()) {
while (1) {
delay(10);
}
}
// configure IMU sensor
// [...]
// print the CSV header (ax0,ay0,az0,...,gx49,gy49,gz49,target)
for (int i=0; i
Serial.print("aX");
Serial.print(i);
Serial.print(",aY");
Serial.print(i);
Serial.print(",aZ");
Serial.print(i);
Serial.print(",gX");
Serial.print(i);
Serial.print(",gY");
Serial.print(i);
Serial.print(",gZ");
Serial.print(i);
Serial.print(",");
}
Serial.println("target");
}
- 采集 30 個(gè)連續(xù)動(dòng)作。如果加速度總和高于某個(gè)閾值(例如,2.5 G ),則檢測到運(yùn)動(dòng)的開始。
#define NUM_GESTURES 30
#define GESTURE_0 0
#define GESTURE_1 1
#define GESTURE_TARGET GESTURE_0
//#define GESTURE_TARGET GESTURE_1
void loop() {
sensors_event_t a, g, temp;
while(gesturesRead < NUM_GESTURES) {
// wait for significant motion
while (samplesRead == NUM_SAMPLES) {
// read the acceleration data
mpu.getEvent(&a, &g, &temp);
// sum up the absolutes
float aSum = fabs(a.acceleration.x) +
fabs(a.acceleration.y) +
fabs(a.acceleration.z);
// check if it's above the threshold
if (aSum >= ACC_THRESHOLD) {
// reset the sample read count
samplesRead = 0;
break;
}
}
// read samples of the detected motion
while (samplesRead < NUM_SAMPLES) {
// read the acceleration and gyroscope data
mpu.getEvent(&a, &g, &temp);
samplesRead++;
// print the sensor data in CSV format
Serial.print(a.acceleration.x, 3);
Serial.print(',');
Serial.print(a.acceleration.y, 3);
Serial.print(',');
Serial.print(a.acceleration.z, 3);
Serial.print(',');
Serial.print(g.gyro.x, 3);
Serial.print(',');
Serial.print(g.gyro.y, 3);
Serial.print(',');
Serial.print(g.gyro.z, 3);
Serial.print(',');
// print target at the end of samples acquisition
if (samplesRead == NUM_SAMPLES) {
Serial.println(GESTURE_TARGET);
}
delay(10);
}
gesturesRead++;
}
}
首先,在打開串行監(jiān)視器并將GESTURE_TARGET設(shè)置為GESTURE_0的情況下運(yùn)行上述草圖。然后,將GESTURE_TARGET設(shè)置為GESTURE_1運(yùn)行。對于每次執(zhí)行,執(zhí)行相同的動(dòng)作 30 次,盡可能確保以相同的方式執(zhí)行動(dòng)作。
將兩個(gè)運(yùn)動(dòng)的串行監(jiān)視器輸出復(fù)制到一個(gè)文本文件中,并將其重命名為“trainingdata.txt”。.csv ”。
2. 使用 Neuton TinyML 訓(xùn)練模型
Neuton自動(dòng)執(zhí)行訓(xùn)練,無需任何用戶交互。使用Neuton訓(xùn)練神經(jīng)網(wǎng)絡(luò)既快速又簡單,分為三個(gè)階段:
- 數(shù)據(jù)集:上傳和驗(yàn)證
- 培訓(xùn):自動(dòng)機(jī)器學(xué)習(xí)
- 預(yù)測:結(jié)果分析和模型下載
2.1。數(shù)據(jù)集:上傳和驗(yàn)證
- 首先,創(chuàng)建一個(gè)新的Neuton解決方案并將其命名(例如Gesture Recognition )。
- 上傳 CSV 訓(xùn)練數(shù)據(jù)集文件。
- Neuton根據(jù)數(shù)據(jù)集要求驗(yàn)證 CSV 文件。
- 如果 CSV 文件符合要求,將出現(xiàn)綠色對勾,否則將顯示錯(cuò)誤消息。
- 選擇目標(biāo)變量的列名(例如,目標(biāo)),然后單擊“下一步”。
2.2. 培訓(xùn):汽車機(jī)器學(xué)習(xí)
現(xiàn)在,讓我們進(jìn)入訓(xùn)練的核心!
- Neuton分析訓(xùn)練數(shù)據(jù)集的內(nèi)容并定義 ML 任務(wù)類型。使用此數(shù)據(jù)集,可以自動(dòng)檢測二進(jìn)制分類任務(wù)。
- Metric用于在訓(xùn)練期間監(jiān)控和衡量模型的性能。對于此實(shí)驗(yàn),您使用準(zhǔn)確度指標(biāo):它表示預(yù)測類別的準(zhǔn)確度。值越高,模型越好。
- 啟用TinyML選項(xiàng)以允許Neuton為微控制器構(gòu)建微型模型。
- 在 TinyML 設(shè)置頁面中,在下拉菜單中選擇“ 8-bit ”并啟用“ Float datatype support”選項(xiàng)。這是因?yàn)閷?shí)驗(yàn)中使用的微控制器是支持浮點(diǎn)數(shù)的 8 位 MCU。
- 按下“開始訓(xùn)練”按鈕后,您將看到過程進(jìn)度條和完成百分比。
- 第一步是數(shù)據(jù)預(yù)處理。這是準(zhǔn)備(清理、組織、轉(zhuǎn)換等)原始數(shù)據(jù)集以使其適合訓(xùn)練和構(gòu)建 ML 模型的過程。
- 數(shù)據(jù)預(yù)處理完成后,模型訓(xùn)練開始。該過程可能需要很長時(shí)間;您可以關(guān)閉窗口并在該過程完成后返回。在訓(xùn)練期間,您可以通過觀察模型狀態(tài)(“一致”或“不一致”)和目標(biāo)指標(biāo)值來監(jiān)控實(shí)時(shí)模型性能。
- 培訓(xùn)完成后,“狀態(tài)”將變?yōu)椤?/font>培訓(xùn)完成” 。模型是一致的并且已經(jīng)達(dá)到了最好的預(yù)測能力。
2.3. 預(yù)測:結(jié)果分析和模型下載
訓(xùn)練過程完成后,您將被重定向到?預(yù)測?部分。在本次實(shí)驗(yàn)中,模型的準(zhǔn)確率達(dá)到了98% 。這意味著從 100 條預(yù)測記錄中,有 98 條被分配到了正確的類別……這令人印象深刻!
此外,要嵌入的模型大小小于3KB 。這是一個(gè)非常小的尺寸,考慮到使用的Arduino板的內(nèi)存大小為256KB ,而 8 位微控制器的典型內(nèi)存大小為64KB÷256KB 。
要下載模型存檔,請單擊“下載”按鈕。
3.在Arduino上部署模型
從Neuton下載的模型存檔包括以下文件和文件夾:
- /模型:緊湊形式(十六進(jìn)制和二進(jìn)制)的神經(jīng)網(wǎng)絡(luò)模型。
- / neuton :一組用于執(zhí)行預(yù)測、計(jì)算、數(shù)據(jù)傳輸、結(jié)果管理等的函數(shù)。
- user_app.c :一個(gè)文件,您可以在其中設(shè)置應(yīng)用程序的邏輯以管理預(yù)測。
首先,修改user_app.c文件,添加函數(shù)以初始化模型并運(yùn)行推理。
/*
* Function: model_init
* ----------------------------
*
* returns: result of initialization (bool)
*/
uint8_t model_init() {
uint8_t res;
res = CalculatorInit(&neuralNet, NULL);
return (ERR_NO_ERROR == res);
}
/*
* Function: model_run_inference
* ----------------------------
*
* sample: input array to make prediction
* size_in: size of input array
* size_out: size of result array
*
* returns: result of prediction
*/
float* model_run_inference(float* sample,
uint32_t size_in,
uint32_t *size_out) {
if (!sample || !size_out)
return NULL;
if (size_in != neuralNet.inputsDim)
return NULL;
*size_out = neuralNet.outputsDim;
return CalculatorRunInference(&neuralNet, sample);
}
之后,您創(chuàng)建user_app.h頭文件以允許主應(yīng)用程序使用用戶函數(shù)。
uint8_t model_init();
float* model_run_inference(float* sample,
uint32_t size_in,
uint32_t* size_out);
下面是主要應(yīng)用程序的Arduino草圖:
- 模型初始化
#include "src/Gesture Recognition_v1/user_app.h"
void setup() {
// init serial port and IMU sensor
// [...]
// init Neuton neural network model
if (!model_init()) {
Serial.print("Failed to initialize Neuton model!");
while (1) {
delay(10);
}
}
}
- 模型推斷
#define GESTURE_ARRAY_SIZE (6*NUM_SAMPLES+1)
void loop() {
sensors_event_t a, g, temp;
float gestureArray[GESTURE_ARRAY_SIZE] = {0};
// wait for significant motion
// [...]
// read samples of the detected motion
while (samplesRead < NUM_SAMPLES) {
// read the acceleration and gyroscope data
mpu.getEvent(&a, &g, &temp);
// fill gesture array (model input)
gestureArray[samplesRead*6 + 0] = a.acceleration.x;
gestureArray[samplesRead*6 + 1] = a.acceleration.y;
gestureArray[samplesRead*6 + 2] = a.acceleration.z;
gestureArray[samplesRead*6 + 3] = g.gyro.x;
gestureArray[samplesRead*6 + 4] = g.gyro.y;
gestureArray[samplesRead*6 + 5] = g.gyro.z;
samplesRead++;
delay(10);
// check the end of gesture acquisition
if (samplesRead == NUM_SAMPLES) {
uint32_t size_out = 0;
// run model inference
float* result = model_run_inference(gestureArray,
GESTURE_ARRAY_SIZE,
&size_out);
// check if model inference result is valid
if (result && size_out) {
// check if problem is binary classification
if (size_out >= 2) {
// check if one of the result has >50% of accuracy
if (result[0] > 0.5) {
Serial.print("Detected gesture: 0");
// [...]
} else if (result[1] > 0.5) {
Serial.print("Detected gesture: 1");
// [...]
} else {
// solution is not reliable
Serial.println("Detected gesture: NONE");
}
}
}
}
}
}
模型在行動(dòng)!
/neuton_gesturerecognition
|- /src
| |- /Gesture Recognition_v1
| |- /model
| |- /neuton
| |- user_app.c
| |- user_app.h
|- neuton_gesturerecognition.ino
現(xiàn)在,是時(shí)候看看預(yù)測模型的實(shí)際應(yīng)用了!
- 驗(yàn)證硬件系統(tǒng)是否正確設(shè)置
- 打開主應(yīng)用程序文件
- 單擊“驗(yàn)證”按鈕,然后單擊“上傳”一個(gè)
- 打開串行監(jiān)視器
- 抓住你的硬件系統(tǒng)并執(zhí)行一些動(dòng)作。
對于每個(gè)檢測到的運(yùn)動(dòng),模型將嘗試猜測運(yùn)動(dòng)是什么類型(0 -punch或 1 -flex )以及預(yù)測的準(zhǔn)確度。如果預(yù)測的準(zhǔn)確度較低(0.5 ),則模型不會(huì)做出決定。
下面是模型推理執(zhí)行的示例:
而且..僅此而已!
- 8位Atmel 微控制器ATMEGA325V-8AU技術(shù)手冊 0次下載
- 32位微控制器APM32S103x8xB數(shù)據(jù)手冊 0次下載
- STM32-32位微控制器產(chǎn)品選擇指南 2次下載
- 基于ARM32位的微控制器AT32F403A系列 13次下載
- 32位CMOS微控制器S3C2440A用戶手冊 0次下載
- EM88F711N 8位微控制器產(chǎn)品規(guī)格書 20次下載
- 32位基于ARM核心的微控制器SRM32F103xC系列 1次下載
- 系統(tǒng)可編程閃存中的RISC微控制器LGT8XM 0次下載
- Atmel微控制器8位AVR的庫文件免費(fèi)下載 0次下載
- MC9S12G優(yōu)化的汽車16位微控制器的數(shù)據(jù)手冊和參考手冊免費(fèi)下載 79次下載
- 意法半導(dǎo)體STM32 8位和32位微控制器系列的產(chǎn)品選擇指南資料免費(fèi)下載 6次下載
- 帶CAN 控制器的單片8 位微控制器 8次下載
- 8位微控制器降低車身應(yīng)用的總體成本 4次下載
- STM8S和STM32微控制器_一個(gè)完全兼容的可移植8位_32位 28次下載
- 高速8位微控制器的用武之地
- 微控制器的定義和工作原理 1084次閱讀
- 【tinyML】使用EdgeImpulse讓您的Arduino可以辨識(shí)手勢! 4081次閱讀
- 如何在 MCU 上快速部署 TinyML 1689次閱讀
- 如何使用Arduino Leonardo和MPU6050制作一個(gè)有線的手勢控制器 2625次閱讀
- 基于stm8系列8位通用微控制器平臺(tái)的電容式觸摸傳感方案 2283次閱讀
- 78K0/Ix2 8位單片微控制器的性能特性及應(yīng)用方案 2983次閱讀
- 基于微控制器TMS320F2812和CAN收發(fā)器實(shí)現(xiàn)新型執(zhí)行器的設(shè)計(jì) 1447次閱讀
- 新唐科技M031KG8AE控制器 1716次閱讀
- 新唐科技N567H030控制器 1035次閱讀
- 新唐科技N567H240控制器介紹 1862次閱讀
- 飛思卡爾新款Flexis微控制器資料 4682次閱讀
- 可編程邏輯在微控制器中起什么關(guān)鍵作用 1584次閱讀
- 微控制器原理及應(yīng)用 1.4w次閱讀
- Silicon Labs 32 位微控制器的 10 大技術(shù)特點(diǎn) 1222次閱讀
- MAXQ614 16位微控制器芯片詳解 1886次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數(shù)據(jù)手冊
- 1.06 MB | 532次下載 | 免費(fèi)
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費(fèi)
- 3TC358743XBG評(píng)估板參考手冊
- 1.36 MB | 330次下載 | 免費(fèi)
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費(fèi)
- 5元宇宙深度解析—未來的未來-風(fēng)口還是泡沫
- 6.40 MB | 227次下載 | 免費(fèi)
- 6迪文DGUS開發(fā)指南
- 31.67 MB | 194次下載 | 免費(fèi)
- 7元宇宙底層硬件系列報(bào)告
- 13.42 MB | 182次下載 | 免費(fèi)
- 8FP5207XR-G1中文應(yīng)用手冊
- 1.09 MB | 178次下載 | 免費(fèi)
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 2555集成電路應(yīng)用800例(新編版)
- 0.00 MB | 33566次下載 | 免費(fèi)
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費(fèi)
- 4開關(guān)電源設(shè)計(jì)實(shí)例指南
- 未知 | 21549次下載 | 免費(fèi)
- 5電氣工程師手冊免費(fèi)下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費(fèi)
- 6數(shù)字電路基礎(chǔ)pdf(下載)
- 未知 | 13750次下載 | 免費(fèi)
- 7電子制作實(shí)例集錦 下載
- 未知 | 8113次下載 | 免費(fèi)
- 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德爾著
- 0.00 MB | 6656次下載 | 免費(fèi)
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費(fèi)
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537798次下載 | 免費(fèi)
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費(fèi)
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費(fèi)
- 6電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191187次下載 | 免費(fèi)
- 7十天學(xué)會(huì)AVR單片機(jī)與C語言視頻教程 下載
- 158M | 183279次下載 | 免費(fèi)
- 8proe5.0野火版下載(中文版免費(fèi)下載)
- 未知 | 138040次下載 | 免費(fèi)
評(píng)論
查看更多