COVID19は本当に歴史的なパンデミックであり、全世界に非常に悪影響を及ぼしており、人々はそれと戦うために多くの新しいデバイスを構築しています。また、非接触温度スクリーニング用の自動消毒機とサーマルガンも構築しました。今日は、コロナウイルスとの戦いに役立つもう1つのデバイスを構築します。これは咳検出システムであり、ノイズと咳音を区別し、コロナ容疑者を見つけるのに役立ちます。そのために機械学習技術を使用します。
このチュートリアルでは、Arduino 33 BLESenseとEdgeImpulseStudioを使用して咳検出システムを構築します。通常のバックグラウンドノイズとリアルタイムオーディオの咳を区別できます。Edge Impulse Studioを使用して、咳とバックグラウンドノイズのサンプルのデータセットをトレーニングし、咳の音をリアルタイムで検出できる高度に最適化されたTInyMLモデルを構築しました。
必要なコンポーネント
ハードウェア
- Arduino 33 BLE Sense
- 導いた
- ジャンパー線
ソフトウェア
- エッジインパルススタジオ
- Arduino IDE
Arduino 33 BLESenseに関する詳細なチュートリアルについて説明しました。
回路図
Arduino 33 BLESenseを使用した咳検出の回路図を以下に示します。Arduino 33 BLEのフリッツ部分が入手できなかったので、両方とも同じピン配置であるため、ArduinoNanoを使用しました。
LEDのプラスのリード線はArduino33 BLEセンスのデジタルピン4に接続され、マイナスのリード線はArduinoのGNDピンに接続されています。
咳検知機のデータセットの作成
前述のように、咳検出モデルのトレーニングにはEdge ImpulseStudioを使用しています。そのためには、Arduinoで認識できるようにしたいデータのサンプルを含むデータセットを収集する必要があります。目標は咳を検出することなので、咳と他のノイズを区別できるように、そのサンプルとノイズのサンプルを収集する必要があります。
「咳」と「ノイズ」の2つのクラスを持つデータセットを作成します。データセットを作成するには、Edge Impulseアカウントを作成し、アカウントを確認してから、新しいプロジェクトを開始します。モバイル、Arduinoボードを使用してサンプルをロードするか、データセットをエッジインパルスアカウントにインポートできます。サンプルをアカウントにロードする最も簡単な方法は、携帯電話を使用することです。そのためには、モバイルをEdgeImpulseに接続する必要があります。
携帯電話を接続するには、[デバイス]をクリックしてから、[新しいデバイスを接続]をクリックし ます 。
次のウィンドウで「 携帯電話を使う 」 を クリックすると、QRコードが表示されます。Googleレンズまたは他のQRコードスキャナーアプリを使用して、携帯電話でQRコードをスキャンします。
これにより、電話がEdge Impulsestudioに接続されます。
スマートフォンをEdgeImpulse Studioに接続すると、サンプルを読み込むことができます。サンプルをロードするには、「 データ収集」を クリックします。次に、[データ収集]ページで、ラベル名を入力し、センサーとしてマイクを選択して、サンプルの長さを入力します。「 サンプリング の 開始 」 を クリックして、40秒のサンプルのサンプリングを開始します。咳を強いる代わりに、さまざまな長さのオンライン咳サンプルを使用できます。さまざまな長さの咳サンプルを合計10〜12個記録します。
咳のサンプルをアップロードした後、ラベルを「ノイズ」に設定し、さらに10〜12個のノイズサンプルを収集します。
これらのサンプルはモジュールのトレーニング用です。次のステップでは、テストデータを収集します。テストデータはトレーニングデータの少なくとも30%である必要があるため、「ノイズ」の3つのサンプルと「咳」の4〜5つのサンプルを収集します。
データを収集する代わりに、Edge ImpulseCLIアップローダーを使用してデータセットをEdgeImpulseアカウントにインポートできます。
CLIアップローダーをインストールするには、まず、Node.jsをダウンロードしてラップトップにインストールします。その後、コマンドプロンプトを開き、次のコマンドを入力します。
npm install -g edge-impulse-cli
次に、データセット(データセットリンク)をダウンロードし、プロジェクトフォルダーにファイルを抽出します。コマンドプロンプトを開き、データセットの場所に移動して、次のコマンドを実行します。
edge-impulse-uploader --clean edge-impulse-uploader--categoryトレーニングトレーニング /*.jsonedge-impulse-uploader--categoryトレーニングトレーニング /*.cboredge-impulse-uploader--categoryテストテスト/*.json edge-impulse-uploader--カテゴリテストテスト/*.cbor
モデルのトレーニングとコードの調整
データセットの準備ができたら、データのインパルスを作成します。そのためには、「インパルスの作成」ページに移動します。
次に、[インパルス の 作成]ページで、[処理ブロックの追加]をクリックします。次のウィンドウで、オーディオ(MFCC)ブロックを選択します。その後、「 学習ブロック の 追加 」 を クリックし、ニューラルネットワーク(Keras)ブロックを選択します。次に、[インパルスの保存]をクリックし ます 。
次のステップでは、MFCCページに移動し、[フィーチャの生成]をクリックし ます 。オーディオのすべてのウィンドウに対してMFCCブロックを生成します。
その後、「 NN分類子」 ページに移動し、「 ニューラルネットワーク設定」の 右上隅にある3つのドットをクリックして、「 Keras(エキスパート)モードに切り替える 」 を選択します。
オリジナルを次のコードに置き換え、「 最小信頼度」 を「0.70」に変更します。次に、[トレーニングの開始]ボタンをクリックします。モデルのトレーニングが開始されます。
tensorflow.keras.modelsからtfとしてtensorflowをインポートします。tensorflow.keras.layersからSequentialをインポートします。Tensorflow.keras.optimizersからDense、InputLayer、Dropout、Flatten、Reshape、BatchNormalization、Conv2D、MaxPooling2D、AveragePooling2Dをインポートします。 import MaxNorm#モデルアーキテクチャmodel = Sequential()model.add(InputLayer(input_shape =(X_train.shape、)、name = 'x_input'))model.add(Reshape((int(X_train.shape / 13)、13、 1)、input_shape =(X_train.shape、)))model.add(Conv2D(10、kernel_size = 5、activation = 'relu'、padding = 'same'、kernel_constraint = MaxNorm(3)))model.add(AveragePooling2D (pool_size = 2、padding = 'same'))model.add(Conv2D(5、kernel_size = 5、activation = 'relu'、padding = 'same'、kernel_constraint = MaxNorm(3)))model.add(AveragePooling2D( pool_size = 2、padding = 'same'))model.add(Flatten())model.add(Dense(classes、activation = 'softmax'、name = 'y_pred'、kernel_constraint = MaxNorm(3)))#これは学習率を制御しますopt = Adam(lr = 0.005、beta_1 = 0.9、beta_2 = 0.999)#ニューラルネットワークをトレーニングしますmodel.compile(loss = 'categorical_crossentropy'、optimizer = opt、metrics =)model.fit(X_train、Y_train、batch_size = 32、epochs = 9、validation_data =(X_test、Y_test)、verbose = 2)verbose = 2)verbose = 2)
モデルをトレーニングすると、トレーニングのパフォーマンスが表示されます。私の場合、精度は96.5%、損失は0.10で、続行するのに適しています。
咳検出モデルの準備ができたら、このモデルをArduinoライブラリとしてデプロイします。モデルをライブラリとしてダウンロードする前に、「 ライブ分類 」ページに移動してパフォーマンスをテストできます。
「 デプロイメント 」ページに移動し、「 Arduinoライブラリ」 を選択します。次に、下にスクロールして[ ビルド ]をクリックし、プロセスを開始します。これにより、プロジェクト用のArduinoライブラリが構築されます。
次に、ArduinoIDEにライブラリを追加します。そのためには、Arduino IDEを開き、[ スケッチ ] > [ライブラリを含める ] > [Add.ZIPライブラリ ]をクリックし ます。
次に、 [ファイル]> [例]> [プロジェクト名]-[エッジインパルス]> [nano_ble33_sense_microphone]に移動して例を読み込みます。
Arduinoが咳を検出したときにアラート音を鳴らすことができるように、コードにいくつかの変更を加えます。そのため、ブザーはArduinoに接続されており、咳を検出するたびにLEDが3回点滅します。
変更は、ノイズと咳の値を出力する void loop() 関数で行われます。元のコードでは、ラベルとその値の両方を一緒に印刷しています。
for(size_t ix = 0; ix <EI_CLASSIFIER_LABEL_COUNT; ix ++){ei_printf( "%s:%。5f \ n"、result.classification.label、result.classification.value); }
ノイズと咳の両方の値をさまざまな変数に保存し、ノイズ値を比較します。ノイズ値が0.50を下回ると、咳の値が0.50を超え、音が鳴ります。元の forloop() コードを次のように置き換え ます 。
for(size_t ix = 1; ix <EI_CLASSIFIER_LABEL_COUNT; ix ++){Serial.print(result.classification.value); float Data = result.classification.value; if(Data <0.50){Serial.print( "Cough Detected"); 警報(); }}
変更を加えたら、コードをArduinoにアップロードします。115200ボーでシリアルモニターを開きます。
したがって、これが咳検出機の構築方法です。COVID19の容疑者を見つけるのにあまり効果的な方法ではありませんが、混雑した地域ではうまく機能します。
ライブラリとコードを含む完全な作業ビデオを以下に示します。