Reconnaissance des gestes avec les modèles de Markov cachés

8

Je travaille actuellement sur un système de reconnaissance gestuelle (pour une application Android). Je pense avoir terminé l'étape de traitement d'image, où je suis capable d'extraire le contour de la main (je porte un gant pour éviter la soustraction de l'arrière-plan pour l'instant).

Je reçois également l'ellipse / rectangle englobant, le centroïde en tant que caractéristiques de forme «importantes» de la main.

Mon problème est que peu de littérature indique quelle est la prochaine étape avant la classification de l'image à travers le modèle markovien caché. Je trouve cette étape «d'extraction de fonctionnalités» très ambiguë.

Actuellement, je reçois une liste des angles du contour (qui est approximée de manière à obtenir un nombre limité d'angles)

Le problème est que je ne sais pas quoi faire ensuite. Lorsque je recherche de la littérature comme «Classification des formes à l'aide de HMM», je trouve toujours difficile de savoir quoi faire ensuite.

En tant qu'outil pour HMM, je prévois d'utiliser JaHMM. Mais je ne sais pas comment expérimenter l'outil à ce stade car je ne sais pas quelle sera la contribution à cette étape de classification!

Cela montre les informations que je peux obtenir de ma main

J'ai rencontré une liste de fonctions que j'ai trouvées dans certains ouvrages, comme les descripteurs de Fourier rapides, les descripteurs de courbure, la spline B; pourtant, je ne sais pas comment appliquer ces fonctions à mes données actuelles (c'est-à-dire la liste des angles, par exemple: -63, 154, 3, 23, 54, ....)


MISE À JOUR 1:

Merci pour vos informations. @Peter K.

Concernant les poses: j'allais opter pour un ensemble de mots en American Sign Language qui sont orthographiés, par exemple «chien» -> «d» «o» «g» (3 états); mais le moment où je n'ai pas décidé quoi faire.

Je lis actuellement d'autres articles pour voir quel type d'informations je dois extraire, comme:

  • centroïde de la main
  • angle de mouvement
  • distance d'un point particulier à différents points du contour de la main (etc.)

Maintenant, j'ai rencontré un article qui semble montrer ce que je veux faire, je ne suis pas sûr:

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

Je lis actuellement la section 5 - Quantification vectorielle (j'ai entendu parler de ce terme auparavant mais je ne sais pas vraiment ce qu'il implique, et dans la figure 5 il semble y avoir un algorithme complexe qui, si j'ai bien compris, convertit l'ensemble des valeurs que j'atteins de la main (juste mentionnée) en 1 chiffre que je peux utiliser comme séquence d'observation pour former un HMM pour 1 signe particulier. Pensez-vous que je me déplace sur la bonne voie? (Je travaille sur Android, (NDK) , J'ai trouvé JaHMM en tant qu'outil HMM et utilisant OpenCV pour le traitement d'images.

@Peter K. Merci pour votre réponse. En ce qui concerne la génération de données, je prévoyais de suivre les étapes de cet article, après avoir produit mon ensemble de données personnelles: (sections 4 et 5) http://www.i.ci.ritsumei.ac.jp/~shimada/papers/vi02 -tanibata.pdf


MISE À JOUR 2: en gardant à l'esprit qu'un geste est formé de {posture a, posture b, posture c}

Je pense maintenant que je dois utiliser une certaine forme d'algorithme de classification. Autrement dit, j'ai actuellement un ensemble de vecteurs de fonctionnalités:

Posture A: [angle d'ellipse l'entourant, rapport hauteur: largeur]

  • 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

Posture B: [structurée de la même manière que la posture 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

etc..

et j'aimerais que lorsque j'alimente un vecteur caractéristique, j'obtienne un simple symbole, par exemple "A", "B", etc.

Est-ce possible? J'ai également migré la question ici: /programming/15602963/vector-quantization-algorithms-used-to-provide-observation-sequences-for-hidden

tester
la source
1
Vous devez définir ce que vous entendez par «geste». Voulez-vous dire la pose de la main? Ou le mouvement de la main? Ou le mouvement des doigts de la main? Il existe de nombreuses façons d'écorcher ce chat ...
Peter K.
Dans ce cas, je vise à la fois le mouvement et les postures, symboles de base du signe américain langauge à partir de l'orthographe des lettres au doigt (au moment: une main) gestes
test
1
Va lire et voir ce que je peux trouver. Cela pourrait prendre un certain temps pour répondre. Surveillez cet endroit.
Peter K.
Bonjour, j'essaie de faire la reconnaissance des gestes de la main avec Android Open CV, je suis un débutant avec les deux outils, toute aide avec les étapes et les idées de votre expérience. Merci beaucoup.
user2253346
Bonjour si j'étais vous je commencerais par suivre les tutoriels sur la page cv ouverte android. Avant cela, la première étape serait de vous assurer que votre développement natif est configuré de manière appropriée afin que vous puissiez exécuter le code C dans votre application Android (si vous utilisez C au lieu de Java pour des résultats plus efficaces!)
testez le

Réponses:

5

J'ai utilisé HMM pour la reconnaissance des gestes (pas la reconnaissance de pose). Ce que j'ai fait, c'est: suivre la main et reconnaître le geste que la main dessinait dans l'air, vous pouvez l'imaginer comme une trace.

Vous pouvez utiliser HMM comme identificateur de séquence, vous devez donc d'abord transformer votre image en une séquence de nombres discrets.

Pour chaque geste que vous souhaitez reconnaître, vous devez former un HMM pour cela.

Vous avez donc un dictionnaire avec un mot connu. Chacun est un HMM formé. Si vous avez un nouveau mot (obdervation inconnue), vous pouvez calculer la probabilité que chaque mot du dictionnaire soit probablement celui inconnu.

Quelques pseudo-codes:

##################### 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) )

Maintenant, voyez quelle est la valeur maximale en probabilités et vous obtenez le mot le plus probable du dictionnaire!

Vois ici:

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/

nkint
la source
Merci pour cette excellente réponse. J'ai bien compris tout ce que tu as dit. Mon problème actuel est de savoir comment j'obtiendrai les observations, c.-à-d. [112223333,222333, etc ...] c.-à-d. Comment puis-je convertir mes données actuelles (par exemple, longueur et largeur de la main + mouvement en même temps + angle de mouvement, etc.) à ces types de nombres? De mon montage, j'ai mentionné que j'examinerai probablement le clustering et K Means pour obtenir un vecteur «code». Quel est votre avis? Encore merci beaucoup!
test
1
oui c'est un problème. j'ai utilisé des kmeans mais cela ne correspondait pas à mon problème, j'ai donc simplement utilisé des centroïdes et "discrétisé" le geste avec la distance eculidienne des centroïdes. sais pas désolé .. fais quelques essais! parfois, il est arrivé, lors de la machinelarning, que certaines solutions empiriques fonctionnent mieux pour certaines données particulières .. essayez des solutions différentes!
nkint
(si vous avez besoin d'un exemple d'utilisation des kmeans avec opencv, demandez)
nkint
probabilly pas une bonne solution , mais vous pouvez essayer de « squelettisent » la main .. en.wikipedia.org/wiki/Morphological_skeleton et voici un code: felix.abecassis.me/2011/09/opencv-morphological-skeleton
nkint
si vous le résolvez, dites-moi simplement comment vous avez réussi à le faire, c'est une belle tâche
:)
3

Commençons par la reconnaissance de pose. Cet article trace la frontière de la main et compte le nombre de détections du bout des doigts à partir de cette frontière. Une chose à noter dans ce document est qu'aucune information "d'état" n'est requise. Pour l'estimation de la position / position, les HMM ne sont probablement pas un bon ajustement.

Les informations sur les gestes s'intègrent mieux dans la gamme HMM pour la résolution de problèmes. Cependant, j'aurais besoin de voir un peu plus le type de données que vous allez utiliser pour les gestes. Pouvez-vous expliquer un peu plus l'algorithme qui génère les données dont vous disposez?

Le problème est que la sélection de la bonne structure du modèle de Markov caché a beaucoup à voir avec la précision réalisable ... Attention: lien PDF!

Peter K.
la source
1
J'ai créé une mise à jour pour la question! Merci beaucoup pour vos informations
test