Sådan bruges lydklassificering med TensorFlow på en IoT-platform

Introduktion

Der er mange forskellige projekter og tjenester til menneskelig talegenkendelse, såsom Pocketsphinx, Googles tale API og mange andre. Sådanne applikationer og tjenester genkender tale og omdanner den til tekst med ret god nøjagtighed. Men ingen af ​​dem kan bestemme forskellige lyde, der er optaget af mikrofonen. Hvad var der på optagelse: menneskelig tale, dyrelyde eller musikafspilning?

Vi blev konfronteret med denne opgave og besluttede at undersøge og bygge et par eksempler på projekter, som ville være i stand til at klassificere forskellige lyde ved hjælp af maskinlæringsalgoritmer.

Denne artikel beskriver, hvilke værktøjer vi valgte, hvilke udfordringer vi stod overfor, hvordan vi uddannede vores model til TensorFlow og hvordan vi kører vores open source-projekt.

Vi kan også levere anerkendelsesresultaterne til DeviceHive (IoT-platformen) til at bruge dem i skytjenester til tredjepartsapplikation.

Valg af værktøjer og en klassificeringsmodel

Først var vi nødt til at vælge, hvilken software der ville fungere bedst med neurale netværk. Den første egnede løsning, som vi fandt, var Python Audio Analyse.

Det største problem i maskinlæring er at finde et godt træningsdatasæt. Der er mange datasæt til talegenkendelse og musikklassificering, men ikke meget til tilfældig lydklassificering. Efter nogle undersøgelser fandt vi det urbane lyddatasæt.

Efter nogle test blev vi konfronteret med følgende problemer:

  • pyAudioAnalysis er ikke fleksibel nok. Det tager ikke en lang række parametre, og nogle af dem beregner på farten (for eksempel antallet af træningseksperimenter baseret på antallet af prøver - og du kan ikke ændre dette).
  • Datasættet har kun 10 klasser, og alle er "urban."

Den næste løsning, som vi fandt, var Google AudioSet. Det er baseret på mærkede YouTube-videosegmenter og kan downloades i to formater:

  1. CSV-filer, der beskriver YouTube-video-id, starttid, sluttid og et eller flere etiketter for hvert segment.
  2. Ekstraherede lydfunktioner, der er gemt som TensorFlow Record-filer.

Disse funktioner er kompatible med YouTube-8M-modeller. Denne løsning bruger også TensorFlow VGGish-modellen som funktionsekstraktor. Det dækkede mange af vores krav, og var derfor det bedste valg for os.

Træning af modellen

Den næste opgave var at finde ud af, hvordan YouTube-8M-interface fungerede. Det er designet til at arbejde med videoer, men heldigvis kan det også fungere med lyd. Dette bibliotek er temmelig fleksibelt, men det har et hardkodet antal prøveklasser. Så vi ændrede dette lidt for at videregive antallet af klasser som en parameter.

YouTube-8M kan arbejde med data af to typer: aggregerede funktioner og rammefunktioner. Google AudioSet kan levere data som funktioner, som vi bemærkede før. Gennem lidt mere forskning opdagede vi, at funktionerne er i rammeformat. Derefter skulle vi vælge den model, der skulle trænes.

Ressourcer, tid og nøjagtighed

GPU'er er et mere passende valg til maskinlæring end CPU'er. Du kan finde mere info om dette her. Så vi springer over dette punkt og går direkte til vores opsætning. Til vores eksperimenter brugte vi en pc med en NVIDIA GTX 970 4GB.

I vores tilfælde var træningstiden ikke rigtig vigtig. Vi skal nævne, at en-to timers træning var nok til at tage en første beslutning om den valgte model og dens nøjagtighed.

Naturligvis ønskede vi at få den bedst mulige nøjagtighed. Men for at træne en mere kompleks model (potentielt bedre nøjagtighed), har du brug for mere RAM (video RAM i tilfælde af GPU) for at passe ind i den.

Valg af model

En komplet liste over YouTube-8M-modeller med beskrivelser er tilgængelig her. Da vores træningsdata var i rammeformat, måtte modeller på rammeniveau anvendes. Google AudioSet forsynede os med et datasæt, der var opdelt i tre dele: afbalanceret tog, ubalanceret tog og evaluering. Du kan få mere info om dem her.

En modificeret version af YouTube-8M blev brugt til træning og evaluering. Det er tilgængeligt her.

Afbalanceret tog

Træningskommandoen ser sådan ud:

python train.py –train_data_pattern = / path_to_data / audioset_v1_embeddings / bal_train / *. tfrecord –num_epochs = 100 –learning_rate_decay_examples = 400000 –feature_names = audio_embedding –feature_size = 128 –bearbejde = 128 –billed = = ModelName

For LstmModel ændrede vi basisindlæringshastigheden til 0,001, som dokumentationen antydede. Vi ændrede også standardværdien af ​​lstm_cells til 256, fordi vi ikke havde nok RAM til mere.

Lad os se træningsresultaterne:

Modelnavn Træningstid Træning af sidste trin hitEvaluering gennemsnit hitLogistic14m 3s0.58590.5560Dbof31m 46s1.0000.5220Lstm1h 45m 53s0.98830.4581

Som du kan se, fik vi gode resultater under træningstrinnet - men det betyder ikke, at vi ville få gode resultater ved den fulde evaluering.

Ubalanceret tog

Så prøvede vi det ubalancerede togsæt. Det har meget flere prøver, så vi ændrede antallet af træningsepoker til 10 (skulle ændres til mindst 5, fordi det tog betydelig tid at træne).

