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

Hustenerkennung mit TinyML auf Arduino

Komponenten und Verbrauchsmaterialien

Arduino Nano 33 BLE Sense
× 1

Apps und Onlinedienste

Edge Impulse Studio

Über dieses Projekt

Es besteht ein großer Bedarf an kostengünstigen, einfach einzusetzenden Lösungen für die COVID-19- und andere grippebezogene Früherkennung. Gemeinsam mit der UNO, Hackster, Edge Impulse und vielen anderen haben wir kürzlich die UN Covid Detect &Protect Challenge ins Leben gerufen, um einfach einsetzbare Lösungen für die Prävention und Erkennung von Grippe in Entwicklungsländern zu entwickeln. In diesem Tutorial zeigen wir, wie Sie Edge Impulse Machine Learning auf einem Arduino Nano BLE Sense verwenden, um das Vorhandensein von Husten in Echtzeit-Audio zu erkennen. Wir haben einen Datensatz mit Husten- und Hintergrundgeräuschproben erstellt und ein hochoptimiertes TInyML-Modell angewendet, um ein Hustenerkennungssystem zu bauen, das in Echtzeit in weniger als 20 kB RAM auf dem Nano BLE Sense läuft. Der gleiche Ansatz gilt für viele andere eingebettete Audiomuster-Matching-Anwendungen, zum Beispiel Altenpflege, Sicherheit und Maschinenüberwachung. Dieses Projekt und der Datensatz wurden ursprünglich von Kartik Thakore gestartet, um bei den COVID-19-Bemühungen zu helfen.

Erste Schritte

Dieses Tutorial hat die folgenden Anforderungen:

  • Grundlegendes Verständnis von Softwareentwicklung und Arduino
  • Installierte Arduino IDE oder CLI
  • Android- oder iOS-Mobiltelefon
  • Arduino Nano BLE Sense oder gleichwertiges Cortex-M4+ Board mit Mikrofon (optional)

Wir werden Edge Impulse verwenden, eine Online-Entwicklungsplattform für maschinelles Lernen auf Edge-Geräten. Erstellen Sie ein kostenloses Konto, indem Sie sich hier anmelden. Loggen Sie sich in Ihr Konto ein und geben Sie Ihrem neuen Projekt einen Namen, indem Sie auf den Titel klicken. Wir nennen unsere das „Arduino Cough Tutorial“.

Erhebung des Datensatzes

Der erste Schritt in jedem maschinellen Lernprojekt besteht darin, einen Datensatz zu sammeln, der bekannte Datenproben darstellt, die wir auf unserem Arduino-Gerät abgleichen möchten. Für den Anfang haben wir einen kleinen Datensatz mit 10 Minuten Audio in zwei Klassen erstellt, „Husten“ und „Lärm“. Wir zeigen, wie Sie diesen Datensatz in Ihr Edge Impulse-Projekt importieren, Ihre eigenen Samples hinzufügen oder sogar Ihren eigenen Datensatz von Grund auf neu starten. Dieser Datensatz ist klein und enthält eine begrenzte Anzahl von Husten- und leisen Hintergrundgeräuschproben. Daher ist der Datensatz nur für Experimente geeignet, und das in diesem Tutorial erstellte Modell kann nur zwischen leisen Hintergrundgeräuschen und einem kleinen Bereich von Husten unterscheiden. Wir empfehlen Ihnen, 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 zum Husten zu zwingen ist sehr hart für deine Stimmbänder, sei vorsichtig beim Sammeln von Daten und beim Testen!

Laden Sie zunächst unseren Husten-Datensatz herunter und entpacken Sie die Datei auf Ihrem PC an einem Ort Ihrer Wahl:https://cdn.edgeimpulse.com/datasets/cough.zip

Sie können diesen Datensatz mit dem Edge Impulse CLI Uploader in Ihr Edge Impulse-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 den Sie die Datei extrahiert haben.

Ausführen:

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

