- Būtini komponentai
- Grandinės schema
- Kosulio aptikimo mašinos duomenų rinkinio kūrimas
- Mokyti modelį ir patobulinti kodą
COVID19 iš tikrųjų yra istorinė pandemija, labai smarkiai paveikusi visą pasaulį, ir žmonės kuria daug naujų prietaisų kovai su ja. Mes taip pat sukūrėme automatinę dezinfekavimo mašiną ir terminį pistoletą bekontaktės temperatūros tikrinimui. Šiandien mes sukursime dar vieną prietaisą, padedantį kovoti su koronavirusu. Tai kosulio aptikimo sistema, kuri gali atskirti triukšmą ir kosulio garsą ir gali padėti surasti įtariamą „Corona“. Tam bus naudojamos mašininio mokymosi technikos.
Šioje pamokoje mes sukursime kosulio aptikimo sistemą naudodami „Arduino 33 BLE Sense“ ir „Edge Impulse Studio“. Tai gali atskirti įprastą foninį triukšmą ir kosulį realiuoju laiku rodomame garse. Mes naudojome „Edge Impulse Studio“, norėdami mokyti kosulio ir foninio triukšmo pavyzdžių rinkinį ir sukurti labai optimizuotą TInyML modelį, kuris realiuoju laiku gali aptikti kosulio garsą.
Būtini komponentai
Aparatinė įranga
- „Arduino 33 BLE Sense“
- LED
- Šuolių laidai
Programinė įranga
- „Edge Impulse“ studija
- „Arduino IDE“
Pateikėme išsamią „Arduino 33 BLE Sense“ pamoką.
Grandinės schema
Žemiau pateikiama kosulio nustatymo naudojant „Arduino 33 BLE Sense“ grandinės schema. Nepastebėta „Arduino 33 BLE“ dalis, todėl naudojau „Arduino Nano“, nes abu turi tą patį kištuką.
Teigiamas šviesos diodo laidas yra prijungtas prie „Arduino 33 BLE sense“ 4 skaitmeninio kaiščio, o neigiamas - prie „Arduino“ GND kaiščio.
Kosulio aptikimo mašinos duomenų rinkinio kūrimas
Kaip minėta anksčiau, kosulio aptikimo modeliui mokyti naudojame „Edge Impulse Studio“. Tam turime surinkti duomenų rinkinį, kuriame yra duomenų pavyzdžiai, kuriuos norėtume atpažinti „Arduino“. Kadangi tikslas yra nustatyti kosulį, turėsite surinkti keletą šio ir kitų mėginių, kad būtų galima nustatyti triukšmą, kad būtų galima atskirti kosulį ir kitus triukšmus.
Sukursime duomenų rinkinį su dviem klasėmis „kosulys“ ir „triukšmas“. Norėdami sukurti duomenų rinkinį, sukurkite „Edge Impulse“ paskyrą, patikrinkite savo paskyrą ir pradėkite naują projektą. Mėginius galite įkelti naudodami mobilųjį telefoną, „Arduino“ plokštę arba galite importuoti duomenų rinkinį į savo krašto impulsų paskyrą. Lengviausias būdas įkelti pavyzdžius į savo sąskaitą yra mobilusis telefonas. Tam turite prijungti savo mobilųjį telefoną naudodami „Edge Impulse“.
Norėdami prijungti savo mobilųjį telefoną, spustelėkite „ Įrenginiai “, tada spustelėkite „ Prijungti naują įrenginį“ .
Dabar kitame lange spustelėkite „ Naudoti savo mobilųjį telefoną“ ir pasirodys QR kodas. Nuskaitykite QR kodą mobiliuoju telefonu naudodami „Google Lens“ ar kitą QR kodų skaitytuvo programą.
Tai sujungs jūsų telefoną su „Edge Impulse“ studija.
Dabar, kai telefonas yra prijungtas prie „Edge Impulse Studio“, galite įkelti pavyzdžius. Norėdami įkelti pavyzdžius, spustelėkite „ Duomenų rinkimas“ . Dabar puslapyje „Duomenų gavimas“ įveskite etiketės pavadinimą, pasirinkite mikrofoną kaip jutiklį ir įveskite mėginio ilgį. Spustelėkite „ Pradėti atranką“ , kad pradėtumėte 40 sek. Užuot verčiami kosėti, galite naudoti skirtingo ilgio internetinius kosulio mėginius. Užregistruokite iš viso 10–12 skirtingo ilgio kosulio mėginių.
Įkėlę kosulio mėginius, dabar nustatykite etiketę „triukšmas“ ir surinkite dar 10–12 triukšmo mėginių.
Šie pavyzdžiai skirti modulio mokymui, atlikdami kitus veiksmus mes surinksime testo duomenis. Testo duomenys turėtų sudaryti bent 30% treniruočių duomenų, todėl surinkite 3 „triukšmo“ ir 4–5 „kosulio“ mėginius.
Užuot rinkę duomenis, galite importuoti mūsų duomenų rinkinį į savo „Edge Impulse“ paskyrą naudodami „Edge Impulse“ CLI įkėlimo programą.
Norėdami įdiegti CLI Uploader, pirmiausia atsisiųskite ir įdiekite „Node.js“ į savo nešiojamąjį kompiuterį. Po to atidarykite komandų eilutę ir įveskite žemiau esančią komandą:
npm įdiegti -g krašto impulsą-cli
Dabar atsisiųskite duomenų rinkinį („Dataset Link“) ir ištraukite failą į savo projekto aplanką. Atidarykite komandų eilutę ir eikite į duomenų rinkinio vietą ir vykdykite šias komandas:
krašto impulsų įkėlėjas - švarus krašto impulsų įkėlėjas - kategorijos mokymo mokymai / *. json krašto impulsų įkėlėjas - kategorijos mokymo mokymai / *. „cbor krašto impulso įkėlėjas - kategorijos testavimo testavimas / *. json „edge-impulse-uploader“ - kategorijos testavimo bandymai / *. cbor
Mokyti modelį ir patobulinti kodą
Kai duomenų rinkinys bus paruoštas, dabar sukursime impulsą duomenims. Tam eikite į puslapį „ Kurti impulsą “.
Dabar puslapyje „ Kurti impulsą“ spustelėkite „ Pridėti apdorojimo bloką“ . Kitame lange pasirinkite garso (MFCC) bloką. Po to spustelėkite „ Pridėti mokymosi bloką“ ir pasirinkite „ Neural Network“ (Keras) bloką. Tada spustelėkite „ Išsaugoti impulsą“ .
Kitame žingsnyje eikite į MFCC puslapį ir tada spustelėkite „ Generuoti funkcijas“ . Tai sugeneruos MFCC blokus visiems mūsų garso langams.
Po to eikite į „ NN klasifikatoriaus“ puslapį ir spustelėkite tris taškus viršutiniame dešiniajame „ Neuroninio tinklo nustatymų“ kampe ir pasirinkite „ Perjungti į režimą„ Keras “(ekspertas)“ .
Pakeiskite originalą šiuo kodu ir pakeiskite „ Minimalus patikimumo įvertinimas“ į „0,70“. Tada spustelėkite mygtuką „ Pradėti treniruotę“ . Tai pradės mokyti jūsų modelį.
importuoti tensorflow kaip tf iš tensorflow.keras.models importuoti seką iš tensorflow.keras.layers importuoti Dense, InputLayer, Dropout, Flatten, Reshape, BatchNormalization, Conv2D, MaxPooling2D, AveragePooling2D iš tensorflow.keras.erasimoptowflow Adam importuoti „MaxNorm“ # modelio architektūros 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 (base_size = 2, padding = 'same')) model.add (Conv2D (5, branduolio_size = 5, aktyvinimas = 'relu', padding = 'tas pats', kernel_constraint = MaxNorm (3))) model.add (AveragePooling2D (baseino dydis = 2,padding = 'same')) model.add (Flatten ()) model.add (Dense (class, activation = 'softmax', name = 'y_pred', kernel_constraint = MaxNorm (3)))) # tai kontroliuoja mokymosi greičio pasirinkimą = Adomas (lr = 0,005, beta_1 = 0,9, beta_2 = 0,999) # mokykite neuroninio tinklo modelį. Sudarykite (nuostolis = 'kategorinė_krosentropija', optimizavimo priemonė = opt, metrika =) modelis. = 9, patvirtinimo_duomenys = (X_test, Y_test), žodynas = 2)žodinis = 2)žodinis = 2)
Išmokęs modelį, jis parodys treniruotės našumą. Man tikslumas buvo 96,5%, o nuostolis - 0,10, kad būtų gerai tęsti.
Kai mūsų kosulio aptikimo modelis bus paruoštas, šį modelį įdiegsime kaip „Arduino“ biblioteką. Prieš atsisiųsdami modelį kaip biblioteką, galite išbandyti našumą apsilankę puslapyje „ Tiesioginė klasifikacija “.
Eikite į puslapį „ Diegimas “ ir pasirinkite „ Arduino biblioteka“ . Dabar slinkite žemyn ir spustelėkite „Sukurti“, kad pradėtumėte procesą. Tai sukurs jūsų projektui „Arduino“ biblioteką.
Dabar pridėkite biblioteką prie „Arduino IDE“. Tam atidarykite „Arduino IDE“ ir spustelėkite „ Eskizas“> „Įtraukti biblioteką“> „Add.ZIP“ biblioteka.
Tada įkelkite pavyzdį eidami į Failas> Pavyzdžiai> Jūsų projekto pavadinimas - krašto impulsas> nano_ble33_sense_microphone.
Atliksime keletą kodo pakeitimų, kad „Arduino“ aptikęs kosulį galėtume ištarti perspėjimo garsą. Dėl to „Arduino“ yra sąsaja ir, kai tik aptinka kosulį, šviesos diodas mirksi tris kartus.
Pakeitimai atliekami tuštumo ciklo () funkcijose, kai spausdinamos triukšmo ir kosulio vertės. Originaliame kode jis spausdina tiek etiketes, tiek jų vertes.
for (dydis_t ix = 0; ix <EI_CLASSIFIER_LABEL_COUNT; ix ++) {ei_printf ("% s:%.5f \ n", rezultatas.klasifikacija.label, rezultatas.klasifikacija.value); }
Mes išsaugosime triukšmo ir kosulio reikšmes skirtingais kintamaisiais ir palyginsime triukšmo vertes. Jei triukšmo vertė nesiekia 0,50, tai reiškia, kad kosulio vertė yra didesnė nei 0,50, ir tai skleis garsą. Pakeiskite kilpos () kodo originalą šiuo:
už (dydis_t ix = 1; ix <EI_CLASSIFIER_LABEL_COUNT; ix ++) {Serial.print (rezultatas.klasifikacija.vertė); plūduriuojantys duomenys = result.classification.value; if (Duomenys <0,50) {Serial.print ("Aptiktas kosulys"); signalizacija (); }}
Atlikę pakeitimus, įkelkite kodą į „Arduino“. Atidarykite nuoseklųjį monitorių 115200 baudų dažniu.
Taigi taip galima sukurti kosulio aptikimo aparatą. Tai nėra labai efektyvus metodas surasti įtariamąjį COVID19, tačiau jis gali puikiai veikti kai kuriose žmonių perpildytose vietose.
Visas darbinis vaizdo įrašas su biblioteka ir kodu pateikiamas žemiau: