[PYTHON] 2nd Neural Network Console Challenge Verwirklichen Sie eine ähnliche Songsuche

1. Zuallererst

** Neural Network Console Challenge ** (NNC Challenge) ist ein von SONY entwickeltes AI-Entwicklungstool ** Neural Network Console **. Dies ist der zweite ** AI Development Contest **, der Deep Learning anhand der bereitgestellten Daten herausfordert.

Das Sponsoring-Unternehmen ist diesmal ** Audiostock **, das Videoproduktion, Events, Hintergrundmusik für das Geschäft mit Soundeffekten und Soundeffekte verkauft. Die bereitgestellten Daten sind ** mehr als 10.000 BGM-Daten ** und wurden vom 2020.09.16 bis 2020.10.19 gespeichert.

Und dieses Mal habe ich aus zwei Themen ausgewählt: ** A) Erstellen eines automatischen Klassifizierungsalgorithmus für die BGM-Suche von Audiostock und B) Analysieren von Audiodaten mit kostenlosen Ideen (kostenloses Thema) **. Auch teilgenommen, so werde ich den Inhalt der Herausforderung beschreiben.

*** Lerndaten bereitgestellt von: Audiostock **

2. Was macht Audiostock?

Audiostock registriert Werke wie ** BGM und Soundeffekte ** von ** Music Creator ** und verkauft sie online als ** urheberrechtsfreie Musik **. ** Käufer ** ist eine Person, die sich mit ** Videoproduktion, Veranstaltungen, Soundeffekten ** usw. beschäftigt. Wenn der Verkauf erfolgreich ist, bietet Audiostock einen Service an, der vom Käufer eine ** Zahlung ** erhält und dem Musikschöpfer, der das Werk erstellt hat, eine ** Belohnung ** zahlt.   スクリーンショット 2020-10-16 12.31.03.png

Käufer können problemlos die Musik kaufen, die sie benötigen **, ohne sich um das Urheberrecht ** kümmern zu müssen, und Musikschaffende haben die Möglichkeit, ihre Werke effizient zu verkaufen. Es ist **.

Derzeit gibt es 16.000 Musikschaffende, die Verträge haben, und 600.000 Tonquellen werden verkauft, was jeden Monat um 10.000 zunimmt.

Werfen wir einen Blick auf die aktuelle Online-Verkaufswebseite. Wie Sie Ihren Lieblingssong finden, ist ** "Länge", "Verwendung", "Songgenre", "Bild", "Hauptinstrument", "Tempo", "Dateiformat" ** Geben Sie das ** Tag ** an, um die zu suchenden Songs einzugrenzen. Es gibt andere Methoden, aber die wichtigste scheint diese Methode zu sein.

スクリーンショット 2020-10-17 17.51.35.png

Klicken Sie auf eine Kategorie, um eine Liste mit ** Tags ** anzuzeigen (es gibt 21 Tags von "Pops" bis "Classic" für Song-Genres). Überprüfen Sie also die Tags, die Ihnen gefallen, und ** wenden Sie ** an ** Drücken Sie die Taste, um einzugrenzen.

Nachdem Sie nach Tag eingegrenzt haben, hören Sie sich jedes Lied an und wählen es aus. Das Anhören eines Songs ist gut gelungen. Sie können den Song problemlos nacheinander anhören, indem Sie die Aufwärts- und Abwärtspfeiltasten drücken, und Sie können den Song von jeder Position aus mit der Maus abspielen.

3. Diesmal zur Verfügung gestellte Daten

Die folgenden drei Daten wurden diesmal von Audiostock zur Verfügung gestellt. スクリーンショット 2020-10-17 8.35.33.png

** 02_rawdata ** sind die Daten in voller Größe von BGM und es gibt 10.802 Teile (Abtastrate 44,1 kHz). Es macht Spaß, die Klangqualität gut zu hören, aber die Länge des Songs variiert und die Gesamtkapazität überschreitet 200 GB, was die Handhabung schwierig macht.

** 01_processed data ** ist eine kompakte Version von 02_rawdata, und es gibt auch 10.802. Durch Trimmen der Länge des Songs in 24 Sekunden ab dem Beginn des Songs und Herabtasten der Samplerate auf 8 kHz wird die Gesamtkapazität auf etwa 3 GB unterdrückt. Die Klangqualität ist nicht sehr gut, aber dies ist eine gute Wahl für tiefes Lernen.

