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

Обнаружение кашля с помощью TinyML на Arduino

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

Arduino Nano 33 BLE Sense
× 1

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

Edge Impulse Studio

Об этом проекте

Существует огромная потребность в недорогих, легко развертываемых решениях для раннего выявления COVID-19 и других заболеваний, связанных с гриппом. Совместно с ООН, Hackster, Edge Impulse и многими другими мы недавно запустили UN Covid Detect &Protect Challenge, целью которого является создание легко развертываемых решений для предотвращения и обнаружения гриппа в развивающихся странах. В этом руководстве мы покажем, как использовать машинное обучение Edge Impulse на Arduino Nano BLE Sense для обнаружения кашля в звуке в реальном времени. Мы создали набор данных образцов кашля и фонового шума и применили высокооптимизированную модель TInyML для создания системы обнаружения кашля, которая работает в режиме реального времени в менее чем 20 КБ ОЗУ на Nano BLE Sense. Этот же подход применяется ко многим другим приложениям сопоставления встроенных звуковых шаблонов, например, по уходу за пожилыми людьми, безопасности и мониторингу оборудования. Первоначально этот проект и набор данных были начаты Картиком Такоре, чтобы помочь в борьбе с COVID-19.

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

К этому руководству предъявляются следующие требования:

  • Базовое понимание разработки программного обеспечения и Arduino
  • Установленная среда разработки Arduino или интерфейс командной строки
  • Мобильный телефон Android или iOS.
  • Arduino Nano BLE Sense или аналогичная плата Cortex-M4 + с микрофоном (необязательно)

Мы будем использовать Edge Impulse, платформу онлайн-разработки для машинного обучения на периферийных устройствах. Создайте бесплатную учетную запись, зарегистрировавшись здесь. Войдите в свою учетную запись и дайте своему новому проекту имя, щелкнув заголовок. Мы называем наш «Учебник от кашля для Arduino».

Сбор набора данных

Первым шагом в любом проекте машинного обучения является сбор набора данных, который представляет известные образцы данных, которые мы хотели бы сопоставить на нашем устройстве Arduino. Для начала мы создали небольшой набор данных с 10-минутным звуком двух классов:«кашель» и «шум». Мы покажем, как импортировать этот набор данных в ваш проект Edge Impulse, добавить свои собственные образцы или даже начать свой собственный набор данных с нуля. Этот набор данных невелик и содержит ограниченное количество образцов кашля и мягкого фонового шума. Таким образом, набор данных подходит только для экспериментов, а модель, созданная в этом руководстве, способна различать только тихий фоновый шум и небольшой диапазон кашля. Мы рекомендуем вам расширить набор данных с более широким диапазоном кашля, фонового шума и других классов, таких как человеческая речь, для повышения производительности.

Примечание. Принуждать себя кашлять очень тяжело для ваших голосовых связок, будьте осторожны при сборе данных и тестировании!

Сначала загрузите наш набор данных о кашле и извлеките файл на свой компьютер в любое место по вашему выбору:https://cdn.edgeimpulse.com/datasets/cough.zip

Вы можете импортировать этот набор данных в свой проект Edge Impulse с помощью загрузчика интерфейса командной строки Edge Impulse. Установите интерфейс командной строки Edge Impulse, следуя этим инструкциям по установке.

Откройте терминал или командную строку и перейдите в папку, в которую вы извлекли файл.

Выполнить:

  $ edge-impulse-uploader --clean 
$ edge-impulse-uploader --category training training / *
$ edge-impulse-uploader --category testing testing / *

Вам будет предложено ввести имя пользователя Edge Impulse, пароль и проект, в который вы хотите добавить набор данных. Образцы наборов данных теперь будут отображаться на странице Сбор данных . страница. Нажав на образец, мы можем увидеть, как он выглядит, и услышать звук, нажав кнопку воспроизведения под каждым графиком.

Для начала достаточно 10 минут анализа данных о кашле и шумах. При желании вы можете расширить набор данных собственными образцами кашля и фонового шума. Мы можем собирать новые образцы данных прямо с устройств из сбора данных страница. Сэмплы аудио в формате WAV также можно загрузить с помощью загрузчика интерфейса командной строки Edge Impulse.

