Verwendung der Klangklassifizierung mit TensorFlow auf einer IoT-Plattform

Einführung

Es gibt viele verschiedene Projekte und Dienste für die Erkennung menschlicher Sprache, z. B. Pocketsphinx, Googles Sprach-API und viele andere. Solche Anwendungen und Dienste erkennen Sprache und wandeln sie mit ziemlich guter Genauigkeit in Text um. Keiner von ihnen kann jedoch unterschiedliche vom Mikrofon erfasste Geräusche feststellen. Was war aufgezeichnet: menschliche Sprache, Tierstimmen oder Musik?

Wir standen vor dieser Aufgabe und beschlossen, einige Beispielprojekte zu untersuchen und zu erstellen, mit denen verschiedene Sounds mithilfe von Algorithmen für maschinelles Lernen klassifiziert werden können.

In diesem Artikel wird beschrieben, welche Tools wir ausgewählt haben, vor welchen Herausforderungen wir standen, wie wir unser Modell für TensorFlow trainiert haben und wie wir unser Open Source-Projekt ausführen.

Wir können die Erkennungsergebnisse auch an DeviceHive (die IoT-Plattform) senden, um sie in Cloud-Diensten für Anwendungen von Drittanbietern zu verwenden.

Auswahl von Werkzeugen und eines Klassifizierungsmodells

Zunächst mussten wir auswählen, welche Software am besten für neuronale Netze geeignet ist. Die erste geeignete Lösung, die wir gefunden haben, war Python Audio Analysis.

Das Hauptproblem beim maschinellen Lernen besteht darin, einen guten Trainingsdatensatz zu finden. Es gibt viele Datensätze für die Spracherkennung und Musikklassifizierung, aber nicht viele für die zufällige Klangklassifizierung. Nach einigen Recherchen haben wir den urbanen Sound-Datensatz gefunden.

Nach einigen Tests waren wir mit folgenden Problemen konfrontiert:

  • pyAudioAnalysis ist nicht flexibel genug. Es sind nicht viele verschiedene Parameter erforderlich, und einige davon werden im Handumdrehen berechnet (z. B. die Anzahl der Trainingsexperimente basierend auf der Anzahl der Proben - und Sie können dies nicht ändern).
  • Der Datensatz hat nur 10 Klassen und alle sind "urban".

Die nächste Lösung, die wir gefunden haben, war Google AudioSet. Es basiert auf gekennzeichneten YouTube-Videosegmenten und kann in zwei Formaten heruntergeladen werden:

  1. CSV-Dateien, die für jedes Segment die YouTube-Video-ID, die Startzeit, die Endzeit und ein oder mehrere Labels beschreiben.
  2. Extrahierte Audio-Features, die als TensorFlow Record-Dateien gespeichert sind.

Diese Funktionen sind mit YouTube-8M-Modellen kompatibel. Diese Lösung verwendet auch das TensorFlow VGGish-Modell als Merkmalsextraktor. Es deckte viele unserer Anforderungen ab und war daher die beste Wahl für uns.

Das Modell trainieren

Die nächste Aufgabe bestand darin, herauszufinden, wie die YouTube-8M-Oberfläche funktioniert. Es wurde für die Arbeit mit Videos entwickelt, kann aber glücklicherweise auch mit Audio arbeiten. Diese Bibliothek ist ziemlich flexibel, verfügt jedoch über eine fest codierte Anzahl von Beispielklassen. Deshalb haben wir dies ein wenig geändert, um die Anzahl der Klassen als Parameter zu übergeben.

YouTube-8M kann mit zwei Datentypen arbeiten: aggregierten Features und Frame-Features. Google AudioSet kann Daten als Funktionen bereitstellen, wie bereits erwähnt. Durch ein wenig mehr Recherche haben wir herausgefunden, dass die Features im Frame-Format vorliegen. Wir mussten dann das zu trainierende Modell auswählen.

Ressourcen, Zeit und Genauigkeit

GPUs sind für maschinelles Lernen besser geeignet als CPUs. Weitere Informationen dazu finden Sie hier. Also überspringen wir diesen Punkt und gehen direkt zu unserem Setup. Für unsere Experimente verwendeten wir einen PC mit einem NVIDIA GTX 970 4GB.

In unserem Fall spielte die Trainingszeit keine Rolle. Wir sollten erwähnen, dass ein bis zwei Stunden Training ausreichten, um eine erste Entscheidung über das ausgewählte Modell und seine Genauigkeit zu treffen.