** BGM-Datenliste ** ist eine Sammlung von einzeiligen Kommentaren und Tags von BGM und sieht folgendermaßen aus. スクリーンショット 2020-10-16 16.23.43.png

Im Gegensatz zu Bildern dauert das Kommentieren von Musik von Grund auf erheblich, sodass die ** BGM-Datenliste ** äußerst wertvolle Daten sind. Schauen wir uns also den Tagging-Status der Hauptkategorien an. Erstens ist das ** "use" -Tag **. スクリーンショット 2020-10-17 10.50.37.png Der erste Platz ist ** Jingle **, gefolgt von ** CM, Events, Spielen, Filmen **. Der 1. Platz Jingle ist ein kurzes Musikstück, das am Wendepunkt des Programms eingefügt wird. Wenn Sie also nach einem Jingle suchen, können Sie ihn anscheinend effektiv eingrenzen. Davon abgesehen scheint die Eingrenzung jedoch nicht eindeutig zu sein. Zum Beispiel gibt es verschiedene Arten von Filmen, so dass es ein wenig zweifelhaft ist, ob Sie die gesuchten Songs mit diesem Tag effizient eingrenzen können. Die Anzahl der verwendeten Tags ist nicht so hoch wie ich dachte, es war 6.730 (Nutzungsrate 62% ohne doppelte Verwendung).

Als nächstes kommt das ** "Musikgenre" -Tag **. 楽曲ジャンルパレート.png Der erste Platz ist ** Rock **, gefolgt von ** Ballad, Techno, Pops, World **. World in 5th Place ist ein allgemeiner Begriff für Volksmusik in jeder Region der Welt. Da es nur auf das Genre des Songs beschränkt ist, abgesehen von der Einschränkung des speziellen Genres, denke ich, dass es nur ein Untertyp ist. Die Anzahl der verwendeten Tags ist mit 5.185 gering (48% Nutzungsrate ohne doppelte Verwendung).

Und dann ist da noch das ** "Bild" -Tag **. イメージパレート.png Der erste Platz ist ** leicht **, gefolgt von ** lustig, hell, sanft und aufregend **. Es ist einfach, das Bild des gesuchten Songs in Ihre eigenen Worte zu fassen. Es kann also effektiv sein, wenn Sie sich darauf einlassen. Das Bild ist jedoch subjektiv und ich denke, es hängt von jeder Person ab, zum Beispiel, ob sie es für ** lustig ** oder ** hell ** hält.

Schließlich gibt es noch das ** "Main Instrument" -Tag **. メイン楽器パレート.png Der erste Platz ist ** Synthesizer **, gefolgt von ** Klavier, E-Gitarre, Streichern, Percussion **. Ich denke, die Tags in dieser Kategorie sind objektiv, weil sie deutlich das Instrument anzeigen, das Sie verwenden. Die Gesamtzahl der verwendeten Tags beträgt 3.429 (32% Nutzungsrate ohne doppelte Nutzung). Dies ist die niedrigste.

Um die Tags zusammenzufassen, denke ich, dass ** "use" -Tags und "music" -Tags nur einen geringen Einschränkungseffekt haben und "image" -Tags viele subjektive Variationen aufweisen **. ** Ich denke, "Hauptinstrument" ist ein objektives Tag **.

Und obwohl es beim Eingrenzen nicht auf der Liste steht, wenn es nicht das richtige Tag hat, ** ist die allgemeine Tag-Nutzungsrate niedrig **. Selbst wenn keine doppelte Verwendung vorliegt, beträgt die Verwendungsrate 62% für das Tag "Verwendung", 48% für das Tag "Musikgenre" und 32% für das Tag "Hauptinstrument".

4. Themenauswahl

Als Käufer habe ich mich als Mitglied von Audiostock registriert (die Registrierung für die Mitgliedschaft ist kostenlos) und mich entschieden, tatsächlich einen Song auszuwählen. Die Idee ist, diese Hintergrundmusik zu wählen, wenn Sie ein Werbevideo für Ihr Unternehmen erstellen.   Das "use" -Tag ist ** "VP", "Corporate VP" , das "Musikgenre" -Tag ist ** "Pops" ** und das "Image" -Tag ist ** "Sprint", "Modisch", "Licht" Wenn Sie die Songs eingrenzen, indem Sie die Tags "" und "Hauptinstrument" mit "Synthesizer" ** markieren, werden insgesamt 730 Songs aufgelistet.

