- Потрібні компоненти
- Кругова діаграма
- Створення набору даних для машини для виявлення кашлю
- Навчання моделі та налаштування кодексу
COVID19 - це справді історична пандемія, яка дуже сильно впливає на весь світ, і люди створюють багато нових пристроїв для боротьби з нею. Ми також створили автоматичну санітарну машину та термопістолет для безконтактного контролю температури. Сьогодні ми створимо ще один пристрій для боротьби з коронавірусом. Це система виявлення кашлю, яка дозволяє розрізнити шум від звуку кашлю та допоможе знайти підозрюваного в короні. Для цього він буде використовувати методи машинного навчання.
У цьому посібнику ми збираємося створити систему виявлення кашлю за допомогою Arduino 33 BLE Sense та Edge Impulse Studio. Він може розрізняти звичайний фоновий шум від кашлю в режимі звуку в реальному часі. Ми використовували Edge Impulse Studio для підготовки набору даних зразків кашлю та фонового шуму та побудови високооптимізованої моделі TInyML, яка може виявляти звук кашлю в режимі реального часу.
Потрібні компоненти
Апаратне забезпечення
- Arduino 33 BLE Sense
- СВІТЛОДІОДНИЙ
- Провід перемички
Програмне забезпечення
- Студія Edge Impulse
- IDE Arduino
Ми розглянули детальний підручник з Arduino 33 BLE Sense.
Кругова діаграма
Схема для виявлення кашлю за допомогою Arduino 33 BLE Sense наведена нижче. Фризинг для Arduino 33 BLE був недоступний, тому я використовував Arduino Nano, оскільки обидва мають однаковий пін-аут.
Позитивний провід світлодіода підключений до цифрового висновку 4 сенсора Arduino 33 BLE, а негативний провід - до виводу GND Arduino.
Створення набору даних для машини для виявлення кашлю
Як уже згадувалося раніше, ми використовуємо Edge Impulse Studio для навчання нашої моделі виявлення кашлю. Для цього ми повинні зібрати набір даних, який містить зразки даних, які ми хотіли б мати можливість розпізнати на нашому Arduino. Оскільки метою є виявлення кашлю, вам потрібно буде зібрати деякі зразки цього та деяких інших зразків на предмет шуму, щоб він міг розрізнити кашель та інші шуми.
Ми створимо набір даних з двома класами "кашель" і "шум". Щоб створити набір даних, створіть обліковий запис Edge Impulse, підтвердьте свій обліковий запис і запустіть новий проект. Ви можете завантажити зразки за допомогою мобільного телефону, плати Arduino або імпортувати набір даних у свій обліковий запис імпульсного краю. Найпростіший спосіб завантажити зразки у свій обліковий запис - за допомогою мобільного телефону. Для цього вам потрібно підключити свій мобільний телефон за допомогою Edge Impulse.
Щоб підключити свій мобільний телефон, натисніть « Пристрої », а потім « Підключити новий пристрій» .
Тепер у наступному вікні натисніть « Використовувати свій мобільний телефон» , і з’явиться QR-код. Скануйте QR-код за допомогою мобільного телефону за допомогою Google Lens або іншого додатка для сканування QR-коду.
Це підключить ваш телефон до студії Edge Impulse.
За допомогою телефону, підключеного до Edge Impulse Studio, тепер ви можете завантажувати свої зразки. Щоб завантажити зразки, натисніть « Збір даних» . Тепер на сторінці Збір даних введіть назву ярлика, виберіть мікрофон як датчик і введіть довжину зразка. Клацніть на « Почати вибірку» , щоб розпочати вибірку з вибірки 40 секунд. Замість того, щоб змушувати себе кашляти, ви можете використовувати зразки кашлю в Інтернеті різної довжини. Зафіксуйте загалом від 10 до 12 зразків кашлю різної довжини.
Після завантаження зразків кашлю встановіть для мітки значення «шум» і зберіть ще 10-12 зразків шуму.
Ці зразки призначені для навчання модулю. На наступних етапах ми будемо збирати дані тесту. Дані тестів повинні складати щонайменше 30% даних тренувань, тому збирайте 3 зразки «шуму» та 4–5 зразків «кашлю».
Замість того, щоб збирати ваші дані, ви можете імпортувати наш набір даних у свій обліковий запис Edge Impulse за допомогою Edge Impulse CLI Uploader.
Щоб встановити CLI Uploader, спочатку завантажте та встановіть Node.js на своєму ноутбуці. Після цього відкрийте командний рядок і введіть наступну команду:
npm встановити -g edge-impulse-cli
Тепер завантажте набір даних (Dataset Link) і витягніть файл у папці проекту. Відкрийте командний рядок і перейдіть до розташування набору даних і запустіть наступні команди:
edge-impulse-uploader --clean edge-impulse-uploader --категорія навчання / *. json edge-impulse-uploader --категорія навчання / *. cbor edge-impulse-uploader - тестування категорій / *. json edge-impulse-uploader - тестування категорій тестування / *. cbor
Навчання моделі та налаштування кодексу
Оскільки набір даних готовий, тепер ми створимо імпульс для даних. Для цього перейдіть на сторінку " Створити імпульс ".
Тепер на сторінці " Створити імпульс" натисніть " Додати блок обробки" . У наступному вікні виберіть блок Аудіо (MFCC). Після цього натисніть « Додати навчальний блок» і виберіть блок « Нейронна мережа» (Keras). Потім натисніть « Зберегти імпульс» .
На наступному кроці перейдіть на сторінку MFCC, а потім натисніть " Створити функції" . Він генеруватиме блоки MFCC для всіх наших вікон аудіо.
Після цього перейдіть на сторінку « Класифікатор NN» і натисніть на три крапки у верхньому правому куті « Налаштування нейронної мережі» та виберіть « Переключитися в режим Кераса (експерт)» .
Замініть оригінал таким кодом і змініть " Мінімальний рейтинг довіри" на "0,70". Потім натисніть кнопку « Почати тренування» . Це почне тренувати вашу модель.
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.optimsizstrastrats імпортувати 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 (розмір_басейну = 2,padding = 'same')) model.add (Flatten ()) model.add (Щільний (класи, активація = 'softmax', name = 'y_pred', kernel_constraint = MaxNorm (3))) # це контролює швидкість навчання opt = Адам (lr = 0,005, beta_1 = 0,9, beta_2 = 0,999) # тренуємо модель нейронної мережі.compile (loss = 'categorical_crossentropy', optimizer = opt, metrics =) model.fit (X_train, Y_train, batch_size = 32, эпохи = 9, дані перевірки_ (X_test, Y_test), детально = 2)багатослівний = 2)багатослівний = 2)
Після навчання моделі вона покаже результативність навчання. Для мене точність становила 96,5%, а втрата - 0,10, що добре продовжувати.
Тепер, коли наша модель виявлення кашлю готова, ми застосуємо цю модель як бібліотеку Arduino. Перш ніж завантажувати модель як бібліотеку, ви можете перевірити ефективність, перейшовши на сторінку " Класифікація в реальному часі ".
Перейдіть на сторінку " Розгортання " та виберіть " Бібліотека Arduino" . Тепер прокрутіть вниз і натисніть кнопку "Збірка", щоб розпочати процес. Це створить бібліотеку Arduino для вашого проекту.
Тепер додайте бібліотеку в свою IDE Arduino. Для цього відкрийте IDE Arduino, а потім натисніть Ескіз> Включити бібліотеку> Додати бібліотеку ZIP.
Потім завантажте приклад, перейшовши у меню Файл> Приклади> Назва вашого проекту - Імпульс краю> нано_бле33_сенс_мікрофон.
Ми внесемо деякі зміни в код, щоб ми могли видавати попереджувальний звук, коли Arduino виявить кашель. Для цього зумер з'єднується з Arduino, і всякий раз, коли він виявляє кашель, світлодіод блиматиме три рази.
Зміни внесені у функції void loop (), де він друкує значення шуму та кашлю. В оригінальному коді він друкує як етикетки, так і їх значення разом.
для (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, і він видасть звук. Замініть оригінальний код for (() кодом таким:
for (size_t ix = 1; ix <EI_CLASSIFIER_LABEL_COUNT; ix ++) {Serial.print (result.classification.value); float Data = result.classification.value; якщо (Дані <0,50) {Serial.print («Виявлено кашель»); сигналізація (); }}
Після внесення змін завантажте код у свій Arduino. Відкрийте послідовний монітор на 115200 бод.
Отже, ось як можна створити машину для виявлення кашлю, це не дуже ефективний метод для виявлення будь-якого підозрюваного COVID19, але він може чудово працювати в деяких людних місцях.
Повне робоче відео з бібліотекою та кодом наведено нижче: