- Gerekli Bileşenler
- Devre şeması
- Öksürük Tespit Makinesi için Veri Seti Oluşturma
- Modeli Eğitmek ve Kodu Ayarlamak
COVID19 gerçekten tüm dünyayı çok kötü etkileyen tarihi bir salgın ve insanlar bununla savaşmak için birçok yeni cihaz yapıyor. Ayrıca otomatik bir sterilizasyon makinesi ve Temassız sıcaklık taraması için Termal Tabanca da yaptık. Bugün Koronavirüs ile savaşmaya yardımcı olacak bir cihaz daha geliştireceğiz. Gürültü ve öksürük sesini ayırt edebilen ve Corona şüphelisinin bulunmasına yardımcı olabilen bir öksürük algılama sistemidir. Bunun için makine öğrenimi tekniklerini kullanacak.
Bu eğitimde, Arduino 33 BLE Sense ve Edge Impulse Studio kullanarak bir Öksürük Algılama sistemi oluşturacağız. Normal arka plan gürültüsünü ve gerçek zamanlı seste öksürüğü ayırt edebilir. Edge Impulse Studio'yu öksürük ve arka plan gürültü örneklerinden oluşan bir veri kümesini eğitmek ve bir Öksürük sesini gerçek zamanlı olarak algılayabilen yüksek düzeyde optimize edilmiş bir TInyML modeli oluşturmak için kullandık.
Gerekli Bileşenler
Donanım
- Arduino 33 BLE Sense
- LED
- Atlama Telleri
Yazılım
- Edge Impulse Studio
- Arduino IDE
Arduino 33 BLE Sense ile ilgili ayrıntılı bir öğreticiyi ele aldık.
Devre şeması
Arduino 33 BLE Sense Kullanılarak Öksürük Tespiti için Devre Şeması aşağıda verilmiştir. Arduino 33 BLE için Fritzing parçası mevcut değildi, bu yüzden her ikisi de aynı pin çıkışına sahip olduğu için Arduino Nano kullandım.
LED'in Pozitif kablosu Arduino 33 BLE sense'nin dijital pin 4'üne ve Negatif ucu Arduino'nun GND pinine bağlıdır.
Öksürük Tespit Makinesi için Veri Seti Oluşturma
Daha önce de belirtildiği gibi, öksürük tespit modelimizi eğitmek için Edge Impulse Studio kullanıyoruz. Bunun için, Arduino'muzda tanımak istediğimiz veri örneklerine sahip bir veri kümesi toplamalıyız. Amaç öksürüğü tespit etmek olduğundan, öksürük ve diğer Gürültüleri ayırt edebilmesi için bundan bazı örnekler ve gürültü için başka bazı örnekler toplamanız gerekecektir.
"Öksürük" ve "gürültü" olmak üzere iki sınıftan oluşan bir veri seti oluşturacağız. Bir veri kümesi oluşturmak için bir Edge Impulse hesabı oluşturun, hesabınızı doğrulayın ve ardından yeni bir proje başlatın. Örnekleri cep telefonunuzu, Arduino kartınızı kullanarak yükleyebilir veya bir veri setini edge impulse hesabınıza aktarabilirsiniz. Örnekleri hesabınıza yüklemenin en kolay yolu cep telefonunuzu kullanmaktır. Bunun için cep telefonunuzu Edge Impulse ile bağlamanız gerekir.
Cep telefonunuzu bağlamak için ' Cihazlar'a ve ardından' Yeni Bir Cihaz Bağla'ya tıklayın .
Şimdi bir sonraki pencerede, ' Cep Telefonunuzu Kullanın'ı tıklayın, bir QR kodu görünecektir. Google Lens veya diğer QR kodu tarayıcı uygulamasını kullanarak QR kodunu Cep Telefonunuzla tarayın.
Bu, telefonunuzu Edge Impulse stüdyosuna bağlayacaktır.
Telefonunuz Edge Impulse Studio'ya bağlıyken artık örneklerinizi yükleyebilirsiniz. Örnekleri yüklemek için ' Veri edinme'ye tıklayın. Şimdi Veri alma sayfasında, etiket adını girin, mikrofonu sensör olarak seçin ve örnek uzunluğunu girin. 'Tıklayın Başlat örnekleme' 40 Sec örneği örnekleme başlamak. Kendinizi öksürmeye zorlamak yerine, farklı uzunluklarda çevrimiçi öksürük örneklerini kullanabilirsiniz. Farklı uzunluklarda toplam 10 ila 12 öksürük örneği kaydedin.
Öksürük örneklerini yükledikten sonra, şimdi etiketi "gürültü" olarak ayarlayın ve 10 ila 12 gürültü örneği daha toplayın.
Bu örnekler modülü eğitmek içindir, sonraki adımlarda Test Verilerini toplayacağız. Test verileri eğitim verilerinin en az% 30'u olmalıdır, bu nedenle 3 'gürültü' ve 4 ila 5 'öksürük' örneğini toplayın.
Verilerinizi toplamak yerine, Edge Impulse CLI Yükleyiciyi kullanarak veri setimizi Edge Impulse hesabınıza aktarabilirsiniz.
CLI Yükleyiciyi kurmak için, önce Node.js'yi dizüstü bilgisayarınıza indirin ve kurun. Bundan sonra komut istemini açın ve aşağıdaki komutu girin:
npm install -g edge-impulse-cli
Şimdi veri kümesini (Veri Kümesi Bağlantısı) indirin ve dosyayı proje klasörünüze çıkarın. Komut istemini açın ve veri kümesi konumuna gidin ve aşağıdaki komutları çalıştırın:
edge-impulse-uploader --clean edge-impulse-uploader - kategori eğitimi eğitimi / *. json edge-impulse-uploader - kategori eğitimi eğitimi / *. cbor edge-impulse-uploader - kategori test testi / *. json edge-impulse-uploader --kategori test testi / *. cbor
Modeli Eğitmek ve Kodu Ayarlamak
Veri seti hazır olduğunda, şimdi veriler için bir itici güç oluşturacağız. Bunun için ' dürtü oluştur ' sayfasına gidin.
Şimdi ' İtme oluştur' sayfasında, ' Bir işleme bloğu ekle'yi tıklayın. Sonraki pencerede, Ses (MFCC) bloğunu seçin. Bundan sonra ' Bir öğrenme bloğu ekle'ye tıklayın ve Sinir Ağı (Keras) bloğunu seçin. Ardından ' Dürtüyü Kaydet'e tıklayın .
Bir sonraki adımda, MFCC sayfasına gidin ve ardından ' Özellik Oluştur'a tıklayın. Tüm ses pencerelerimiz için MFCC blokları oluşturacaktır.
Bundan sonra ' NN Sınıflandırıcı' sayfasına gidin ve ' Sinir Ağı ayarları'nın sağ üst köşesindeki üç noktayı tıklayın ve' Keras (uzman) moduna geç'i seçin.
Orijinali aşağıdaki kodla değiştirin ve " Minimum güven derecesi" ni "0,70" olarak değiştirin. Ardından ' Eğitimi başlat' düğmesine tıklayın. Modelinizi eğitmeye başlayacaktır.
tensorflow'u tensorflow.keras.models'ten tf olarak içe aktar tensorflow.keras.layers'dan Sequential ithal Dense, InputLayer, Dropout, Flatten, Reshape, BatchNormalization, Conv2D, MaxPooling2D, AveragePooling2D'yi tensorflow.keras.optimizers'dan tensorflow.keras.optimizers'dan içe aktarır Adamas.constraints.ker import MaxNorm # model mimari model = Sıralı () model.add (InputLayer (input_shape = (X_train.shape,), name = 'x_input')) model.add (Yeniden şekillendirme ((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 (OrtalamaHavuz2D (pool_size = 2, padding = 'same')) model.add (Conv2D (5, kernel_size = 5, activation = 'relu', padding = 'same', kernel_constraint = MaxNorm (3))) model.add (OrtalamaPooling2D (pool_size = 2,padding = 'same')) model.add (Flatten ()) model.add (Yoğun (sınıflar, aktivasyon = 'softmax', name = 'y_pred', kernel_constraint = MaxNorm (3))) # bu, öğrenme hızını kontrol eder = Adam (lr = 0.005, beta_1 = 0.9, beta_2 = 0.999) # sinir ağı modelini eğitin. Yığın (kayıp = 'categorical_crossentropy', optimizer = opt, metrics =) model.fit (X_train, Y_train, batch_size = 32, epochs = 9, validation_data = (X_test, Y_test), ayrıntılı = 2)ayrıntılı = 2)ayrıntılı = 2)
Modeli eğittikten sonra, eğitim performansını gösterecektir. Benim için doğruluk% 96.5 ve kayıp 0.10 idi, bu da devam etmek için iyidir.
Şimdi öksürük tespit modelimiz hazır olduğu için bu modeli Arduino kütüphanesi olarak devreye alacağız. Modeli kitaplık olarak indirmeden önce, ' Canlı Sınıflandırma ' sayfasına giderek performansı test edebilirsiniz.
' Dağıtım ' sayfasına gidin ve ' Arduino Kitaplığı'nı seçin. Şimdi aşağı kaydırın ve işlemi başlatmak için 'Oluştur'a tıklayın. Bu, projeniz için bir Arduino kitaplığı oluşturacaktır.
Şimdi kitaplığı Arduino IDE'nize ekleyin. Bunun için Arduino IDE'yi açın ve ardından Sketch> Include Library> Add.ZIP library tıklayın.
Ardından, Dosya> Örnekler> Proje adınız - Edge Impulse> nano_ble33_sense_microphone'a giderek bir örnek yükleyin.
Arduino öksürük algıladığında bir uyarı sesi çıkarabilmemiz için kodda bazı değişiklikler yapacağız. Bunun için Arduino ile bir zil arabirimine bağlanır ve öksürük algıladığında LED üç kez yanıp söner.
Değişiklikler, gürültü ve öksürük değerlerini yazdırdığı void loop () işlevlerinde yapılır. Orijinal kodda hem etiketleri hem de değerlerini birlikte yazdırmaktadır.
for (size_t ix = 0; ix <EI_CLASSIFIER_LABEL_COUNT; ix ++) {ei_printf ("% s:%.5f \ n", result.classification.label, result.classification.value); }
Hem gürültü hem de öksürük değerlerini farklı değişkenlere kaydedip gürültü değerlerini karşılaştıracağız. Gürültü değeri 0,50'nin altına düşerse bu öksürük değerinin 0,50'den fazla olduğu anlamına gelir ve ses çıkarır. Orijinal for loop () kodunu bununla değiştirin:
for (size_t ix = 1; ix <EI_CLASSIFIER_LABEL_COUNT; ix ++) {Serial.print (sonuç.classification.value); float Veri = sonuc.classification.value; eğer (Data <0.50) {Serial.print ("Öksürük Algılandı"); alarm (); }}
Değişiklikleri yaptıktan sonra, kodu Arduino'nuza yükleyin. Seri monitörü 115200 baud'da açın.
Yani bir öksürük algılama makinesi böyle inşa edilebilir, herhangi bir COVID19 şüphelisini bulmak için çok etkili bir yöntem değildir, ancak bazı kalabalık alanlarda güzelce çalışabilir.
Kitaplık ve kod içeren eksiksiz bir çalışma videosu aşağıda verilmiştir: