Développement d'un ensemble de données acoustiques pour la formation d'un réseau neuronal



Une fois, dans une interview, un musicien russe bien connu a dĂ©clarĂ©: "Nous travaillons Ă  mentir et Ă  cracher au plafond." Je ne peux pas ĂȘtre en dĂ©saccord avec cette affirmation, car le fait que la paresse est le moteur du dĂ©veloppement de la technologie ne peut ĂȘtre contestĂ©. En effet, ce n'est qu'au siĂšcle dernier que nous sommes passĂ©s des machines Ă  vapeur Ă  l'industrialisation numĂ©rique, et maintenant l'intelligence artificielle, qui a Ă©tĂ© Ă©crite par des Ă©crivains de science-fiction et des futurologues du siĂšcle dernier, devient chaque jour une rĂ©alitĂ© sans cesse croissante de notre monde. Jeux informatiques, appareils mobiles, montres intelligentes et bien plus encore utiliser essentiellement des algorithmes associĂ©s Ă  des mĂ©canismes d'apprentissage automatique.



De nos jours, en raison de la croissance des capacitĂ©s de calcul des processeurs graphiques et de la grande quantitĂ© de donnĂ©es qui sont apparues, les rĂ©seaux de neurones ont gagnĂ© en popularitĂ©, Ă  l'aide desquels ils rĂ©solvent les problĂšmes de classification et de rĂ©gression, en les formant sur les donnĂ©es prĂ©parĂ©es. De nombreux articles ont dĂ©jĂ  Ă©tĂ© Ă©crits sur la façon de former les rĂ©seaux de neurones et les cadres Ă  utiliser pour cela. Mais il y a une tĂąche antĂ©rieure qui doit Ă©galement ĂȘtre rĂ©solue, et c'est la tĂąche de former un tableau de donnĂ©es - un ensemble de donnĂ©es, pour la formation continue du rĂ©seau neuronal. Cela sera discutĂ© dans cet article.



Il n'y a pas si longtemps, il Ă©tait nĂ©cessaire de construire un classificateur de bruit acoustique de voiture capable d'extraire des donnĂ©es d'un flux audio commun: vitre cassĂ©e, ouverture des portes et fonctionnement d'un moteur de voiture dans diffĂ©rents modes. Le dĂ©veloppement du classificateur n'a pas Ă©tĂ© difficile, mais oĂč obtenir l'ensemble de donnĂ©es pour qu'il rĂ©ponde Ă  toutes les exigences?

Google est venu à la rescousse (sans offenser Yandex - je parlerai de ses avantages un peu plus tard), avec l'aide duquel il a été possible de distinguer plusieurs clusters principaux contenant les données nécessaires. Je tiens à noter à l'avance que les sources indiquées dans cet article incluent une grande quantité d'informations acoustiques, avec différentes classes, ce qui vous permet de créer un ensemble de données pour différentes tùches. Nous passons maintenant à un aperçu de ces sources.

Freesound.org



TrĂšs probablement, Freesound.org fournit le plus grand volume de donnĂ©es acoustiques, Ă©tant un rĂ©fĂ©rentiel conjoint d'Ă©chantillons de musique sous licence, qui compte actuellement plus de 230 000 copies d'effets sonores. Chaque Ă©chantillon sonore peut ĂȘtre distribuĂ© sous une licence diffĂ©rente, il est donc prĂ©fĂ©rable de vous familiariser avec l' accord de licence Ă  l' avance. Par exemple, la licence zĂ©ro (cc0) a le statut «Aucun droit d'auteur» et vous permet de copier, modifier et distribuer, y compris Ă  des fins commerciales, et vous permet d'utiliser les donnĂ©es de maniĂšre absolument lĂ©gale.

Pour la commodité de trouver des éléments d'informations acoustiques dans une variété de freesound.org, les développeurs ont fourni une API conçue pour analyser, rechercher et télécharger des données à partir de référentiels. Pour travailler avec, vous devez avoir accÚs, pour cela, vous devez aller dans le formulaire et remplir tous les champs nécessaires, aprÚs quoi la clé individuelle sera générée.



Les dĂ©veloppeurs de Freesound.org fournissent des API pour diffĂ©rents langages de programmation, permettant ainsi de rĂ©soudre le mĂȘme problĂšme avec diffĂ©rents outils. La liste des langues prises en charge et les liens pour y accĂ©der sur GitHub sont rĂ©pertoriĂ©s ci-dessous.



Pour atteindre l'objectif, python a Ă©tĂ© utilisĂ©, car ce beau langage de programmation de frappe dynamique a gagnĂ© en popularitĂ© en raison de sa facilitĂ© d'utilisation, effaçant complĂštement le mythe de la complexitĂ© du dĂ©veloppement logiciel. Le module pour travailler avec freesound.org pour python peut ĂȘtre clonĂ© Ă  partir du rĂ©fĂ©rentiel github.com.

Vous trouverez ci-dessous le code en deux parties qui démontre la facilité d'utilisation de cette API. La premiÚre partie du code du programme effectue la tùche d'analyse des données, dont le résultat est la densité de distribution des données pour chaque classe demandée, et la seconde partie télécharge les données des référentiels freesound.org pour les classes sélectionnées. La densité de distribution lors de la recherche d'informations acoustiques avec les mots-clés verre, moteur, porte est présentée ci-dessous dans un graphique circulaire à titre d'exemple.



Exemple de code d'analyse de données Freesound.org

import plotly import plotly.graph_objs as go import freesound import os import termcolor #      def histogram(data, filename = "tmp_histogram.html"): data = [ go.Histogram( histfunc="count", x=data, name="count",textfont=dict(size=15) ), ] plotly.offline.plot({ "data": data, "layout": go.Layout(title="Histogram") }, auto_open=True, filename=filename) pass #      freesound.org def freesound_analysis(search_tokens, output, lim_page_count = 1, key = None): lim_page_count = int(lim_page_count) try: client = freesound.FreesoundClient() client.set_token(key,"token") print(termcolor.colored("Authorisation successful ", "green")) except: print(termcolor.colored("Authorisation failed ", "red")) classes = list() for token in search_tokens: try: results = client.text_search(query=token,fields="id,name,previews") output_catalog = os.path.normpath(output) if not os.path.exists(output_catalog): os.makedirs(output_catalog) page_count = int(0) while True: for sound in results: try: classes.append(token) info = "Data has been getter: " + str(sound.name) print(termcolor.colored(info, "green")) except: info = "Data has not been getter: " + str(sound.name) print(termcolor.colored(info, "red")) page_count += 1 if (not results.next) or (lim_page_count == page_count): page_count = 0 break results = results.next_page() except: print(termcolor.colored(" Search is failed ", "red")) histogram(classes) pass 

Exemple de code pour télécharger des données freesound.org

 #   def freesound_download(search_tokens, output, lim_page_count = 1, key = None): lim_page_count = int(lim_page_count) #  .     try: client = freesound.FreesoundClient() client.set_token(key,"token") print(termcolor.colored("Authorisation successful ", "green")) except: print(termcolor.colored("Authorisation failed ", "red")) for token in search_tokens: try: results = client.text_search(query=token,fields="id,name,previews") output_catalog = os.path.normpath(output + "\\" + str(token)) if not os.path.exists(output_catalog): os.makedirs(output_catalog) page_count = int(0) while True: for sound in results: try: sound.retrieve_preview(output_catalog) info = "Saved file: " + str(output_catalog) + str(sound.name) print(termcolor.colored(info, "green")) except: info = str("Sound can`t be saved to " + str(output_catalog) + str(sound.name) ) print(termcolor.colored(info, "red")) page_count += 1 if not results.next or lim_page_count == page_count: page_count = 0 break results = results.next_page() except: print(termcolor.colored(" Search is failed ", "red")) 

Une caractĂ©ristique de freesound est que l'analyse des donnĂ©es audio peut ĂȘtre effectuĂ©e sans tĂ©lĂ©charger de fichier audio, vous permettant d'obtenir le MFCC, l'Ă©nergie spectrale, le centroĂŻde spectral et d'autres coefficients. En savoir plus sur les informations de bas niveau dans la documentation freesound.ord .

GrĂące Ă  l'API freesound.org, le temps passĂ© Ă  rĂ©cupĂ©rer et tĂ©lĂ©charger des donnĂ©es est minimisĂ©, ce qui vous permet de gagner des heures de travail en Ă©tudiant d'autres sources d'informations, car les classificateurs acoustiques de haute prĂ©cision nĂ©cessitent un grand ensemble de donnĂ©es avec une grande variabilitĂ©, reprĂ©sentant des donnĂ©es avec diffĂ©rentes harmoniques sur une seule et la mĂȘme classe d'Ă©vĂ©nements.

YouTube-8M et AudioSet



Je pense que YouTube n'est pas particuliĂšrement requis dans la prĂ©sentation, mais nĂ©anmoins, Wikipedia nous dit que YouTube est un site d'hĂ©bergement vidĂ©o qui fournit aux utilisateurs des services d'affichage vidĂ©o, oubliant de dire que YouTube est une Ă©norme base de donnĂ©es, et cette source doit ĂȘtre utilisĂ©e dans le machine learning et Google Inc nous fournit un projet appelĂ© YouTube-8M Dataset .

YouTube-8M Dataset est un ensemble de données qui comprend plus d'un million de fichiers vidéo de YouTube en haute qualité, pour donner des informations plus précises.En mai 2018, il y avait 6,1 millions de vidéos avec 3862 classes. Ce jeu de données est sous licence Creative Commons Attribution 4.0 International (CC BY 4.0) . Une telle licence vous permet de copier et de distribuer du matériel sur n'importe quel support et format.

Vous vous demandez probablement: oĂč les donnĂ©es vidĂ©o entrent-elles lorsque des informations acoustiques sont nĂ©cessaires pour la tĂąche, et vous aurez tout Ă  fait raison. Le fait est que Google fournit non seulement du contenu vidĂ©o, mais a Ă©galement allouĂ© sĂ©parĂ©ment un sous-projet avec des donnĂ©es audio appelĂ© AudioSet .



AudioSet - fournit un ensemble de donnĂ©es obtenues Ă  partir de vidĂ©os YouTube, oĂč de nombreuses donnĂ©es sont prĂ©sentĂ©es dans une hiĂ©rarchie de classes Ă  l'aide d' un fichier d'ontologie , sa reprĂ©sentation graphique est situĂ©e ci-dessous.



Ce fichier vous permet de vous faire une idée de l'imbrication des classes, ainsi que d'accéder aux vidéos youtube. Pour télécharger des données depuis l'espace Internet, vous pouvez utiliser le module python - youtube-dl, qui vous permet de télécharger du contenu audio ou vidéo, selon la tùche requise.

AudioSet représente un cluster divisé en trois ensembles: ensemble de données de test, d'apprentissage (équilibré) et d'apprentissage (asymétrique).

Examinons ce cluster et analysons chacun de ces ensembles séparément pour avoir une idée des classes contenues.

Entraßnement (équilibré)

Selon la documentation, cet ensemble de données se compose de 22 176 segments obtenus à partir de diverses vidéos sélectionnées par mots-clés, fournissant à chaque classe au moins 59 copies. Si nous regardons la densité de distribution des classes racines dans la hiérarchie de l'ensemble, nous verrons que la classe Music est le plus grand groupe de fichiers audio.