スクリーンショット 2020-10-16 15.14.11.png

Ich höre von hier aus nacheinander Songs, aber es ist nicht realistisch, alle 730 Songs zu hören. Das liegt daran, dass die Auswahl eines Songs zwei Stunden dauert, auch wenn es durchschnittlich nur 10 Sekunden dauert. Das Anhören eines Songs dauert viel länger als das Auswählen eines Bildes.

In diesem Sinne wäre es schön, wenn Sie nach ähnlichen Songs suchen könnten, wenn Sie nach Tags eingrenzen und jedes Lied einzeln anhören und auf ein Lied stoßen, das ungefähr zu Ihrem Bild passt. Ich dachte.

Wenn man bedenkt, dass ** die allgemeine Tag-Nutzungsrate niedrig ist **, was aus der Analyse der BGM-Datenliste zuvor hervorgeht, kann es auch Songs geben, die Ihnen gefallen, selbst unter den Songs, die durch Eingrenzen der Tags übersehen wurden. Es gibt Sex. In diesem Fall halte ich es für eine effektive Methode, eine ** ähnliche Liedsuche ** nach Liedern durchzuführen, die ungefähr zu Ihrem Bild aus den Liedern passen, die nicht auf der Liste stehen.

Aus diesem Grund habe ich beschlossen, das Thema dieser Zeit auf ** "Suche nach ähnlichen Songs" ** zu setzen.

5. Machen Sie eine grobe Skizze

Nachdem das Thema festgelegt wurde, erstellen wir eine grobe Skizze, um eine ähnliche Liedsuche zu realisieren.

** 1) Konvertieren Sie Wellenformdaten in ein Bild ** BGM-Wellenformdaten können wie beim Deep Learning verarbeitet werden. Die Verarbeitung von Zeitreihendaten wie Wellenformen dauert jedoch in der Regel sehr lange. Daher werden wir die Eigenschaften der Wellenformdaten in Bilddaten konvertieren und verarbeiten. Daher werden wir die BGM-Wellenformdaten in ** Mel-Frequenzspektrogramm ** konvertieren. スクリーンショット 2020-10-15 17.41.42.png Hier ist ein Beispiel für das Mel-Frequenzspektrogramm. Die vertikale Achse ist die Frequenz (Hz), die horizontale Achse ist die verstrichene Zeit (Sek.) Und die Farbe ist der Schalldruckpegel (db). ** Mel-Frequenz ** ist eine Frequenz, die an die menschlichen Hörmerkmale angepasst wird. Mit anderen Worten, es ist ein Bild, das die Zeitreihenänderungen im Ton zeigt.

** 2) Erstellen Sie einen BGM-Klassifikator ** Geben Sie die klassifizierten Hintergrundmusikbilder ein und trainieren Sie die Gewichte mit CNN. Zuerst gibt es eine zufällige Klasse aus, aber es lernt das Gewicht des Netzwerks, das durch Fehlerrückübertragung allmählich die richtige Klasse ausgibt. スクリーンショット 2020-10-18 11.54.27.png

Das Ergebnis ist ein ** BGM-Klassifikator **, der BGM richtig klassifizieren kann.

** 3) Holen Sie sich den Merkmalsvektor von BGM ** Wenn Sie das BGM-Bild in den BGM-Klassifizierer eingeben, wird die Klasse ausgegeben, aber die Informationsmenge ist gering, da die Klasse das Endergebnis ist, nachdem verschiedene Verarbeitungen durchgeführt wurden. Die vollständig verbundene Ebene (Affine) davor ist überwiegend reich an Informationen, daher werde ich hier den ** Merkmalsvektor ** extrahieren. スクリーンショット 2020-10-18 11.54.51.png Wenn Sie auf diese Weise die Bilder aller Hintergrundmusik eingeben, können Sie die Merkmalsvektoren aller Hintergrundmusik abrufen.

