Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

Husten mit TinyML auf Arduino Nano erkennen – Früherkennung von Grippe

Komponenten und Materialien

Arduino Nano 33 BLE Sense × 1

Apps und Online-Dienste

Edge Impulse Studio

Über dieses Projekt

Es besteht ein großer Bedarf an kostengünstigen, leicht einsetzbaren Lösungen für die Früherkennung von COVID-19 und anderen grippebedingten Erkrankungen. Gemeinsam mit der UN, Hackster, Edge Impulse und vielen anderen haben wir kürzlich die „UN Covid Detect & Protect Challenge“ gestartet, um leicht einsetzbare Lösungen für Prävention und Erkennung von Grippe in Entwicklungsländern zu schaffen. In diesem Tutorial zeigen wir, wie man Edge Impulse Machine Learning auf einem Arduino Nano BLE Sense einsetzt, um Husten in Echtzeit-Audio zu erkennen. Wir haben einen Datensatz mit Husten- und Hintergrundgeräusch-Proben erstellt und ein hochoptimiertes TinyML-Modell angewendet, um ein Hustenerkennungssystem zu bauen, das in Echtzeit mit weniger als 20 kB RAM auf dem Nano BLE Sense läuft. Derselbe Ansatz lässt sich auf viele andere eingebettete Audio-Mustererkennungsanwendungen übertragen, z. B. Altenpflege, Sicherheit und Maschinenüberwachung. Dieses Projekt und der Datensatz wurden ursprünglich von Kartik Thakore im Rahmen der COVID-19-Bemühungen gestartet.

Erste Schritte

Dieses Tutorial setzt folgende Voraussetzungen:

Wir nutzen Edge Impulse, eine Online-Entwicklungsplattform für Machine Learning auf Edge-Geräten. Erstellen Sie ein kostenloses Konto durch Registrierung hier. Melden Sie sich an und geben Sie Ihrem neuen Projekt einen Namen. Wir nennen unseres „Arduino Cough Tutorial“.

Husten mit TinyML auf Arduino Nano erkennen – Früherkennung von Grippe

Datensatz sammeln

Der erste Schritt in jedem ML-Projekt ist das Sammeln eines Datensatzes, der bekannte Proben der Daten repräsentiert, die wir auf unserem Arduino-Gerät erkennen möchten. Wir haben einen kleinen Datensatz mit 10 Minuten Audio in zwei Klassen („husten“ und „geräusch“) erstellt. Wir zeigen, wie man diesen Datensatz in Ihr Edge-Impulse-Projekt importiert, eigene Proben hinzufügt oder einen eigenen Datensatz von Grund auf neu erstellt. Dieser Datensatz ist klein und hat eine begrenzte Anzahl an Husten- und leisen Hintergrundgeräusch-Proben. Er eignet sich daher nur für Experimente, und das in diesem Tutorial erzeugte Modell kann nur zwischen leisem Hintergrundgeräusch und einem kleinen Bereich von Husten unterscheiden. Wir ermutigen Sie, den Datensatz mit einem breiteren Spektrum an Husten, Hintergrundgeräuschen und anderen Klassen wie menschlicher Sprache zu erweitern, um die Leistung zu verbessern.

Hinweis: Sich selbst zum Husten zu zwingen, belastet die Stimmbänder stark. Seien Sie vorsichtig beim Sammeln von Daten und Testen!

Laden Sie zunächst unseren Hustendatensatz herunter und entpacken Sie die Datei an einem beliebigen Ort auf Ihrem PC: https://cdn.edgeimpulse.com/datasets/cough.zip

Sie können diesen Datensatz mit dem Edge Impulse CLI Uploader in Ihr Projekt importieren. Installieren Sie die Edge Impulse CLI gemäß diesen Installationsanweisungen.

Öffnen Sie ein Terminal oder eine Eingabeaufforderung und navigieren Sie zu dem Ordner, in dem Sie die Datei entpackt haben.

Führen Sie aus:

