Wir suchen nach einer Panne im Auto durch das GerÀusch: Wir fordern ein wenig maschinelles Lernen, um Anomalien im Motor zu finden

In der Schule hatte ich einen Klassenkameraden, der hören konnte, wie das Auto auf dem Hof ​​funktioniert, und mit ernstem Gesicht ein Urteil fĂ€llen konnte: Alles ist in Ordnung oder etwas ist kaputt, und ich muss dringend nach neuen Teilen / Öl / Werkzeugen suchen! Ich, wie eine absolute Teekanne im AutomobilgeschĂ€ft, hörte immer das ĂŒbliche Rasseln des nĂ€chsten Dvenashka, bemerkte keine Unterschiede und staunte nur schweigend ĂŒber sein Gehör und seine FĂ€higkeiten.



Jetzt habe ich die Innenseiten des Autos nicht besser verstanden, aber ich habe angefangen, mit der Verarbeitung von Tonsignalen und maschinellem Lernen zu arbeiten. Hier werden wir versuchen zu verstehen, ob es möglich ist, einem Computer beizubringen, Anomalien im GerÀusch eines Motors zu erkennen.


Zumindest ist es nur interessant zu ĂŒberprĂŒfen, und in Zukunft könnte eine solche Technologie den Autobesitzern viel Geld sparen. Zumindest meiner Meinung nach treten kritische Fehler allmĂ€hlich unter der Haube auf, und in den frĂŒhen Stadien sind viele von ihnen schnell und kostengĂŒnstig zu hören, was Zeit, Geld und bereits wackelige Nerven spart.


Nun, vielleicht ist es Zeit, von Worten zu Taten ĂŒberzugehen. Lass uns gehen!


Ich möchte gleich sagen, dass ich in allem, was Mathematik und Algorithmen betrifft, mehr Wert auf Bedeutung und VerstĂ€ndnis legen werde. Hier wird es keine Formeln und mathematischen Berechnungen geben. Ich habe hier keine neuen Algorithmen entwickelt. Wenn Sie möchten, ist es fĂŒr Formeln besser, Google und Wikipedia zu verwenden und die Links zu verwenden, die ich im gesamten Artikel hinterlassen werde.


Ich werde alle ErklÀrungen am Beispiel des GerÀusches eines defekten Motors aus diesem Video auf YouTube geben .


Die von YouTube heruntergeladene Datei (Sie können sie mit Browsererweiterungen oder einfach durch Ändern des YouTube-Links zu ssyoutube herunterladen) konvertieren wir mit ffmpeg in das WAV-Format:


ffmpeg -i input_video.mp4 -c:a pcm_s16le -ar 16000 -ac 1 engine_sound.wav 

Bevor ich mit der Verarbeitung dieser Datei beginne, möchte ich einige Worte darĂŒber sagen, was ein Spektrogramm ist und wie es uns bei der Lösung dieses Problems helfen wird. Sicherlich haben viele von Ihnen ein Ă€hnliches Bild gesehen - dies ist die amplitudenzeitliche Darstellung von Ton oder ein Oszillogramm.



Wenn in einfachen Worten, dann ist Schall eine Welle, und die Amplitudenwerte dieser Welle werden zu bestimmten Zeiten auf dem Oszillogramm beobachtet.


Um aus einer solchen Darstellung ein Spektrogramm zu erhalten, benötigen wir die Fourier-Transformation. Mit seiner Hilfe können Sie die Amplituden-Frequenz-Darstellung des Klangs oder des Amplitudenspektrums erhalten. Ein solches Spektrum zeigt, bei welcher Frequenz und mit welcher Amplitude das untersuchte Signal ausgedrĂŒckt wird.


TatsÀchlich ist ein Spektrogramm ein Satz von Spektren kurzer aufeinanderfolgender Teile eines Signals. Vielleicht reicht eine solche "Definition" aus, um nicht stark von der Aufgabe abgelenkt zu werden. Alles wird klarer, wenn Sie sich die Visualisierung des Spektrogramms ansehen (das Bild wurde mit WaveAssistant aufgenommen ). Die Zeit ist auf der X-Achse aufgetragen, die Frequenz auf der Y-Achse, dh jede Spalte in dieser Matrix ist der Spektrummodul zu einem bestimmten Zeitpunkt.


