Reconhecimento de gestos com modelos de Markov ocultos

8

Atualmente, estou trabalhando em um sistema de reconhecimento de gestos (para um aplicativo Android). Acho que concluí a etapa de processamento da imagem, onde sou capaz de extrair o contorno da mão (estou usando uma luva para evitar a subtração de fundo por enquanto).

Também estou obtendo a elipse / retângulo delimitador, o centróide como características de forma 'importantes' da mão.

Meu problema é que não há muita literatura indicando qual é o próximo estágio antes da classificação da imagem através do modelo oculto de Markov. Estou achando esse estágio de 'Extração de recursos' muito ambíguo.

Atualmente, estou obtendo uma lista de ângulos do contorno (que é aproximado para obter um número limitado de ângulos)

O problema é que não tenho idéia do que fazer a seguir. Quando pesquiso literatura como 'Classificação de formas usando HMMs', ainda acho difícil o que devo fazer a seguir.

Como ferramenta para o HMM, planejo usar o JaHMM. Mas não sei como experimentar a ferramenta nesse estágio, pois não sei qual será a entrada para esse estágio de classificação!

Isso mostra as informações que posso obter da minha mão

Encontrei uma lista de funções que encontrei em alguma literatura, como Descritores Rápidos de Fourier, Descritores de Curvatura, B Spline; no entanto, não tenho noção de como aplicar essas funções aos meus dados atuais (ou seja, lista de ângulos, por exemplo: -63, 154, 3, 23, 54, ....)


ATUALIZAÇÃO 1:

Obrigado pela sua informação. @Peter K.

Em relação às poses: eu procuraria um conjunto de palavras em língua de sinais americana, escritas com os dedos, por exemplo, 'cachorro' -> 'd' 'o' 'g' (3 estados); mas no momento em que ainda não decidi o que fazer.

Atualmente, estou lendo mais alguns artigos para ver que tipo de informação devo extrair, como:

  • centróide da mão
  • ângulo de movimento
  • distância de um ponto em particular a diferentes pontos do contorno da mão (etc.)

Agora, encontrei um artigo que parece mostrar o que quero fazer, não tenho certeza:

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

