Reconocimiento de gestos con modelos ocultos de Markov

8

Actualmente estoy trabajando en un sistema de reconocimiento de gestos (para una aplicación de Android). Creo que he completado la etapa de procesamiento de imágenes, donde puedo extraer el contorno de la mano (por ahora, estoy usando un guante para evitar la sustracción del fondo).

También obtengo la elipse / rectángulo delimitador, el centroide como características de forma 'importantes' de la mano.

Mi problema es que no hay mucha literatura que indique cuál es la siguiente etapa antes de la clasificación de la imagen a través del modelo oculto de Markov. Esta etapa de 'Extracción de características' me parece muy ambigua.

Actualmente estoy obteniendo una lista de ángulos del contorno (que se aproxima para obtener un número limitado de ángulos)

El problema es que no tengo ni idea de qué hacer a continuación. Cuando busco literatura como 'Clasificación de formas usando HMM', todavía me resulta difícil hacer lo siguiente.

Como herramienta para HMM planeo usar JaHMM. ¡Pero no sé cómo experimentar con la herramienta en esta etapa ya que no sé cuál será la entrada a esta etapa de clasificación!

Esto muestra la información que puedo obtener de mi mano.

He encontrado una lista de funciones que encontré en la literatura, como Descriptores rápidos de Fourier, Descriptores de curvatura, B Spline; Sin embargo, no tengo ni idea de cómo aplicar estas funciones a mis datos actuales (es decir, lista de ángulos, por ejemplo: -63, 154, 3, 23, 54, ...)


ACTUALIZACIÓN 1:

Gracias por su información. @Peter K.

Con respecto a las poses: iba a buscar un conjunto de palabras en lenguaje de señas americano que están escritas con los dedos, por ejemplo, 'perro' -> 'd' 'o' 'g' (3 estados); pero en el momento no he decidido a qué ir.

Actualmente estoy leyendo algunos documentos más para ver qué tipo de información debo extraer, como:

  • centroide de la mano
  • ángulo de movimiento
  • distancia desde un punto particular a diferentes puntos del contorno de la mano (etc.)

Ahora que he encontrado un artículo que parece mostrar lo que quiero hacer, no estoy seguro:

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

