RGBライトを制御するためのTinyMLキーワード検出
コンポーネントと消耗品
> | Arduino Nano 33 BLE Sense | | × | 1 | |
アプリとオンラインサービス
> | | |
このプロジェクトについて
前提
エッジでの機械学習は、従来のコードと比較してはるかに少ないプログラミングと論理フローチャートで「インテリジェント」なタスクを実行できるデバイスを作成するのに非常に役立ちます。そのため、特定の単語を認識し、発言内容に基づいてタスクを実行できる最先端のキーワード検出を組み込みたいと考えました。
ハードウェア
このプロジェクトには、Arduino Nano 33 BLESenseという1つのコンポーネントしかありません。実際の魔法は機械学習モデルで発生します。 Arduino Nano 33 BLE Senseには、マイク、9軸IMU、環境センサー、ジェスチャー/近接/色/環境光センサー(APDS-9960)などのセンサーが満載です。その上のマイクロコントローラは、64MHzで動作し、1MBのフラッシュメモリと256KBのRAMを含むnRF52840です。このプロジェクトでは、オンボードRGBLEDを使用して現在の色を表示します。
<図> <図>
エッジインパルスの設定
まず、Edge Impulseで新しいプロジェクトを作成し、次にEdge ImpulseCLIツールをインストールしました。これを行う方法の詳細については、インストール手順ページにアクセスしてください。これにより、Arduino Nanoはクラウドサービスと通信して、コマンドを受信し、センサーデータを自動的に送信できます。最新のEdgeImpulseファームウェアをダウンロードし、リセットボタンをダブルクリックしてブートローダーモードにすることでボードにフラッシュしました。次に、 flash_windows.bat
を実行しました それを転送します。
<図>
コマンドプロンプトで edge-impulse-daemon
を実行しました ウィザードに従って設定しました。これで、Nanoがプロジェクトのデバイスリストに表示され、トレーニング/テストデータセットの一部としてサンプルを取得してアップロードできるようになります。
<図>
サンプルの収集
機械学習モデルのトレーニングには、データとそのかなりの量が必要です。 RGBLEDストリップに次のモードが必要でした。
モードごとに約1分の音が出て、1〜2秒間隔で単語を繰り返し言って分割しました。
<図> <図>
しかし、これらのサンプルを持っているだけでは十分ではありません。バックグラウンドノイズや他の単語が誤った読みを与えるからです。ありがたいことに、Edge Impulseは、ノイズと「不明な」単語の事前に作成されたデータセットをすでに提供しているため、「既存のデータのアップロード」ツールを使用して、これらのオーディオファイルをトレーニングデータにアップロードしました。
<図>
最後に、データセットのバランスを取り直して、データのトレーニングとテストにそれぞれ推奨される80〜20の分割を行いました。
<図>
モデルのトレーニング
1時間のトレーニングデータとたくさんのラベルで武装したので、モデルをトレーニングする時が来ました。私が設計したインパルスは、ウィンドウサイズが1秒でウィンドウが500ms増加する時系列データとしてオーディオを取り込みます。次に、MFCCブロックを通過してKerasニューラルネットワークブロックに入ります。
<図>
MFCCブロックを使用すると、周波数を視覚的に示すスペクトログラムとともに、オーディオの処理方法を構成できます。
<図>
ニューラルネットワークの設定はほとんどデフォルトのままにしましたが、いくつかの変更も加えました。最初に、最小信頼しきい値を0.80から0.70に変更し、追加のノイズとマスキング時間帯域の形でデータ拡張を少し追加しました。これにより、NNはより多様なデータを処理できるため、モデルの過剰適合を回避できます。
<図>
Arduino Nano 33 BLESenseへの展開
Arduino Nano 33 BLE Senseは、音声を継続的にサンプリングし、キーワードの1つが話されたかどうかを検出する常時オンのマイクとして機能します。見つかったら、キーワードは目的の色をデコードするために使用されるインデックスに変換されます。 onまたはoffキーワードの場合、LEDは黒またはライトグレーに設定されます。
モデルをライブラリとしてダウンロードしてArduinoIDEに追加し、コードをコンパイルしてNanoにフラッシュしました。
<図>
コード
RGBLEDKeywordDetection C / C ++
/ * Edge ImpulseArduinoの例* Copyright(c)2020 EdgeImpulse Inc. * *このソフトウェアおよび関連するドキュメントファイル(「ソフトウェア」)のコピーを取得するすべての人に*許可が無料で付与されます。ソフトウェアのコピーを使用、コピー、変更、マージ、公開、配布、サブライセンス、および/または販売する権利を含むがこれらに限定されない、ソフトウェアでの取引、およびソフトウェアの所有者を許可すること。 * *上記の著作権通知およびこの許可通知は、ソフトウェアのすべてのコピーまたは実質的な部分に含まれるものとします。 * *ソフトウェアは「現状有姿」で提供され、商品性の保証を含むがこれに限定されない、明示または黙示を問わず、いかなる種類の保証もありません。*特定の目的および非侵害への適合性。いかなる場合も、*作者または著作権所有者は、本ソフトウェアまたは使用またはその他に起因または関連して、契約、不法行為、またはその他の行為にかかわらず、いかなる請求、損害、またはその他の責任についても責任を負わないものとします。 *ソフトウェアでの取引。 * ///ターゲットのメモリが制限されている場合は、このマクロを削除して10Kを節約しますRAM#define EIDSP_QUANTIZE_FILTERBANK 0 / ***モデルウィンドウごとのスライス数を定義します。例えば。 1000ミリ秒のモデルウィンドウ*モデルウィンドウあたりのスライス数は4に設定されています。結果としてスライスサイズは250ミリ秒になります。 *詳細:https://docs.edgeimpulse.com/docs/continuous-audio-sampling * /#define EI_CLASSIFIER_SLICES_PER_MODEL_WINDOW 3 / *含まれるもの------------------- --------------------------------------------- * /#include #include #include