Gestenerkennung mit Hidden Markov-Modellen


8

Ich arbeite derzeit an einem Gestenerkennungssystem (für eine Android-Anwendung). Ich glaube, ich habe die Bildverarbeitungsphase abgeschlossen, in der ich die Kontur der Hand extrahieren kann (ich trage einen Handschuh, um vorerst eine Hintergrundsubtraktion zu vermeiden).

Ich bekomme auch die begrenzende Ellipse / das Rechteck, den Schwerpunkt als "wichtige" Formmerkmale der Hand.

Mein Problem ist, dass nicht viel Literatur angibt, was die nächste Stufe vor der Klassifizierung des Bildes durch das Hidden-Markov-Modell ist. Ich finde diese Phase der Feature-Extraktion sehr zweideutig.

Derzeit erhalte ich eine Liste der Winkel der Kontur (die angenähert wird, um eine begrenzte Anzahl von Winkeln zu erhalten).

Das Problem ist, dass ich keine Ahnung habe, was ich als nächstes tun soll. Wenn ich nach Literatur als "Formklassifizierung mit HMMs" suche, fällt es mir immer noch schwer, was ich als nächstes tun soll.

Als Werkzeug für HMM plane ich JaHMM zu verwenden. Aber ich weiß noch nicht, wie ich mit dem Tool experimentieren soll, da ich nicht weiß, was der Input für diese Klassifizierungsphase sein wird!

Dies zeigt die Informationen, die ich aus meiner Hand erhalten kann

Ich bin auf eine Liste von Funktionen gestoßen, die ich in einigen Literaturstellen gefunden habe, wie z. B. Fast Fourier Descriptors, Curvature Descriptors, B Spline; Ich habe jedoch keine Ahnung, wie ich diese Funktionen auf meine aktuellen Daten anwenden soll (dh Liste der Winkel, z. B.: -63, 154, 3, 23, 54, ....).


UPDATE 1:

Danke für Ihre Information. @ Peter K.

In Bezug auf die Posen: Ich wollte eine Reihe von Wörtern in amerikanischer Gebärdensprache verwenden, die mit den Fingern geschrieben sind, z. B. 'Hund' -> 'd' 'o' 'g' (3 Staaten); Aber in dem Moment habe ich mich noch nicht entschieden.

Ich lese gerade einige weitere Artikel, um zu sehen, welche Art von Informationen ich extrahieren sollte, wie zum Beispiel:

  • Schwerpunkt der Hand
  • Bewegungswinkel
  • Abstand von einem bestimmten Punkt zu verschiedenen Punkten der Handkontur (etc ..)

Jetzt bin ich auf ein Papier gestoßen, das zu zeigen scheint, was ich tun möchte. Ich bin mir nicht sicher:

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

Ich lese gerade Abschnitt 5 - Vektorquantisierung (Ich habe bereits von diesem Begriff gehört, weiß aber nicht genau, worum es geht, und in Abbildung 5 scheint es einen komplexen Algorithmus zu geben, der, wenn ich richtig verstanden habe, die von mir erreichten Werte konvertiert von der Hand (gerade erwähnt) in eine Ziffer, die ich als Beobachtungssequenz verwenden kann, um ein HMM für ein bestimmtes Zeichen zu trainieren. Glaubst du, ich bewege mich auf dem richtigen Weg? (Ich arbeite an Android, (NDK) Ich fand JaHMM als HMM-Tool und verwendete OpenCV für die Bildverarbeitung.

@ Peter K. Vielen Dank für Ihre Antwort. In Bezug auf die Datengenerierung hatte ich vor, die Schritte dieses Dokuments zu befolgen, nachdem ich meinen persönlichen Datensatz erstellt hatte: (Abschnitt 4 und 5) http://www.i.ci.ritsumei.ac.jp/~shimada/papers/vi02 -tanibata.pdf


UPDATE 2: Beachten Sie, dass eine Geste aus {Haltung a, Haltung b, Haltung c} besteht.

Ich denke jetzt, dass ich irgendeine Form von Klassifizierungsalgorithmus verwenden muss. Das heißt, ich habe derzeit eine Reihe von Merkmalsvektoren:

Haltung A: [Ellipsenwinkel um sie herum, Verhältnis Höhe: Breite]

  • 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

Haltung B: [strukturiert wie Haltung 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

usw..

und ich möchte, dass ich beim Zuführen eines Merkmalsvektors ein einfaches Symbol erhalte, z. B. 'A', 'B' usw.

Ist das möglich? Ich habe die Frage auch hier migriert: /programming/15602963/vector-quantization-algorithms-used-to-provide-observation-sequences-for-hidden


1
Sie müssen definieren, was Sie unter "Geste" verstehen. Meinst du die Pose der Hand? Oder die Bewegung der Hand? Oder die Bewegung der Finger der Hand? Es gibt viele Möglichkeiten, diese Katze zu häuten ...
Peter K.

In diesem Fall strebe ich sowohl Bewegung als auch Körperhaltung an, grundlegende Symbole der amerikanischen Zeichensprache, angefangen von der Rechtschreibung der Buchstaben bis hin zu einfachen Gesten (zum Zeitpunkt: einhändig)
Test

1
Werde lesen und sehen, was ich mir einfallen lassen kann. Es kann eine Weile dauern, bis Sie antworten. Beobachten Sie diesen Raum.
Peter K.

Hallo, ich versuche, mit Android Open CV eine Handgestenerkennung durchzuführen. Ich bin ein Anfänger mit beiden Tools, jeder Hilfe mit Schritten und Ideen aus Ihrer Erfahrung. Ich danke dir sehr.
user2253346

Hallo, wenn ich du wäre, würde ich zunächst den Tutorials auf der Android Open CV-Seite folgen. Zuvor besteht der erste Schritt darin, sicherzustellen, dass Ihre native Entwicklung ordnungsgemäß eingerichtet ist, damit Sie C-Code in Ihrer Android-Anwendung ausführen können (wenn Sie C anstelle von Java für effizientere Ergebnisse verwenden!)
Test

Antworten:


5

Ich habe HMM zur Gestenerkennung verwendet (keine Posenerkennung). Was ich getan habe war: Verfolge die Hand und erkenne die Geste, die die Hand in der Luft zeichnete. Du kannst sie dir als Spur vorstellen.

Sie können HMM als Sequenzerkennung verwenden. Zunächst müssen Sie Ihr Bild in eine diskrete Zahlenfolge umwandeln.

Für jede Geste, die Sie erkennen möchten, müssen Sie ein HMM dafür trainieren.

Sie haben also ein Wörterbuch mit einem bekannten Wort. Jeder ist ein geschultes HMM. Wenn Sie ein neues Wort haben (unbekannte Beobachtung), können Sie die Wahrscheinlichkeit berechnen, dass jedes Wort des Wörterbuchs wahrscheinlich das unbekannte ist.

Ein Pseudocode:

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

Sehen Sie nun, was der Maximalwert für Wahrscheinlichkeiten ist, und Sie erhalten das wahrscheinlichste Wort des Wörterbuchs!

Siehe hier:

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/


Vielen Dank für diese tolle Antwort. Ich habe alles verstanden, was du gesagt hast. Mein aktuelles Problem ist, wie ich die Beobachtungen erhalte, dh [112223333,222333, etc ...] dh wie kann ich meine aktuellen Daten konvertieren (z. B. Länge und Breite der Hand + Bewegung gleichzeitig + Bewegungswinkel usw.) zu diesen Arten von Zahlen? In meiner Bearbeitung habe ich erwähnt, dass ich mich wahrscheinlich mit Clustering und K Means befassen werde, um einen 'Code'-Vektor zu erhalten. Was ist Ihr Feedback? Danke dir nochmal!
Test

1
Ja, das ist ein Problem. Ich habe kmeans verwendet, aber es passte nicht in mein Problem, also habe ich einfach Zentroide verwendet und die Geste mit eculideanem Abstand von Zentroiden "diskretisiert" Ich weiß nicht, tut mir leid. Mach ein paar Versuche! Manchmal kam es beim Machinelarning vor, dass einige empirische Lösungen für bestimmte Daten besser funktionieren. Probieren Sie verschiedene Lösungen aus!
Nkint

(Wenn Sie ein Beispiel brauchen, wie man kmeans mit opencv benutzt, fragen Sie einfach)
nkint

Wahrscheinlich keine gute Lösung, aber Sie können versuchen, die Hand zu "skelettieren". en.wikipedia.org/wiki/Morphological_skeleton und hier ein Code: felix.abecassis.me/2011/09/opencv-morphological-skeleton
nkint

Wenn Sie es lösen, sagen Sie mir einfach, wie Sie es geschafft haben, es ist eine schöne Aufgabe
:)

3

Beginnen wir mit der Posenerkennung. Dieses Papier zeichnet die Handgrenze nach und zählt die Anzahl der Fingerspitzenerkennungen von dieser Grenze aus. In diesem Artikel ist zu beachten, dass keine "Status" -Informationen erforderlich sind. Für die Posen- / Positionsschätzung sind HMMs wahrscheinlich nicht gut geeignet.

Die Gesteninformationen passen zur Problemlösung besser in den HMM-Bereich. Ich müsste jedoch ein bisschen mehr von den Daten sehen, die Sie für Gesten verwenden werden. Können Sie etwas mehr über den Algorithmus erklären, der Ihre Daten generiert?

Das Problem ist, dass die Auswahl der richtigen Struktur des Hidden-Markov-Modells einen erheblichen Einfluss auf die erreichbare Genauigkeit hat ... Warnung: PDF-Link!


1
Ich habe ein Update für die Frage erstellt! Vielen Dank für Ihre Informationen
Test
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.