** 4) Suche nach ähnlichen Songs aus dem Feature-Vektor ** Wie viel die beiden Vektoren in die gleiche Richtung zeigen, kann berechnet werden, indem ** cos Ähnlichkeit ** unter Verwendung der folgenden Formel berechnet wird. Die cos-Ähnlichkeit wird durch -1 bis +1 dargestellt und beträgt +1, wenn sie in genau dieselbe Richtung zeigt. スクリーンショット 2020-10-16 11.07.59.png Wenn Sie also die gesamte COS-Ähnlichkeit zwischen dem Merkmalsvektor des Songs, nach dem Sie suchen möchten, und den Merkmalsvektoren anderer Songs berechnen und die Ergebnisse sortieren, können Sie nach Songs in absteigender Reihenfolge der Ähnlichkeit suchen.

Nachdem Sie nun eine grobe Skizze haben, gehen wir konkret vor.

6. Konvertieren Sie Wellenformdaten in ein Bild

Konvertieren Sie BGM-Wellenformdaten mit dem Paket ** lbrosa **, das für die Musik- und Klanganalyse in Python verwendet wird, in ein Mel-Frequenzspektrogramm.

import sys
import numpy as np
import librosa
import matplotlib.pyplot as plt
import scipy.io.wavfile
import librosa.display
import os

def save_png(filename,soundpath,savepath):

    #Audiodatei lesen
    wav_filename = soundpath+filename
    rate, data = scipy.io.wavfile.read(wav_filename)

    #16-Bit-Audiodateidaten-Normalisieren Sie von 1 auf 1
    data = data / 32768
    #Rahmenlänge
    fft_size = 1024                 
    #Rahmenverschiebungslänge
    hop_length = int(fft_size / 4)  

    #Kurze Fourier-Transformationsausführung
    amplitude = np.abs(librosa.core.stft(data, n_fft=fft_size, hop_length=hop_length))

    #Wandle die Amplitude in Dezibel um
    log_power = librosa.core.amplitude_to_db(amplitude)

    #Grafikanzeige
    plt.figure(figsize=(4, 4)) 
    librosa.display.specshow(log_power, sr=rate, hop_length=hop_length)
    plt.savefig(savepath+filename + '.png',dpi=200)    

soundpath = './input/'
savepath = './output/'
cnt = 0

for filename in os.listdir(soundpath):
    cnt += 1
    print(cnt,'Verarbeitete die Angelegenheit', filename)
    save_png(filename,soundpath,savepath)
    plt.close() 

スクリーンショット 2020-10-16 15.57.15.png

Wenn ich den Code ausführe, erhalte ich ein PNG-Bild mit 800 x 800 Pixel. Da es einen Rand gibt, beschneiden Sie ihn von der Mitte aus bei 600 x 600 und ändern Sie die Größe auf 224 x 224.

7. Erstellen Sie einen BGM-Klassifikator

Was das Erstellen eines Datensatzes angeht, ist es zu schwierig, BGM von Grund auf neu zu klassifizieren. Daher möchte ich die Verwendung der Tags in der BGM-Datenliste verwalten. Wenn Sie sich auf Tags verlassen, sind "use" und "music genre" nicht eindeutig und "image" ist subjektiv. Ich dachte, das Ziel sei das "Hauptinstrument", und entschied mich, es anhand des Tags "Hauptinstrument" zu klassifizieren.

スクリーンショット 2020-10-17 12.49.21.png

Konzentrieren Sie sich auf häufig verwendete Tags, schließen Sie diejenigen aus, die nicht der Hauptklang wie "Percussion" sind, und diejenigen, die verschiedene Klänge wie "Ethno" haben, und nur Songs mit einem roten Rahmen Extrakt. Als Ergebnis haben wir 716 Synthesizer-Songs, 596 Piano-Songs, 419 E-Gitarren-Songs, 282 Streicher-Songs, 215 Akustik-Gitarren-Songs, 177 Blechbläser-Sektionen und 127 Synth-Lead-Songs aufgenommen. Danach hörte ich mir die Songs an, die ich aufgenommen und klassifiziert hatte. ..

Selbst wenn es beispielsweise ein Synthesizer-Tag hat, wird es nur zum Backen verwendet und die Hauptverwendung ist Saxophon, oder es wird sicherlich verwendet, aber nur für kurze Zeit. Ich ging (es gibt ziemlich viele davon). Am Ende haben wir insgesamt 300 Songs mit jeweils 75 Songs ausgewählt, die in 4 Typen unterteilt sind: ** "Akustikgitarre", "E-Gitarre", "Klavier" und "Synthesizer" **, einschließlich der Konsolidierung von Tags.

