- Komponenter, der kræves
- Kredsløbsdiagram
- Oprettelse af datasættet til maskine til hostedetektion
- Træning af modellen og justering af koden
COVID19 er virkelig en historisk pandemi, der påvirker hele verden meget dårligt, og folk bygger mange nye enheder til at kæmpe med det. Vi har også bygget en automatisk desinfektionsmaskine og termisk pistol til kontaktløs temperaturscreening. I dag bygger vi endnu en enhed til at hjælpe med at kæmpe med Coronavirus. Det er et hostedetektionssystem, der kan skelne mellem støj og hostelyd og kan hjælpe med at finde Corona mistænkt. Det vil bruge maskinlæringsteknikker til det.
I denne vejledning skal vi opbygge et hostedetektionssystem ved hjælp af Arduino 33 BLE Sense og Edge Impulse Studio. Det kan skelne mellem normal baggrundsstøj og hoste i lyd i realtid. Vi brugte Edge Impulse Studio til at træne et datasæt med hoste og baggrundsstøjprøver og opbygge en meget optimeret TInyML-model, der kan registrere en hostelyd i realtid.
Komponenter, der kræves
Hardware
- Arduino 33 BLE Sense
- LED
- Jumper Wires
Software
- Edge Impulse Studio
- Arduino IDE
Vi har dækket en detaljeret vejledning om Arduino 33 BLE Sense.
Kredsløbsdiagram
Kredsløbsdiagram til hostedetektion ved hjælp af Arduino 33 BLE Sense er angivet nedenfor. Fritzing-del til Arduino 33 BLE var ikke tilgængelig, så jeg brugte Arduino Nano, da begge har samme pin-out.
Den positive ledning af LED er forbundet til den digitale pin 4 i Arduino 33 BLE-følelse, og negativ ledning er forbundet til GND-stiften i Arduino.
Oprettelse af datasættet til maskine til hostedetektion
Som tidligere nævnt bruger vi Edge Impulse Studio til at træne vores hostedetekteringsmodel. Til det er vi nødt til at indsamle et datasæt, der indeholder de eksempler på data, som vi gerne vil kunne genkende på vores Arduino. Da målet er at detektere hosten, skal du samle nogle prøver af det og nogle andre prøver til støj, så det kan skelne mellem hoste og andre lyde.
Vi opretter et datasæt med to klasser "hoste" og "støj". For at oprette et datasæt skal du oprette en Edge Impulse-konto, kontrollere din konto og derefter starte et nyt projekt. Du kan indlæse prøverne ved hjælp af din mobil, dit Arduino-kort eller du kan importere et datasæt til din kantimpulskonto. Den nemmeste måde at indlæse prøverne på din konto er ved hjælp af din mobiltelefon. Til det skal du forbinde din mobil med Edge Impulse.
For at forbinde din mobiltelefon skal du klikke på ' Enheder ' og derefter klikke på ' Tilslut en ny enhed' .
Klik nu på det næste vindue på ' Brug din mobiltelefon' , så vises en QR-kode. Scan QR-koden med din mobiltelefon ved hjælp af Google Lens eller en anden QR-kode-scanner-app.
Dette forbinder din telefon med Edge Impulse studio.
Med din telefon tilsluttet Edge Impulse Studio kan du nu indlæse dine prøver. For at indlæse prøverne skal du klikke på ' Dataindsamling' . Indtast nu etiketnavnet på dataindsamlingssiden, vælg mikrofonen som en sensor, og indtast prøvelængden. Klik på ' Start prøveudtagning' for at starte prøveudtagning af en prøve på 40 sek. I stedet for at tvinge dig selv til at hoste, kan du bruge online hosteprøver af forskellige længder. Optag i alt 10 til 12 hosteprøver med forskellige længder.
Efter upload af hosteprøverne skal du nu indstille etiketten til 'støj' og samle yderligere 10 til 12 støjprøver.
Disse prøver er til træning af modulet. I de næste trin indsamler vi testdata. Testdata skal være mindst 30% af træningsdataene, så indsaml de 3 prøver af 'støj' og 4 til 5 prøver af 'hoste'.
I stedet for at indsamle dine data kan du importere vores datasæt til din Edge Impulse-konto ved hjælp af Edge Impulse CLI Uploader.
For at installere CLI Uploader skal du først downloade og installere Node.js på din bærbare computer. Derefter skal du åbne kommandoprompten og indtaste nedenstående kommando:
npm installer -g kant-impuls-cli
Download nu datasættet (datasætlink), og udpak filen i din projektmappe. Åbn kommandoprompten, og naviger til datasættets placering, og kør nedenstående kommandoer:
kant-impuls-uploader - ren kant-impuls-uploader - kategori træningstræning / *. json kant-impuls-uploader - kategori træningstræning / *. cbor kant-impuls-uploader - kategoritest test / *. json edge-impulse-uploader - testing af kategoritest / *. cbor
Træning af modellen og justering af koden
Da datasættet er klar, opretter vi nu en impuls til data. Gå til siden ' Opret impuls ' for det.
Klik nu på siden ' Opret impuls' på ' Tilføj en behandlingsblok' . I det næste vindue skal du vælge Audio (MFCC) -blokken. Klik derefter på ' Tilføj en læringsblok' og vælg blokken Neural Network (Keras). Klik derefter på ' Gem impuls' .
I det næste trin skal du gå til MFCC-siden og derefter klikke på ' Generer funktioner' . Det genererer MFCC-blokke til alle vores lydvinduer.
Gå derefter til ' NN Classifier' -siden og klik på de tre prikker i øverste højre hjørne af ' Neural Network settings' og vælg ' Switch to Keras (expert) mode' .
Udskift originalen med følgende kode, og skift ' Minimum tillidsvurdering' til '0,70'. Klik derefter på knappen ' Start træning' . Det begynder at træne din model.
importer tensorflow som tf fra tensorflow.keras.models import Sekventiel fra tensorflow.keras.layers importerer Dense, InputLayer, Dropout, Flatten, Reshape, BatchNormalization, Conv2D, MaxPooling2D, AveragePooling2D fra tensorflow.keras.optimizers importerer Adam fra tensorflow.keras.conints importer MaxNorm # modelarkitektur model = Sekventiel () 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, aktivering = 'relu', padding = 'samme', kernel_constraint = MaxNorm (3))) model.add (AveragePooling2D (pool_size = 2, padding = 'same')) model.add (Conv2D (5, kernel_size = 5, aktivering = 'relu', padding = 'same', kernel_constraint = MaxNorm (3))) model.add (AveragePooling2D (pool_størrelse = 2,padding = 'same')) model.add (Flatten ()) model.add (Tæt (klasser, aktivering = 'softmax', name = 'y_pred', kernel_constraint = MaxNorm (3))) # dette styrer optagelsen af læringshastigheden = Adam (lr = 0,005, beta_1 = 0,9, beta_2 = 0,999) # træne den neurale netværksmodel. Kompilere (loss = 'categorical_crossentropy', optimizer = opt, metrics =) model.fit (X_train, Y_train, batch_size = 32, epoker = 9, validering_data = (X_test, Y_test), detaljeret = 2)detaljeret = 2)detaljeret = 2)
Efter træning af modellen viser den træningspræstationen. For mig var nøjagtigheden 96,5%, og tabet var 0,10, hvilket er godt at fortsætte.
Da vores hostedetekteringsmodel er klar, vil vi implementere denne model som Arduino-bibliotek. Før du downloader modellen som et bibliotek, kan du teste ydeevnen ved at gå til ' Live Classification ' -siden.
Gå til siden ' Implementering ' og vælg ' Arduino Library' . Rul nu ned og klik på 'Byg' for at starte processen. Dette bygger et Arduino-bibliotek til dit projekt.
Tilføj nu biblioteket i din Arduino IDE. For det skal du åbne Arduino IDE og derefter klikke på Skitse> Inkluder bibliotek> Tilføj.ZIP-bibliotek.
Indlæs derefter et eksempel ved at gå til Filer> Eksempler> Dit projektnavn - Edge Impulse> nano_ble33_sense_microphone.
Vi foretager nogle ændringer i koden, så vi kan give en alarmlyd, når Arduino registrerer hoste. Til det er en summer grænseflade med Arduino, og når den registrerer hoste, blinker LED tre gange.
Ændringerne foretages i ugyldige loop () -funktioner, hvor det udskriver støj- og hosteværdierne. I den originale kode udskriver det både etiketterne og deres værdier sammen.
for (size_t ix = 0; ix <EI_CLASSIFIER_LABEL_COUNT; ix ++) {ei_printf ("% s:%.5f \ n", result.classification.label, result.classification.value); }
Vi skal gemme både støj- og hosteværdier i forskellige variabler og sammenligne støjværdierne. Hvis støjværdien går under 0,50 betyder det, at hosteværdien er mere end 0,50, og det vil give lyden. Udskift originalen til loop () -koden med dette:
for (size_t ix = 1; ix <EI_CLASSIFIER_LABEL_COUNT; ix ++) {Serial.print (result.classification.value); float Data = result.classification.value; hvis (Data <0,50) {Serial.print ("Host detekteret"); alarm (); }}
Når du har foretaget ændringerne, skal du uploade koden til din Arduino. Åbn den serielle skærm ved 115200 baud.
Så det er sådan en hoste afsløring maskine kan bygges, er det ikke en meget effektiv metode til at finde nogen COVID19 mistænkte, men det kan fungere fint i nogle overfyldt område.
En komplet arbejdsvideo med bibliotek og kode er angivet nedenfor: