- Komponenter krävs
- Kretsschema
- Skapa datamängden för hostdetekteringsmaskin
- Träna modellen och justera koden
COVID19 är verkligen en historisk pandemi som påverkar hela världen väldigt dåligt och människor bygger många nya enheter för att slåss med den. Vi har också byggt en automatisk desinfektionsmaskin och en termisk pistol för kontaktlös temperaturskärmning. Idag kommer vi att bygga ytterligare en enhet för att bekämpa Coronavirus. Det är ett hostdetekteringssystem som kan skilja mellan ljud och hostljud och kan hjälpa till att hitta Corona misstänkt. Det kommer att använda maskininlärningstekniker för det.
I den här handledningen ska vi bygga ett hostdetekteringssystem med Arduino 33 BLE Sense och Edge Impulse Studio. Det kan skilja mellan normalt bakgrundsbrus och hosta i realtidsljud. Vi använde Edge Impulse Studio för att träna en uppsättning host- och bakgrundsbrusprover och bygga en mycket optimerad TInyML-modell som kan upptäcka ett hostljud i realtid.
Komponenter krävs
Hårdvara
- Arduino 33 BLE Sense
- LED
- Bygeltrådar
programvara
- Edge Impulse Studio
- Arduino IDE
Vi har täckt en detaljerad handledning om Arduino 33 BLE Sense.
Kretsschema
Kretsschema för hostdetektering med Arduino 33 BLE Sense ges nedan. Fritzing-delen för Arduino 33 BLE var inte tillgänglig, så jag använde Arduino Nano eftersom båda har samma pin-out.
Den positiva ledningen på LED är ansluten till den digitala stiftet 4 i Arduino 33 BLE-avkänning och den negativa ledningen är ansluten till GND-stiftet i Arduino.
Skapa datamängden för hostdetekteringsmaskin
Som tidigare nämnts använder vi Edge Impulse Studio för att träna vår hostdetekteringsmodell. För det måste vi samla in en datauppsättning som innehåller dataprover som vi vill kunna känna igen på vår Arduino. Eftersom målet är att upptäcka hostan måste du samla in några prover av det och några andra prover för buller, så att det kan skilja mellan hosta och andra ljud.
Vi skapar en dataset med två klasser "hosta" och "buller". För att skapa en dataset, skapa ett Edge Impulse-konto, verifiera ditt konto och starta sedan ett nytt projekt. Du kan ladda proverna med din mobil, ditt Arduino-kort eller så kan du importera en dataset till ditt kantimpulskonto. Det enklaste sättet att ladda proverna till ditt konto är att använda din mobiltelefon. För det måste du ansluta din mobil till Edge Impulse.
För att ansluta din mobiltelefon, klicka på " Enheter " och klicka sedan på " Anslut en ny enhet" .
Klicka nu på " Använd din mobiltelefon" i nästa fönster så visas en QR-kod. Skanna QR-koden med din mobiltelefon med Google Lens eller annan QR-kodscanner-app.
Detta kommer att ansluta din telefon till Edge Impulse studio.
Med din telefon ansluten till Edge Impulse Studio kan du nu ladda dina prover. För att ladda proverna klickar du på ' Datainsamling' . Nu på datainsamlingssidan anger du etikettnamnet, väljer mikrofonen som sensor och anger provlängden. Klicka på ' Start sampling' för att börja sampla ett 40 sek prov. Istället för att tvinga dig att hosta kan du använda hostprover av olika längd online. Registrera totalt 10 till 12 hostprover av olika längd.
Efter att ha laddat upp hostproverna ställer du nu in etiketten på "buller" och samlar in ytterligare 10 till 12 bullerprover.
Dessa prover är för utbildning av modulen, i nästa steg samlar vi in testdata. Testdata bör vara minst 30% av träningsdata, så samla de tre proverna av "buller" och 4 till 5 prover av "hosta".
Istället för att samla in dina data kan du importera vår dataset till ditt Edge Impulse-konto med Edge Impulse CLI Uploader.
För att installera CLI Uploader, ladda ner och installera först Node.js på din bärbara dator. Öppna sedan kommandotolken och ange kommandot nedan:
npm installera -g kant-impuls-cli
Ladda nu ned datamängden (Dataset Link) och extrahera filen i din projektmapp. Öppna kommandotolken och navigera till dataplatsen och kör kommandona nedan:
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
Träna modellen och justera koden
Eftersom datasetet är klart skapar vi nu en impuls för data. Gå till sidan ' Skapa impuls ' för det.
Klicka nu på sidan ' Skapa impuls' på ' Lägg till ett behandlingsblock' . I nästa fönster väljer du Audio (MFCC) -blocket. Klicka sedan på ' Lägg till ett inlärningsblock' och välj blocket Neural Network (Keras). Klicka sedan på ' Spara impuls' .
I nästa steg, gå till MFCC-sidan och klicka sedan på ' Skapa funktioner' . Det kommer att generera MFCC-block för alla våra ljudfönster.
Gå sedan till sidan " NN Classifier" och klicka på de tre punkterna i det övre högra hörnet av " Neural Network Settings" och välj " Switch to Keras (expert) mode" .
Byt ut originalet med följande kod och ändra ' Minsta tillförlitlighet' till '0,70'. Klicka sedan på knappen ' Börja träna' . Det kommer att börja träna din modell.
importera tensorflow som tf från tensorflow.keras.models importera sekventiellt från tensorflow.keras.layers importerar tät, InputLayer, Dropout, platt, omformning, BatchNormalization, Conv2D, MaxPooling2D, AveragePooling2D från tensorflow.keras.optimizers importerar Adam från tensorflow.keras.straints. importera MaxNorm # modellarkitekturmodell = Sekventiell () modell.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 = 'samma', 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_size = 2,padding = 'same')) model.add (Flatten ()) model.add (Tät (klasser, aktivering = 'softmax', name = 'y_pred', kernel_constraint = MaxNorm (3))) # detta styr inlärningshastigheten opt = Adam (lr = 0,005, beta_1 = 0,9, beta_2 = 0,999) # träna den neurala nätverksmodellen. Kompilera (loss = 'categorical_crossentropy', optimizer = opt, metrics =) model.fit (X_train, Y_train, batch_size = 32, epoker = 9, validering_data = (X_test, Y_test), ingående = 2)detaljerad = 2)detaljerad = 2)
Efter träning av modellen kommer den att visa träningsprestandan. För mig var noggrannheten 96,5% och förlusten var 0,10 vilket är bra att fortsätta.
Nu när vår hostdetekteringsmodell är klar kommer vi att distribuera den här modellen som Arduino-bibliotek. Innan du laddar ner modellen som ett bibliotek kan du testa föreställningen genom att gå till " Live Classification " -sidan.
Gå till sidan ' Deployment ' och välj ' Arduino Library' . Bläddra nu ner och klicka på 'Bygg' för att starta processen. Detta kommer att bygga ett Arduino-bibliotek för ditt projekt.
Lägg nu till biblioteket i din Arduino IDE. För att öppna Arduino IDE och klicka sedan på Skiss> Inkludera bibliotek> Add.ZIP-bibliotek.
Ladda sedan ett exempel genom att gå till Arkiv> Exempel> Ditt projektnamn - Edge Impulse> nano_ble33_sense_microphone.
Vi kommer att göra några ändringar i koden så att vi kan göra ett varningsljud när Arduino upptäcker hosta. För det är en summer gränssnitt med Arduino och när den upptäcker hosta kommer LED att blinka tre gånger.
Ändringarna görs i void loop () -funktioner där det skriver ut buller- och hostvärdena. I den ursprungliga koden skriver den ut både etiketterna och deras värden tillsammans.
för (size_t ix = 0; ix <EI_CLASSIFIER_LABEL_COUNT; ix ++) {ei_printf ("% s:%.5f \ n", result.classification.label, result.classification.value); }
Vi kommer att spara både buller och hostvärden i olika variabler och jämföra bullervärdena. Om bullervärdet går under 0,50 betyder det att hostvärdet är mer än 0,50 och det kommer att göra ljudet. Ersätt originalet för loop () -koden med detta:
för (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 ("Host detekterad"); larm(); }}
Efter att ha gjort ändringarna laddar du upp koden till din Arduino. Öppna den seriella bildskärmen vid 115200 baud.
Så det här är hur en hostdetekteringsmaskin kan byggas, det är inte en mycket effektiv metod för att hitta någon COVID19-misstänkt men den kan fungera bra i något trångt område.
En komplett arbetsvideo med bibliotek och kod ges nedan: