2nd Neural Network Console Challenge Réaliser une recherche de chanson similaire

1.Tout d'abord

** Neural Network Console Challenge ** (NNC Challenge) est un outil de développement d'IA ** Neural Network Console ** développé par SONY. Il s'agit du deuxième ** concours de développement IA ** à défier l'apprentissage en profondeur en utilisant les données fournies.

La société sponsor cette fois est ** Audiostock **, qui vend des productions vidéo, des événements, des BGM pour les effets sonores et des effets sonores. Les données fournies sont ** plus de 10000 données BGM ** et ont été conservées du 2020.09.16 au 2020.10.19.

Et cette fois, j'ai choisi deux thèmes: ** A) Créer un algorithme de classification automatique pour la recherche BGM d'Audiostock, et B) Analyser les données audio avec des idées gratuites (thème gratuit) **. J'ai également participé, je vais donc décrire le contenu du défi.

*** Données d'apprentissage fournies par: Audiostock **

2. Que fait Audiostock?

Audiostock enregistrera des œuvres telles que ** BGM et effets sonores ** de ** Music Creator ** et les vendra en ligne en tant que ** musique libre de droits **. ** L'acheteur ** est une personne engagée dans ** la production vidéo, les événements, les effets sonores **, etc. Lorsque la vente est réussie, Audiostock propose un service qui reçoit ** paiement ** de l'acheteur et verse ** récompense ** au créateur musical qui a créé l'œuvre.   スクリーンショット 2020-10-16 12.31.03.png

Les acheteurs peuvent facilement acheter la musique dont ils ont besoin ** sans se soucier des lois sur les droits d'auteur **, et les créateurs de musique ont la possibilité de vendre leur travail efficacement. Il est **.

Actuellement, 16 000 créateurs de musique ont des contrats et 600 000 sources sonores sont vendues, ce qui augmente de 10 000 chaque mois.

Jetons un coup d'œil à la page Web de vente en ligne réelle. Comment trouver votre chanson préférée est ** «longueur», «utilisation», «genre de musique», «image», «instrument principal», «tempo», «format de fichier» ** Spécifiez le ** tag ** pour affiner les chansons que vous souhaitez rechercher. Il existe d'autres méthodes, mais la principale semble être cette méthode.

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

Cliquez sur une catégorie pour afficher une liste de ** tags ** (il y a 21 tags de "pop" à "classique" pour les genres de chansons), alors vérifiez les tags que vous aimez et ** appliquez ** Appuyez sur le bouton pour affiner.

Après avoir affiné par tag, vous écouterez chaque chanson et la sélectionnerez. Le processus d'écoute d'une chanson est bien fait, vous pouvez écouter la chanson l'une après l'autre en douceur simplement en appuyant sur les touches fléchées haut et bas, et vous pouvez jouer la chanson à partir de n'importe quelle position avec la souris.

3. Données fournies cette fois

Les trois données suivantes ont été fournies par Audiostock cette fois. スクリーンショット 2020-10-17 8.35.33.png

** 02_rawdata ** correspond aux données de taille réelle de la musique de fond, et il y a 10 802 pièces (fréquence d'échantillonnage de 44,1 KHz). C'est amusant de bien écouter la qualité sonore, mais la longueur de la chanson varie et la capacité totale dépasse 200 Go, ce qui la rend difficile à gérer telle quelle.

** 01_processed data ** est une version compacte de 02_rawdata, et il y en a également 10 802. En réduisant la longueur de la chanson en 24 secondes à partir du début de la chanson et en sous-échantillonnant la fréquence d'échantillonnage à 8 kHz, la capacité globale est réduite à environ 3 Go. La qualité sonore n'est pas très bonne, mais c'est un bon choix pour l'apprentissage en profondeur.

** Liste de données BGM ** est une collection de commentaires d'une ligne et de balises de BGM, et ressemble à ceci. スクリーンショット 2020-10-16 16.23.43.png

Contrairement aux images, il faut un temps considérable pour annoter la musique à partir de zéro, de sorte que la ** liste de données BGM ** est des données extrêmement précieuses. Jetons donc un œil à l'état de marquage des principales catégories. Le premier est la balise ** "use" **. スクリーンショット 2020-10-17 10.50.37.png La première place est ** Jingle **, suivi de ** CM, événements, jeux, films **. Le Jingle de la 1ère place est un petit morceau de musique qui s'insère au tournant du programme, donc si vous recherchez un Jingle, il semble que vous puissiez effectivement affiner. Cependant, à part cela, il semble que la réduction sera ambiguë. Par exemple, il existe différents types de films, il est donc un peu douteux que vous puissiez affiner efficacement les chansons que vous recherchez avec cette balise. Le nombre de tags utilisés n'est pas aussi élevé que je pensais qu'il était de 6 730 (taux d'utilisation de 62% sans utilisation en double).

Vient ensuite le ** tag "Music Genre" **. 楽曲ジャンルパレート.png La première place est ** Rock **, suivi de ** Ballad, Techno, Pops, World **. Monde à la 5ème place est un terme général pour la musique folklorique dans chaque région du monde. Puisqu'il ne restreint que le genre de la chanson, en plus de restreindre le genre spécial, je pense que c'est juste un sous-type. Le nombre de balises utilisées est faible à 5 185 (taux d'utilisation de 48% sans utilisation en double).

Et puis il y a la balise ** "image" **. イメージパレート.png La première place est ** légère **, suivie de ** amusante, lumineuse, douce et excitante **. Il est facile de mettre l'image de la chanson que vous recherchez dans vos propres mots, donc cela peut être efficace si vous devenez accro. Cependant, l'image est subjective, et je pense que cela dépend de chaque personne, par exemple, si elle pense que c'est ** amusant ** ou ** brillant **.

Enfin, il y a la balise ** "Main Instrument" **. メイン楽器パレート.png La première place est ** Synthétiseur **, suivi de ** Piano, Guitare électrique, Cordes, Percussions **. Je pense que les balises de cette catégorie sont objectives car elles indiquent clairement l'instrument que vous utilisez. Le nombre total de balises utilisées est de 3 429 (taux d'utilisation de 32% sans utilisation en double), ce qui est le plus bas.

Pour résumer les balises, je pense que ** les balises "use" et les balises "musique" ont peu d'effet de rétrécissement, et les balises "image" ont beaucoup de variations subjectives **. ** Je pense que "l'instrument principal" est une balise objective **.

Et, même s'il sera hors de la liste lors de la réduction s'il n'a pas la bonne balise, ** le taux d'utilisation global des balises est faible **. Même s'il n'y a pas d'utilisation dupliquée, le taux d'utilisation est de 62% pour la balise "Utilisation", de 48% pour la balise "Genre de musique" et de 32% pour la balise "Instrument principal".

4. Sélection du thème

En tant qu'acheteur, je me suis inscrit en tant que membre d'Audiostock (l'inscription est gratuite) et j'ai décidé de sélectionner une chanson. L'hypothèse est que vous choisirez le BGM pour créer une vidéo promotionnelle pour votre entreprise.   La balise "use" est ** VP, corporate VP **, la balise "music genre" est ** pops ** et la balise" image "est sprinting, fashionable,light Si vous affinez les morceaux en marquant les balises et" main instrument "avec ** synthesizer **, un total de 730 morceaux sera répertorié.

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

J'écoute les chansons une par une d'ici, mais ce n'est pas réaliste d'écouter les 730 chansons. En effet, il faut deux heures pour sélectionner une chanson, même si cela ne prend que 10 secondes en moyenne. L'écoute d'une chanson prend beaucoup plus de temps que le choix d'une image.

Dans cet esprit, si vous affinez par tag et écoutez chaque chanson une par une et tombez sur une chanson qui correspond à peu près à votre image, ce serait bien de pouvoir ** rechercher des chansons similaires ** parmi les chansons restreintes. J'ai pensé.

De plus, étant donné que ** le taux d'utilisation global des balises est faible **, ce qui a été trouvé à partir de l'analyse de la liste de données BGM précédemment, il se peut qu'il y ait des chansons que vous aimez même parmi les chansons qui ont été manquées en réduisant les balises. Il y a du sexe. Dans ce cas, je pense que c'est une méthode efficace pour effectuer une ** recherche de chanson similaire ** de chansons qui sont ** hors de la liste et qui correspondent à peu près à votre image.

Par conséquent, j'ai décidé de définir le thème de cette fois sur ** "Rechercher des chansons similaires" **.

5.Faites un croquis approximatif

Maintenant que le thème a été décidé, nous allons créer un croquis pour réaliser une recherche de chanson similaire.

** 1) Convertir les données de forme d'onde en image ** Les données de forme d'onde BGM peuvent être traitées telles quelles pour l'apprentissage en profondeur, mais les données de séries chronologiques telles que les formes d'onde ont tendance à prendre beaucoup de temps à traiter, nous allons donc convertir les caractéristiques des données de forme d'onde en données d'image et les traiter. Par conséquent, nous convertirons les données de forme d'onde BGM en ** spectrogramme de fréquence Mel **. スクリーンショット 2020-10-15 17.41.42.png Voici un exemple du spectrogramme de fréquence Mel. L'axe vertical est la fréquence (Hz), l'axe horizontal est le temps écoulé (sec) et la couleur est le niveau de pression acoustique (db). ** La fréquence Mel ** est une fréquence ajustée en fonction des caractéristiques de l'audition humaine. En d'autres termes, c'est une image qui montre les changements de séries temporelles dans le son.

** 2) Créez un classificateur BGM ** Entrez les images BGM classifiées et entraînez les poids avec CNN. Au début, il sort une classe aléatoire, mais il apprend le poids du réseau qui sort progressivement la classe correcte par propagation de retour d'erreur. スクリーンショット 2020-10-18 11.54.27.png

Le résultat est un ** classificateur BGM ** qui peut correctement classer BGM.

** 3) Obtenez le vecteur de fonctionnalités de BGM ** Lorsque vous entrez l'image BGM dans le classificateur BGM, la classe est sortie, mais la quantité d'informations est faible car la classe est le résultat final après avoir effectué divers traitements. Plutôt que cela, la couche entièrement connectée (Affine) avant cela est extrêmement riche en informations, je vais donc extraire le ** vecteur de caractéristiques ** d'ici. スクリーンショット 2020-10-18 11.54.51.png En faisant cela, si vous entrez les images de tous les BGM, vous pouvez obtenir les vecteurs de caractéristiques de tous les BGM.

** 4) Recherchez des chansons similaires à partir du vecteur de fonctionnalités ** Dans quelle mesure les deux vecteurs pointent dans la même direction peut être calculé en calculant ** cos similarité ** en utilisant la formule ci-dessous. La similitude de cos est représentée par -1 à +1 et est de +1 lorsque vous faites face exactement dans la même direction. スクリーンショット 2020-10-16 11.07.59.png Par conséquent, si vous calculez toute la similitude COS entre le vecteur de caractéristiques de la chanson que vous souhaitez rechercher pour des chansons similaires et les vecteurs de caractéristiques d'autres chansons et triez les résultats, vous pouvez rechercher des chansons par ordre décroissant de similitude.

Maintenant que vous avez une esquisse, procédons concrètement avec elle.

6. Convertir les données de forme d'onde en image

Convertissez les données de forme d'onde BGM en spectrogramme de fréquence Mel à l'aide du package ** lbrosa ** utilisé pour l'analyse musicale et sonore en Python.

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):

    #Lire le fichier audio
    wav_filename = soundpath+filename
    rate, data = scipy.io.wavfile.read(wav_filename)

    #Données de fichier audio 16 bits-Normaliser de 1 à 1
    data = data / 32768
    #Longueur du cadre
    fft_size = 1024                 
    #Longueur de décalage d'image
    hop_length = int(fft_size / 4)  

    #Exécution de la transformée de Fourier à court terme
    amplitude = np.abs(librosa.core.stft(data, n_fft=fft_size, hop_length=hop_length))

    #Convertir l'amplitude en décibels
    log_power = librosa.core.amplitude_to_db(amplitude)

    #affichage graphique
    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,'A traité l'affaire', filename)
    save_png(filename,soundpath,savepath)
    plt.close() 

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

