Hoesten detecteren met TinyML op Arduino Nano voor vroege griepeisdetectie
Onderdelen en benodigdheden
| Arduino Nano 33 BLE Sense | 1 |
Apps en online diensten
| Edge Impulse Studio |
Over dit project
Er is een grote behoefte aan goedkope, gemakkelijk in te zetten oplossingen voor COVID-19 en andere grieprelaterte vroege detectie. Samen met de VN, Hackster, Edge Impulse en velen anderen hebben we recentelijk de UN Covid Detect & Protect Challenge gelanceerd met als doel eenvoudig in te zetten oplossingen te creëren voor preventie en detectie van griep in ontwikkelingslanden. In deze tutorial laten we zien hoe je Edge Impulse machine learning op een Arduino Nano BLE Sense kunt gebruiken om de aanwezigheid van hoesten in realtime-audio te detecteren. We hebben een dataset gebouwd met hoest- en achtergrondgeluid-samples, en een hoogst geoptimaliseerd TinyML-model toegepast, om een hoestdetectiesysteem te bouwen dat in realtime draait in minder dan 20 kB RAM op de Nano BLE Sense. Deze benadering is toepasbaar op veel andere ingebedde audio-patroonherkenningstoepassingen, zoals ouderenzorg, veiligheid en machinemonitoring. Dit project en de dataset werden oorspronkelijk gestart door Kartik Thakore om bij te dragen aan de COVID-19-inspanningen.
Aan de slag
Deze tutorial vereist:
- Basiskennis van softwareontwikkeling en Arduino
- Geïnstalleerde Arduino IDE of CLI
- Android of iOS mobiele telefoon
- Arduino Nano BLE Sense of vergelijkbaar Cortex-M4+ bord met microfoon (optioneel)
We gebruiken Edge Impulse, een online ontwikkelplatform voor machine learning op edge-apparaten. Maak een gratis account aan via hier registreren. Log in en geef je nieuwe project een naam door op de titel te klikken. We noemen de onze „Arduino Hoest Tutorial”.
Dataset verzamelen
De eerste stap in elk machine learning-project is een dataset verzamelen die bekende samples vertegenwoordigt van data die we op ons Arduino-apparaat willen matchen. We hebben een kleine dataset gemaakt met 10 minuten audio in twee klassen: „hoest” en „ruis”. We laten zien hoe je deze dataset in je Edge Impulse-project importeert, je eigen samples toevoegt of zelfs een eigen dataset vanaf nul start. Deze dataset is klein en heeft een beperkt aantal hoest- en zachte achtergrondgeluid-samples. Daarom is de dataset alleen geschikt voor experimenten, en kan het model in deze tutorial alleen differentiëren tussen stilte en een klein bereik aan hoesten. We moedigen je aan om de dataset uit te breiden met een breder scala aan hoesten, achtergrondgeluiden en andere klassen zoals menselijke spraak om de prestaties te verbeteren.
Let op: Jezelf dwingen te hoesten is zwaar voor je stemligamenten, wees voorzichtig bij het verzamelen van data en testen!
Download eerst onze hoest-dataset en pak het uit op je PC op een locatie naar keuze: https://cdn.edgeimpulse.com/datasets/cough.zip
Je kunt deze dataset importeren in je Edge Impulse-project met de Edge Impulse CLI Uploader. Installeer de Edge Impulse CLI volgens deze installatie-instructies.
Open een terminal of opdrachtprompt, navigeer naar de map waar je het bestand hebt uitgepakt.
Voer uit:
$ edge-impulse-uploader --clean
$ edge-impulse-uploader --category training training/*
$ edge-impulse-uploader --category testing testing/*
Je wordt gevraagd om je Edge Impulse-gebruikersnaam, wachtwoord en het project waar je de dataset aan wilt toevoegen. De datasetsamples zijn nu zichtbaar op de Data acquisition-pagina. Door op een sample te klikken, zie je hoe het eruitziet en kun je de audio beluisteren door op de play-knop onder elke grafiek te klikken.
10 minuten hoest- en ruis-data is voldoende om te beginnen. Je kunt optioneel de dataset uitbreiden met je eigen hoest- en achtergrondgeluid-samples. We kunnen nieuwe datasamples direct van apparaten verzamelen vanaf de Data acquisition-pagina. Audio-samples in WAV-formaat kunnen ook geüpload worden met de Edge Impulse CLI Uploader.
De makkelijkste manier om te beginnen is audio-data verzamelen met je mobiele telefoon (volledige tutorial hier). Ga naar de Devices-pagina en klik op de „+ Connect a new device”-knop rechtsboven. Selecteer „Use your mobile phone”. Dit genereert een unieke QR-code om een webapplicatie op je telefoonbrowser te openen. Scan de QR-code en open de link.
De webapplicatie verbindt met je Edge Impulse-project en ziet er zo uit:
We kunnen nu audio-datasamples direct van de telefoon verzamelen vanaf de Data acquisition-pagina van Edge Impulse. In de sectie „Record new data” typ je een label „hoest” of „ruis”, zorg dat „Microphone” geselecteerd is als Sensor, en klik op „Start sampling”. Je telefoon verzamelt nu een audiosample en voegt het toe aan je dataset.
Audio-data direct verzamelen van het Nano BLE Sense-bord wordt ook ondersteund. Volg deze instructies om de Edge Impulse-firmware en daemon te installeren. Zodra het apparaat met Edge Impulse verbonden is, kun je datasamples verzamelen net als met je telefoon hierboven.
Je impulse aanmaken
Vervolgens selecteren we signaalverwerkings- en machine learning-blokken op de Create impulse-pagina. De impulse begint leeg, met Raw data- en Output feature-blokken. Laat de standaardinstellingen van 1000 ms Window size en 500 ms Window increase staan. Dit betekent dat onze audiodata 1 seconde per keer verwerkt wordt, beginnend elke 0,5 seconde. Een klein venster bespaart geheugen op het ingebedde apparaat, maar betekent dat we hoestdata nodig hebben zonder grote pauzes tussen hoesten.
Klik op „Add a processing block” en selecteer het Audio (MFCC)-blok. Klik vervolgens op „Add a learning block” en selecteer het Neural Network (Keras)-blok. Klik op „Save Impulse”. Het audioblok extraheert een spectrogram voor elk venster van audio, en het neurale netwerkblok wordt getraind om het spectrogram te classificeren als „hoest” of „ruis” op basis van onze trainingsdataset. Je resulterende impulse ziet er zo uit:
Vervolgens genereren we features uit de trainingsdataset op de MFCC-pagina. Deze pagina toont hoe het geëxtraheerde spectrogram eruitziet voor elk 1-seconde venster van elke datasetsample. We laten de parameters op hun standaardwaarden.
Klik nu op de „Generate features”-knop, die de volledige trainingsdataset verwerkt met dit verwerkingsblok. Dit creëert de complete set features die gebruikt wordt om ons neurale netwerk in de volgende stap te trainen. Druk op „Generate features” om te starten, dit duurt een paar minuten.
We kunnen nu ons neurale netwerk op de NN Classifier-pagina instellen en trainen. Het standaard neurale netwerk werkt goed voor continue geluiden als water dat loopt. Hoestdetectie is complexer, dus we configureren een rijker netwerk met 2D-convolutie over het spectrogram van elk venster. 2D-convolutie verwerkt het audiospectrogram op een vergelijkbare manier als afbeeldingsclassificatie. Klik op de rechterbovenhoek van de sectie „Neural Network settings” en selecteer „Switch to Keras (expert) mode”.
Vervang de „Neural network architecture”-definitie met de volgende code en stel de „Minimum confidence rating” in op „0.70”. Klik vervolgens op „Start training”. Training duurt enkele seconden.
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 architectuur
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)))
# leerpercentage regelen
opt = Adam(lr=0.005, beta_1=0.9, beta_2=0.999)
# neurale netwerk trainen
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)
De pagina toont de trainingsprestaties en on-device prestaties, die er ongeveer zo uit moeten zien (afhankelijk van je dataset):
Onze Arduino-hoestdetectie-algoritme is nu klaar om te testen!
Training en testen
De Live classification-pagina stelt ons in staat om het algoritme te testen met de bestaande testdata die bij de dataset hoorde, of door audio-data te streamen van je mobiele telefoon of Arduino-apparaat. We beginnen met een simpele test door een willekeurig testsample te kiezen en op „Load sample” te drukken. Dit classificeert het testsample en toont de resultaten:
We kunnen het algoritme ook testen met live data. Begin met je mobiele telefoon door de browserpagina op je telefoon te vernieuwen die we eerder openden. Selecteer je apparaat in de sectie „Classify new data” en druk op „Start sampling”. Je kunt op dezelfde manier audio-samples streamen van je Nano BLE Sense wanneer het via de edge-impulse-daemon met het project verbonden is (zoals in de dataverzamelstap).
Implementatie
We kunnen ons hoestdetectie-algoritme gemakkelijk implementeren op de mobiele telefoon. Ga naar het browservenster op je telefoon, vernieuw, en druk op de „Switch to classification mode”-knop. Dit bouwt het project automatisch in een WebAssembly-pakket en voert het continu uit op je telefoon (geen cloud meer nodig daarna, zelfs vliegtuigmodus aan!)
Vervolgens kunnen we het algoritme implementeren op de Nano BLE Sense via de Deployment-pagina. Selecteer „Arduino Nano 33 BLE Sense” onder „Build firmware” en klik op „Build”.
Dit bouwt een complete firmware voor de Nano BLE Sense inclusief je laatste algoritme. Volg de instructies op het scherm om je Arduino-bord te flashen met de binary.
Zodra de Arduino geflasht is, open een seriële poort naar het apparaat terwijl het via USB aangesloten is op 115.200 baud. Zodra de seriële poort open is, druk op Enter om een prompt te krijgen en dan:
> 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
Starting inferencing in 2 seconds...
Recording...
Recording done
Predictions (DSP: 495 ms., Classification: 84 ms., Anomaly: 0 ms.):
cough: 0.01562
noise: 0.98438
Starting inferencing in 2 seconds...
Recording...
Recording done
Predictions (DSP: 495 ms., Classification: 84 ms., Anomaly: 0 ms.):
cough: 0.86719
noise: 0.13281
Starting inferencing in 2 seconds...
Recording...
Recording done
Predictions (DSP: 495 ms., Classification: 84 ms., Anomaly: 0 ms.):
cough: 0.01562
noise: 0.98438
Toekomstig werk
De lucht is de grens met TinyML, sensoren en Edge Impulse op Arduino. Hier zijn ideeën voor verder werk:
- Breid de standaarddataset uit met je eigen hoest- en achtergrondgeluiden, onthoud periodiek opnieuw te trainen en te testen. Je kunt unittests instellen onder de Testing-pagina om te garanderen dat het model nog werkt na uitbreiding.
- Voeg een nieuwe klasse en data toe voor menselijke geluiden die geen hoesten zijn, zoals achtergrondspraak, gapen, etc.
- Begin met een nieuwe dataset, audio-samples verzamelen om iets nieuws te detecteren. Tip: Je kunt alleen de ruis-klasdata van deze dataset uploaden om te beginnen!
- Volg deze instructies om naar Arduino Library te deployen als onderdeel van een Arduino-sketch om hoestdetectie te tonen met de LED of een display.
- Maak gebruik van andere sensoren zoals de 3-as versnellingsmeter van de Nano BLE Sense door deze tutorial te volgen.
Productieproces
- K30 CO2-sensor: Real-time binnenluchtkwaliteitmonitoring met Arduino
- Communicatie voor doofblinden vergemakkelijken met 1Sheeld en Arduino
- Slimme spaarpot bouwen: Muntenacceptor besturen met Arduino Nano
- Een LED bedienen via Bluetooth met Arduino – Eenvoudige DIY Handleiding
- Een DFRobot Capacitieve Vingerafdruksensor integreren met Arduino of ESP8266
- Interactief Nextion HMI-weerstation met Arduino Mega en sensoren
- Arduino-gebaseerde 6-DoF Robotarm Gestoeerd met Wii Nunchuk
- Plantengezondheid Beoordelen met TinyML: Een Praktische Gids
- Real-time Bosbrandbewakingssysteem met SMS-alarmen
- Accurate zonnestralingsmeting met Arduino UNO en Ethernet Shield
- Compact Arduino Radarsysteem met HC-SR04 Ultrasonische Sensor & 1.8" Display