Les classes organisées sont décomposées en sous-ensembles de classes, ce qui vous permet d'obtenir des informations plus détaillées lors de son utilisation. Cet ensemble d'entraßnement équilibré a une densité de distribution sur laquelle il est clair que l'équilibre est présent, mais aussi les classes individuelles sont trÚs distinguées de la vue générale.



La répartition des classes dont le nombre d'éléments dépasse la valeur moyenne



La durée moyenne de chacun des fichiers audio est de 10 secondes, des informations plus détaillées sont présentées par le schéma du disque, qui montre que la durée de certains fichiers diffÚre de celle de l'ensemble principal. Ce graphique est également présenté.



Diagramme d'une durée non moyenne de 1,5% à partir d'un ensemble audio équilibré



Entraßnement (déséquilibré)

L'avantage de cet ensemble de données est sa taille. Imaginez simplement que, selon la documentation, cet ensemble comprend 2 042 985 segments et, par rapport aux ensembles de données équilibrés, représente une grande variabilité, mais l'entropie de cet ensemble est beaucoup plus élevée.



Dans cet ensemble, la durée moyenne de chacun des fichiers audio est également égale à 10 secondes, le diagramme du disque pour cet ensemble de données est présenté ci-dessous.



Graphique de durée non moyenne d'un ensemble audio déséquilibré



Ensemble de test

Cet ensemble est trÚs similaire à un ensemble équilibré avec l'avantage que les éléments de ces ensembles ne se croisent pas. Leur répartition est présentée ci-dessous.



La répartition des classes dont le nombre d'éléments dépasse la valeur moyenne



La durée moyenne d'un segment de cet ensemble de données est également égale à 10 secondes



et le reste a la durée indiquée sur le schéma du disque



