Arduino Nano 33 BLE Sense と TinyML で咳検知 - エッジAIによるインフルエンザ早期発見
必要な部品と材料
| 部品 | 数量 |
|---|---|
| Arduino Nano 33 BLE Sense(マイク内蔵、Cortex-M4F) | 1 |
使用ツール・サービス
- Edge Impulse Studio(ブラウザ完結のTinyML開発プラットフォーム)
- Arduino IDE / CLI
- Android / iOS スマートフォン(データ収集・推論テスト用)
プロジェクト概要
新型コロナウイルスやインフルエンザの早期検知ニーズに応えるため、Arduino Nano 33 BLE Senseの内蔵マイクとTinyML(エッジ機械学習)を用いて、リアルタイムで咳音を検知するシステムを構築します。Edge Impulseで咳/環境音のデータセットを構築し、MFCC特徴量抽出+2D畳み込みニューラルネットワーク(Keras)で分類モデルを学習、約20KB RAMでNano BLE Sense上でリアルタイム推論が可能です。同じ手法で、高齢者見守り、産業機械異音検知、安全監視等への応用も可能です。
準備・要件
- 基本的なソフトウェア開発とArduinoの理解
- Arduino IDE または CLI インストール済み
- AndroidまたはiOSスマートフォン
- Arduino Nano 33 BLE Sense(または同等のCortex-M4+ マイク搭載ボード)
ステップ1:Edge Impulse プロジェクト作成
- Edge Impulse Studio で無料アカウント作成
- 新規プロジェクト作成(例: "Arduino Cough Tutorial")
ステップ2:データセット収集・インポート
チュートリアル用に約10分間の「咳(cough)」と「環境音(noise)」のデータセットが提供されています。
- データセットダウンロード: cough.zip
- 解凍後、Edge Impulse CLI でアップロード:
$ edge-impulse-uploader --clean $ edge-impulse-uploader --category training training/* $ edge-impulse-uploader --category testing testing/* - ユーザー名/パスワード/プロジェクトを指定してアップロード完了
※このデータセットは実験用に小規模です。実際の運用では、多様な咳・環境音・発話等を追加して拡張することを強く推奨します。
独自データ収集(スマホ/実機)
- Edge Impulse「Devices」ページで「Use your mobile phone」選択 → QRコードでスマホブラウザ接続
- 「Data acquisition」ページからラベル(cough/noise)指定で録音・アップロード
- Nano BLE Sense実機からの収集も可能(
edge-impulse-daemonインストール後)
ステップ3:インパルス(信号処理+学習)設計
- Create impulse ページで:Window size 1000ms, Window increase 500ms
- 処理ブロック: Audio (MFCC) 追加(スペクトログラム抽出)
- 学習ブロック: Neural Network (Keras) 追加
- 「Save Impulse」
MFCC パラメータ
デフォルトでOK。「Generate features」ボタンで全学習データから特徴量生成(数分)。
ステップ4:ニューラルネットワーク設計・学習
咳検知は連続音より複雑なため、スペクトログラムを画像のように扱う 2D畳み込み(Conv2D) アーキテクチャを採用します。
- NN Classifier ページで「Switch to Keras (expert) mode」選択
- 以下のアーキテクチャ定義で置換:
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)
- Minimum confidence rating: 0.70 に設定
- 「Start training」で学習実行(数秒〜数十秒)
ステップ5:テスト・検証
- Live classification ページでテストデータまたは実機ストリーミングで推論テスト
- スマホブラウザをリフレッシュし、「Classify new data」で実機音声を分類
ステップ6:デプロイメント
スマートフォンへ(WebAssembly)
- スマホのブラウザをリフレッシュ
- 「Switch to classification mode」ボタン押下
- WebAssemblyパッケージが自動ビルドされ、オフライン(機内モードでも)で連続推論実行
Arduino Nano 33 BLE Sense へ(ファームウェア)
- Edge Impulse「Deployment」ページで「Arduino Nano 33 BLE Sense」選択 → 「Build」
- 生成されたバイナリを画面指示に従ってボードへ書き込み
- シリアルモニタ(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
今後の拡張アイデア
- データセット拡充:多様な咳、環境音、発話、あくび等のクラス追加・定期的再学習
- 単体テスト(Testingページ)でモデル品質を継続監視
- Arduino Library としてエクスポートし、スケッチに組み込んでLED/ディスプレイ表示等のアクション追加
- Nano BLE Senseの加速度センサー(3軸)を活用した複合検知(咳+体動等)
- 他の音響パターン(機械異音、ガラス破損、赤ちゃんの泣き声等)への応用
参考リンク
- Edge Impulse ドキュメント: docs.edgeimpulse.com
- Arduino Nano 33 BLE Sense 製品ページ: store.arduino.cc
- UN Covid Detect & Protect Challenge (Hackster/Edge Impulse/UN 共催)
製造プロセス
- K30 CO2センサで室内空気質をリアルタイム監視する
- 1SheeldとArduinoで盲ろう者のコミュニケーションを支援する
- スマート貯金箱を作ろう:Arduino Nanoでコインアクセプターを制御
- ArduinoでBluetooth経由でLEDを制御 – シンプルDIYガイド
- DFRobot静電容量式指紋センサーをArduino/ESP8266で使う – 登録・認証・削除の完全ガイド
- Arduino MegaとNextion HMIで作る高機能ウェザーステーション
- Arduinoベースのヌンチャク操作6自由度ロボットアームキット
- TinyMLで植物の健康状態を診断:実践ガイド
- リアルタイム森林火災監視システム: SMSアラート機能付き
- Arduino UNOとEthernetシールドで太陽放射を測定する自作ピラノメーター
- コンパクトなArduinoレーダーシステム – HC-SR04超音波センサー & 1.8インチST7735ディスプレイ搭載