Самый простой способ начать - собрать аудиоданные с помощью мобильного телефона (полное руководство можно найти здесь). Перейдите в Устройства странице и нажмите кнопку «+ Подключить новое устройство» в правом верхнем углу. Выберите «Использовать свой мобильный телефон». Это создаст уникальный QR-код для открытия веб-приложения в браузере вашего телефона. Сделайте снимок QR-кода и нажмите, чтобы открыть ссылку.

Веб-приложение подключится к вашему проекту Edge Impulse и должно выглядеть следующим образом:

Теперь мы можем собирать образцы аудиоданных прямо с телефона с помощью сбора данных . страница Edge Impulse. В разделе «Записать новые данные» введите метку «кашель» или «шум», убедитесь, что «Микрофон» выбран в качестве датчика, и нажмите «Начать выборку». Теперь ваш телефон соберет образец звука и добавит его в набор данных.

Также поддерживается сбор аудиоданных непосредственно с платы Nano BLE Sense. Следуйте этим инструкциям, чтобы установить прошивку и демон Edge Impulse. После подключения устройства к Edge Impulse вы можете собирать образцы данных так же, как с помощью мобильного телефона, описанного выше.

Создайте свой импульс

Затем мы выберем блоки обработки сигналов и машинного обучения на вкладке Создать импульс . страница. Импульс будет пустым, с функциональными блоками «Необработанные данные» и «Вывод». Оставьте настройки по умолчанию:размер окна 1000 мс и увеличение окна 500 мс. Это означает, что наши аудиоданные будут обрабатываться 1 с за раз, начиная каждые 0,5 с. Использование небольшого окна позволяет сэкономить память на встроенном устройстве, но означает, что нам нужны образцы данных о кашле без больших перерывов между кашлями.

Нажмите «Добавить блок обработки» и выберите Аудио (MFCC) блокировать. Затем нажмите «Добавить обучающий блок» и выберите Нейронная сеть (Keras) . блокировать. Нажмите «Сохранить импульс». Аудиоблок будет извлекать спектрограмму для каждого окна звука, а блок нейронной сети будет обучен классифицировать спектрограмму как «кашель» или «шум» на основе нашего обучающего набора данных. Результирующий импульс будет выглядеть так:

Затем мы сгенерируем функции из набора обучающих данных в MFCC . страница. На этой странице показано, как выглядит извлеченная спектрограмма для каждого 1-секундного окна из любого из образцов набора данных. Мы можем оставить параметры по умолчанию.

Затем нажмите кнопку «Создать функции», чтобы затем обработать весь набор обучающих данных с помощью этого блока обработки. Это создает полный набор функций, которые будут использоваться для обучения нашей нейронной сети на следующем этапе. Нажмите кнопку «Создать функции», чтобы начать обработку, это займет пару минут.

Теперь мы можем приступить к настройке и обучению нашей нейронной сети на Классификаторе NN . страница. Нейронная сеть по умолчанию хорошо работает для непрерывных звуков, таких как вода. Обнаружение кашля сложнее, поэтому мы настроим более обширную сеть, используя двумерную свертку по спектрограмме каждого окна. Двумерная свертка обрабатывает звуковую спектрограмму аналогично классификации изображений. Нажмите в правом верхнем углу раздела «Настройки нейронной сети» и выберите «Перейти в режим Keras (эксперт)».

Замените определение «Архитектура нейронной сети» следующим кодом и установите для параметра «Минимальный рейтинг достоверности» значение «0,70». Затем нажмите кнопку «Начать обучение». Обучение займет несколько секунд.

  импортировать тензорный поток как tf 
из tensorflow.keras.models импортировать последовательный
из 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 (классы, активация ='softmax', name ='y_pred', kernel_co nstraint =MaxNorm (3)))
# это контролирует скорость обучения
opt =Adam (lr =0.005, beta_1 =0.9, beta_2 =0.999)
# обучение нейронной сети
model.compile (loss ='ategorical_crossentropy ', optimizer =opt, metrics =[' precision '])
model.fit (X_train, Y_train, batch_size =32, epochs =9, validation_data =(X_test, Y_test) , verbose =2)

На странице будет отображаться эффективность обучения и производительность на устройстве, которые должны быть такими, в зависимости от вашего набора данных:

Наш алгоритм обнаружения кашля Arduino теперь готов опробовать!

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

