- Необходими компоненти
- Електрическа схема
- Създаване на набор от данни за машина за откриване на кашлица
- Обучение на модела и промяна на кода
COVID19 наистина е историческа пандемия, засягаща много зле целия свят и хората изграждат много нови устройства, за да се борят с него. Също така сме изградили автоматична машина за дезинфекция и термопистолет за безконтактен температурен преглед. Днес ще изградим още едно устройство, което да помогне в борбата с коронавируса. Това е система за откриване на кашлица, която може да прави разлика между шум и звук от кашлица и може да помогне за намирането на заподозрян в Corona. За това ще използва техники за машинно обучение.
В този урок ще изградим система за откриване на кашлица, използвайки Arduino 33 BLE Sense и Edge Impulse Studio. Той може да прави разлика между нормален фонов шум и кашлица в аудио в реално време. Използвахме Edge Impulse Studio, за да обучим набор от проби за кашлица и фонов шум и да изградим силно оптимизиран модел TInyML, който може да открие звук от кашлица в реално време.
Необходими компоненти
Хардуер
- Arduino 33 BLE Sense
- LED
- Джъмперни проводници
Софтуер
- Edge Impulse Studio
- IDE на Arduino
Покрихме подробен урок за Arduino 33 BLE Sense.
Електрическа схема
Схема за откриване на кашлица с помощта на Arduino 33 BLE Sense е дадена по-долу. Фризиращата част за Arduino 33 BLE не беше налична, затова използвах Arduino Nano, тъй като и двете имат еднакъв pin-out.
Положителният проводник на LED е свързан към цифров щифт 4 на Arduino 33 BLE sense, а отрицателният проводник е свързан към 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 install -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
Обучение на модела и промяна на кода
Тъй като наборът от данни е готов, сега ще създадем импулс за данни. За това отидете на страницата „ Създаване на импулс “.
Сега на страницата „ Създаване на импулс“ кликнете върху „ Добавяне на блок за обработка“ . В следващия прозорец изберете блока Audio (MFCC). След това кликнете върху „ Добавяне на учебен блок“ и изберете блока на Neural Network (Keras). След това кликнете върху „ Запазване на импулса“ .
В следващата стъпка отидете на страницата на MFCC и след това кликнете върху „ Генериране на функции“ . Той ще генерира MFCC блокове за всички наши аудио прозорци.
След това отидете на страницата „ NN Classifier“ и кликнете върху трите точки в горния десен ъгъл на „ Настройки на невронната мрежа“ и изберете „ Превключване към режим Keras (експертен)“ .
Заменете оригинала със следния код и променете „ Минимален рейтинг на доверие“ на „0,70“. След това кликнете върху бутона „ Стартиране на обучението“ . Ще започне да тренира вашия модел.
импортиране на tensorflow като tf от tensorflow.keras.models импортиране на Sequential от tensorflow.keras.layers импортиране на Dense, InputLayer, Dropout, Flatten, Reshape, BatchNormalization, Conv2D, MaxPooling2D, AveragePooling2D от tensorflow.keras.optimizor импортиране на 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 (Dense (класове, активация = 'softmax', name = 'y_pred', kernel_constraint = MaxNorm (3))) # това контролира опцията за скорост на обучение = Адам (lr = 0,005, beta_1 = 0,9, beta_2 = 0,999) # тренирайте модела на невронната мрежа.compile (загуба = 'categorical_crossentropy', оптимизатор = 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 за вашия проект.
Сега добавете библиотеката във вашата Arduino IDE. За това отворете IDE на Arduino и след това кликнете върху Скица> Включване на библиотека> Добавяне на библиотека ZIP.
След това заредете пример, като отидете на Файл> Примери> Името на вашия проект - Edge Impulse> nano_ble33_sense_microphone.
Ще направим някои промени в кода, за да можем да издадем предупредителен звук, когато Arduino открие кашлица. За това зумерът е свързан с Arduino и всеки път, когато открие кашлица, LED мига три пъти.
Промените се извършват във функциите 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 и това ще издаде звук. Заменете оригиналния код за цикъл () с този:
за (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, но може да работи добре в някои претъпкани райони.
Пълно работещо видео с библиотека и код е дадено по-долу: