電子發(fā)燒友App

硬聲App

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

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

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>電子資料>手勢識(shí)別:用于8位微控制器的TinyML

手勢識(shí)別:用于8位微控制器的TinyML

2022-10-24 | zip | 0.14 MB | 次下載 | 2積分

資料介紹

描述

介紹

在這個(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)行模型
pYYBAGNVjNGATKr9AABDotfqIG831.jpeg
實(shí)驗(yàn)流程
?

設(shè)置

手勢識(shí)別系統(tǒng)由以下部分組成:

GY-521 由Arduino Mega 電源部分的5VGND引腳供電,而對于數(shù)據(jù)通信,則使用I2C引腳(引腳 20 和引腳 21)。其余引腳是可選的,對于此應(yīng)用無用。

要驗(yàn)證 GY-521 模塊是否正確供電,請連接Arduino板的 USB 電纜并檢查安裝在傳感器板上的 LED 是否亮起。

poYBAGNVjNOASddQAAApwMlVnLQ740.png
GY-521:LED位置
?

驗(yàn)證傳感器電源后,通過下載Adafruit MPU6050 Arduino 庫并打開“繪圖儀”示例檢查I2C通信是否正常工作。

將示例草圖上傳到Arduino板上,打開Tools菜單中的“ Serial Plotter ” ,在baud下拉菜單中設(shè)置115200 ,然后“搖動(dòng)”sensor板。預(yù)期結(jié)果如下:

MPU6050繪圖儀串口繪圖儀示例
?

現(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 )。
pYYBAGNVjNaAcDF1AADWvNnM2A0221.png
Neuton:添加新的解決方案
?
  • 上傳 CSV 訓(xùn)練數(shù)據(jù)集文件。
poYBAGNVjNiAcK1GAABg6RnmmUg979.png
Neuton:上傳 CSV 文件
?
  • Neuton根據(jù)數(shù)據(jù)集要求驗(yàn)證 CSV 文件。
pYYBAGNVjN2AJLHEAABgM5D3sd8219.png
Neuton:數(shù)據(jù)集驗(yàn)證
?
  • 如果 CSV 文件符合要求,將出現(xiàn)綠色對勾,否則將顯示錯(cuò)誤消息。
poYBAGNVjN-AD5rFAABlAok_RhU489.png
Neuton:經(jīng)過驗(yàn)證的數(shù)據(jù)集
?
  • 選擇目標(biāo)變量的列名(例如,目標(biāo)),然后單擊“下一步”。
pYYBAGNVjOKAAgurAABz2lu5Phg359.png
Neuton:目標(biāo)變量
?
poYBAGNVjOSARLEqAACcWwbcuaI248.png
Neuton:數(shù)據(jù)集內(nèi)容預(yù)覽
?

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ù)。
pYYBAGNVjOaACKUrAACI2X3A4nU755.png
Neuton:任務(wù)類型
?
  • Metric用于在訓(xùn)練期間監(jiān)控和衡量模型的性能。對于此實(shí)驗(yàn),您使用準(zhǔn)確度指標(biāo):它表示預(yù)測類別的準(zhǔn)確度。值越高,模型越好。
poYBAGNVjOmAFVm9AACHothjTzk802.png
Neuton:公制
?
  • 啟用TinyML選項(xiàng)以允許Neuton為微控制器構(gòu)建微型模型。
pYYBAGNVjOuANk8yAABkguol5Tc090.png
Neuton:TinyML 選項(xiàng)
?
  • 在 TinyML 設(shè)置頁面中,在下拉菜單中選擇“ 8-bit ”并啟用“ Float datatype support”選項(xiàng)。這是因?yàn)閷?shí)驗(yàn)中使用的微控制器是支持浮點(diǎn)數(shù)的 8 位 MCU。
poYBAGNVjO2APkH9AADFZuKdeTg326.png
Neuton:TinyML 設(shè)置
?
  • 按下“開始訓(xùn)練”按鈕后,您將看到過程進(jìn)度條和完成百分比。
