5

Attualmente sto lavorando a un'applicazione di riconoscimento gestuale, utilizzando un modello di Markov nascosto come fase di classificazione su MATLAB (utilizzando la webcam). Ho completato la parte di pre-elaborazione che include l'estrazione del vettore di funzionalità. Ho applicato Principal Component Analysis (PCA) a questi vettori.Riconoscimento di gesti utilizzando il modello markov nascosto

Ora per me usare la casella degli strumenti HMM di Kevin Murphy, ho bisogno che la mia sequenza di osservazione sia in forma di numeri (interi) compresi tra 1 e M (M = numero di simboli di osservazione). Se ho ragione, devo usare il concetto di un libro di codici e usare la quantizzazione vettoriale per ottenere la mia sequenza di osservazioni.

Le mie domande:

  1. Come faccio a costruire un codebook?
  2. E come utilizzare questo libro di codici per ottenere i simboli di osservazione del mio video di input?

Nota: Ho usato descrittori ellittica Fourier per estrazione delle caratteristiche di forma e per ogni gesto valori PCA sono memorizzati in una matrice di dimensione [11x220] (Numero di fotogrammi nel video = 11)

Cosa faccio dopo? Esiste un altro modo per ottenere i vettori di feature al posto dei descrittori di Fourier di Elliptical?

risposta

2

Un HMM è una famiglia di modelli probabilistici per dati sequenziali in cui si assume che i dati siano generati da una catena Markov dello stato discreto su uno spazio di stato latente ("nascosto"). Generalmente, le cosiddette "emissioni" provengono dalla stessa famiglia di distribuzioni per ciascuno stato, ma con parametri diversi.

Non ho molta familiarità con l'implementazione di MATLAB, ma sembra che tu stia facendo riferimento a un'implementazione che utilizza una distribuzione multinomiale di emissioni, in cui i dati osservati sono una sequenza di simboli di un alfabeto pre-specificato. I parametri sconosciuti in questo modello sono probabilità di transizione tra gli stati nascosti e i pesi multinomiali per ciascun simbolo di uscita in ogni stato. Questa è la distribuzione appropriata se le tue caratteristiche sono binarie e si escludono a vicenda - diciamo "il gesto è andato a sinistra" contro "il gesto è andato a destra" o qualcosa del genere.

Tuttavia, se le funzionalità sono continue, potrebbe essere più appropriato utilizzare una distribuzione continua delle emissioni. Ad esempio, gli HMM gaussiani sono piuttosto comuni. Qui i tuoi dati osservati sono una sequenza di dati continui (possibili multivariati) e l'assunto è che in ogni stato nascosto, l'output è i.i.d da un gaussiano con una media e (co) varianza che speri di imparare.

Se non si è opposti a Python, c'è una documentazione abbastanza buona di entrambi gli HMM multinomiali e gaussiani nella pagina di apprendimento scikits: http://scikit-learn.org/stable/modules/hmm.html.

Da un punto di vista pratico, se si è vincolati all'utilizzo di un HMM multinomiale sui dati, suggerirei di creare il codice in prima esecuzione eseguendo il clustering di k-means e quindi utilizzando le etichette di stato come input per l'HMM. Ma probabilmente sarebbe preferibile usare un HMM gaussiano.