2011-12-13 1 views
3

Je veux faire de la reconnaissance gestuelle en python avec kinect. Après avoir lu une théorie, je pense que l'une des meilleures méthodes est l'apprentissage non supervisé avec HMM (Baum Welch Model) ou quelques méthodes EM pour obtenir un ensemble de HMM (un pour chaque geste que je veux reconnaître).reconnaissance de geste avec kinect avec python: hmm apprentissage

Je ferais alors la reconnaissance correspondant au log de vraisemblance maximum (avec viterbi?) Des données observées avec le HMM dans l'ensemble formé. Par exemple, j'ai des données (coordonnées x, y, z de la main droite) enregistrées avec l'appareil kinect de quelques gestes (dire bonjour, donner un coup de poing, faire un cercle avec la main) et je fais de la formation :

# training 
known_datas = [ 
tuple(load_data('punch.mat'),    'PUNCH'), 
tuple(load_data('say_hello.mat'),   'HELLO'), 
tuple(load_data('do_circle_with_hands.mat'), 'CIRCLE') 
] 

gestures = set() 
for x, name in known_datas: 
    m = HMM() 
    m.baumWelch(x) 
    gestures.add(m) 

puis-je effectuer la reconnaissance des valeurs observées de nouvelles données effectuant le maximum loglik et choisissez le geste sauvé avant qui a le maximum loglik pour chaque HMM formé:

# recognition 
observed = load_data('new_data.mat') 
logliks = [m.viterbi(observed) for m in gestures] 

print 'observed data is ', gestures[logliks.index(max(logliks))] 

Mes questions sont les suivantes:

  • Est-ce quelque chose de totalement stupide?
  • Combien d'ensembles de formation pour un cas réel?
  • Combien d'états pour chaque HMM?
  • Est-il possible de le faire en temps réel?

Répondre

2

Tout d'abord: C'est une question très spéciale, vous aurez besoin d'un expert en apprentissage automatique ici. Malheureusement, il n'y a pas encore d'équivalent ML parmi les sites d'échange de pile ... peut-être qu'il y en aura un un jour. :)

Je suppose que votre approche est valable, à seulement quelques remarques:

  • La classe HMM que vous venez d'instancier avec HMM() ici doit être conçu de telle sorte que la structure du HMM peut représenter équiv à un geste . HMM ont états et transitions entre eux, alors comment définiriez-vous un HMM pour un geste? Je suis certain que c'est possible (et même que je pense que c'est une bonne approche) mais cela demande de la réflexion. Peut-être que les états sont juste les coins d'un cube 3D, et pour chaque point observé de votre geste reconnu, vous choisissez le coin le plus proche de ce cube. L'algorithme BW peut alors approcher les probabilités de transition à travers vos données d'entraînement. Mais vous devrez peut-être choisir un modèle d'état plus fin, peut-être une grille de voxel n * n * n.

  • L'algorithme de Viterbi ne vous donne pas la probabilité d'un modèle mais la séquence d'états la plus probable pour une observation de séquence donnée. IIRC vous choisirez l'algorithme forward pour obtenir la probabilité d'une séquence d'observation donnée pour un modèle donné.

Je suppose que, étant donné un personnel bien formé et non HMM trop complexe, vous devriez être en mesure de reconnaître les gestes en temps réel, mais c'est juste une supposition. :)

Questions connexes