Soglia del modello Markov nascosto


14

Ho sviluppato un sistema di prova del concetto per il riconoscimento sonoro usando modelli mfcc e markov nascosti. Fornisce risultati promettenti quando collaudo il sistema su suoni noti. Sebbene il sistema, quando viene immesso un suono sconosciuto, restituisce il risultato con la corrispondenza più vicina e il punteggio non è così distinto da escogitare, è un suono sconosciuto, ad esempio:

Ho addestrato 3 modelli markov nascosti uno per il parlato, uno per l'acqua che esce dal rubinetto dell'acqua e uno per bussare alla scrivania. Quindi li collaudo su dati invisibili e ottengo i seguenti risultati:

input: speech
HMM\knocking:  -1213.8911146444477
HMM\speech:  -617.8735676792728
HMM\watertap:  -1504.4735097322673

So highest score speech which is correct

input: watertap
HMM\knocking:  -3715.7246152783955
HMM\speech:  -4302.67960438553
HMM\watertap:  -1965.6149147201534

So highest score watertap which is correct

input: knocking
HMM\filler  -806.7248912250212
HMM\knocking:  -756.4428782636676
HMM\speech:  -1201.686687761133
HMM\watertap:  -3025.181144273698

So highest score knocking which is correct

input: unknown
HMM\knocking:  -4369.1702184688975
HMM\speech:  -5090.37122832872
HMM\watertap:  -7717.501505674925
Here the input is an unknown sound but it still returns the closest match as there is no system for thresholding/garbage filtering.

So che nella ricerca di parole chiave un suono OOV (fuori dal vocabolario) può essere filtrato usando un modello di immondizia o di riempimento, ma dice che è addestrato usando un insieme finito di parole sconosciute in cui questo non può essere applicato al mio sistema mentre lo faccio conosci tutti i suoni che il sistema potrebbe registrare.

Come viene risolto un problema simile nel sistema di riconoscimento vocale? E come posso risolvere il mio problema per evitare falsi positivi?

Risposte:


5

Ottima domanda!

Come dici tu, l'unico modo per ottenere l'HMM per darti una risposta "Non lo so" (chiamiamolo OOV) è quello di dargli uno stato speciale perché genera sempre gli stati con la più alta probabilità sotto il tuo modello. Quindi devi assicurarti che OOV abbia una maggiore probabilità sotto ogni input che non lo è speech, watertapo knocking.

La risposta breve è che ciò non è possibile. Perché un HMM non è un riconoscimento di pattern assoluto. Confronta solo la probabilità degli output sotto il tuo modello e nel contesto è stato addestrato .

Pensa a un input che sarebbe speeche knockingallo stesso tempo. Molto probabilmente l'HMM "esiterà" tra questi due stati perché questo input ha caratteristiche di ciascuno. Alla fine produrrebbe uno di questi, ma è abbastanza improbabile che produrrebbe OOV. Nel caso dello spotting delle parole chiave, la mia ipotesi è che potresti trovare input intelligenti che ingannerebbero costantemente il loro HMM. Tuttavia, gli autori probabilmente sanno quali input aspettarsi e hanno scelto il loro elenco finito di parole sconosciute in modo che questi input velenosi siano rari.

Ti consiglio di fare lo stesso. Pensa alle situazioni in cui utilizzerai l'HMM e formerai uno stato OOV sugli input più comuni che desideri eliminare. Puoi persino pensare di avere diversi stati OOV.


2
Ma che ne dite di un modello soglia basato su hmm per il riconoscimento dei gesti descritto qui: herin.kaist.ac.kr/Publication/PS/hklee_PAMI_i09611.pdf . Creano un modello di soglia che è un hmm ergodico che ha stati di ciascun hmm combinati insieme. "Il modello di soglia funge da linea di base. Un gesto candidato si trova quando un modello di gesto specifico supera la soglia" Ma il mio problema è che sto usando la libreria java e jahmm e non penso che abbia l'opzione per ergodic hmm.
Radek

Come dice il titolo, questo è un algoritmo basato su HMM, quindi non è un HMM. Mi sembra che un HMM puro non soddisfi le tue esigenze e che un classificatore basato su soglia sia effettivamente più adatto.
gui11aume,