Anfangsfragment des Signalspektrogramms


Dieses Spektrogramm zeigt, dass das GerĂ€usch des Motors ohne Klopfen ungefĂ€hr gleich aussieht und bei Frequenzen in der NĂ€he von 600, 1200, 2400 und 4800 Hz ausgedrĂŒckt wird. Das GerĂ€usch eines Klopfens, das den Besitzer stört, ist im Frequenzbereich von 600 bis 1200 Hz von 5 bis 8 Sekunden sehr deutlich. Da die Aufnahme unter ziemlich lauten Bedingungen auf der Straße gemacht wurde, sind diese GerĂ€usche auch im Spektrogramm vorhanden, was unsere Aufgabe etwas erschwert.


Wenn wir uns ein solches Spektrogramm ansehen, können wir dennoch sicher sagen, wo das Klopfen war und wo nicht. Der Computer hat keine Augen, daher mĂŒssen wir einen Algorithmus auswĂ€hlen, der in der Lage ist, zwischen einer solchen Abweichung (und vorzugsweise nicht nur dieser) zu unterscheiden, sofern in der Aufzeichnung Rauschen vorhanden ist.


Spektrogramme können mit der librosa-Bibliothek wie folgt berechnet werden:


 from librosa.util import buf_to_float from librosa.core import stft #     import numpy as np from scipy.io import wavfile #    wav- def cut_wav(path_to_wav, start_time, end_time): sr, wav_data = wavfile.read(path_to_wav) return wav_data[int(sr * start_time): int(sr * end_time)] def get_stft(wav_data): feat = np.abs(stft(buf_to_float(wav_data), n_fft=fft_size, hop_length=fft_step)) #  -       return feat.T wav_path = './engine_sound.wav' train_features = [] #    , time_list -    for [ts, te] in time_list: wav_part = cut_wav(wav_path, ts, te) spec = get_stft(wav_part) train_features.append(spec) X_train = np.vstack(train_features) #     full_wav_data = wavfile.read(wav_path)[1] X_test = get_stft(full_wav_data) 

Lösung


Genau genommen mĂŒssen wir das Problem der binĂ€ren Klassifizierung lösen, bei dem wir feststellen mĂŒssen, ob der Motor defekt ist oder normal funktioniert. Mein Kollege und ich haben bereits in unserem vorherigen Artikel Ă€hnliche Aufgaben beschrieben , bei denen wir ein Faltungs-Neuronales Netzwerk zur Klassifizierung akustischer Ereignisse verwendet haben. Eine solche Lösung ist hier kaum möglich: Neuronen lieben es sehr, wenn sie große Datenmengen erhalten. Wir haben es mit einer einzelnen EinrĂŒckung zu tun, die etwas lĂ€nger als eine Minute dauert und offensichtlich nicht als großer Datensatz bezeichnet werden kann.


Die Auswahl wurde beim Gaußschen Mischungsmodell (Modell der Gaußschen Mischungen) gestoppt. Ein guter Artikel, der das Funktionsprinzip und das Training dieses Modells beschreibt, ist hier zu finden . Die allgemeine Idee dieses Modells besteht darin, die Daten unter Verwendung einer komplexen Verteilung in Form einer linearen Kombination mehrerer mehrdimensionaler Normalverteilungen zu beschreiben (mehr ĂŒber die mehrdimensionale Normalverteilung hier ).


Da der Motor wĂ€hrend seines Betriebs ungefĂ€hr "gleich" klingt, kann das GerĂ€usch seines Betriebs als stationĂ€r angesehen werden, und die Idee, dieses GerĂ€usch unter Verwendung einer solchen Verteilung zu beschreiben, scheint ziemlich sinnvoll. Um die Essenz von GMM zu verstehen, empfehle ich dringend, sich ein Beispiel fĂŒr das Training anzusehen und hier die Anzahl der Gaussoiden zu wĂ€hlen.