Dann werden die Wellenformdaten von 300 Liedern durch das zuvor erläuterte Verfahren in ein Bild umgewandelt. Erstellen Sie dann einen Datensatz in NNC.

データセット(補足).PNG

300 Daten wurden durch Lernen geteilt: Auswertung = 7: 3 und 210 Trainingsdaten und 90 Testdaten wurden erstellt.

In Bezug auf die Gestaltung des neuronalen Netzes gab mir das Sekretariat als Privileg der Wettbewerbsteilnehmer das Recht, die Cloud-Version von NNC für 10.000 Yen zu verwenden, sodass ich sie ohne zu zögern ausprobieren konnte. ** Mit der GPU kann das Lernen ungefähr 20 Mal schneller als mit der CPU durchgeführt werden, daher war ich sehr dankbar, dass ich verschiedene Dinge fast ohne Stress ausprobieren konnte **.

Infolge verschiedener Versuche ergab das Modell mit relativ kleinen Kostenparametern bessere Ergebnisse, wahrscheinlich weil die Trainingsdaten nur 210 waren.

モデル.PNG Der Kostenparameter dieses Modells beträgt 1.128.700. Dies ist eine Stufe, die praktisch auf einer CPU funktioniert.

Es ist eine Lernkurve. 学習曲線.PNG Das Lernen wurde unter Verwendung der NNC Windows-Version (CPU) unter Berücksichtigung der anschließenden Verarbeitung durchgeführt, und 100 Epochen wurden in 48 Minuten abgeschlossen. Der beste Validierungsfehler (VALIDATION ERROR) beträgt 0,530326 nach 60 Epochen.

Verwirrungsmatrix und Genauigkeit. 混同行列PNG.PNG ** Genauigkeit ** (Genauigkeit) beträgt ** 84,44% **, und es gibt keine großen Unterschiede beim Rückruf für jedes Etikett, und es handelt sich um eine angemessene Klassifizierungsgenauigkeit.

8. Holen Sie sich den BGM-Merkmalsvektor

Nachdem wir nun einen BGM-Klassifikator haben, werden wir ihn verwenden, um die Merkmalsvektoren aller BGM zu finden. Zuerst habe ich mich gefragt, ob ich etwas ziemlich Kompliziertes tun muss, aber die Neural Network Console (Windows-Version) ist gut gemacht, [** "Analyse der Zwischenausgabe eines gelernten neuronalen Netzwerks". **](https://support.dl.sony.com/docs-ja/ Tutorial: Learned Neural Network /).

Konvertieren Sie zunächst alle BGM-Wellenformen in Bilder, um Testdaten zu erstellen (korrekte Antwortdaten können beliebig sein), und ersetzen Sie sie durch die Testdaten aus dem vorherigen Lernprozess.

Erstellen Sie als Nächstes ein Netzwerk für die Zwischenergebnisausgabe.

ベクトル検出モデル.PNG

Es handelt sich im Grunde genommen um eine Kopie des Lernnetzwerks, aber ** eine zweite Zweigverbindung von Affine zu Identify wird hinzugefügt **, damit der Merkmalsvektor abgerufen werden kann.

Dieses Netzwerk ist ** zusätzlich ** auf der Registerkarte ** BEARBEITEN ** mit dem Namen ActivationMonitor ** registriert **, und die ** Executor ** -Spezifikation von ** CONFIG ** wurde ebenfalls in diesen ActivationMonitor ** Global Config ** geändert. Setze ** Max Epoch ** auf ** 0 **.

Wenn Sie das trainierte neuronale Netzwerk mit ** Open in EDIT Tab with Weight ** laden und mit dem Training beginnen, ist Max Epoch 0, sodass das Training abgeschlossen ist, ohne etwas zu tun. Wenn Sie mit der Auswertung beginnen, wird der Merkmalsvektor jedes in den Testdaten registrierten Bildes als CSV-Datei (output_result.csv) ausgegeben. Es ist erstaunlich, so eine kleine Kurve machen zu können!

Dies ist das Bild der CSV-Datei. Da Affine 100-dimensional ist, ist der Merkmalsvektor auch 100-dimensional. スクリーンショット 2020-10-15 21.52.47.png

9. Suchen Sie im Feature-Vektor nach ähnlichen Songs

Nachdem wir nun eine CSV-Datei haben, die die Merkmalsvektoren jeder Hintergrundmusik zusammenfasst, werden wir Python verwenden, um nach Songs mit den fünf wichtigsten Ähnlichkeiten zu suchen.

import csv
import numpy as np

#Grundeinstellung
N = 500  #Index zur Berechnung der Ähnlichkeit(audiostock_Geben Sie 43054 an)

#cos Ähnlichkeitsberechnungsfunktion
def cos_sim(v1, v2):
    return np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2))