5

Questo è in qualche modo comune nel campo del riconoscimento dei gesti. La risposta è creare un modello soglia come descritto nell'articolo di Lee e Kim (1999)

Ha lo stesso ruolo di un modello di riempimento o immondizia, ma non ha bisogno di essere addestrato separatamente come dici tu. È possibile creare un modello di soglia collegando tutti gli stati di auto-transizione dagli altri modelli e inizializzando la transizione con probabilità uniformi, collegando completamente tali stati. Si prega di dare un'occhiata al documento per vedere come può effettivamente essere fatto.

Anche se la tua libreria non supporta i modelli ergodici, non dovrebbe impedirti di creare manualmente un modello delle dimensioni richieste e di impostare gli stati di conseguenza. Se si desidera davvero una libreria per questo, quindi le implementazioni per i classificatori di modelli Markov nascosti, incluso il supporto per i modelli di soglia, sono disponibili in Accord.NET Framework , ad esempio.

Disclaimer: sono l'autore di questa biblioteca.


Bene, posso creare manualmente un modello di soglia. Quindi diciamo ad esempio che ho due modelli hmm di nome: sound1 e sound2. Entrambi hanno 2 stati. Quindi creo un modello di soglia con 4 stati. Ogni stato ha lo stesso valore iniziale che è 0,25. Quindi ho impostato una distribuzione uniforme per tutte le possibili transizioni in modo che tutte le possibili transizioni di stato (0,0), (0,1), (1,0), (1,1), (1,2), (2,1), (2,2), ecc. Ottengono una distribuzione uniforme di 0,0625. Quindi per gli stati 1 e 2 del modello di soglia ho impostato l'opdf degli stati 1 e 2 da sound1 e per gli stati 3 e 4 della soglia ho impostato l'opdf degli stati 1 e 2 da sound2.
Radek,

L'approccio sopra descritto è corretto?
Radek,

1
Non del tutto ... forse ero un po 'lento nella mia descrizione. Gli elementi diagonali della matrice di transizione per il modello di soglia ricevono le probabilità di auto-transizione originali dagli altri modelli. Le transizioni da uno stato ad altri stati vengono inizializzate con probabilità uniformi. So che può sembrare pigro indicarlo al codice, ma a volte il codice è più facile da capire rispetto alle formule .
Cesar

A proposito, se hai letto l'articolo di Lee e Kim e l'hai interpretato in modo diverso o ritieni che la mia implementazione sia errata, per favore fatemelo sapere.
Cesar,

3

Quindi quello che ho fatto è: ho creato la mia versione semplificata di un modello di riempimento. Ogni hmm che rappresenta il suono watertap, il suono di bussare e il suono del parlato è un hmm separato a 6 stati addestrato da suoni provenienti da un set di allenamento di 30, 50, 90 suoni rispettivamente di varie lunghezze da 0,3 secondi a 10 secondi. Quindi ho creato un modello di riempimento che è un hmm a 1 stato composto da tutti i suoni del set di allenamento per bussare, watertap e parlato. Quindi, se il punteggio del modello hmm è maggiore per un dato suono rispetto al punteggio del filler, il suono viene riconosciuto altrimenti è un suono sconosciuto. Non ho dati di grandi dimensioni ma ho eseguito un test successivo per il rifiuto dei falsi positivi e il rifiuto dei veri positivi su suoni invisibili.

true positives rejection
knocking 1/11 = 90% accuracy
watertap 1/9 = 89% accuracy
speech 0/14 = 100% accuracy


false positives rejection
Tested 7 unknown sounds
6/7 = 86% accuracy

Quindi da questo rapido test posso concludere che questo approccio dà risultati ragionevoli anche se ho la strana sensazione che potrebbe non essere sufficiente.


+1 Questo è molto interessante. Se non ti sei già dimenticato di questo lavoro, questo approccio ha funzionato alla fine? È bastato un modello 'filler / altro'? In caso contrario, hai implementato qualcos'altro alla fine?
Zhubarb,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.