Unser Fall unterscheidet sich von den obigen Beispielen darin, dass anstelle von Punkten auf einer zweidimensionalen Ebene die aus dem Signalspektrogramm entnommenen Spektrumswerte verwendet werden. Sie können Verteilungsparameter wie den Typ der Kovarianzmatrix mithilfe des BIC-Kriteriums ( Beispiel , Beschreibung ) auswÀhlen. In meinem Fall zeigten sich jedoch die optimalen Parameter aus Sicht dieses Kriteriums schlechter als die im folgenden Code gezeigten:


 from sklearn.mixture import GaussianMixture n_components = 3 gmm_clf = GaussianMixture(n_components) gmm_clf.fit(X_train) 

Unter der Annahme, dass das GerÀusch des normalen Betriebs durch eine Verteilung beschrieben wird, deren Parameter wÀhrend des Trainingsprozesses ausgewÀhlt wurden, ist es möglich zu messen, wie nahe ein GerÀusch an dieser Verteilung liegt.


Dazu können Sie die durchschnittliche Wahrscheinlichkeit der Spalten des Spektrogramms des untersuchten Signals berechnen und dann einen Schwellenwert auswĂ€hlen, der die Wahrscheinlichkeit von GerĂ€uschen guter Arbeit von allen anderen trennt. Die GlaubwĂŒrdigkeit fĂŒr jede Sekunde ist wie folgt:


 n_seconds = len(full_wav_data) // sr gmm_scores = [] #     for i in range(n_seconds - 1): test_sec = X_test[(i * sr) // fft_step: ((i + 1) * sr) // fft_step, :] sc = gmm_clf.score(test_sec) gmm_scores.append(sc) 

Wenn Sie die erhaltene Wahrscheinlichkeit in der Tabelle anzeigen, erhalten wir das folgende Bild.
Der obere Teil zeigt das Spektrogramm des Signals, das mit der Matplotlib-Bibliothek angezeigt wird. Durch Klopfen verursachte Änderungen sind nicht so stark erkennbar wie im obigen Beispiel (weshalb Sie hier 2 Bilder gesehen haben). Wenn Sie genau hinschauen, sind sie dennoch sichtbar. Vertikale Linien markieren die Start- und Endzeiten des Klopfens.



Schlussfolgerungen


Wie Sie der Grafik entnehmen können, ist die Wahrscheinlichkeit zum Zeitpunkt des Klopfens tatsÀchlich unter den Schwellenwert gefallen, was bedeutet, dass wir diese beiden Klassen (Arbeiten mit und ohne Klopfen) trennen können. Aber ich muss sagen, dass dieser Wert nahe genug an der Schwelle und in Bereichen liegt, in denen das Klopfen nicht zu hören ist. Dies liegt daran, dass in der Aufzeichnung hÀufig FremdgerÀusche auftreten, die sich auch auf die Wahrscheinlichkeit auswirken.


Wir fĂŒgen hier Training in nur wenigen Sekunden Sound und schlechten Aufnahmebedingungen hinzu, und Sie können bereits ĂŒberrascht sein, dass das Experiment irgendwie erfolgreich war!


Um diese Methode in die Praxis umzusetzen und sich ihrer ZuverlĂ€ssigkeit sicher zu sein, mĂŒssen Sie höchstwahrscheinlich viel mehr Ton aufnehmen und das Mikrofon gut platzieren, um das Rauschen beim Eintritt in die Aufnahmen zu minimieren.


Dieser Artikel ist nur ein Versuch, ein Àhnliches Problem zu lösen, ohne absolute Korrektheit zu beanspruchen. Wenn Sie Ideen und VorschlÀge oder Fragen haben, lassen Sie uns diese gemeinsam in den Kommentaren oder persönlich diskutieren.


Der vollstÀndige Github-Code ist hier

Source: https://habr.com/ru/post/de460467/


All Articles