工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

Arduino Nano 33 BLE Sense と TinyML で咳検知 - エッジAIによるインフルエンザ早期発見

必要な部品と材料

部品 数量
Arduino Nano 33 BLE Sense(マイク内蔵、Cortex-M4F) 1

使用ツール・サービス

プロジェクト概要

新型コロナウイルスやインフルエンザの早期検知ニーズに応えるため、Arduino Nano 33 BLE Senseの内蔵マイクとTinyML(エッジ機械学習)を用いて、リアルタイムで咳音を検知するシステムを構築します。Edge Impulseで咳/環境音のデータセットを構築し、MFCC特徴量抽出+2D畳み込みニューラルネットワーク(Keras)で分類モデルを学習、約20KB RAMでNano BLE Sense上でリアルタイム推論が可能です。同じ手法で、高齢者見守り、産業機械異音検知、安全監視等への応用も可能です。

準備・要件

ステップ1:Edge Impulse プロジェクト作成

  1. Edge Impulse Studio で無料アカウント作成
  2. 新規プロジェクト作成(例: "Arduino Cough Tutorial")

ステップ2:データセット収集・インポート

チュートリアル用に約10分間の「咳(cough)」と「環境音(noise)」のデータセットが提供されています。

  1. データセットダウンロード: cough.zip
  2. 解凍後、Edge Impulse CLI でアップロード:
    $ edge-impulse-uploader --clean
    $ edge-impulse-uploader --category training training/*
    $ edge-impulse-uploader --category testing testing/*
    
  3. ユーザー名/パスワード/プロジェクトを指定してアップロード完了

※このデータセットは実験用に小規模です。実際の運用では、多様な咳・環境音・発話等を追加して拡張することを強く推奨します。

独自データ収集(スマホ/実機)

ステップ3:インパルス(信号処理+学習)設計

  1. Create impulse ページで:Window size 1000ms, Window increase 500ms
  2. 処理ブロック: Audio (MFCC) 追加(スペクトログラム抽出)
  3. 学習ブロック: Neural Network (Keras) 追加
  4. 「Save Impulse」

MFCC パラメータ

デフォルトでOK。「Generate features」ボタンで全学習データから特徴量生成(数分)。

ステップ4:ニューラルネットワーク設計・学習

咳検知は連続音より複雑なため、スペクトログラムを画像のように扱う 2D畳み込み(Conv2D) アーキテクチャを採用します。

  1. NN Classifier ページで「Switch to Keras (expert) mode」選択
  2. 以下のアーキテクチャ定義で置換:
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, InputLayer, Dropout, Flatten, Reshape, BatchNormalization, Conv2D, MaxPooling2D, AveragePooling2D
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.constraints import MaxNorm

model = Sequential()
model.add(InputLayer(input_shape=(X_train.shape[1],), name='x_input'))
model.add(Reshape((int(X_train.shape[1] / 13), 13, 1), input_shape=(X_train.shape[1],)))
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=['accuracy'])
model.fit(X_train, Y_train, batch_size=32, epochs=9, validation_data=(X_test, Y_test), verbose=2)

ステップ5:テスト・検証

ステップ6:デプロイメント

スマートフォンへ(WebAssembly)

  1. スマホのブラウザをリフレッシュ
  2. 「Switch to classification mode」ボタン押下
  3. WebAssemblyパッケージが自動ビルドされ、オフライン(機内モードでも)で連続推論実行

Arduino Nano 33 BLE Sense へ(ファームウェア)

  1. Edge Impulse「Deployment」ページで「Arduino Nano 33 BLE Sense」選択 → 「Build」
  2. 生成されたバイナリを画面指示に従ってボードへ書き込み
  3. シリアルモニタ(115200 baud)を開き、AT+RUNIMPULSE コマンドで推論開始

実機推論ログ例


> AT+RUNIMPULSE
Inferencing settings:
 Interval: 0.06 ms.
 Frame size: 16000
 Sample length: 1000 ms.
 No. of classes: 2
Starting inferencing, press 'b' to break
Recording...
Recording done
Predictions (DSP: 495 ms., Classification: 84 ms., Anomaly: 0 ms.):
 cough: 0.01562
 noise: 0.98438
...
Recording done
Predictions (DSP: 495 ms., Classification: 84 ms., Anomaly: 0 ms.):
 cough: 0.86719   ← 咳検知!
 noise: 0.13281

今後の拡張アイデア

参考リンク

製造プロセス

  1. K30 CO2センサで室内空気質をリアルタイム監視する
  2. 1SheeldとArduinoで盲ろう者のコミュニケーションを支援する
  3. スマート貯金箱を作ろう:Arduino Nanoでコインアクセプターを制御
  4. ArduinoでBluetooth経由でLEDを制御 – シンプルDIYガイド
  5. DFRobot静電容量式指紋センサーをArduino/ESP8266で使う – 登録・認証・削除の完全ガイド
  6. Arduino MegaとNextion HMIで作る高機能ウェザーステーション
  7. Arduinoベースのヌンチャク操作6自由度ロボットアームキット
  8. TinyMLで植物の健康状態を診断:実践ガイド
  9. リアルタイム森林火災監視システム: SMSアラート機能付き
  10. Arduino UNOとEthernetシールドで太陽放射を測定する自作ピラノメーター
  11. コンパクトなArduinoレーダーシステム – HC-SR04超音波センサー & 1.8インチST7735ディスプレイ搭載