Actualmente estoy leyendo la sección 5: Cuantización vectorial (he oído hablar de este término antes, pero no sé realmente qué implica, y en la figura 5 parece haber un algoritmo complejo que, si entendí correctamente, convierte el conjunto de valores que logro de la mano (que acabo de mencionar) en 1 dígito que puedo usar como secuencia de observación para entrenar un HMM para 1 signo en particular. ¿Crees que me estoy moviendo en el camino correcto? (Estoy trabajando en Android, (NDK) Encontré JaHMM como una herramienta HMM y utilicé OpenCV para el procesamiento de imágenes.

@ Peter K. Gracias por su respuesta. Con respecto a la generación de datos, estaba planeando seguir los pasos de este documento, después de producir mi conjunto de datos personales: (secciones 4 y 5) http://www.i.ci.ritsumei.ac.jp/~shimada/papers/vi02 -tanibata.pdf


ACTUALIZACIÓN 2: teniendo en cuenta que un gesto está formado por {postura a, postura b, postura c}

Ahora estoy pensando que debo utilizar algún tipo de algoritmo de clasificación. Es decir, actualmente tengo un conjunto de vectores de características:

Postura A: [ángulo de elipse que lo rodea, relación altura: ancho]

  • 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: [estructurada igual que 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

etc.

y me gustaría que cuando alimente un vector de características obtengo un símbolo simple, por ejemplo, 'A', 'B', etc.

es posible? También migré la pregunta aquí: /programming/15602963/vector-quantization-algorithms-used-to-provide-observation-sequences-for-hidden

prueba
fuente
1
Debe definir lo que quiere decir con "gesto". ¿Te refieres a la pose de la mano? ¿O el movimiento de la mano? ¿O el movimiento de los dedos de la mano? Hay muchas maneras de desollar a este gato ...
Peter K.
En este caso, estoy apuntando tanto al movimiento como a las posturas, símbolos básicos del lenguaje de signos americano que comienzan desde la ortografía con el dedo de las letras hasta los gestos básicos (en el momento: con una sola mano)
prueba del
1
Leeremos y veremos qué se me ocurre. Podría tomar un tiempo responder. Mira este espacio.
Peter K.
Hola, estoy tratando de hacer el reconocimiento de gestos con la mano con Android Open CV, soy un principiante con ambas herramientas, cualquier ayuda con los pasos e ideas de su experiencia. Muchas gracias.
user2253346
Hola, si fuera tú, comenzaría siguiendo los tutoriales en la página de Android Open CV. Antes de eso, el primer paso sería asegurarse de tener su desarrollo nativo configurado adecuadamente para que pueda ejecutar el código C en su aplicación de Android (¡si usará C en lugar de Java para obtener resultados más eficientes!)
pruebe el

Respuestas:

5

He usado HMM para el reconocimiento de gestos (no para el reconocimiento de pose). Lo que hice fue: seguir la mano y reconocer el gesto que dibujaba la mano en el aire, puedes imaginarlo como un rastro.

Puede usar HMM como reconocedor de secuencia, por lo que antes que nada necesita transformar su imagen en una secuencia de números discretos.

Para cada gesto que desee reconocer, debe entrenar a un HMM para eso.

Entonces tienes un diccionario con alguna palabra conocida. Cada uno es un HMM entrenado. Si tiene una nueva palabra (observación desconocida), puede calcular la probabilidad de que cada palabra del diccionario sea la desconocida.

Algunos pseudocódigo:

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

¡Ahora, vea cuál es el valor máximo en probabilidades y obtendrá la palabra más probable del diccionario!

Mira aquí:

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
fuente
Gracias por tan buena respuesta. Entendí todo lo que dijiste. Mi problema actual es cómo obtendré las observaciones, es decir, [112223333,222333, etc. ... es decir, cómo puedo convertir mis datos actuales (por ejemplo, longitud y ancho de la mano + movimiento al mismo tiempo + ángulo de movimiento, etc.) a este tipo de números? De mi edición mencioné que probablemente buscaré clustering y K Means para obtener un vector de 'código'. ¿Cuál es tu opinión? ¡De nuevo, muchas gracias!
prueba
1
Sí, esto es un problema. utilicé kmeans pero no encajaba en mi problema, así que simplemente utilicé los centroides y "discreticé" el gesto con una distancia eculideana de los centroides ... seguro que puedes hacerlo inteligente y agregar más datos como velocidad y kmeans podrían encajar, pero no no sé lo siento ... hacer algunas pruebas! a veces sucedió en machinelarning que algunas soluciones empíricas funcionan mejor para algunos datos particulares ... ¡pruebe diferentes soluciones!
nkint
(si necesita algún ejemplo de cómo usar kmeans con opencv, solo pregunte)
nkint
Probablemente no sea una buena solución, pero puede intentar "esqueletizar" la mano. en.wikipedia.org/wiki/Morphological_skeleton y aquí un código: felix.abecassis.me/2011/09/opencv-morphological-skeleton
nkint
si lo resuelve, solo dígame cómo logró hacerlo, es una buena tarea
:)
3

Comencemos con el reconocimiento de pose. Este documento traza el límite de la mano y cuenta el número de detecciones de la punta del dedo desde ese límite. Una cosa a tener en cuenta en ese documento es que no se requiere información de "estado". Para la estimación de pose / posición, los HMM probablemente no encajan bien.

La información del gesto se adapta mejor a la gama HMM para la resolución de problemas. Sin embargo, necesitaría ver un poco más del tipo de datos que usará para los gestos. ¿Puedes explicar un poco más sobre el algoritmo que genera los datos que tienes?

El problema es que seleccionar la estructura correcta del modelo oculto de Markov tiene una gran influencia en la precisión alcanzable ... Advertencia: ¡Enlace PDF!

Peter K.
fuente
1
¡He creado una actualización para la pregunta! Muchas gracias por su información
prueba