一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

電子發(fā)燒友App

硬聲App

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

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

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>電子資料>使用Esp32和TinyML進(jìn)行手勢分類

使用Esp32和TinyML進(jìn)行手勢分類

2023-06-15 | zip | 0.00 MB | 次下載 | 2積分

資料介紹

描述

介紹

手勢分類是機器學(xué)習(xí)可以做的一個簡單但同時也是很好的例子。它使用大量“雜亂”的數(shù)據(jù)對事物進(jìn)行分類。

在這個項目中,我們將制作一個有 4 個類的分類器,idle、up_down、left_right 和 circle。該項目將使用Esp32 板(8 美元)制作,因為與使用Arduino Nano 33 BLE Sense (35 美元)的“經(jīng)典”示例相比,它非常便宜。

pYYBAGNo8IyAONCUAAEyTuZuiEg816.png
系統(tǒng)采用 Esp32、MPU6050 和 RGB LED。
?

數(shù)據(jù)采集

要將數(shù)據(jù)上傳到 Edge Impulse,我們需要使用 Edge Impulse CLI,按照教程了解如何安裝它。

我們要使用的工具是Data Forwarder ,該工具將串行中可用的數(shù)據(jù)上傳到 Edge Impulse。我們需要使用 Arduino Sketch 以一定的采樣頻率將數(shù)據(jù)上傳到串行,并用“,”分隔數(shù)據(jù),在這種情況下,我們將發(fā)送加速度數(shù)據(jù)。

#include 
#include 
#include 
#define FREQUENCY_HZ        60
#define INTERVAL_MS         (1000 / (FREQUENCY_HZ + 1))
// objeto da classe Adafruit_MPU6050
Adafruit_MPU6050 mpu;
static unsigned long last_interval_ms = 0;
void setup() {
Serial.begin(115200);
Serial.println("Classificador de gestos com TinyML");
// Try to initialize!
if (!mpu.begin()) {
Serial.println("Failed to find MPU6050 chip");
while (1) {
delay(10);
}
}
Serial.println("MPU6050 Found!");
mpu.setAccelerometerRange(MPU6050_RANGE_8_G);
Serial.print("Accelerometer range set to: ");
switch (mpu.getAccelerometerRange()) {
case MPU6050_RANGE_2_G:
Serial.println("+-2G");
break;
case MPU6050_RANGE_4_G:
Serial.println("+-4G");
break;
case MPU6050_RANGE_8_G:
Serial.println("+-8G");
break;
case MPU6050_RANGE_16_G:
Serial.println("+-16G");
break;
}
mpu.setGyroRange(MPU6050_RANGE_500_DEG);
Serial.print("Gyro range set to: ");
switch (mpu.getGyroRange()) {
case MPU6050_RANGE_250_DEG:
Serial.println("+- 250 deg/s");
break;
case MPU6050_RANGE_500_DEG:
Serial.println("+- 500 deg/s");
break;
case MPU6050_RANGE_1000_DEG:
Serial.println("+- 1000 deg/s");
break;
case MPU6050_RANGE_2000_DEG:
Serial.println("+- 2000 deg/s");
break;
}
mpu.setFilterBandwidth(MPU6050_BAND_21_HZ);
Serial.print("Filter bandwidth set to: ");
switch (mpu.getFilterBandwidth()) {
case MPU6050_BAND_260_HZ:
Serial.println("260 Hz");
break;
case MPU6050_BAND_184_HZ:
Serial.println("184 Hz");
break;
case MPU6050_BAND_94_HZ:
Serial.println("94 Hz");
break;
case MPU6050_BAND_44_HZ:
Serial.println("44 Hz");
break;
case MPU6050_BAND_21_HZ:
Serial.println("21 Hz");
break;
case MPU6050_BAND_10_HZ:
Serial.println("10 Hz");
break;
case MPU6050_BAND_5_HZ:
Serial.println("5 Hz");
break;
}
Serial.println("");
delay(100);
}
void loop() {
sensors_event_t a, g, temp;
if (millis() > last_interval_ms + INTERVAL_MS) {
last_interval_ms = millis();
mpu.getEvent(&a, &g, &temp);
Serial.print(a.acceleration.x);
Serial.print(",");
Serial.print(a.acceleration.y);
Serial.print(",");
Serial.println(a.acceleration.z);
}
}

