- Wymagane składniki
- Schemat obwodu
- Tworzenie zestawu danych dla maszyny do wykrywania kaszlu
- Szkolenie modelu i ulepszanie kodu
COVID19 to naprawdę historyczna pandemia, która bardzo źle wpływa na cały świat i ludzie budują wiele nowych urządzeń, aby z nią walczyć. Zbudowaliśmy również automat do odkażania i pistolet termiczny do bezkontaktowego badania temperatury. Dziś zbudujemy jeszcze jedno urządzenie, które pomoże w walce z koronawirusem. Jest to system wykrywania kaszlu, który potrafi rozróżnić hałas i dźwięk kaszlu i może pomóc w znalezieniu podejrzanego o koronę Corona. Wykorzysta do tego techniki uczenia maszynowego.
W tym samouczku zbudujemy system wykrywania kaszlu przy użyciu Arduino 33 BLE Sense i Edge Impulse Studio. Potrafi rozróżnić normalny hałas w tle i kaszel w czasie rzeczywistym. Użyliśmy Edge Impulse Studio do wytrenowania zestawu danych próbek kaszlu i hałasu w tle oraz zbudowania wysoce zoptymalizowanego modelu TInyML, który może wykrywać dźwięk kaszlu w czasie rzeczywistym.
Wymagane składniki
Sprzęt komputerowy
- Arduino 33 BLE Sense
- DOPROWADZIŁO
- Przewody połączeniowe
Oprogramowanie
- Edge Impulse Studio
- Arduino IDE
Omówiliśmy szczegółowy samouczek dotyczący Arduino 33 BLE Sense.
Schemat obwodu
Schemat obwodu do wykrywania kaszlu przy użyciu Arduino 33 BLE Sense przedstawiono poniżej. Część Fritzing dla Arduino 33 BLE nie była dostępna, więc użyłem Arduino Nano, ponieważ oba mają takie same wyprowadzenia.
Dodatni przewód diody LED jest podłączony do cyfrowego pinu 4 czujnika BLE Arduino 33, a przewód ujemny jest podłączony do pinu GND Arduino.
Tworzenie zestawu danych dla maszyny do wykrywania kaszlu
Jak wspomniano wcześniej, używamy Edge Impulse Studio do trenowania naszego modelu wykrywania kaszlu. W tym celu musimy zebrać zestaw danych zawierający próbki danych, które chcielibyśmy móc rozpoznać w naszym Arduino. Ponieważ celem jest wykrycie kaszlu, musisz zebrać kilka próbek tego i innych próbek na hałas, aby można było odróżnić kaszel od innych hałasów.
Stworzymy zbiór danych z dwiema klasami „kaszel” i „hałas”. Aby utworzyć zestaw danych, utwórz konto Edge Impulse, zweryfikuj swoje konto, a następnie rozpocznij nowy projekt. Możesz załadować próbki za pomocą telefonu komórkowego, płyty Arduino lub możesz zaimportować zestaw danych do konta Edge Impulse. Najłatwiejszym sposobem załadowania próbek na konto jest użycie telefonu komórkowego. W tym celu musisz połączyć swój telefon komórkowy z Edge Impulse.
Aby podłączyć telefon komórkowy, kliknij „ Urządzenia ”, a następnie kliknij „ Podłącz nowe urządzenie” .
Teraz w następnym oknie kliknij „ Użyj telefonu komórkowego” , a pojawi się kod QR. Zeskanuj kod QR telefonem komórkowym za pomocą Google Lens lub innej aplikacji do skanowania kodów QR.
To połączy Twój telefon ze studiem Edge Impulse.
Po podłączeniu telefonu do Edge Impulse Studio możesz teraz załadować swoje próbki. Aby załadować próbki, kliknij „ Pobieranie danych” . Teraz na stronie Pozyskiwanie danych wprowadź nazwę etykiety, wybierz mikrofon jako czujnik i wprowadź długość próbki. Kliknij „ Start sampling” , aby rozpocząć próbkowanie 40-sekundowej próbki. Zamiast zmuszać się do kaszlu, możesz użyć internetowych próbek kaszlu o różnej długości. Zarejestruj łącznie od 10 do 12 próbek kaszlu o różnej długości.
Po przesłaniu próbek kaszlu ustaw etykietę na „hałas” i zbierz kolejne 10–12 próbek hałasu.
Te próbki służą do szkolenia modułu, w następnych krokach zbierzemy dane testowe. Dane testowe powinny stanowić co najmniej 30% danych treningowych, dlatego zbierz 3 próbki „hałasu” i 4 do 5 próbek „kaszlu”.
Zamiast zbierać dane, możesz zaimportować nasz zestaw danych na swoje konto Edge Impulse za pomocą narzędzia do przesyłania Edge Impulse CLI Uploader.
Aby zainstalować narzędzie do przesyłania CLI, najpierw pobierz i zainstaluj Node.js na swoim laptopie. Następnie otwórz wiersz polecenia i wprowadź poniższe polecenie:
npm install -g edge-impulse-cli
Teraz pobierz zestaw danych (łącze do zestawu danych) i wyodrębnij plik w folderze projektu. Otwórz wiersz polecenia i przejdź do lokalizacji zestawu danych i uruchom poniższe polecenia:
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
Szkolenie modelu i ulepszanie kodu
Ponieważ zbiór danych jest gotowy, teraz utworzymy impuls dla danych. W tym celu przejdź do strony „ Stwórz impuls ”.
Teraz na stronie „ Utwórz impuls” kliknij „ Dodaj blok przetwarzania” . W następnym oknie wybierz blok Audio (MFCC). Następnie kliknij „ Dodaj blok szkoleniowy” i wybierz blok Sieć neuronowa (Keras). Następnie kliknij „ Save Impulse” .
W następnym kroku przejdź do strony MFCC, a następnie kliknij „ Generuj funkcje” . Wygeneruje bloki MFCC dla wszystkich naszych okien audio.
Następnie przejdź do strony „ Klasyfikator NN” i kliknij trzy kropki w prawym górnym rogu „ Ustawienia sieci neuronowej” i wybierz „ Przełącz na tryb Keras (ekspert)” .
Zastąp oryginał następującym kodem i zmień „ Minimalny poziom ufności” na „0,70”. Następnie kliknij przycisk „ Rozpocznij szkolenie” . Zacznie trenować Twój model.
import tensorflow jako tf z tensorflow.keras.models import Sequential z tensorflow.keras.layers import Dense, InputLayer, Dropout, Flatten, Reshape, BatchNormalization, Conv2D, MaxPooling2D, AveragePooling2D z tensorflow.keras.optimizers import Adama z tensorflow.keras.optimizers. import MaxNorm # model architecture 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, aktywacja = 'relu', padding = 'same', kernel_constraint = MaxNorm (3))) model.add (AveragePooling2D (pool_size = 2, padding = 'same')) model.add (Conv2D (5, kernel_size = 5, aktywacja = 'relu', padding = 'same', kernel_constraint = MaxNorm (3))) model.add (AveragePooling2D (pool_size = 2,padding = 'same')) model.add (Flatten ()) model.add (Dense (classes, aktywacja = 'softmax', name = 'y_pred', kernel_constraint = MaxNorm (3))) # kontroluje szybkość uczenia opt = Adam (lr = 0,005, beta_1 = 0,9, beta_2 = 0,999) # trenuj model sieci neuronowej. Stos (strata = 'categorical_crossentropy', optimizer = opt, metrics =) model.fit (X_train, Y_train, batch_size = 32, epoki = 9, validation_data = (X_test, Y_test), verbose = 2)gadatliwy = 2)gadatliwy = 2)
Po wytrenowaniu model pokaże wydajność treningu. Dla mnie dokładność wynosiła 96,5%, a strata 0,10, więc dobrze jest kontynuować.
Teraz, gdy nasz model wykrywania kaszlu jest gotowy, wdrożymy go jako bibliotekę Arduino. Przed pobraniem modelu jako biblioteki możesz przetestować wydajność, przechodząc do strony „ Klasyfikacja na żywo ”.
Przejdź do strony „ Wdrażanie ” i wybierz „ Biblioteka Arduino” . Teraz przewiń w dół i kliknij „Buduj”, aby rozpocząć proces. Spowoduje to zbudowanie biblioteki Arduino dla twojego projektu.
Teraz dodaj bibliotekę do swojego Arduino IDE. W tym celu otwórz Arduino IDE, a następnie kliknij Szkic> Dołącz bibliotekę> Dodaj bibliotekę ZIP.
Następnie załaduj przykład, przechodząc do Plik> Przykłady> Nazwa Twojego projektu - Edge Impulse> nano_ble33_sense_microphone.
Wprowadzimy pewne zmiany w kodzie, abyśmy mogli wydać dźwięk ostrzegawczy, gdy Arduino wykryje kaszel. W tym celu brzęczyk jest połączony z Arduino i za każdym razem, gdy wykryje kaszel, dioda LED zamiga trzy razy.
Zmiany są wprowadzane w funkcjach void loop (), gdzie drukuje wartości hałasu i kaszlu. W oryginalnym kodzie drukuje razem etykiety i ich wartości.
for (size_t ix = 0; ix <EI_CLASSIFIER_LABEL_COUNT; ix ++) {ei_printf ("% s:%.5f \ n", result.classification.label, result.classification.value); }
Zamierzamy zapisać wartości hałasu i kaszlu w różnych zmiennych i porównać wartości hałasu. Jeśli wartość hałasu spadnie poniżej 0,50, oznacza to, że wartość kaszlu jest większa niż 0,50 i wyda dźwięk. Zastąp oryginalny kod pętli () tym:
for (size_t ix = 1; ix <EI_CLASSIFIER_LABEL_COUNT; ix ++) {Serial.print (result.classification.value); float Data = result.classification.value; if (Dane <0,50) {Serial.print ("Wykryto kaszel"); alarm(); }}
Po wprowadzeniu zmian prześlij kod do swojego Arduino. Otwórz monitor szeregowy z prędkością 115200 bodów.
Tak więc można zbudować maszynę do wykrywania kaszlu, nie jest to bardzo skuteczna metoda na znalezienie podejrzanego o COVID19, ale może dobrze działać w zatłoczonych miejscach.
Pełne wideo robocze z biblioteką i kodem znajduje się poniżej: