Riconoscimento gestuale con i modelli nascosti di Markov


8

Attualmente sto lavorando a un sistema di riconoscimento dei gesti (per un'applicazione Android). Penso di aver completato la fase di elaborazione delle immagini, dove sono in grado di estrarre il contorno della mano (sto indossando un guanto per evitare la sottrazione di sfondo per ora).

Ricevo anche l'ellisse / rettangolo di delimitazione, il centroide come caratteristiche di forma "importanti" della mano.

Il mio problema è che non molta letteratura indica quale sarà la fase successiva prima della classificazione dell'immagine attraverso il modello markov nascosto. Sto trovando questa fase di "Estrazione delle caratteristiche" molto ambigua.

Attualmente sto ottenendo un elenco di angoli del contorno (che è approssimato in modo da ottenere un numero limitato di angoli)

Il problema è che non ho idea di cosa fare dopo. Quando cerco la letteratura come "Classificazione delle forme usando gli HMM", trovo ancora difficile cosa dovrei fare dopo.

Come strumento per HMM ho intenzione di utilizzare JaHMM. Ma non so come sperimentare lo strumento in questa fase poiché non so quale sarà l'input per questa fase di classificazione!

Questo mostra le informazioni che posso ottenere dalla mia mano

Ho incontrato un elenco di funzioni che ho trovato in alcune pubblicazioni, come descrittori Fast Fourier, descrittori di curvatura, spline B; tuttavia non ho idea di come applicare queste funzioni ai miei dati attuali (es. elenco di angoli, ad esempio: -63, 154, 3, 23, 54, ....)


AGGIORNAMENTO 1:

Grazie per le vostre informazioni. @Peter K.

Per quanto riguarda le pose: stavo per cercare una serie di parole nella lingua dei segni americana che sono scritte con le dita, ad esempio "cane" -> "d" "o" g "(3 stati); ma nel momento in cui non ho deciso cosa fare.

Attualmente sto leggendo altri articoli per vedere che tipo di informazioni dovrei estrarre, come ad esempio:

  • centroide della mano
  • angolo di movimento
  • distanza da un punto particolare a diversi punti del contorno della mano (ecc.)

Ora ho incontrato un documento che sembra mostrare cosa voglio fare, non sono sicuro:

http://espace.library.uq.edu.au/eserv.php?pid=UQ:10700&dsID=n0273.pdf

Attualmente sto leggendo la sezione 5 - Quantizzazione vettoriale (ho già sentito parlare di questo termine ma in realtà non so cosa comporta, e nella figura 5 sembra esserci un algoritmo complesso che, se ho capito bene, converte l'insieme di valori che raggiungo dalla mano (appena menzionata) in 1 cifra che posso usare come sequenza di osservazione per addestrare un HMM per un segno particolare. Pensi che mi sto muovendo sulla strada giusta? (Sto lavorando su Android, (NDK) , Ho trovato JaHMM come strumento HMM e usando OpenCV per l'elaborazione delle immagini.

@Peter K. Grazie per la risposta. Per quanto riguarda la generazione dei dati, stavo pianificando di seguire i passaggi di questo documento, dopo aver prodotto il mio set di dati personali: (sezioni 4 e 5) http://www.i.ci.ritsumei.ac.jp/~shimada/papers/vi02 -tanibata.pdf


AGGIORNAMENTO 2: tenere presente che si forma un gesto di {postura a, postura b, postura c}

Ora sto pensando che devo usare una qualche forma di algoritmo di classificazione. Cioè, attualmente ho una serie di vettori di funzionalità:

Postura A: [angolo dell'ellisse che lo circonda, altezza: rapporto larghezza]

  • 0.802985 33.909615
  • 0.722824 31.209663
  • 0.734535 30.206722
  • 0.68397 31.838253
  • 0.713706 34.29641
  • 0.688798 30.603661
  • 0.721395 34.880161

Postura B: [strutturato come la postura A]

  • 0.474164 16.077467
    • 0.483104 14.526289
    • 0.478904 14.800572
    • 0.483134 14.523611
    • 0.480608 14.41159
    • 0.481552 15.563665
    • 0.497951 15.563585

eccetera..

e vorrei che quando alimento un vettore di feature ottengo un semplice simbolo, ad es. 'A', 'B', ecc.

È possibile? Ho anche migrato la domanda qui: /programming/15602963/vector-quantization-algorithms-used-to-provide-observation-sequences-for-hidden


1
Devi definire cosa intendi per "gesto". Intendi la posa della mano? O il movimento della mano? O il movimento delle dita della mano? Ci sono molti modi per scuoiare questo gatto ...
Peter K.

In questo caso, sto mirando sia al movimento che alle posture, simboli di base del langauge del segno americano a partire dall'ortografia delle lettere con i gesti di base (al momento: con una mano)
test

1
Avrà una lettura e vedrò cosa posso inventare. Potrebbe richiedere del tempo per rispondere. Guarda questo spazio.
Peter K.

Ciao, sto provando a riconoscere i gesti delle mani con Android Open CV, sono un principiante con entrambi gli strumenti, qualsiasi aiuto con i passaggi e le idee della tua esperienza. Grazie mille.
user2253346

Ciao, se fossi in te, inizierei seguendo i tutorial sulla pagina cv di android open. Prima di ciò il primo passo sarebbe quello di assicurarti di avere il tuo sviluppo nativo impostato in modo appropriato in modo da poter eseguire il codice C nella tua applicazione Android (se utilizzerai C invece di Java per risultati più efficienti!)
prova il

Risposte:


5

Ho usato HMM per il riconoscimento dei gesti (non per il riconoscimento delle pose). Quello che ho fatto è stato: rintracciare la mano e riconoscere il gesto che la mano stava disegnando in aria, puoi immaginarla come una scia.

Puoi utilizzare HMM come riconoscimento di sequenza, quindi prima di tutto devi trasformare la tua immagine in una sequenza numerica discreta.

Per ogni gesto che vuoi riconoscere, devi addestrare un HMM per quello.

Quindi hai un dizionario con qualche parola conosciuta. Ognuno è un HMM addestrato. Se hai una nuova parola (obdervation sconosciuta) puoi calcolare la probabilità che ogni parola del dizionario sia probabilmente quella sconosciuta.

Alcuni pseudo-codici:

##################### training phase

examples = [112233, 11233, 123, 1122223333]
word1 = train(example)

examples = [222333, 22222223333, 2222333333]
word2 = train(example)

examples = [124555, 1122445, 1111111222224444555]
word3 = train(example)

dictionary = [word1, word2, word3]


##################### recognition phase

#let's say you have a new unkown word: 12245, you want to know what word of the dictionary it is more likly

unkown = 12245
probabilities = []
for w in word:
    probabilities.append( calculate_prob(unkown) )

Ora, vedi qual è il valore massimo nelle probabilità e ottieni la parola più probabile del dizionario!

Vedere qui:

http://www.ece.ucsb.edu/Faculty/Rabiner/ece259/Reprints/tutorial%20on%20hmm%20and%20applications.pdf

http://www.codeproject.com/Articles/69647/Hidden-Markov-Models-in-C

http://www.creativedistraction.com/demos/gesture-recognition-kinect-with-hidden-markov-models-hmms/


Grazie per un'ottima risposta. Ho capito tutto quello che hai detto. Il mio problema attuale è come otterrò le osservazioni cioè [112223333,222333, ecc ...] cioè Come posso convertire i miei dati attuali (ad es. Lunghezza e larghezza della mano + movimento contemporaneamente + angolo di movimento, ecc.) a questi tipi di numeri? Dalla mia modifica ho detto che probabilmente guarderò al clustering e ai mezzi di K per ottenere un vettore di "codice". Qual è il tuo feedback? Mille Grazie ancora!
prova il

1
si questo è un problema ho usato kmean ma non si adattava al mio problema, quindi ho semplicemente usato i centroidi e "discretizzato" il gesto con distanza eculide dai centroidi .. di sicuro puoi renderlo intelligente e aggiungere più dati come la velocità e i kmean potrebbero adattarsi ma io non mi dispiace .. fai delle prove! a volte è successo nel macchinelarning che alcune soluzioni empiriche funzionano meglio per alcuni dati particolari .. prova diverse soluzioni!
nkint

(se hai bisogno di qualche esempio su come usare i kmean con opencv basta chiedere)
nkint

probabilmente non è una buona soluzione ma puoi provare a "scheletrare" la mano .. en.wikipedia.org/wiki/Morphological_skeleton e qui un po 'di codice: felix.abecassis.me/2011/09/opencv-morphological-skeleton
nkint

se lo risolvi dimmi solo come sei riuscito a farlo, è un bel compito
:)

3

Cominciamo con il riconoscimento della posa. Questo documento traccia il confine della mano e conta il numero di rilevamenti della punta del dito da quel confine. Una cosa da notare in quel documento è che non sono richieste informazioni sullo "stato". Per la stima di posa / posizione, gli HMM probabilmente non sono adatti.

Le informazioni sui gesti si adattano meglio alla gamma HMM per la risoluzione dei problemi. Tuttavia, avrei bisogno di vedere un po 'più del tipo di dati che utilizzerai per i gesti. Puoi spiegare qualcosa in più sull'algoritmo che genera i dati che hai?

Il problema è che la selezione della giusta struttura del modello Markov nascosto ha un certo peso sulla precisione ottenibile ... Attenzione: collegamento PDF!


1
Ho creato un aggiornamento per la domanda! Grazie mille per le tue informazioni
prova il
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.