$ edge-impulse-uploader --clean
$ edge-impulse-uploader --category training training/*
$ edge-impulse-uploader --category testing testing/*

Sie werden nach Ihrem Edge-Impulse-Benutzernamen, Passwort und dem Projekt gefragt, in das Sie den Datensatz hinzufügen möchten. Die Datensatz-Proben sind nun auf der Seite Data acquisition sichtbar. Durch Klicken auf eine Probe können Sie sehen, wie sie aussieht, und das Audio durch Klicken auf den Play-Button unter jedem Graphen anhören.

Husten mit TinyML auf Arduino Nano erkennen – Früherkennung von Grippe

10 Minuten Husten- und Geräuschdaten reichen für den Anfang. Optional können Sie den Datensatz mit eigenen Husten- und Hintergrundgeräusch-Proben erweitern. Wir können neue Datensätze direkt von Geräten auf der Data acquisition-Seite sammeln. Audio-Proben im WAV-Format können auch mit dem Edge Impulse CLI Uploader hochgeladen werden.

Der einfachste Einstieg ist das Sammeln von Audiodaten mit Ihrem Smartphone (vollständiges Tutorial hier). Gehen Sie zur Seite Devices und klicken Sie auf den Button „+ Connect a new device“ oben rechts. Wählen Sie „Use your mobile phone“. Es wird ein einzigartiger QR-Code erzeugt, um eine Web-App auf Ihrem Smartphone-Browser zu öffnen. Scannen Sie den QR-Code und öffnen Sie den Link.

Husten mit TinyML auf Arduino Nano erkennen – Früherkennung von Grippe

Die Web-App verbindet sich mit Ihrem Edge-Impulse-Projekt und sollte so aussehen:

Husten mit TinyML auf Arduino Nano erkennen – Früherkennung von Grippe

Wir können nun Audiodaten direkt vom Smartphone auf der Data acquisition-Seite von Edge Impulse sammeln. Im Bereich „Record new data“ geben Sie ein Label („cough“ oder „noise“) ein, stellen sicher, dass „Microphone“ als Sensor ausgewählt ist, und klicken auf „Start sampling“. Ihr Smartphone sammelt nun eine Audio-Probe und fügt sie Ihrem Datensatz hinzu.

Husten mit TinyML auf Arduino Nano erkennen – Früherkennung von Grippe

Das Sammeln von Audiodaten direkt vom Nano BLE Sense Board wird ebenfalls unterstützt. Folgen Sie diesen Anweisungen, um die Edge Impulse Firmware und den Daemon zu installieren. Sobald das Gerät mit Edge Impulse verbunden ist, können Sie Datensätze genauso sammeln wie mit dem Smartphone oben.

Husten mit TinyML auf Arduino Nano erkennen – Früherkennung von Grippe

Impuls erstellen

Als Nächstes wählen wir Signalverarbeitungs- und Machine-Learning-Blöcke auf der Seite Create impulse. Der Impuls beginnt leer mit Raw Data und Output Feature Blöcken. Behalten Sie die Standardeinstellungen bei: 1000 ms Fenstergröße und 500 ms Fenstererhöhung. Das bedeutet, unsere Audiodaten werden sekundenweise verarbeitet, beginnend alle 0,5 s. Ein kleines Fenster spart Speicher auf dem Embedded-Gerät, erfordert aber Husten-Proben ohne große Pausen zwischen den Husten.

Husten mit TinyML auf Arduino Nano erkennen – Früherkennung von Grippe

Klicken Sie auf „Add a processing block“ und wählen Sie den Audio (MFCC)-Block. Dann auf „Add a learning block“ und wählen Sie Neural Network (Keras). Klicken Sie auf „Save Impulse“. Der Audio-Block extrahiert ein Spektrogramm für jedes Audio-Fenster, und der Neural-Network-Block wird trainiert, das Spektrogramm basierend auf unserem Trainingsdatensatz als „cough“ oder „noise“ zu klassifizieren. Ihr resultierender Impuls sieht so aus:

Husten mit TinyML auf Arduino Nano erkennen – Früherkennung von Grippe

Als Nächstes generieren wir Features aus dem Trainingsdatensatz auf der MFCC-Seite. Diese Seite zeigt das extrahierte Spektrogramm für jedes 1-Sekunden-Fenster aus beliebigen Datensatz-Proben. Die Parameter können auf ihren Standardwerten belassen werden.

Husten mit TinyML auf Arduino Nano erkennen – Früherkennung von Grippe

Klicken Sie nun auf den Button „Generate features“, der den gesamten Trainingsdatensatz mit diesem Verarbeitungsblock verarbeitet. Dies erstellt den vollständigen Feature-Satz, der im nächsten Schritt zum Trainieren unseres Neural Networks verwendet wird. Drücken Sie „Generate features“, um die Verarbeitung zu starten – dies dauert einige Minuten.

Husten mit TinyML auf Arduino Nano erkennen – Früherkennung von Grippe

Wir können nun unser Neural Network auf der NN Classifier-Seite einrichten und trainieren. Das Standard-Neuronale Netz funktioniert gut für kontinuierliche Geräusche wie fließendes Wasser. Husten-Erkennung ist komplexer, daher konfigurieren wir ein reicheres Netzwerk mit 2D-Faltung über das Spektrogramm jedes Fensters. 2D-Faltung verarbeitet das Audiospektrogramm ähnlich wie Bildklassifikation. Drücken Sie die rechte obere Ecke des Bereichs „Neural Network settings“ und wählen Sie „Switch to Keras (expert) mode“.

Husten mit TinyML auf Arduino Nano erkennen – Früherkennung von Grippe

Ersetzen Sie die „Neural network architecture“-Definition mit dem folgenden Code und setzen Sie „Minimum confidence rating“ auf „0.70“. Klicken Sie dann auf „Start training“. Das Training dauert einige Sekunden.

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, InputLayer, Dropout, Flatten, Reshape, BatchNormalization, Conv2D, MaxPooling2D, AveragePooling2D
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.constraints import MaxNorm

# Modellarchitektur
model = Sequential()
model.add(InputLayer(input_shape=(X_train.shape[1], ), name='x_input'))
model.add(Reshape((int(X_train.shape[1] / 13), 13, 1), input_shape=(X_train.shape[1], )))
model.add(Conv2D(10, kernel_size=5, activation='relu', padding='same', kernel_constraint=MaxNorm(3)))
model.add(AveragePooling2D(pool_size=2, padding='same'))
model.add(Conv2D(5, kernel_size=5, activation='relu', padding='same', kernel_constraint=MaxNorm(3)))
model.add(AveragePooling2D(pool_size=2, padding='same'))
model.add(Flatten())
model.add(Dense(classes, activation='softmax', name='y_pred', kernel_constraint=MaxNorm(3)))

# Lernrate steuern
opt = Adam(lr=0.005, beta_1=0.9, beta_2=0.999)

# Neuronales Netz trainieren
model.compile(loss='categorical_crossentropy', optimizer=opt, metrics=['accuracy'])
model.fit(X_train, Y_train, batch_size=32, epochs=9, validation_data=(X_test, Y_test), verbose=2)

Die Seite zeigt die Trainingsleistung und die On-Device-Leistung, die etwa so aussehen sollte (abhängig von Ihrem Datensatz):

Husten mit TinyML auf Arduino Nano erkennen – Früherkennung von Grippe

Unser Arduino-Hustenerkennungsalgorithmus ist nun bereit zum Testen!

Training und Test

Die Seite Live classification ermöglicht das Testen des Algorithmus sowohl mit den vorhandenen Testdaten aus dem Datensatz als auch durch Streaming von Audiodaten von Ihrem Smartphone oder Arduino-Gerät. Beginnen Sie mit einem einfachen Test, indem Sie eine beliebige Testprobe auswählen und „Load sample“ drücken. Dies klassifiziert die Testprobe und zeigt die Ergebnisse:

Husten mit TinyML auf Arduino Nano erkennen – Früherkennung von Grippe

Wir können den Algorithmus auch mit Live-Daten testen. Starten Sie mit Ihrem Smartphone, indem Sie die Browser-Seite auf Ihrem Telefon aktualisieren, die wir zuvor geöffnet haben. Wählen Sie dann Ihr Gerät im Bereich „Classify new data“ aus und drücken Sie „Start sampling“. Ebenso können Sie Audiodaten von Ihrem Nano BLE Sense streamen, wenn es über den edge-impulse-daemon mit dem Projekt verbunden ist (wie im Datensammelschritt).

Bereitstellung

Wir können unseren Hustenerkennungsalgorithmus einfach auf dem Smartphone bereitstellen. Gehen Sie zum Browserfenster auf Ihrem Telefon, aktualisieren Sie es und drücken Sie den Button „Switch to classification mode“. Dies baut das Projekt automatisch in ein WebAssembly-Paket und führt es kontinuierlich auf Ihrem Telefon aus (nachdem keine Cloud mehr erforderlich ist, sogar im Flugmodus!).

Husten mit TinyML auf Arduino Nano erkennen – Früherkennung von Grippe

Als Nächstes können wir den Algorithmus auf dem Nano BLE Sense bereitstellen, indem wir zur Seite Deployment gehen. Wählen Sie unter „Build firmware“ den „Arduino Nano 33 BLE Sense“ und klicken Sie auf „Build“.

Husten mit TinyML auf Arduino Nano erkennen – Früherkennung von Grippe

Dies erstellt eine komplette Firmware für den Nano BLE Sense einschließlich Ihres neuesten Algorithmus. Folgen Sie den Anweisungen auf dem Bildschirm, um Ihr Arduino-Board mit der Binärdatei zu flashen.

Husten mit TinyML auf Arduino Nano erkennen – Früherkennung von Grippe

Sobald der Arduino geflasht ist, können Sie einen seriellen Port zum Gerät öffnen, während es per USB angeschlossen ist, bei 115.200 Baud. Sobald der serielle Port offen ist, drücken Sie Enter für eine Aufforderung und dann:

> AT+RUNIMPULSE
Inferencing settings:
 Interval: 0.06 ms.
 Frame size: 16000
 Sample length: 1000 ms.
 No. of classes: 2
Starting inferencing, press 'b' to break
Recording...
Recording done
Predictions (DSP: 495 ms., Classification: 84 ms., Anomaly: 0 ms.):
 cough: 0.01562
 noise: 0.98438
Starting inferencing in 2 seconds...
Recording...
Recording done
Predictions (DSP: 495 ms., Classification: 84 ms., Anomaly: 0 ms.):
 cough: 0.01562
 noise: 0.98438
Starting inferencing in 2 seconds...
Recording...
Recording done
Predictions (DSP: 495 ms., Classification: 84 ms., Anomaly: 0 ms.):
 cough: 0.86719
 noise: 0.13281
Starting inferencing in 2 seconds...
Recording...
Recording done
Predictions (DSP: 495 ms., Classification: 84 ms., Anomaly: 0 ms.):
 cough: 0.01562
 noise: 0.98438

Zukünftige Arbeit

Mit TinyML, Sensoren und Edge Impulse auf Arduino sind die Möglichkeiten grenzenlos. Hier sind einige Ideen für weitere Arbeiten:

Herstellungsprozess

  1. K30 CO₂-Sensor: Echtzeit-Luftqualitätsmessung mit Arduino
  2. Kommunikationshilfe für Taubblinde: 1Sheeld + Arduino + Sprachausgabe & Anzeige
  3. Smartes Sparschwein: Münzprüfer mit Arduino Nano steuern
  4. LED per Bluetooth mit Arduino steuern – Einfache DIY-Anleitung
  5. DFRobot Kapazitiver Fingerabdrucksensor mit Arduino oder ESP8266 einbinden
  6. Interaktives Nextion HMI Projekt mit Arduino Mega und Sensoren
  7. Arduino-basierter 6-DoF Roboterarm mit Nunchuk-Steuerung
  8. Pflanzengesundheit mit TinyML bewerten: Praktischer Leitfaden
  9. Echtzeit-Waldbrand-Überwachungssystem mit SMS-Alarm
  10. Präzise Solareinstrahlungsmessung mit Arduino UNO & Ethernet Shield