#Laden Sie den Feature-Vektor in das Array
with open('./output_result.csv', 'r') as f:
     reader = csv.reader(f)

     h = next(reader)  #Header überspringen
     for i, line in enumerate(reader):
        if i == 0:
            array = np.array(line[1:], dtype=float)
            index = [line[0]]
        else:
            array = np.vstack([array,np.array(line[1:], dtype=float)])
            index.append(line[0])
     print('Lesen des Merkmalsvektors abgeschlossen', array.shape)
     print('Indexlesung abgeschlossen', len(index))

#cos Ähnlichkeitsberechnung
for i in range(len(array)):
    x = cos_sim(array[N], array[i])     
    if i == 0:
        score = x
    else:
        score = np.hstack([score,x])
print('cos Ähnlichkeitsberechnung abgeschlossen', score.shape)

#TOP5 Indexsuche
for j in range(1,6):
    b = np.where(score==np.sort(score)[-j])
    n = int(b[0])
    print('TOP'+str(j), index[n][:16], 'score = '+str(score[n]))

スクリーンショット 2020-10-18 21.38.53.png Wenn Sie den Code ausführen, werden die Songtitel in absteigender Reihenfolge der Ähnlichkeit angeordnet. Das TOP1 audiostock_43054 ist das zu durchsuchende Lied (daher ist die cos-Ähnlichkeit das Maximum 1). Mit Blick auf TOP2 und darüber hinaus ist "audiostock_52175" mit der höchsten Ähnlichkeit die Ähnlichkeit von 0,9530.

Lassen Sie uns nun nach ähnlichen Songs für verschiedene Songs suchen. スクリーンショット 2020-10-19 9.59.08.png

Ich nahm vier Songs auf, fragte, ob es Songs ähnlich wie TOP1 in TOP2 bis TOP5 gibt, überprüfte und markierte die Songs, die zutreffend zu sein schienen, in Gelb.

Als Ergebnis wurde festgestellt, dass 11 der 16 Songs als ähnliche Songs beurteilt werden konnten und dass ähnliche Songs mit einer durchschnittlichen Genauigkeit von etwa 70% gesucht werden konnten. Wir haben auch festgestellt, dass 9 von 11 ähnlichen Songs nicht im Datensatz enthalten sind und ** die Suche nach ähnlichen Songs effektiv funktioniert **.

Insbesondere dachte ich, dass die TOP5 von leichten Akustikgitarren und die TOP3 von mit einem Stern markierten Steinen genau die ähnlichen Songs sind, die ich anstrebte.

10. Zusammenfassung

Bei dieser Herausforderung stellte ich fest, dass die Suche nach ähnlichen Songs mit dem BGM-Klassenklassifikator durchaus brauchbar ist. Wenn Sie diese Methode zusätzlich zur aktuellen Liedsuchmethode hinzufügen, können Sie Ihr Lieblingslied aus einer großen Menge von Hintergrundmusik effizient finden.

Außerdem habe ich zum ersten Mal erfahren, dass die Neural Network Console eine Funktion hat, die das Umdrehen erleichtert und "die Zwischenausgabe eines gelernten neuronalen Netzwerks analysiert". Die Neuronale Netzwerkkonsole wird empfohlen, da es sich um ein benutzerfreundliches KI-Tool handelt, das den juckenden Bereich erreichen kann.

Recommended Posts

2nd Neural Network Console Challenge Verwirklichen Sie eine ähnliche Songsuche
Liste der Gewinner der Neural Network Console Challenge