- Необходимые компоненты
- Принципиальная электрическая схема
- Создание набора данных для машины обнаружения кашля
- Обучение модели и настройка кода
COVID19 - это действительно историческая пандемия, очень сильно затронувшая весь мир, и люди создают множество новых устройств для борьбы с ней. Мы также построили автомат для дезинфекции и термопистолет для бесконтактного контроля температуры. Сегодня мы создадим еще одно устройство для борьбы с коронавирусом. Это система обнаружения кашля, которая может различать шум и звук кашля и может помочь найти подозреваемого в коронавирусе. Для этого он будет использовать методы машинного обучения.
В этом руководстве мы собираемся создать систему обнаружения кашля с использованием Arduino 33 BLE Sense и Edge Impulse Studio. Он может различать нормальный фоновый шум и кашель в звуке в реальном времени. Мы использовали Edge Impulse Studio для обучения набора данных образцов кашля и фонового шума и построили оптимизированную модель TInyML, которая может обнаруживать звук кашля в реальном времени.
Необходимые компоненты
Оборудование
- Arduino 33 BLE Sense
- СВЕТОДИОД
- Перемычки
Программного обеспечения
- Edge Impulse Studio
- IDE Arduino
Мы рассмотрели подробное руководство по Arduino 33 BLE Sense.
Принципиальная электрическая схема
Принципиальная схема обнаружения кашля с использованием Arduino 33 BLE Sense приведена ниже. Деталь Fritzing для Arduino 33 BLE не была доступна, поэтому я использовал Arduino Nano, так как оба имеют одинаковые выводы.
Положительный вывод светодиода подключается к цифровому выводу 4 датчика BLE Arduino 33, а отрицательный вывод подключается к выводу GND на Arduino.
Создание набора данных для машины обнаружения кашля
Как упоминалось ранее, мы используем Edge Impulse Studio для обучения нашей модели обнаружения кашля. Для этого нам нужно собрать набор данных, содержащий образцы данных, которые мы хотели бы распознавать на нашем Arduino. Поскольку цель состоит в том, чтобы обнаружить кашель, вам нужно будет собрать несколько образцов этого и некоторых других образцов шума, чтобы он мог отличить кашель от других шумов.
Мы создадим набор данных с двумя классами «кашель» и «шум». Чтобы создать набор данных, создайте учетную запись Edge Impulse, подтвердите свою учетную запись и затем начните новый проект. Вы можете загрузить образцы с помощью мобильного телефона, платы Arduino или импортировать набор данных в свою учетную запись Edge Impulse. Самый простой способ загрузить образцы в свою учетную запись - использовать мобильный телефон. Для этого вам необходимо подключить свой мобильный телефон к Edge Impulse.
Чтобы подключить свой мобильный телефон, нажмите « Устройства », а затем нажмите « Подключить новое устройство» .
Теперь в следующем окне нажмите « Использовать свой мобильный телефон» , и появится QR-код. Отсканируйте QR-код на свой мобильный телефон с помощью Google Lens или другого приложения для сканирования QR-кода.
Это подключит ваш телефон к Edge Impulse studio.
Теперь, когда ваш телефон подключен к Edge Impulse Studio, вы можете загружать свои сэмплы. Чтобы загрузить образцы, нажмите « Сбор данных» . Теперь на странице сбора данных введите название метки, выберите микрофон в качестве датчика и введите длину выборки. Нажмите « Начать выборку» , чтобы начать выборку 40-секундной выборки. Вместо того, чтобы заставлять себя кашлять, вы можете использовать онлайн-образцы от кашля разной длины. Запишите в общей сложности от 10 до 12 образцов кашля разной длины.
После загрузки образцов кашля установите метку «шум» и соберите еще 10–12 образцов шума.
Эти образцы предназначены для обучения модуля, на следующих шагах мы соберем тестовые данные. Тестовые данные должны составлять не менее 30% данных обучения, поэтому соберите 3 образца «шума» и 4–5 образцов «кашель».
Вместо того, чтобы собирать свои данные, вы можете импортировать наш набор данных в свою учетную запись Edge Impulse с помощью Edge Impulse CLI Uploader.
Чтобы установить CLI Uploader, сначала загрузите и установите Node.js на свой ноутбук. После этого откройте командную строку и введите следующую команду:
npm install -g edge-impulse-cli
Теперь загрузите набор данных (ссылка на набор данных) и извлеките файл в папку проекта. Откройте командную строку, перейдите в расположение набора данных и выполните следующие команды:
edge-impulse-uploader --clean edge-impulse-uploader --category training training / *. json edge-impulse-uploader --category training training / *. cbor edge-impulse-uploader --category testing testing / *. json edge-impulse-uploader --category testing testing / *. cbor
Обучение модели и настройка кода
Поскольку набор данных готов, теперь мы создадим импульс для данных. Для этого перейдите на страницу « Создать импульс ».
Теперь на странице « Создать импульс» нажмите « Добавить блок обработки» . В следующем окне выберите блок Audio (MFCC). После этого нажмите « Добавить обучающий блок» и выберите блок нейронной сети (Keras). Затем нажмите « Сохранить импульс» .
На следующем шаге перейдите на страницу MFCC и нажмите « Создать компоненты» . Он будет генерировать блоки MFCC для всех наших окон аудио.
После этого перейдите на страницу « Классификатор NN», нажмите на три точки в правом верхнем углу « Настройки нейронной сети» и выберите « Перейти в режим Keras (эксперт)» .
Замените оригинал на следующий код и измените « Минимальный рейтинг достоверности» на «0,70». Затем нажмите кнопку « Начать обучение» . Начнется обучение вашей модели.
импортировать тензорный поток как tf из tensorflow.keras.models импортировать последовательность из tensorflow.keras.layers импортировать Dense, InputLayer, Dropout, Flatten, Reshape, BatchNormalization, Conv2D, MaxPooling2D, AveragePooling2D из tensorflow.keras.optimizers импортировать Adamras.constraflow. import 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 (pool_size = 2,padding = 'same')) model.add (Flatten ()) model.add (Dense (classes, activate = 'softmax', name = 'y_pred', kernel_constraint = MaxNorm (3))) # это контролирует скорость обучения opt = Adam (lr = 0.005, beta_1 = 0.9, beta_2 = 0.999) # обучить нейронную сеть model.compile (loss ='ategorical_crossentropy ', optimizer = opt, metrics =) model.fit (X_train, Y_train, batch_size = 32, epochs = 9, validation_data = (X_test, Y_test), verbose = 2)подробный = 2)подробный = 2)
После обучения модель покажет результаты обучения. Для меня точность составила 96,5%, а потери составили 0,10, что неплохо для продолжения.
Теперь, когда наша модель обнаружения кашля готова, мы развернем эту модель как библиотеку Arduino. Перед загрузкой модели в виде библиотеки вы можете протестировать производительность, перейдя на страницу « Живая классификация ».
Перейдите на страницу « Развертывание » и выберите « Библиотека Arduino» . Теперь прокрутите вниз и нажмите «Построить», чтобы начать процесс. Это создаст библиотеку Arduino для вашего проекта.
Теперь добавьте библиотеку в вашу Arduino IDE. Для этого откройте IDE Arduino, а затем нажмите Sketch> Include Library> Add.ZIP library.
Затем загрузите пример, выбрав Файл> Примеры> Имя вашего проекта - Edge Impulse> nano_ble33_sense_microphone.
Мы внесем некоторые изменения в код, чтобы мы могли издавать звуковой сигнал, когда Arduino обнаруживает кашель. Для этого к Arduino подключен зуммер, и всякий раз, когда он обнаруживает кашель, светодиод мигнет три раза.
Изменения внесены в функции void loop (), которые выводят значения шума и кашля. В исходном коде метки и их значения печатаются вместе.
for (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 (size_t ix = 1; ix <EI_CLASSIFIER_LABEL_COUNT; ix ++) {Serial.print (result.classification.value); float Data = result.classification.value; if (Data <0.50) {Serial.print («Обнаружен кашель»); аварийная сигнализация(); }}
После внесения изменений загрузите код в свой Arduino. Откройте последовательный монитор на скорости 115200 бод.
Вот как можно построить машину для обнаружения кашля, это не очень эффективный метод для поиска любого подозреваемого в COVID19, но он может хорошо работать в некоторых людных местах.
Полное рабочее видео с библиотекой и кодом приведено ниже: