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