Sie werden aufgefordert, Ihren Edge Impulse-Benutzernamen, Ihr Passwort und das Projekt einzugeben, zu dem Sie den Datensatz hinzufügen möchten. Die Datensatzproben sind jetzt auf der Datenerfassung . sichtbar Seite. Wenn wir auf ein Beispiel klicken, können wir sehen, wie das Beispiel aussieht, und das Audio hören, indem wir auf die Wiedergabeschaltfläche unter jedem Diagramm klicken.

10 Minuten Husten- und Geräuschdatenproben reichen aus, um loszulegen. Optional können Sie den Datensatz mit Ihren eigenen Husten- und Hintergrundgeräuschproben erweitern. Wir können neue Datenproben direkt von Geräten aus der Datenerfassung sammeln Seite. Hörproben im WAV-Format können auch mit dem Edge Impulse CLI Uploader hochgeladen werden.

Der einfachste Weg, um zu beginnen, besteht darin, Audiodaten mit Ihrem Mobiltelefon zu sammeln (vollständiges Tutorial hier). Gehen Sie zu Geräte Seite und klicken Sie oben rechts auf die Schaltfläche "+ Neues Gerät verbinden". Wählen Sie „Ihr Mobiltelefon verwenden“. Dadurch wird ein eindeutiger QR-Code zum Öffnen einer Webanwendung in Ihrem Telefonbrowser erzeugt. Machen Sie ein Foto des QR-Codes und wählen Sie aus, um den Link zu öffnen.

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

Wir können jetzt Audiodatenproben direkt vom Telefon aus der Datenerfassung sammeln Seite von Edge Impulse. Geben Sie im Abschnitt „Neue Daten aufzeichnen“ entweder „Husten“ oder „Geräusch“ ein, stellen Sie sicher, dass „Mikrofon“ als Sensor ausgewählt ist, und klicken Sie auf „Probenahme starten“. Ihr Telefon sammelt jetzt ein Audiobeispiel und fügt es Ihrem Datensatz hinzu.

Das Sammeln von Audiodaten direkt vom Nano BLE Sense Board wird ebenfalls unterstützt. Befolgen Sie diese Anweisungen, um die Edge Impulse-Firmware und den Daemon zu installieren. Sobald das Gerät mit Edge Impulse verbunden ist, können Sie Datenproben wie oben mit Ihrem Mobiltelefon sammeln.

Impulse setzen

Als Nächstes werden wir Signalverarbeitungs- und Machine-Learning-Blöcke auswählen, die auf dem Create-Impuls basieren Seite. Der Impuls beginnt leer mit Rohdaten und Ausgabe-Feature-Blöcken. Belassen Sie die Standardeinstellungen einer Fenstergröße von 1000 ms und einer Fenstererhöhung von 500 ms. Das bedeutet, dass unsere Audiodaten jeweils 1 s lang verarbeitet werden, beginnend alle 0,5 s. Die Verwendung eines kleinen Fensters spart Speicherplatz auf dem eingebetteten Gerät, bedeutet jedoch, dass wir Husten-Beispieldaten ohne große Pausen zwischen den Husten benötigen.

Klicken Sie auf „Verarbeitungsblock hinzufügen“ und wählen Sie Audio (MFCC) Block. Klicken Sie anschließend auf „Lernblock hinzufügen“ und wählen Sie das Neural Network (Keras) Block. Klicken Sie auf „Impuls speichern“. Der Audioblock extrahiert ein Spektrogramm für jedes Audiofenster, und der neuronale Netzwerkblock wird trainiert, um das Spektrogramm basierend auf unserem Trainingsdatensatz entweder als „Husten“ oder „Rauschen“ zu klassifizieren. Ihr resultierender Impuls sieht so aus:

Als Nächstes generieren wir Features aus dem Trainings-Dataset auf dem MFCC Seite. Diese Seite zeigt, wie das extrahierte Spektrogramm für jedes 1-Sekunden-Fenster aus jedem der Datensatzproben aussieht. Wir können die Parameter auf ihren Standardwerten belassen.

