精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

電子發燒友App

硬聲App

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

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

3天內不再提示
電子發燒友網>電子資料下載>電子資料>手勢識別:用于8位微控制器的TinyML

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

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

資料介紹

描述

介紹

在這個項目中,我將展示一種開始使用 TinyML 的簡單方法:在Arduino板上實現機器學習模型,同時創建一些很酷的東西:基于加速度計的手勢識別系統。

為了使實驗更簡單,該系統設計為僅識別兩種手勢:出拳彎曲動作(在數據科學領域,二元分類)。

打孔手勢
?
彈性手勢
?

這個實驗的最大挑戰是試圖在一個非常小的設備上運行預測模型:一個 8 位微控制器。為此,您可以使用Neuton。

Neuton是一個 TinyML 框架。它允許在沒有任何編碼和一點機器學習經驗的情況下自動構建神經網絡,并將它們嵌入到小型計算設備中。它支持8位16位32 位微控制器。

實驗分為三個步驟:

  • 捕獲訓練數據集
  • 使用Neuton訓練模型
  • 在Arduino上部署和運行模型
pYYBAGNVjNGATKr9AABDotfqIG831.jpeg
實驗流程
?

設置

手勢識別系統由以下部分組成:

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

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

poYBAGNVjNOASddQAAApwMlVnLQ740.png
GY-521:LED位置
?

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

將示例草圖上傳到Arduino板上,打開Tools菜單中的“ Serial Plotter ” ,在baud下拉菜單中設置115200 ,然后“搖動”sensor板。預期結果如下:

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

現在,系統已準備好收集加速度計和陀螺儀數據。

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

2.2. 培訓:汽車機器學習

現在,讓我們進入訓練的核心!

  • Neuton分析訓練數據集的內容并定義 ML 任務類型。使用此數據集,可以自動檢測二進制分類任務。
pYYBAGNVjOaACKUrAACI2X3A4nU755.png
Neuton:任務類型
?
  • Metric用于在訓練期間監控和衡量模型的性能。對于此實驗,您使用準確度指標:它表示預測類別的準確度。值越高,模型越好。
poYBAGNVjOmAFVm9AACHothjTzk802.png
Neuton:公制
?
  • 啟用TinyML選項以允許Neuton為微控制器構建微型模型。
pYYBAGNVjOuANk8yAABkguol5Tc090.png
Neuton:TinyML 選項
?
  • 在 TinyML 設置頁面中,在下拉菜單中選擇“ 8-bit ”并啟用“ Float datatype support”選項。這是因為實驗中使用的微控制器是支持浮點數的 8 位 MCU。
poYBAGNVjO2APkH9AADFZuKdeTg326.png
Neuton:TinyML 設置
?
  • 按下“開始訓練”按鈕后,您將看到過程進度條和完成百分比。
pYYBAGNVjO-AfMy4AACiGm1puDw143.png
Neuton:培訓開始
?
  • 第一步是數據預處理。這是準備(清理、組織、轉換等)原始數據集以使其適合訓練和構建 ML 模型的過程。
  • 數據預處理完成后,模型訓練開始。該過程可能需要很長時間;您可以關閉窗口并在該過程完成后返回。在訓練期間,您可以通過觀察模型狀態(“一致”或“不一致”)和目標指標來監控實時模型性能。
poYBAGNVjPKAH1oBAADP6q4mOz4739.png
Neuton:數據預處理完成
?
  • 培訓完成后,“狀態”將變為“培訓完成” 。模型是一致的并且已經達到了最好的預測能力。
pYYBAGNVjPSAXmqAAACvROKnzAc380.png
Neuton:訓練完成
?

2.3. 預測:結果分析和模型下載

poYBAGNVjPeAAo0YAACoucN7HHg882.png
Neuton:訓練完成
?

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

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

pYYBAGNVjPmAEXhxAACwgwhOv5o325.png
Neuton:指標
?

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

poYBAGNVjPyALXn3AADHV3a0cO4624.png
Neuton:預測選項卡
?

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 ),則模型不會做出決定。

下面是模型推理執行的示例:

pYYBAGNVjP6AbGqKAAE05uN1yiY311.png
Neuton 手勢識別系統的串口監視器輸出
?

而且..僅此而已!


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

評論

查看更多

下載排行

本周

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

本月

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

總榜

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