Живая классификация Страница позволяет нам протестировать алгоритм как с существующими данными тестирования, которые поставляются с набором данных, так и путем потоковой передачи аудиоданных с вашего мобильного телефона или устройства Arduino. Мы можем начать с простого теста, выбрав любой из тестовых образцов и нажав «Загрузить образец». Это позволит классифицировать тестовый образец и показать результаты:

Мы также можем протестировать алгоритм с живыми данными. Начните со своего мобильного телефона, обновив страницу браузера на телефоне, которую мы открыли ранее. Затем выберите свое устройство в разделе «Классифицировать новые данные» и нажмите «Начать выборку». Аналогичным образом вы можете передавать аудиосэмплы из Nano BLE Sense при подключении к проекту через edge-impulse-daemon, как на этапе сбора данных.

Развертывание

Мы можем легко развернуть наш алгоритм обнаружения кашля на мобильном телефоне. Перейдите в окно браузера на телефоне и обновите страницу, затем нажмите кнопку «Перейти в режим классификации». Это автоматически встраивает проект в пакет WebAssembly и непрерывно выполняет его на вашем телефоне (после этого облако не требуется, даже при переходе в режим полета!)

Затем мы можем развернуть алгоритм в Nano BLE Sense, перейдя в Развертывание страница. В разделе «Сборка прошивки» выберите «Arduino Nano 33 BLE Sense» и нажмите «Сборка».

Это создаст полную прошивку для Nano BLE Sense, включая ваш последний алгоритм. Следуйте инструкциям на экране, чтобы прошить плату Arduino двоичным кодом.

После прошивки Arduino мы можем открыть последовательный порт для устройства, пока оно подключено к USB на скорости 115 200 бод. Когда последовательный порт открыт, нажмите клавишу ВВОД, чтобы получить приглашение, а затем:

 > AT + RUNIMPULSE 
Настройки вывода:
Интервал:0,06 мс.
Размер кадра:16000
Длина выборки:1000 мс.
Нет. классов:2
Начав логический вывод, нажмите 'b', чтобы прервать
Запись ...
Запись завершена
Прогнозы (DSP:495 мс, классификация:84 мс, аномалия :0 мс.):
кашель:0,01562
шум:0,98438
Начало вывода через 2 секунды ...
Запись ...
Запись завершена
Прогнозы (DSP:495 мсек., Классификация:84 мсек., Аномалия:0 мсек.):
кашель:0,01562
шум:0,98438
начало вывода через 2 секунды ...
Запись ...
Запись завершена
Прогнозы (DSP:495 мс, классификация:84 мс, аномалия:0 мс):
кашель:0,86719
шум:0,13281
Начало логического вывода через 2 секунды ...
Запись ...
Запись завершена
Прогнозы (DSP:495 мс., Классификация:84 мс., Аномалия:0 мс.) :
кашель:0,01562
шум:0,98438

Будущая работа

С TinyML, датчиками и Edge Impulse на Arduino нет предела, вот несколько идей для дальнейшей работы:

  • Расширьте набор данных по умолчанию за счет собственных кашляющих и фоновых звуков, не забывайте периодически переучиваться и тестировать. Вы можете настроить модульные тесты на странице "Тестирование", чтобы убедиться, что модель по-прежнему работает после расширения.
  • Добавьте новый класс и данные для человеческих звуков, не связанных с кашлем, таких как фоновая речь, зевота и т. д.
  • Начните с нового набора данных, собирая образцы звука, чтобы обнаружить что-то новое. Подсказка:для начала вы можете загрузить только данные о классе шума из этого набора данных!
  • Из этих инструкций разверните в библиотеке Arduino как часть Arduino Sketch, чтобы показать обнаружение кашля с помощью светодиода или дисплея.
  • Воспользуйтесь другими датчиками, такими как 3-осевой акселерометр Nano BLE Sense, следуя этому руководству.

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

  1. Мониторинг CO2 с помощью датчика K30
  2. Слепоглухое общение с 1Sheeld / Arduino
  3. Управление монетоприемником с помощью Arduino
  4. Arduino с Bluetooth для управления светодиодом!
  5. Емкостной датчик отпечатков пальцев с Arduino или ESP8266
  6. Игра с дисплеем Nextion
  7. Роботизированная рука, управляемая нунчук (с Arduino)
  8. Определение здоровья растений с помощью TinyML
  9. Система мониторинга и обнаружения лесных пожаров (с SMS-оповещениями)
  10. Измерение солнечной радиации с помощью Arduino