Modelnavn Træningstid Træning af sidste trin hitEvaluering gennemsnit hitLogistic2h 4m 14s0.87500.5125Dbof4h 39m 29s0.88480.5605Lstm9h 42m 52s0.86910.5396

Toglogfiler

Hvis du vil undersøge vores træningslogfiler, kan du downloade og pakke train_logs.tar.gz. Kør derefter tensorboard –logdir / path_to_train_logs / og gå til http://127.0.0.1:6006

Mere om træning

YouTube-8M tager mange parametre, og mange af dem påvirker træningsprocessen.

For eksempel: Du kan indstille indlæringshastigheden og antallet af epoker, der vil ændre træningsprocessen meget. Der er også tre forskellige funktioner til beregning af tab og mange andre nyttige variabler, som du kan indstille og ændre for at forbedre resultaterne.

Brug af den uddannede model med lydoptagelsesenheder

Nu hvor vi havde nogle træne modeller, var det tid til at tilføje nogle kode for at interagere med dem.

Optag mikrofon

Vi var nødt til at fange lyddata fra en mikrofon på en eller anden måde. Vi brugte PyAudio. Det giver en enkel grænseflade og kan arbejde på de fleste platforme.

Lydforberedelse

Som vi nævnte før, brugte vi TensorFlow VGGish-modellen som funktionsekstraktor. Her er en kort forklaring af transformationsprocessen:

Eksemplet på "hundebark" fra UrbanSound-datasættet blev brugt til visualisering.

Resample lyd til 16 kHz mono.

Beregn spektrogram ved hjælp af størrelser af Short-Time Fourier Transform med en vinduesstørrelse på 25 ms, et vindueshopp på 10 ms og et periodisk Hann-vindue.

Beregn mel-spektrogram ved at kortlægge spektrogrammet til 64 mel-beholdere.

Beregn stabiliseret log mel spektrogram ved at anvende log (mel-spektrum + 0,01), hvor en forskydning bruges til at undgå at tage en logaritme på nul.

Disse funktioner blev derefter indrammet i ikke-overlappende eksempler på 0,96 sekunder, hvor hvert eksempel dækker 64 mel-bånd og 96 rammer på 10 ms hver.

Disse eksempler blev derefter ført ind i VGGish-modellen til ekstraktion af indlejringer.

klassificering

Og endelig havde vi brug for en grænseflade til at tilføje dataene til det neurale netværk og få resultaterne.

Vi brugte YouTube-8M-grænsefladen som et eksempel, men modificerede det for at fjerne serialisering / deserialiseringstrinnet.

Her kan du se resultaterne af vores arbejde. Lad os se nærmere på.

Installation

PyAudio bruger libportaudio2 og portaudio19-dev, så du skal installere dem for at få det til at fungere.

Nogle Python-biblioteker er påkrævet. Du kan installere dem ved hjælp af pip.

pip installere -r krav.txt

Du skal også downloade og udpakke arkivet til projektroten med de gemte modeller. Du kan finde det her.

Løb

Vores projekt indeholder tre grænseflader, der skal bruges.

1. Behandl forudindspillet lydfil

Kør bare python parse_file.py path_to_your_file.wav, og du vil se på terminalen noget som Tale: 0.75, Musik: 0.12, Inde, stort rum eller hal: 0,03

Resultatet afhænger af inputfilen. Disse værdier er de forudsigelser, som det neurale netværk har lavet. En højere værdi betyder en større chance for, at inputfilen tilhører den klasse.

2. Optagelse og behandling af data fra mikrofon

python capture.py starter processen, der vil fange data fra din mikrofon uendeligt. Det indlæser data til klassificeringsgrænsefladen hvert 5-7 sekund (som standard). Du kan se resultaterne i det forrige eksempel.

Du kan køre det med –save_path = / path_to_samples_dir / og i dette tilfælde gemmes alle indfangne ​​data i det medfølgende bibliotek i wav-filer. Denne funktion er nyttig, hvis du vil prøve forskellige modeller med de samme eksempler. Brug parameteren –hjælp for at få mere info.

3. Webgrænseflade

python daemon.py implementerer en simpel webgrænseflade, der er tilgængelig som standard på http://127.0.0.1:8000. Vi brugte den samme kode som i det foregående eksempel. Du kan se de sidste ti forudsigelser om siden (http://127.0.0.1:8000/events).

IoT Service Integration

Sidst men ikke mindst er integration med IoT-infrastrukturen. Hvis du kører webgrænsefladen, som vi nævnte i det foregående afsnit, kan du finde DeviceHive-klientstatus og -konfiguration på indekssiden. Så længe klienten er tilsluttet, sendes forudsigelser til den specificerede enhed som underretninger.

Konklusion

TensorFlow er et meget fleksibelt værktøj, som du kan se, og kan være nyttigt i mange applikationer til maskinlæring, f.eks. Billede og lydgenkendelse. At have en sådan løsning sammen med en IoT-platform giver dig mulighed for at opbygge en smart løsning over et meget bredt område.

Smarte byer kunne bruge dette til sikkerhedsmæssige formål og kontinuerligt lytte til brudt glas, skudsprøjt og andre lyde i forbindelse med forbrydelser. Selv i regnskove kunne en sådan løsning bruges til at spore vilde dyr eller fugle ved at analysere deres stemmer.

IoT-platformen kan levere alle sådanne underretninger. Denne løsning kan installeres på lokale enheder (skønt den stadig kan distribueres et sted som en skytjeneste) for at minimere udgifter til trafik og sky. Det kan også tilpasses til kun at levere meddelelser i stedet for at inkludere den rå lyd. Glem ikke, at dette er et open source-projekt, så du er velkommen til at bruge det.

Skrevet af Nikolay Khabarov, medstifter af DeviceHive.