Klicken Sie anschließend auf die Schaltfläche „Features generieren“, die dann den gesamten Trainingsdatensatz mit diesem Verarbeitungsblock verarbeitet. Dadurch entsteht der komplette Funktionsumfang, der im nächsten Schritt zum Trainieren unseres neuronalen Netzes verwendet wird. Drücken Sie die Schaltfläche "Funktionen generieren", um die Verarbeitung zu starten. Dies dauert einige Minuten.

Wir können jetzt mit der Einrichtung und dem Training unseres neuronalen Netzwerks auf dem NN-Klassifikator fortfahren Seite. Das standardmäßige neuronale Netzwerk funktioniert gut für kontinuierliche Geräusche wie fließendes Wasser. Die Hustenerkennung ist komplizierter, daher konfigurieren wir ein reichhaltigeres Netzwerk mit 2D-Faltung über das Spektrogramm jedes Fensters. Die 2D-Faltung verarbeitet das Audiospektrogramm ähnlich wie bei der Bildklassifizierung. Drücken Sie die obere rechte Ecke des Abschnitts „Neural Network settings“ und wählen Sie „Switch to Keras (Expert) mode“.

Ersetzen Sie die Definition „Neural Network Architecture“ durch den folgenden Code und setzen Sie die Einstellung „Minimum Confidence Rating“ auf „0.70“. Klicken Sie dann auf die Schaltfläche „Training starten“. Das Training dauert einige Sekunden.

tensorflow als tf importieren
von tensorflow.keras.models importieren sequenziell
von tensorflow.keras.layers importieren Dense, InputLayer, Dropout, Flatten, Reshape, BatchNormalization, Conv2D, MaxPooling2D, AveragePooling2D
von tensorflow.keras.optimizers importieren Adam
von tensorflow.keras.constraints importieren 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(Klassen, Aktivierung='softmax', name='y_pred', kernel_co nstraint=MaxNorm(3)))
# steuert die Lernrate
opt =Adam(lr=0.005, beta_1=0.9, beta_2=0.999)
# trainiert das neuronale Netz
model.compile(loss='categorical_crossentropy', Optimizer=opt, metrics=['accuracy'])
model.fit(X_train, Y_train, batch_size=32, epochs=9, Validierung_data=(X_test, Y_test) , ausführlich=2)

Die Seite zeigt die Trainingsleistung und die Leistung auf dem Gerät an, die je nach Ihrem Datensatz so aussehen sollte:

Unser Arduino Hustenerkennungsalgorithmus ist jetzt bereit zum Ausprobieren!

Training und Tests

Die Live-Klassifizierung Seite ermöglicht es uns, den Algorithmus sowohl mit den vorhandenen Testdaten, die mit dem Datensatz geliefert wurden, als auch durch das Streamen von Audiodaten von Ihrem Mobiltelefon oder Arduino-Gerät zu testen. Wir können mit einem einfachen Test beginnen, indem wir eines der Testmuster auswählen und auf „Probe laden“ klicken. Dadurch wird die Testprobe klassifiziert und die Ergebnisse angezeigt:

Wir können den Algorithmus auch mit Live-Daten testen. Beginnen Sie mit Ihrem Mobiltelefon, indem Sie die Browserseite auf Ihrem Telefon aktualisieren, die wir zuvor geöffnet haben. Wählen Sie dann Ihr Gerät im Abschnitt „Neue Daten klassifizieren“ aus und klicken Sie auf „Sampling starten“. Sie können Audiosamples von Ihrem Nano BLE Sense auf ähnliche Weise streamen, wenn Sie über den Edge-Impulse-Daemon mit dem Projekt verbunden sind, wie im Datenerfassungsschritt.

Bereitstellung

Wir können unseren Hustenerkennungsalgorithmus einfach auf das Mobiltelefon übertragen. Rufen Sie das Browserfenster Ihres Telefons auf und aktualisieren Sie es. Drücken Sie dann die Schaltfläche "In den Klassifizierungsmodus wechseln". Dadurch wird das Projekt automatisch in ein WebAssembly-Paket integriert und kontinuierlich auf Ihrem Telefon ausgeführt (danach keine Cloud erforderlich, sogar in den Flugzeugmodus wechseln!)