Exemple de code pour analyser et télécharger des données acoustiques conformément à l'ensemble de données sélectionné:

 import plotly import plotly.graph_objs as go from collections import Counter import numpy as np import os import termcolor import csv import json import youtube_dl import subprocess #      def histogram(data,hist_mean= True, filename = "tmp_histogram.html"): if hist_mean == True: cdata = Counter(data) mean_number_classes = np.asarray([cdata[x] for x in cdata]).mean() ldata = list() for name in cdata: if cdata[name] > mean_number_classes: ldata += list(Counter({name:cdata[name]}).elements()) trace_mean_data = go.Histogram(histfunc="count", x=ldata, name="count" ) trace_data = go.Histogram(histfunc="count", x=data, name="count", text="" ) trace = [ trace_data, trace_mean_data] plotly.offline.plot({ "data": trace, "layout": go.Layout(title="stack") }, auto_open=True, filename=filename) pass #       def pie_chart(labels, values = None, filename = "tmp_pie_chart.html", textinfo = 'label+value'): if labels == None: raise Exception("Can not create pie chart, because labels is None") if values == None: data = Counter(labels) labels = list() values = list() for name in data: labels.append(name) values.append(data[name]) trace = go.Pie(labels=labels, values=values,textfont=dict(size=20),hoverinfo='label+percent', textinfo=textinfo, marker=dict(line=dict(color='#000000', width=2)) ) plotly.offline.plot([trace], filename='basic_pie_chart') pass #          def audioset_analysis(audioset_file, inputOntology): if not os.path.exists(inputOntology) or not os.path.exists(audioset_file): raise Exception("Can not found file") with open(audioset_file, 'r') as fe: csv_data = csv.reader(fe) sx = list() with open(inputOntology) as f: data = json.load(f) duration_hist = list() for row in csv_data: if row[0][0] == '#': continue classes = row[3:] try: color = "green" tmp_duration = str(float(row[2]) - float(row[1])) info = str("id: ") + str(row[0]) + str(" duration: ") + tmp_duration duration_hist.append(tmp_duration) for cl in classes: for dt in data: cl = str(cl).strip().replace('"',"") if cl == dt['id'] and len(dt['child_ids']) == 0: sx.append(dt['name']) info += str(" ")+str(dt['name']) + str(",") except: color = "red" info = "File has been pass: " + str(row[0]) continue print(termcolor.colored(info, color)) histogram(sx, filename="audioset_class") pie_chart(duration_hist, textinfo="percent + label", filename="audioset_duration") 


 #   youtube def youtube_download(filepath, ytid): ydl_opts = { 'format': 'bestaudio/best', 'outtmpl': os.path.normpath(filepath), 'postprocessors': [{ 'key': 'FFmpegExtractAudio', 'preferredcodec': 'wav', 'preferredquality': '192', }], } with youtube_dl.YoutubeDL(ydl_opts) as ydl: ydl.download(['https://www.youtube.com/watch?v={}'.format(ytid)]) pass #    ffmpeg def cutOfPartFile(filename,outputFile, start, end, frequency = 44100): duration = float(end) - float(start) command = 'ffmpeg -i ' command += str(filename)+" " command += " -ar " + str(frequency) command += " -ss " + str(start) command += " -t " + str(duration) + " " command += str(outputFile) subprocess.call(command,shell=True) pass #    yotube        def audioset_converter(incatalog,outcatalog, token = "*.wav", frequency = 44100): find_template = os.path.join(incatalog,token) files = glob(find_template); for file in files: _,name = os.path.split(file) name = os.path.splitext(name)[0] duration = str(name).split("_")[1:3] filename = name.split("_")[0] +"."+ token.split(".")[1]; outfile = os.path.join(outcatalog,filename) cutOfPartFile(file,outfile,start=duration[0],end=duration[1]) #    audioset def audioset_download(audioset_file, outputDataset, frequency = 44100): t,h = os.path.split(audioset_file) h = h.split(".") outputDataset_full = os.path.join(outputDataset,str(h[0])+"_full") outputDataset = os.path.join(outputDataset,str(h[0])) if not os.path.exists(outputDataset): os.makedirs(outputDataset) if not os.path.exists(outputDataset_full): os.makedirs(outputDataset_full) with open(audioset_file, 'r') as fe: csv_data = csv.reader(fe) duration_hist = list() for row in csv_data: if row[0][0] == '#': continue try: color = "green" tmp_duration = str(float(row[2]) - float(row[1])) info = str("id: ") + str(row[0]) + str(" duration: ") + tmp_duration duration_hist.append(tmp_duration) save_full_file = str(outputDataset_full) + str("//")+ str(row[0]).lstrip()+str("_") +str(row[1]).lstrip() + str("_").lstrip() + str(row[2]).lstrip() + str('.%(ext)s') youtube_download(save_full_file,row[0]) except: color = "red" info = "File has been pass: " + str(row[0]) continue print(termcolor.colored(info, color)) audioset_converter(outputDataset_full,outputDataset, frequency = frequency) 

Pour obtenir des informations plus détaillées sur l'analyse des données de l'ensemble audio ou pour télécharger ces données à partir de l'espace yotube conformément au fichier d'ontologie et à l' ensemble audio sélectionné, le code du programme est disponible gratuitement dans le référentiel GitHub .

Urbansound



Urbansound est l'un des plus grands ensembles de donnĂ©es avec des Ă©vĂ©nements sonores balisĂ©s, dont les classes appartiennent Ă  l'environnement urbain. Cet ensemble est appelĂ© taxonomique (catĂ©gorique), c'est-Ă -dire chaque classe est divisĂ©e en ses sous-classes. Une telle multitude peut ĂȘtre reprĂ©sentĂ©e sous la forme d'un arbre.



Pour télécharger des données urbansound pour une utilisation ultérieure, accédez simplement à la page et cliquez sur télécharger .

Puisqu'il n'est pas nécessaire d'utiliser toutes les sous-classes dans la tùche et que vous n'avez besoin que d'une seule classe associée à la voiture, vous devez d'abord filtrer les classes nécessaires en utilisant le méta-fichier situé à la racine du répertoire obtenu lors de la décompression du fichier téléchargé.