Natürlich wollten wir die bestmögliche Genauigkeit erzielen. Um ein komplexeres Modell zu trainieren (potenziell bessere Genauigkeit), benötigen Sie jedoch mehr RAM (Video-RAM im Falle einer GPU), um es einzubauen.

Modell auswählen

Eine vollständige Liste der YouTube-8M-Modelle mit Beschreibungen finden Sie hier. Da unsere Trainingsdaten im Frame-Format vorliegen, mussten Modelle auf Frame-Ebene verwendet werden. Google AudioSet hat uns einen Datensatz zur Verfügung gestellt, der in drei Teile unterteilt ist: Gegentakt, Ungegentakt und Auswertung. Sie können mehr Informationen über sie hier erhalten.

Eine modifizierte Version von YouTube-8M wurde für das Training und die Evaluierung verwendet. Es ist hier erhältlich.

Ausgeglichener Zug

Der Trainingsbefehl sieht folgendermaßen aus:

python train.py –train_data_pattern = / path_to_data / audioset_v1_embeddings / bal_train / * = ModelName

Für LstmModel haben wir die Basislernrate auf 0,001 geändert, wie in der Dokumentation vorgeschlagen. Außerdem haben wir den Standardwert von lstm_cells in 256 geändert, weil wir nicht genug RAM für mehr hatten.

Sehen wir uns die Trainingsergebnisse an:

ModellnameTrainingszeitTraining letzter Schritt TrefferAuswertung Durchschnitt TrefferLogistik14M 3S0.58590.5560Dbof31M 46S1.0000.5220LstM1H 45M 53S0.98830.4581

Wie Sie sehen, haben wir während des Trainings gute Ergebnisse erzielt. Dies bedeutet jedoch nicht, dass wir bei der vollständigen Evaluierung gute Ergebnisse erzielen würden.

Unausgeglichener Zug

Dann haben wir den unsymmetrischen Zugdatensatz ausprobiert. Da es viel mehr Samples gibt, haben wir die Anzahl der Trainingsepochen auf 10 geändert (sollte mindestens auf 5 geändert werden, da das Training viel Zeit in Anspruch nahm).

ModellnameTrainingszeitTraining letzter Schritt hitEvaluation Durchschnitt hitLogistic2h 4m 14s0.87500.5125Dbof4h 39m 29s0.88480.5605Lstm9h 42m 52s0.86910.5396

Zugprotokolle

Wenn Sie unsere Trainingsprotokolle einsehen möchten, können Sie train_logs.tar.gz herunterladen und extrahieren. Führen Sie dann tensorboard –logdir / path_to_train_logs / aus und rufen Sie http://127.0.0.1:6006 auf

Weitere Informationen zum Training

YouTube-8M verwendet viele Parameter, von denen viele den Trainingsprozess beeinflussen.

Zum Beispiel: Sie können die Lernrate und die Anzahl der Epochen einstellen, die den Trainingsprozess stark verändern. Es gibt auch drei verschiedene Funktionen für die Verlustberechnung und viele andere nützliche Variablen, die Sie abstimmen und ändern können, um die Ergebnisse zu verbessern.

Verwenden des trainierten Modells mit Audioaufnahmegeräten

Nachdem wir einige geschulte Modelle hatten, war es an der Zeit, Code für die Interaktion mit ihnen hinzuzufügen.

Capture Mic

Wir mussten irgendwie Audiodaten von einem Mikrofon aufnehmen. Wir haben PyAudio verwendet. Es bietet eine einfache Benutzeroberfläche und kann auf den meisten Plattformen verwendet werden.

Tonvorbereitung

Wie bereits erwähnt, haben wir das TensorFlow VGGish-Modell als Merkmalsextraktor verwendet. Hier ist eine kurze Erklärung des Transformationsprozesses:

Zur Visualisierung wurde das Beispiel „Hunderinde“ aus dem UrbanSound-Datensatz verwendet.

Setzen Sie das Audiosignal erneut auf 16 kHz Mono.

Berechnen Sie das Spektrogramm mit Größen der Kurzzeit-Fourier-Transformation mit einer Fenstergröße von 25 ms, einem Fenstersprung von 10 ms und einem periodischen Hann-Fenster.

Berechnen Sie das Mel-Spektrogramm, indem Sie es auf 64 Mel-Bins abbilden.

Berechnen Sie ein stabilisiertes logarithmisches Mel-Spektrogramm, indem Sie log (mel-spectrum + 0.01) anwenden, wobei ein Offset verwendet wird, um zu vermeiden, dass ein Logarithmus von Null verwendet wird.

Diese Merkmale wurden dann in nicht überlappende Beispiele von 0,96 Sekunden gerahmt, wobei jedes Beispiel 64 Mel-Bänder und 96 Rahmen von jeweils 10 ms abdeckt.