Lorsque j'exécute le code, j'obtiens une image png de 800x800 pixels. Puisqu'il y a une marge autour, rognez-le à partir du centre à 600 x 600 et redimensionnez-le à 224 x 224.

7. Créez un classificateur BGM

Quant à la façon de créer un ensemble de données, il est trop difficile de classer BGM à partir de zéro, donc je veux réussir à utiliser les balises dans la liste de données BGM. Lorsqu'on se fie aux balises, «utiliser» et «genre de musique» sont ambigus et «image» est subjective. Je pensais que l'objectif était "l'instrument principal", j'ai donc décidé de le classer en fonction du tag "instrument principal".

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

Concentrez-vous sur les balises qui sont fréquemment utilisées, excluez celles qui ne sont pas le son principal comme "percussion" et celles qui ont différents sons comme "ethnique", et uniquement les chansons avec une balise à cadre rouge Extrait. En conséquence, nous avons sélectionné 716 morceaux de synthétiseur, 596 morceaux de piano, 419 morceaux de guitare électrique, 282 morceaux de cordes, 215 morceaux de guitare acoustique, 177 sections de cuivres et 127 morceaux de synthé principal. Après cela, j'ai écouté les chansons que j'ai ramassées et je les ai classées. ..

Par exemple, même s'il a une balise de synthétiseur, il n'est utilisé que pour l'accompagnement et l'utilisation principale est le sax, ou il est certainement utilisé mais seulement pour une courte période. J'y suis allé (il y en a pas mal). Au final, nous avons sélectionné un total de 300 morceaux, 75 morceaux chacun, répartis en 4 types: ** "Acoustic Guitar", "Electric Guitar", "Piano" et "Synthesizer" **, y compris la consolidation des tags.

Ensuite, les données de forme d'onde de 300 chansons sont converties en une image par la méthode expliquée précédemment. Créez ensuite un ensemble de données dans NNC.

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

300 données ont été divisées par formation: évaluation = 7: 3, et 210 données de formation et 90 données de test ont été créées.

Concernant la conception du réseau de neurones, comme un privilège des participants au concours, le secrétariat m'a donné le droit d'utiliser la version cloud de NNC pour 10000 yens, j'ai donc pu l'essayer sans aucune hésitation. ** Le GPU peut apprendre environ 20 fois plus vite que le CPU, donc j'étais très reconnaissant de pouvoir essayer diverses choses sans presque aucun stress **.

À la suite de divers essais, le modèle avec des paramètres de coût relativement petits a donné de meilleurs résultats, probablement parce que les données de formation étaient aussi petites que 210.

モデル.PNG Le paramètre de coût de ce modèle est de 1 128 700, ce qui est un niveau qui fonctionne pratiquement sur un processeur.

C'est une courbe d'apprentissage. 学習曲線.PNG L'apprentissage a été effectué en utilisant la version Windows NNC (CPU), compte tenu du traitement ultérieur, et 100 epoch ont été achevés en 48 minutes. La meilleure erreur de validation (ERREUR DE VALIDATION) est 0,530326 à 60 époques.

Matrice de confusion et précision. 混同行列PNG.PNG ** La précision ** (Précision) est de ** 84,44% **, et il n'y a pas de grande variation dans le rappel pour chaque étiquette, ce qui est une précision de classification raisonnable.

8. Obtenez le vecteur de fonctionnalités BGM

