Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Обнаружение кашля с TinyML на Arduino Nano 33 BLE Sense для ранней диагностики гриппа

Компоненты и материалы

Arduino Nano 33 BLE Sense 1

Приложения и онлайн-сервисы

О проекте

Существует огромная потребность в дешевых, легко развертываемых решениях для раннего обнаружения COVID-19 и гриппа. Вместе с ООН, Hackster, Edge Impulse и другими запущен UN Covid Detect & Protect Challenge для создания доступных инструментов профилактики и детектирования в развивающихся странах. В этом туториале показано, как использовать Edge Impulse (TinyML) на Arduino Nano BLE Sense для обнаружения кашля в реальном времени по аудиосигналу.

Мы собрали датасет из 10 минут аудиозаписей двух классов — «cough» (кашель) и «noise» (фоновый шум), обучили высокооптимизированную TinyML-модель, которая работает в реальном времени менее чем в 20 КБ ОЗУ на Nano BLE Sense. Подход применим ко многим задачам аудио-паттерн-матчинга: уход за пожилыми, безопасность, мониторинг оборудования. Проект и датасет начал Картик Тхакор для помощи в борьбе с COVID-19.

Начало работы

Требования:

Используем Edge Impulse — онлайн-платформу ML для эдж-устройств. Создайте бесплатный аккаунт, войдите, назовите проект (например, «Arduino Cough Tutorial»).

Обнаружение кашля с TinyML на Arduino Nano 33 BLE Sense для ранней диагностики гриппа

Сбор датасета

Первый шаг любого ML-проекта — сбор репрезентативного датасета. Мы подготовили небольшой датасет (10 мин аудио, классы «cough» и «noise»). Покажем, как импортировать его в Edge Impulse, добавить свои сэмплы или начать с нуля.

Внимание: Принудительный кашель вреден для голосовых связок — будьте осторожны при сборе данных и тестировании!

  1. Скачайте датасет: cough.zip и распакуйте.
  2. Установите Edge Impulse CLI.
  3. В терминале перейдите в папку с данными и выполните:
    $ edge-impulse-uploader --clean
    $ edge-impulse-uploader --category training training/*
    $ edge-impulse-uploader --category testing testing/*
  4. Введите логин/пароль Edge Impulse и выберите проект. Сэмплы появятся на странице Data acquisition. Клик по сэмплу показывает волну и позволяет прослушать.
Обнаружение кашля с TinyML на Arduino Nano 33 BLE Sense для ранней диагностики гриппа

10 минут достаточно для старта. Можно расширить датасет своими записями. Сбор данных с телефона — проще всего (полный туториал здесь). На странице Devices нажмите «+ Connect a new device» → «Use your mobile phone» → отсканируйте QR-код камерой телефона.

Обнаружение кашля с TinyML на Arduino Nano 33 BLE Sense для ранней диагностики гриппа
Обнаружение кашля с TinyML на Arduino Nano 33 BLE Sense для ранней диагностики гриппа

Теперь на странице Data acquisition в разделе «Record new data» выберите лейбл «cough» или «noise», сенсор «Microphone», нажмите «Start sampling». Телефон запишет сэмпл и добавит в датасет.

Обнаружение кашля с TinyML на Arduino Nano 33 BLE Sense для ранней диагностики гриппа

Сбор с Nano BLE Sense также поддерживается: установите файрмварь и демон Edge Impulse, затем собирайте данные так же, как с телефона.

Обнаружение кашля с TinyML на Arduino Nano 33 BLE Sense для ранней диагностики гриппа

Создание импульса (Impulse)

На странице Create impulse выберите блоки обработки и обучения. Оставьте Window size = 1000 мс, Window increase = 500 мс (аудио обрабатывается окнами по 1 сек со сдвигом 0.5 сек). Маленькое окно экономит память, но требует кашля без больших пауз.

Обнаружение кашля с TinyML на Arduino Nano 33 BLE Sense для ранней диагностики гриппа
  1. Add processing block → Audio (MFCC).
  2. Add learning block → Neural Network (Keras).
  3. Save Impulse.

Audio-блок извлекает спектрограмму для каждого окна, нейросеть классифицирует её как «cough» или «noise».

Обнаружение кашля с TinyML на Arduino Nano 33 BLE Sense для ранней диагностики гриппа

На странице MFCC генерация признаков: оставьте параметры по умолчанию, нажмите «Generate features» (занимает пару минут).

Обнаружение кашля с TinyML на Arduino Nano 33 BLE Sense для ранней диагностики гриппа
Обнаружение кашля с TinyML на Arduino Nano 33 BLE Sense для ранней диагностики гриппа

Обучение нейросети

На странице NN Classifier настроим сеть. Для кашля нужна более сложная архитектура с 2D-конволюцией по спектрограмме (как в классификации изображений). Нажмите «Switch to Keras (expert) mode» в правом верхнем углу «Neural Network settings».

Обнаружение кашля с TinyML на Arduino Nano 33 BLE Sense для ранней диагностики гриппа

Замените архитектуру на:

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» (несколько секунд).

Обнаружение кашля с TinyML на Arduino Nano 33 BLE Sense для ранней диагностики гриппа

Алгоритм обнаружения кашля готов к тесту!

Обучение и тестирование

Страница Live classification позволяет тестировать на тестовых данных или стримить аудио с телефона/платы. Выберите тестовый сэмпл → «Load sample» → классификация.

Обнаружение кашля с TinyML на Arduino Nano 33 BLE Sense для ранней диагностики гриппа

Для живого теста обновите страницу на телефоне, выберите устройство в «Classify new data» → «Start sampling». Так же работает с Nano BLE Sense через edge-impulse-daemon.

Развертывание (Deployment)

На телефон: обновите браузер на телефоне → «Switch to classification mode». Проект соберется в WebAssembly и будет работать локально (даже в авиарежиме).

Обнаружение кашля с TinyML на Arduino Nano 33 BLE Sense для ранней диагностики гриппа

На Nano BLE Sense: страница Deployment → «Arduino Nano 33 BLE Sense» под «Build firmware» → «Build».

Обнаружение кашля с TinyML на Arduino Nano 33 BLE Sense для ранней диагностики гриппа

Соберется полная прошивка с вашей моделью. Следуйте инструкциям на экране для прошивки платы.

Обнаружение кашля с TinyML на Arduino Nano 33 BLE Sense для ранней диагностики гриппа

После прошивки откройте Serial Monitor (115200 baud), нажмите Enter для промпта, введите:

> 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
...
(при кашле: cough: 0.86719, noise: 0.13281)

Дальнейшая работа

Производственный процесс

  1. Датчик CO2 K30: мониторинг качества воздуха в реальном времени на Arduino
  2. Устройство для общения глухосліпых людей с помощью 1Sheeld и Arduino
  3. Умная копилка: управление монетоприёмником на Arduino Nano
  4. Управление светодиодом по Bluetooth с Arduino: простой DIY-гид
  5. Интеграция ёмкостного сканера отпечатков DFRobot с Arduino или ESP8266
  6. Интерактивный HMI-проект на Nextion с Arduino Mega и датчиками
  7. Роботизированная рука 6 степеней свободы на Arduino Mega с управлением через Nunchuk
  8. Оценка здоровья растений с TinyML: Практическое руководство
  9. Система мониторинга лесных пожаров в реальном времени с SMS-уведомлениями
  10. Измерение солнечной радиации на Arduino UNO с Ethernet Shield