Diese Beispiele wurden dann in das VGGish-Modell eingespeist, um Einbettungen zu extrahieren.

Klassifizierung

Und schließlich brauchten wir eine Schnittstelle, um die Daten in das neuronale Netz einzuspeisen und die Ergebnisse zu erhalten.

Wir haben die YouTube-8M-Benutzeroberfläche als Beispiel verwendet, sie jedoch geändert, um den Serialisierungs- / Deserialisierungsschritt zu entfernen.

Hier sehen Sie die Ergebnisse unserer Arbeit. Lass uns genauer hinschauen.

Installation

PyAudio verwendet libportaudio2 und portaudio19-dev. Sie müssen diese also installieren, damit es funktioniert.

Einige Python-Bibliotheken sind erforderlich. Sie können sie mit pip installieren.

pip install -r requirements.txt

Sie müssen auch das Archiv herunterladen und mit den gespeicherten Modellen in das Projektstammverzeichnis extrahieren. Sie finden es hier.

Laufen

In unserem Projekt stehen drei Schnittstellen zur Verfügung.

1. Verarbeiten Sie die voraufgezeichnete Audiodatei

Führen Sie einfach python parse_file.py path_to_your_file.wav aus und Sie sehen im Terminal so etwas wie Speech: 0.75, Music: 0.12, Inside, Large Room oder Hall: 0.03

Das Ergebnis hängt von der Eingabedatei ab. Diese Werte sind die Vorhersagen, die das neuronale Netzwerk getroffen hat. Ein höherer Wert bedeutet eine höhere Wahrscheinlichkeit, dass die Eingabedatei zu dieser Klasse gehört.

2. Erfassen und verarbeiten Sie Daten vom Mikrofon

python capture.py startet den Prozess, mit dem Daten von Ihrem Mikrofon unendlich erfasst werden. Alle 5 bis 7 Sekunden werden Daten an die Klassifizierungsschnittstelle gesendet (Standardeinstellung). Sie können die Ergebnisse im vorherigen Beispiel sehen.

Sie können es mit –save_path = / path_to_samples_dir / ausführen. In diesem Fall werden alle erfassten Daten im angegebenen Verzeichnis in WAV-Dateien gespeichert. Diese Funktion ist nützlich, wenn Sie verschiedene Modelle mit denselben Beispielen ausprobieren möchten. Verwenden Sie den Parameter –help, um weitere Informationen abzurufen.

3. Webinterface

python daemon.py implementiert eine einfache Weboberfläche, die standardmäßig unter http://127.0.0.1:8000 verfügbar ist. Wir haben den gleichen Code wie im vorherigen Beispiel verwendet. Auf der Seite Ereignisse (http://127.0.0.1:8000/events) werden die letzten zehn Vorhersagen angezeigt.

Integration von IoT-Diensten

Zu guter Letzt erfolgt die Integration in die IoT-Infrastruktur. Wenn Sie die im vorherigen Abschnitt erwähnte Webschnittstelle ausführen, finden Sie den Status und die Konfiguration des DeviceHive-Clients auf der Indexseite. Solange der Client verbunden ist, werden Vorhersagen als Benachrichtigungen an das angegebene Gerät gesendet.

Fazit

Wie Sie sehen, ist TensorFlow ein sehr flexibles Werkzeug und kann in vielen maschinellen Lernanwendungen wie der Bild- und Tonerkennung hilfreich sein. Wenn Sie eine solche Lösung zusammen mit einer IoT-Plattform verwenden, können Sie eine intelligente Lösung für einen sehr großen Bereich erstellen.

Intelligente Städte könnten dies zu Sicherheitszwecken nutzen und ständig auf Glasscherben, Schüsse und andere Geräusche im Zusammenhang mit Straftaten achten. Selbst in Regenwäldern könnte eine solche Lösung verwendet werden, um wilde Tiere oder Vögel durch Analyse ihrer Stimmen zu verfolgen.

Die IoT-Plattform kann all diese Benachrichtigungen liefern. Diese Lösung kann auf lokalen Geräten installiert werden (obwohl sie immer noch als Cloud-Dienst bereitgestellt werden kann), um den Datenverkehr und die Cloud-Kosten zu minimieren. Es kann auch so angepasst werden, dass nur Benachrichtigungen gesendet werden, anstatt das RAW-Audio einzuschließen. Vergessen Sie nicht, dass dies ein Open-Source-Projekt ist, also können Sie es gerne nutzen.

Geschrieben von Nikolay Khabarov, Mitbegründer von DeviceHive.