pYYBAGNVjO-AfMy4AACiGm1puDw143.png
Neuton:培訓(xù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í)模型性能。
poYBAGNVjPKAH1oBAADP6q4mOz4739.png
Neuton:數(shù)據(jù)預(yù)處理完成
?
  • 培訓(xùn)完成后,“狀態(tài)”將變?yōu)椤?/font>培訓(xùn)完成” 。模型是一致的并且已經(jīng)達(dá)到了最好的預(yù)測能力。
pYYBAGNVjPSAXmqAAACvROKnzAc380.png
Neuton:訓(xùn)練完成
?

2.3. 預(yù)測:結(jié)果分析和模型下載

poYBAGNVjPeAAo0YAACoucN7HHg882.png
Neuton:訓(xùn)練完成
?

訓(xùn)練過程完成后,您將被重定向到?預(yù)測?部分。在本次實(shí)驗(yàn)中,模型的準(zhǔn)確率達(dá)到了98% 。這意味著從 100 條預(yù)測記錄中,有 98 條被分配到了正確的類別……這令人印象深刻!

此外,要嵌入的模型大小小于3KB 。這是一個(gè)非常小的尺寸,考慮到使用的Arduino板的內(nèi)存大小為256KB ,而 8 位微控制器的典型內(nèi)存大小為64KB÷256KB 。

pYYBAGNVjPmAEXhxAACwgwhOv5o325.png
Neuton:指標(biāo)
?

要下載模型存檔,請單擊“下載”按鈕。

poYBAGNVjPyALXn3AADHV3a0cO4624.png
Neuton:預(yù)測選項(xiàng)卡
?

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í)行的示例:

pYYBAGNVjP6AbGqKAAE05uN1yiY311.png
Neuton 手勢識(shí)別系統(tǒng)的串口監(jiān)視器輸出
?

而且..僅此而已!


下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評(píng)論

查看更多

下載排行

本周

  1. 1山景DSP芯片AP8248A2數(shù)據(jù)手冊
  2. 1.06 MB  |  532次下載  |  免費(fèi)
  3. 2RK3399完整板原理圖(支持平板,盒子VR)
  4. 3.28 MB  |  339次下載  |  免費(fèi)
  5. 3TC358743XBG評(píng)估板參考手冊
  6. 1.36 MB  |  330次下載  |  免費(fèi)
  7. 4DFM軟件使用教程
  8. 0.84 MB  |  295次下載  |  免費(fèi)
  9. 5元宇宙深度解析—未來的未來-風(fēng)口還是泡沫
  10. 6.40 MB  |  227次下載  |  免費(fèi)
  11. 6迪文DGUS開發(fā)指南
  12. 31.67 MB  |  194次下載  |  免費(fèi)
  13. 7元宇宙底層硬件系列報(bào)告
  14. 13.42 MB  |  182次下載  |  免費(fèi)
  15. 8FP5207XR-G1中文應(yīng)用手冊
  16. 1.09 MB  |  178次下載  |  免費(fèi)

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費(fèi)
  3. 2555集成電路應(yīng)用800例(新編版)
  4. 0.00 MB  |  33566次下載  |  免費(fèi)
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費(fèi)
  7. 4開關(guān)電源設(shè)計(jì)實(shí)例指南
  8. 未知  |  21549次下載  |  免費(fèi)
  9. 5電氣工程師手冊免費(fèi)下載(新編第二版pdf電子書)
  10. 0.00 MB  |  15349次下載  |  免費(fèi)
  11. 6數(shù)字電路基礎(chǔ)pdf(下載)
  12. 未知  |  13750次下載  |  免費(fèi)
  13. 7電子制作實(shí)例集錦 下載
  14. 未知  |  8113次下載  |  免費(fèi)
  15. 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德爾著
  16. 0.00 MB  |  6656次下載  |  免費(fèi)

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費(fèi)
  3. 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
  4. 78.1 MB  |  537798次下載  |  免費(fèi)
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420027次下載  |  免費(fèi)
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費(fèi)
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費(fèi)
  11. 6電路仿真軟件multisim 10.0免費(fèi)下載
  12. 340992  |  191187次下載  |  免費(fèi)
  13. 7十天學(xué)會(huì)AVR單片機(jī)與C語言視頻教程 下載
  14. 158M  |  183279次下載  |  免費(fèi)
  15. 8proe5.0野火版下載(中文版免費(fèi)下載)
  16. 未知  |  138040次下載  |  免費(fèi)