Atualmente, estou lendo a seção 5 - Quantização vetorial (ouvi falar desse termo antes, mas não sei realmente o que ele envolve, e na figura 5 parece haver um algoritmo complexo que, se entendi corretamente, converte o conjunto de valores que alcanço da mão (mencionada anteriormente) em 1 dígito, que eu posso usar como sequência de observação para treinar um HMM para um sinal específico 1. Você acha que estou seguindo o caminho certo? (Estou trabalhando no Android, (NDK) , Encontrei o JaHMM como uma ferramenta HMM e usei o OpenCV para processamento de imagens.

@ Peter K. Obrigado pela sua resposta. Com relação à geração de dados, planejava seguir as etapas deste artigo, depois de produzir meu conjunto de dados pessoais: (seções 4 e 5) http://www.i.ci.ritsumei.ac.jp/~shimada/papers/vi02 -tanibata.pdf


ATUALIZAÇÃO 2: lembrando que um gesto é formado de {postura a, postura b, postura c}

Agora estou pensando que devo usar alguma forma de algoritmo de classificação. Ou seja, atualmente tenho um conjunto de vetores de recursos:

Postura A: [ângulo de elipse em torno dela, relação altura: largura]

  • 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: [estruturada da mesma maneira que a 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 ..

e gostaria que, ao alimentar um vetor de característica, obtenho um símbolo simples, por exemplo, 'A', 'B' etc.

Isso é possível? Também migrei a pergunta aqui: /programming/15602963/vector-quantization-algorithms-used-to-provide-observation-sequences-for-hidden

teste
fonte
1
Você precisa definir o que você quer dizer com "gesto". Você quer dizer a pose da mão? Ou o movimento da mão? Ou o movimento dos dedos da mão? Há muitas maneiras de esfolar este gato ...
Peter K.
Neste caso, estou apontando para movimentos e posturas, símbolos básicos da linguagem dos sinais americanos, começando pela grafia dos dedos das letras aos gestos básicos (no momento: com uma mão)
teste
1
Vai ler e ver o que eu posso fazer. Pode demorar um pouco para responder. Assista esse espaço.
Peter K.
Olá, estou tentando fazer o reconhecimento de gestos com a mão com o Android Open CV, sou iniciante com as duas ferramentas, qualquer ajuda com as etapas e idéias da sua experiência. Muito obrigado.
precisa saber é o seguinte
Olá, se eu fosse você, começaria seguindo os tutoriais na página de cv aberto do Android. Antes disso, o primeiro passo seria garantir que seu desenvolvimento nativo fosse configurado apropriadamente para que você possa executar o código C em seu aplicativo Android (se você estiver usando C em vez de java para obter resultados mais eficientes!)
teste em

Respostas:

5

Eu usei o HMM para reconhecimento de gestos (não para reconhecimento de pose). O que eu fiz foi: rastrear a mão e reconhecer o gesto que a mão estava desenhando no ar, você pode imaginá-la como uma trilha.

Você pode usar o HMM como reconhecedor de sequência. Primeiro, você precisa transformar sua imagem em uma sequência numérica discreta.

Para cada gesto que você deseja reconhecer, você precisa treinar um HMM para isso.

Então você tem um dicionário com alguma palavra conhecida. Cada um é um HMM treinado. Se você tiver uma nova palavra (observação desconhecida), poderá calcular a probabilidade de cada palavra do dicionário ser provavelmente a desconhecida.

Algum pseudo-có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) )

Agora, veja qual é o valor máximo em probabilidades e você obtém a palavra mais provável do dicionário!

Veja aqui:

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
fonte
Obrigado por uma ótima resposta. Eu entendi tudo o que você disse. Meu problema atual é como vou obter as observações, por exemplo [112223333,222333, etc ...] ou seja, como posso converter meus dados atuais (por exemplo, comprimento e largura da mão + movimento ao mesmo tempo + ângulo de movimento etc.) para esses tipos de números? Na minha edição, mencionei que provavelmente estarei olhando para o cluster e o K Means para obter um vetor de 'código'. Qual é o seu feedback? Muito obrigado novamente!
teste
1
sim, isso é um problema. usei kmeans, mas ele não se encaixava no meu problema, então simplesmente usei centróides e "discretizei" o gesto com distância eculidiana dos centróides .. com certeza você pode torná-lo inteligente e adicionar mais dados, como velocidade e kmeans, mas eu não sinto muito .. faça algumas tentativas! às vezes acontecia na máquina que algumas soluções empíricas funcionam melhor para alguns dados em particular. tente soluções diferentes!
Nkint 24/03
(se você precisar de algum exemplo de como usar kmeans com opencv basta perguntar)
nkint
probabilly não é uma boa solução, mas você pode tentar "esqueletizar" a mão .. en.wikipedia.org/wiki/Morphological_skeleton e aqui algum código: felix.abecassis.me/2011/09/opencv-morphological-skeleton
nkint
se você resolvê-lo, apenas me diga como conseguiu fazê-lo, é uma boa tarefa
:) nkint
3

Vamos começar com o reconhecimento de pose. Este documento rastreia o limite da mão e conta o número de detecções da ponta do dedo a partir desse limite. Uma coisa a ser observada nesse artigo é que não há informações de "estado" necessárias. Para estimativa de pose / posição, os HMMs provavelmente não são um bom ajuste.

As informações dos gestos se encaixam melhor na gama HMM para a solução de problemas. No entanto, eu precisaria ver um pouco mais do tipo de dados que você usará para gestos. Você pode explicar um pouco mais sobre o algoritmo que gera os dados que você possui?

O problema é que a seleção da estrutura correta do modelo Markov oculto influencia bastante a precisão alcançável ... Aviso: link PDF!

Peter K.
fonte
1
Eu criei uma atualização para a pergunta! Muito obrigado pela sua informação
teste