在 Esp32 板準(zhǔn)備好發(fā)送數(shù)據(jù)后,我們需要將 Edge Impulse 帳戶與 CLI 連接起來,它應(yīng)該是這樣的:

pYYBAGNo8I6ALtUCAACLgbAT5v4230.png
圖片來自:https://docs.edgeimpulse.com/docs/cli-data-forwarder
?
  • 了解這種方法的局限性很重要,例如,我們不能用它來上傳音頻數(shù)據(jù),因為采樣頻率應(yīng)該至少是信號最大頻率的兩倍(奈奎斯特采樣定理),我們可以不要使用串行以如此高的頻率傳輸數(shù)據(jù)。

之后你可以開始收集一些數(shù)據(jù),你可以做很多動作,只要確保它們不太相似(稍后你可以在特征瀏覽器中決定)。

poYBAGNo8JCAZaG7AAEknj2GFOE693.png
圓周運動的數(shù)據(jù)
?

設(shè)計沖動

脈沖是一組采集、處理和推理數(shù)據(jù)。

pYYBAGNo8JOAWoF3AADkxPUR_pQ059.png
?

頻譜分析為 Keras 模型創(chuàng)建了要使用的特征,在這個階段,信號被過濾并生成兩個頻譜,一個是頻率(使用 FFT),另一個是能量(PSD

poYBAGNo8JWAXEI9AAB2tB4jLeE805.png
FFT 和 PSD
?

我們可以使用特征資源管理器看到我們的類是如何分離的:

poYBAGNo8JeAFgNVAABvgCZ1GH4488.png
?

它們看起來非常不同,所以我們應(yīng)該用模型得到一個很好的結(jié)果。

這些數(shù)據(jù)進(jìn)入神經(jīng)網(wǎng)絡(luò),因為這是一項簡單的任務(wù),神經(jīng)網(wǎng)絡(luò)也應(yīng)該很簡單。

pYYBAGNo8JmAbYxsAACDlicehws192.png
神經(jīng)網(wǎng)絡(luò)設(shè)計
?

在我們訓(xùn)練模型之后,我們可以在混淆矩陣中看到性能:

poYBAGNo8JuAMYsdAABMfElQk3w684.png
?

它看起來不錯,但性能可能會隨著測試數(shù)據(jù)而降低。

對模型感到滿意后,您可以使用 de Arduino IDE 和 Edge Impulse 中生成的庫將其嵌入。

pYYBAGNo8J6AcmEHAAB8rDLdX9U247.png
?

就像 Arduino 中的另一個庫一樣,我們需要包含它并使用它們的函數(shù)進(jìn)行推理。

#include 
#include 
#include 
#include 

#define FREQUENCY_HZ        60
#define INTERVAL_MS         (1000 / (FREQUENCY_HZ + 1))
#define RED 16
#define GREEN 17
#define BLUE 18

// objeto da classe Adafruit_MPU6050
Adafruit_MPU6050 mpu;

float features[EI_CLASSIFIER_DSP_INPUT_FRAME_SIZE];
size_t feature_ix = 0;

static unsigned long last_interval_ms = 0;


void setup() {
  Serial.begin(115200);

  ledcSetup(0, 5000, 8);
  /*
    ledcAttachPin(RED, 0);
    ledcAttachPin(GREEN, 1);
    ledcAttachPin(BLUE, 2);
  */

  pinMode(RED, OUTPUT);
  pinMode(GREEN, OUTPUT);
  pinMode(BLUE, OUTPUT);



  if (!mpu.begin()) {
    Serial.println("Failed to find MPU6050 chip");
    while (1) {
      delay(10);
    }
  }
  Serial.println("MPU6050 Found!");

  mpu.setAccelerometerRange(MPU6050_RANGE_8_G);
  Serial.print("Accelerometer range set to: ");
  switch (mpu.getAccelerometerRange()) {
    case MPU6050_RANGE_2_G:
      Serial.println("+-2G");
      break;
    case MPU6050_RANGE_4_G:
      Serial.println("+-4G");
      break;
    case MPU6050_RANGE_8_G:
      Serial.println("+-8G");
      break;
    case MPU6050_RANGE_16_G:
      Serial.println("+-16G");
      break;
  }
  mpu.setGyroRange(MPU6050_RANGE_500_DEG);
  Serial.print("Gyro range set to: ");
  switch (mpu.getGyroRange()) {
    case MPU6050_RANGE_250_DEG:
      Serial.println("+- 250 deg/s");
      break;
    case MPU6050_RANGE_500_DEG:
      Serial.println("+- 500 deg/s");
      break;
    case MPU6050_RANGE_1000_DEG:
      Serial.println("+- 1000 deg/s");
      break;
    case MPU6050_RANGE_2000_DEG:
      Serial.println("+- 2000 deg/s");
      break;
  }

  mpu.setFilterBandwidth(MPU6050_BAND_21_HZ);
  Serial.print("Filter bandwidth set to: ");
  switch (mpu.getFilterBandwidth()) {
    case MPU6050_BAND_260_HZ:
      Serial.println("260 Hz");
      break;
    case MPU6050_BAND_184_HZ:
      Serial.println("184 Hz");
      break;
    case MPU6050_BAND_94_HZ:
      Serial.println("94 Hz");
      break;
    case MPU6050_BAND_44_HZ:
      Serial.println("44 Hz");
      break;
    case MPU6050_BAND_21_HZ:
      Serial.println("21 Hz");
      break;
    case MPU6050_BAND_10_HZ:
      Serial.println("10 Hz");
      break;
    case MPU6050_BAND_5_HZ:
      Serial.println("5 Hz");
      break;
  }

  Serial.println("");
  delay(100);

  Serial.print("Features: ");
  Serial.println(EI_CLASSIFIER_DSP_INPUT_FRAME_SIZE);
  Serial.print("Label count: ");
  Serial.println(EI_CLASSIFIER_LABEL_COUNT);

}

void loop() {
  sensors_event_t a, g, temp;

  if (millis() > last_interval_ms + INTERVAL_MS) {
    last_interval_ms = millis();

    mpu.getEvent(&a, &g, &temp);

    features[feature_ix++] = a.acceleration.x;
    features[feature_ix++] = a.acceleration.y;
    features[feature_ix++] = a.acceleration.z;

    if (feature_ix == EI_CLASSIFIER_DSP_INPUT_FRAME_SIZE) {
      Serial.println("Running the inference...");
      signal_t signal;
      ei_impulse_result_t result;
      int err = numpy::signal_from_buffer(features, EI_CLASSIFIER_DSP_INPUT_FRAME_SIZE, &signal);
      if (err != 0) {
        ei_printf("Failed to create signal from buffer (%d)\n", err);
        return;
      }

      EI_IMPULSE_ERROR res = run_classifier(&signal, &result, true);

      if (res != 0) return;

      ei_printf("Predictions ");
      ei_printf("(DSP: %d ms., Classification: %d ms.)",
                result.timing.dsp, result.timing.classification);
      ei_printf(": \n");

      for (size_t ix = 0; ix < EI_CLASSIFIER_LABEL_COUNT; ix++) {
        ei_printf("    %s: %.5f\n", result.classification[ix].label, result.classification[ix].value);
        if (result.classification[ix].value > 0.6) {
          if (result.classification[ix].label == "up_down")
          {
            /*// color code #00C9CC (R = 0,   G = 201, B = 204)
              //analogWrite(RED, 0);
              ledcWrite(0, 0);
              //analogWrite(GREEN, 201);
              ledcWrite(1, 201);
              //analogWrite(BLUE, 204);
              ledcWrite(2, 204);
              Serial.println("up and down");*/
            digitalWrite(RED, HIGH);
            digitalWrite(GREEN, LOW);
            digitalWrite(BLUE, LOW);
          } else if (result.classification[ix].label == "left_right")
          {
            digitalWrite(RED, LOW);
            digitalWrite(GREEN, HIGH);
            digitalWrite(BLUE, LOW);
          } else if (result.classification[ix].label == "circle")
          {
            digitalWrite(RED, LOW);
            digitalWrite(GREEN, LOW);
            digitalWrite(BLUE, HIGH);
          } else
          {
            digitalWrite(RED, LOW);
            digitalWrite(GREEN, LOW);
            digitalWrite(BLUE, LOW);
          }
        }
      }
      feature_ix = 0;
    }

  }
}

void ei_printf(const char *format, ...) {
  static char print_buf[1024] = { 0 };

  va_list args;
  va_start(args, format);
  int r = vsnprintf(print_buf, sizeof(print_buf), format, args);
  va_end(args);

  if (r > 0) {
    Serial.write(print_buf);
  }
}

在這個應(yīng)用程序中,我使用 RGB LED 來顯示檢測到的類,您也可以在串行監(jiān)視器中看到。

poYBAGNo8KCAMS-VAABLlsyUJyM831.png
?
?
?
?
?
1 / 3 ?圓圈 -> 藍(lán)色 LED
?

?


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

評論

查看更多

下載排行

本周

  1. 1人形機器人電機驅(qū)動和傳感報告
  2. 4.27 MB   |  9次下載  |  免費
  3. 2Altium Designer元件庫
  4. 17.11 MB   |  6次下載  |  免費
  5. 324V2A開關(guān)電源PCB資料分享
  6. 0.23 MB   |  4次下載  |  1 積分
  7. 4GD100PIX120C6SNA規(guī)格書
  8. 0.98 MB   |  3次下載  |  免費
  9. 5Multisim模擬電路仿真教程
  10. 1.93 MB   |  1次下載  |  3 積分
  11. 6BK7258英文規(guī)格書
  12. 1.67 MB   |  1次下載  |  免費
  13. 7RA4L1硬件手冊
  14. 21.89 MB  |  1次下載  |  免費
  15. 8RA4L1_SENSOR-V1原理圖
  16. 754.36 KB  |  1次下載  |  免費

本月

  1. 1晶體三極管的電流放大作用詳細(xì)說明
  2. 0.77 MB   |  32次下載  |  2 積分
  3. 2雙極型三極管放大電路的三種基本組態(tài)的學(xué)習(xí)課件免費下載
  4. 4.03 MB   |  25次下載  |  1 積分
  5. 3AIWA HS-J303 MKⅡ維修手冊
  6. 22.47 MB   |  24次下載  |  10 積分
  7. 4九陽豆?jié){機高清原理圖
  8. 2.47 MB   |  23次下載  |  1 積分
  9. 5多級放大電路的學(xué)習(xí)課件免費下載
  10. 1.81 MB   |  21次下載  |  2 積分
  11. 6AIWA HS-J202/HS-J202M/HS-J800維修手冊
  12. 13.60 MB   |  16次下載  |  10 積分
  13. 7東芝彩色電視機29SF6C維修說明書
  14. 4.86 MB   |  9次下載  |  1 積分
  15. 8人形機器人電機驅(qū)動和傳感報告
  16. 4.27 MB   |  9次下載  |  免費

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935127次下載  |  10 積分
  3. 2開源硬件-PMP21529.1-4 開關(guān)降壓/升壓雙向直流/直流轉(zhuǎn)換器 PCB layout 設(shè)計
  4. 1.48MB  |  420063次下載  |  10 積分
  5. 3Altium DXP2002下載入口
  6. 未知  |  233089次下載  |  10 積分
  7. 4電路仿真軟件multisim 10.0免費下載
  8. 340992  |  191382次下載  |  10 積分
  9. 5十天學(xué)會AVR單片機與C語言視頻教程 下載
  10. 158M  |  183338次下載  |  10 積分
  11. 6labview8.5下載
  12. 未知  |  81586次下載  |  10 積分
  13. 7Keil工具M(jìn)DK-Arm免費下載
  14. 0.02 MB  |  73814次下載  |  10 積分
  15. 8LabVIEW 8.6下載
  16. 未知  |  65988次下載  |  10 積分