Als nächstes können wir den Algorithmus für den Nano BLE Sense bereitstellen, indem wir zur Bereitstellung gehen Seite. Wählen Sie „Arduino Nano 33 BLE Sense“ unter „Firmware erstellen“ und klicken Sie dann auf „Erstellen“.

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

Sobald das Arduino geflasht ist, können wir einen seriellen Port zum Gerät öffnen, während es mit 115, 200 Baud an USB angeschlossen ist. Sobald der serielle Port geöffnet ist, drücken Sie die Eingabetaste, um eine Eingabeaufforderung zu erhalten, und dann:

> AT+RUNIMPULSE
Inferencing-Einstellungen:
Intervall:0,06 ms.
Framegröße:16000
Sample-Länge:1000 ms.
Nr. der Klassen:2
Beginnen Sie mit der Inferenz, drücken Sie 'b', um zu unterbrechen
Aufnahme...
Aufnahme fertig
Vorhersagen (DSP:495 ms., Klassifizierung:84 ms., Anomalie :0 ms.):
Husten:0,01562
Geräusch:0,98438
Inferencing in 2 Sekunden starten...
Aufnahme...
Aufnahme fertig
Vorhersagen (DSP:495 ms., Klassifizierung:84 ms., Anomalie:0 ms.):
Husten:0,01562
Geräusch:0,98438
Inferencing in 2 Sekunden beginnen...
Aufnahme...
Aufnahme fertig
Vorhersagen (DSP:495 ms., Klassifizierung:84 ms., Anomalie:0 ms.):
Husten:0.86719
Rauschen:0.13281
Inferencing in 2 Sekunden starten...
Aufnahme...
Aufnahme fertig
Vorhersagen (DSP:495 ms., Klassifizierung:84 ms., Anomalie:0 ms.) :
Husten:0,01562
Geräusch:0,98438

Zukünftige Arbeit

Der Himmel ist die Grenze mit TinyML, Sensoren und Edge Impulse auf Arduino, hier sind einige Ideen für die weitere Arbeit:

  • Erweitern Sie den Standarddatensatz mit Ihren eigenen Husten- und Hintergrundgeräuschen, denken Sie daran, regelmäßig neu zu trainieren und zu testen. Sie können Komponententests auf der Seite Testen einrichten, um sicherzustellen, dass das Modell auch bei der Erweiterung noch funktioniert.
  • Fügen Sie eine neue Klasse und Daten für menschliche Geräusche hinzu, die nicht husten, wie Hintergrundsprache, Gähnen usw.
  • Beginnen Sie mit einem neuen Datensatz und sammeln Sie Audiobeispiele, um etwas Neues zu entdecken. Hinweis:Sie können nur die Geräuschklassendaten aus diesem Datensatz hochladen, um loszulegen!
  • Aus dieser Anleitung wird die Bereitstellung in der Arduino-Bibliothek als Teil einer Arduino-Skizze durchgeführt, um die Hustenerkennung mithilfe der LED oder eines Displays anzuzeigen
  • Nutzen Sie andere Sensoren wie den 3-Achsen-Beschleunigungsmesser des Nano BLE Sense, indem Sie diesem Tutorial folgen.

Herstellungsprozess

  1. CO2-Überwachung mit K30-Sensor
  2. taubblinde Kommunikation mit 1Sheeld/Arduino
  3. Münzprüfer mit Arduino steuern
  4. Arduino mit Bluetooth zur Steuerung einer LED!
  5. Kapazitiver Fingerabdrucksensor mit einem Arduino oder ESP8266
  6. Mit Nextion Display spielen
  7. Nunchuk-gesteuerter Roboterarm (mit Arduino)
  8. Bestimmung der Pflanzengesundheit mit TinyML
  9. Waldbrandüberwachungs- und -erkennungssystem (mit SMS-Warnungen)
  10. Messung der Sonneneinstrahlung mit Arduino