AprÚs avoir déchargé toutes les données nécessaires des sources répertoriées, il s'est avéré former un ensemble de données contenant plus de 15 000 fichiers. Un tel volume de données nous permet de passer à la tùche de former le classificateur acoustique, mais il reste un problÚme non résolu concernant la `` pureté '' des données, c'est-à-dire l'ensemble de formation comprend des données non liées aux classes nécessaires du problÚme à résoudre. Par exemple, lorsque vous écoutez des fichiers de la classe «briser le verre», vous pouvez trouver des gens qui parlent de «comment il n'est pas bon de briser le verre». Par conséquent, nous sommes confrontés à la tùche de filtrer les données et, comme outil pour résoudre ce type de problÚme, un outil est parfaitement adapté, dont le noyau a été développé par des gars biélorusses et a reçu le nom étrange "Yandex.Toloka".

Yandex.Toloka



Yandex.Toloka est un projet de financement participatif créé en 2014 pour baliser ou collecter une grande quantitĂ© de donnĂ©es pour une utilisation ultĂ©rieure dans l'apprentissage automatique. En fait, cet outil vous permet de collecter, marquer et filtrer des donnĂ©es Ă  l'aide d'une ressource humaine. Oui, ce projet vous permet non seulement de rĂ©soudre des problĂšmes, mais permet Ă©galement Ă  d'autres personnes de gagner de l'argent. Dans ce cas, le fardeau financier vous incombe, mais en raison du fait que plus de 10 000 tolkers agissent de la part des artistes interprĂštes ou exĂ©cutants, les rĂ©sultats du travail seront reçus dans un avenir proche. Une bonne description du fonctionnement de cet outil peut ĂȘtre trouvĂ©e sur le blog Yandex .

En gĂ©nĂ©ral, l'utilisation de l'Ă©crasement n'est pas particuliĂšrement difficile, car la publication d'une tĂąche ne nĂ©cessite qu'une inscription sur le site , un montant minimum de 10 US dollars et une tĂąche correctement exĂ©cutĂ©e. Comment formuler correctement une tĂąche, vous pouvez voir la documentation Yandex.Tolok ou il n'y a pas un mauvais article sur Habr . De moi Ă  cet article, je veux ajouter que mĂȘme si un modĂšle adaptĂ© Ă  l'exigence de votre tĂąche est manquant, son dĂ©veloppement ne prendra pas plus de quelques heures de travail, avec une pause pour le cafĂ© et la cigarette, et les rĂ©sultats des artistes pourront ĂȘtre obtenus d'ici la fin de la journĂ©e de travail.

Conclusion

Dans l'apprentissage automatique, lors de la résolution du problÚme de classification ou de régression, l'une des principales tùches consiste à développer un ensemble de données fiable - un ensemble de données. Dans cet article, les sources d'information avec une grande quantité de données acoustiques ont été considérées qui ont permis de former et d'équilibrer l'ensemble de données nécessaire pour une tùche spécifique. Le code de programme présenté nous permet de simplifier au minimum le téléchargement de données, réduisant ainsi le temps de réception des données et de consacrer le reste à l'élaboration d'un classificateur.

Quant à ma tùche, aprÚs avoir collecté des données de toutes les sources présentées dans cet article et filtré les données par la suite, j'ai réussi à former l'ensemble de données nécessaire à la formation du classificateur acoustique, qui est basé sur un réseau de neurones. J'espÚre que cet article vous permettra, ainsi qu'à votre équipe, de gagner du temps et de le consacrer au développement de nouvelles technologies.

PS Un module logiciel développé en python, pour l'analyse et le téléchargement de données acoustiques pour chacune des sources présentées, que vous pouvez trouver dans le référentiel github

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


All Articles