TinyML-言語検出器-エッジインパルスとArduinoに基づく
コンポーネントと消耗品
> |
| × | 1 | |||
| × | 1 | ||||
| × | 3 | ||||
| × | 1 |
必要なツールとマシン
> |
| |||
|
アプリとオンラインサービス
> |
| |||
| ||||
|
このプロジェクトについて
概要
このプロジェクトの背後にある考え方は、マイクロコントローラーに実装されたニューラルネットワーキング/ディープラーニングを使用して、言語分類を作成することです。デバイスは、イタリア語、英語、フランスの言語の1つの単語を識別します。認識される単語は「 si 「イタリア語の場合、「 oui フランス語の場合は「はい 「英語の場合。デバイスは継続的にリッスンしており、3つの単語の1つが認識されると、関連する言語のフラグが発生します。
このプロジェクトは、Arduino Nano 33 BLESenseマイクロコントローラーとEdgeImpulseStudio開発プラットフォームの2つの主要コンポーネントに基づいています。
プロジェクトの実装は次の手順に従っていました:
- データセットのサンプリング/作成
- モデルを設計する
- モデルのトレーニング
- モデルのテスト
- ハードウェアに合わせてカスタマイズ
- モデルの展開とそのカスタマイズ
- 最終的なデバイス(モデル周辺のハードウェア)を構築します。
データセットのサンプリング/作成
データセットは、グローバルに約30分(各単語で10分)続く3つの単語(oui、si、yes)の記録で構成されています。
単語ごとに、同じ単語が連続して繰り返される連続サウンドファイルが作成され、Audacityアプリケーションを使用して、ファイルが1秒間のそれぞれの複数のファイルに分割されました。各ファイルには、単語の例が含まれています。
<図>次に、これらのファイルはエッジインパルスにアップロードされ、単語に従ってラベルが付けられました。
これらのファイルに加えて、1秒間の録音ファイルの別のセットがアップロードされ、バックグラウンドノイズとしてラベル付けされました。
<図>グローバルにトレーニングデータは33分で構成されていました(各単語に10分、バックグラウンドノイズに3分)
モデルを設計する
モデルは、エッジインパルスプラットフォームを利用して実装されました。エッジインパルスプラットフォームでは、必要なアルゴリズムのほとんどがすでに定義されています。
モデルを作成するための最初のステップは、サウンドを時系列に変換することです。次に、時系列は事前定義された時間ウィンドウサイズで分割されます。
(この最初の変換は、下の画像の赤い側に示されています。)
<図>2番目のステップは、信号処理技術(この場合はMFCC(Mel Frequency Cepstral Coefficients))を使用して、4つのクラス(3ワード+背景)のそれぞれを最もよく特徴付ける時系列から特徴を抽出することです。
MFCC変換とその係数の例を以下に示します。
<図>時系列と係数の畳み込みは、ニューラルネットワークにフィードするために使用されます。最後に、ニューラルネットワークの出力は、各クラスに属する確率を提供します。
ニューラルネットワークの実装とその分類パフォーマンスの概要を以下に示します。
<図>
トレーニング-ArduinoNano 33 BLESense用にカスタマイズ
トレーニングと最終的なモデルのカスタマイズのために、「 EONチューナー」と呼ばれる新しいオプションがEdgeImpulseStudioで利用可能です。 "。組み込みの機械学習アプリケーションに最適なアーキテクチャを選択できます。
可能なモデルの多くのインスタンスを並行して実行し、各インスタンスは異なる構成(異なる信号デジタル技術と異なるニューラルネットワークアーキテクチャ)を備えています。
このオプションを実行するには、いくつかの情報が必要です。
- 「ターゲット モデルタイプを表す「」(この場合は「キーワードスポッティング」) ")
- アプリケーションを実行するハードウェア(この場合は「 Arduino Nano 33 BLE Sense(Cortex-M4F 64MHz)」 "。
インスタンスごとに、いくつかの分類パフォーマンスメトリック、計算にかかる時間、RAMの量、およびマイクロコントローラーファイルシステムで使用されるファイルシステムスペースが示されます。
<図>このプロジェクトでは、分類の精度について5つの最良のインスタンスを選択し、それらから最速のインスタンスを選択しました。
テスト
テストは、新しいレコーダーファイルのセットを収集し、分類の品質を確認することによって実行されました。
<図>分類が正確であることが確認されたら。実装の次のステップである最終的な展開に移りました。
導入
エッジインパルススタジオのおかげで導入は非常に簡単でした。
<図>デプロイオプションからArduinoライブラリオプションが選択されました。これにより、モデルの標準のarduino Cファイルが作成され、ニーズに合わせてカスタマイズできます。
<図>建物がエッジインパルスによって完成すると、zipファイルが作成され、ローカルマシンにダウンロードされます。最終的なカスタマイズのために、ArduinoIdeにインポートする必要があります。
コード
コードはリンクから入手できます。このコードは、以下に示すように、いくつかのカスタマイズを行ったエッジインパルスからダウンロードされたコードに基づいています。
1.ライブラリを追加しました Adafruit_PWMServoDriver.h 旗に取り付けられたサーボを駆動するため。
2.関数 servos_selector が定義されました 分類結果に従ってサーボを調整します。
voidservos_selector(int iter){
time_now =millis();
delta =time_now --time_was;
if(delta> 2000){
time_was =time_now;
switch(iter){
case 0:
pwm.setPWM(0、0、350);
delay(500);
pwm.setPWM( 0、0、200);
pwm.setPWM(1、0、200);
pwm.setPWM(2、0、200);
break;
ケース1:
pwm.setPWM(1、0、350);
Serial.println( "2222");
delay(500);
pwm.setPWM(0、0、200); );
pwm.setPWM(1、0、200);
pwm.setPWM(2、0、200);
break;
ケース2:
pwm .setPWM(2、0、350);
Serial.println( "333");
delay(500);
pwm.setPWM(0、0、200);
pwm.setPWM(1、0、200);
pwm.setPWM(2、0、200);
break;
}
}
} コード>
3.最後に、 servos_select を呼び出すIF条件が追加されました。 「 result.classification 」に基づく関数 「オブジェクト。
for(size_t ix =0; ix ei_printf( "%s:%。5f \ n"、result.classification [ix] .label、
result.classification [ix] .value);
}
#if EI_CLASSIFIER_HAS_ANOMALY ==1
ei_printf( "異常スコア:%。3f \ n"、result.anomaly);
#endif
print_results =0;
}
if(result.classification [1] .value> 0.80){
servos_selector(0);
}
else if(result.classification [2] .value> 0.80){
servos_selector(1);
}
else if(result.classification [3] .value> 0.80){
servos_selector(2);
}
}
電気回路
電気回路は、マイクロコントローラーArduino Nano 33 BLE Senseマイクロコントローラーに基づいており、PCA9685を使用して3つのサーボを駆動します。
PCA9685ワークロードは、9Vの外部バッテリーでサポートされています。
<図>以上です。
コード
コード
https://github.com/EnzoCalogero/Tensorflow_Lite_embeded/tree/main/nano_sense_EdgeImpulse/language_detection/nano_ble33_sense_microphone_continuous カスタムパーツとエンクロージャー
回路図
languagedetection_9RxXhRX5sj.fzz 製造プロセス