Maintenant que nous avons un classificateur BGM, nous allons l'utiliser pour trouver les vecteurs de caractéristiques de tous les BGM. Au début je me demandais si je devais faire quelque chose d'assez compliqué, mais la Neural Network Console (version Windows) est bien faite, [** "Analyser la sortie intermédiaire d'un réseau de neurones appris". **](https://support.dl.sony.com/docs-ja/ Tutorial: Learned Neural Network /).

Tout d'abord, convertissez toutes les formes d'onde BGM en images pour créer des données de test (les données de réponse correctes peuvent être n'importe quoi) et remplacez-les par les données de test de l'apprentissage précédent.

Ensuite, créez un réseau pour la sortie de résultat intermédiaire.

ベクトル検出モデル.PNG

Il s'agit essentiellement d'une copie du réseau d'apprentissage, mais ** une deuxième connexion de branche d'Affine à Identify est ajoutée ** afin que le vecteur de caractéristiques puisse être récupéré.

Ce réseau est ** en outre enregistré ** dans l'onglet ** EDIT ** avec le nom ActivationMonitor, et la spécification ** Executor ** de ** CONFIG ** est également remplacée par ce ActivationMonitor, ** Global Config ** Réglez ** Max Epoch ** sur ** 0 **.

Lorsque vous chargez le réseau neuronal entraîné avec ** Ouvrir dans l'onglet EDIT avec poids ** et que vous commencez l'entraînement, Max Epoch est égal à 0, donc l'entraînement est terminé sans rien faire. Ensuite, lorsque l'évaluation est lancée, le vecteur de caractéristiques de chaque image enregistrée dans les données de test sera généré sous forme de fichier CSV (output_result.csv). C'est incroyable de pouvoir faire un petit tour comme ça!

Ceci est l'image du fichier CSV. Comme Affine est à 100 dimensions, le vecteur de caractéristiques est également à 100 dimensions. スクリーンショット 2020-10-15 21.52.47.png

9. Recherchez des chansons similaires à partir du vecteur de fonctionnalités

Maintenant que nous avons un fichier CSV qui résume les vecteurs de fonctionnalités de chaque BGM, nous utiliserons Python pour rechercher des chansons avec les 5 principales similitudes.

import csv
import numpy as np

#Réglage initial
N = 500  #Index pour calculer la similarité(audiostock_Spécifiez 43054)

#fonction de calcul de similarité cos
def cos_sim(v1, v2):
    return np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2))

#Charger le vecteur d'entités dans le tableau
with open('./output_result.csv', 'r') as f:
     reader = csv.reader(f)

     h = next(reader)  #Ignorer l'en-tête
     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('Lecture du vecteur de caractéristiques terminée', array.shape)
     print('lecture de l'index terminée', len(index))

#calcul de similarité cos
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('calcul de similarité cos terminé', score.shape)

#Recherche d'index TOP5
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 Lorsque vous exécutez le code, les titres des morceaux sont classés par ordre décroissant de similitude. TOP1 ʻaudiostock_43054 est la chanson à rechercher (la similitude cos est donc au maximum 1). En regardant TOP2 et au-delà, celui avec la plus grande similitude est ʻaudiostock_52175, qui a une similitude de 0,9530.

Maintenant, recherchons des chansons similaires pour différentes chansons. スクリーンショット 2020-10-19 9.59.08.png

J'ai choisi quatre chansons, demandé s'il y avait des chansons similaires à TOP1 dans TOP2 à TOP5, vérifié et marqué les chansons qui semblaient applicables en jaune.

En conséquence, il a été constaté que 11 des 16 chansons pouvaient être jugées comme des chansons similaires, et que des chansons similaires pouvaient être recherchées avec ** une précision moyenne d'environ 70% **. Nous avons également constaté que 9 chansons similaires sur 11 ne figurent pas dans l'ensemble de données et que ** la recherche de chansons similaires fonctionne efficacement **.

En particulier, je pensais que le TOP5 des guitares acoustiques légères et le TOP3 des roches marquées d'une étoile sont exactement les chansons similaires que je visais.

10. Résumé

Dans ce défi, j'ai trouvé que ** rechercher des chansons similaires à l'aide du classificateur de classe BGM est tout à fait utilisable **. En ajoutant cette méthode en plus de la méthode de recherche de chanson actuelle, vous pouvez trouver efficacement votre chanson préférée à partir d'une énorme quantité de musique de fond.

J'ai également appris pour la première fois que la console de réseau neuronal a une fonction qui facilite la rotation, «l'analyse de la sortie intermédiaire d'un réseau neuronal appris». Neural Network Console est recommandé car il s'agit d'un outil d'intelligence artificielle facile à utiliser qui peut atteindre la zone qui démange.

Recommended Posts

2nd Neural Network Console Challenge Réaliser une recherche de chanson similaire
Liste des travaux gagnants du défi de la console de réseau neuronal