Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

de:universeller_bayescher_bilderkenner:gestenkinect

Gestenerkennung mit der Kinect (SS2013)

Das Projekt entstand als Erweiterung der Gestenerkennung für das AIIPS Projekt des Barrierefreien Schranksystems.

Entwicklungsumgebung

  • Microsoft Visual Studio 2010
  • MATLAB 7.9.0
  • OpenNI -1.5.2.23
  • NITE -1.5.2.21
  • SensorKinect - 5.1.0.25
  • OpenCV 2.4.3
  • Kinect XBOX 360 Kamera

Installation

Folgender Link erläutert wie die oben genannten Bibliotheken in Visual Studio 2010 eingebunden werden können 2.

Hinweis

  • Die neueren Bibliotheken NITE 2 und OpenNI2 funktionieren nur wenn man die Windows Kinect verwendet. Benutzt man die XBOX 360 Kinect müssen die älteren Bibliotheken installiert werden.
  • Unter Visual Studio müssen die 32-bit Bibliotheken und Treiber installiert werden.
  • Damit unter Windows 8 die Sensor Kinect Treiber installiert werden können, muss die automatische Treiber Zertifizierung deaktiviert werden 3.

Projektziele

  • Segmentierung der Handkonturen mittels Infrarot-Abstands-Muster (Stabilisierung der Segmentierung)
  • Erweiterung des Verfahrens mit zusätzlichen Merkmalen der Erkennung (besser Klassifizierung)
  • Maschinelles Lernen zur Klassifizierung (besser Klassifizierung)

Merkmale der Gebärdensprache
Ziel des Projektes sollte es sein, ein System zu entwickeln welches in der Lage sein sollte visuell aufgenommene Gebärdensprache in schriftliche Form umwandeln zu können. Um dies zu ermöglichen muss zuerst einmal geklärt werden was genau unter Gebärdensprache zu verstehen ist. Hauptsprachinstrumente

Merkmal Beispiel
Handstellung z.B. Handrücken zeigt nach oben oder unten, Zeigefingerhand
Ausführungsstellung Handzeichen vor der Brust, auf Augenhöhe etc.
Bewegung Richtung der Geste, Geschwindigkeit und Dauer
Mimik Augenausdruck, Blickrichtung

Verwendete Gesten

Verwendet wird das DGS der Deutschen Gebärdensprache, welches seit 2002 mit dem Behindertengleichstellungsgesetz (§ 6 BGG) offiziell in Deutschland als Sprache anerkannt ist. Es wurden folgende Gesten zum einlernen des Gestenerkennungsprogramms ausgewählt.

Da im aktuellen Programm einerseits noch viele Wichtige Faktoren fehlen wie erkennen der Mimik, mit einbeziehen des sequenziellen Ablaufs der Gesten(da momentan nur Start&-Endpunkt der Geste erfasst wird). Wurden zum Testen des Systems erst einmal nur 8 Gesten gewählt, die unterschieden werden sollten. Die einzelnen Gesten wurden zur Klassifizierung mit einem Index versehen.

Index 1 2 3 4 5 6 7 8
Geste Raum Anrufen Computer Einkaufen Erdgeschoss Kalt Lernen Mitbringen

Programm

Merkmale berechnen

Das Programm zum Ermitteln der Konvexen Hülle zweier Hände mittels Kinect OpenNI wurde von einem OpenSource Programm übernommen 4 und entsprechend der Erfordernisse angepasst. Es wurde die Ermittlung der verschiedenen Merkmale (Verhältnis zwischen Konvexer Hülle und Kontur, Abstand der beiden Hände in X&Y Koordinaten zum Kopf), das Bilden eines Arithmetischen Mittels von x Werten. Und die nötige Sequenz zum Bestimmen der Merkmale an 2 verschiedenen Positionen ergänzt.

Der Merkmalsvektor enthält folgende Einträge.

Index Merkmal Index Merkmal Index Merkmal Index Merkmal
1.Position Linke Hand x1 X-Koordinate y1 Y-Koordinate r1 Verhältnis Konv. Hülle & Kontur d1 Conv. Defekte
Rechte Hand x2 X-Koordinate y2 Y-Koordinate r2 Verhältnis Konv. Hülle & Kontur d2 Conv. Defekte
2.Position Linke Hand x3 X-Koordinate y3 Y-Koordinate r3 Verhältnis Konv. Hülle & Kontur d3 Conv. Defekte
Rechte Hand x4 X-Koordinate y4 Y-Koordinate r4 Verhältnis Konv. Hülle & Kontur d4 Conv. Defekte

Diese Merkmale werden in einem Merkmalsvektor mit 1×16 Einträgen über die MATLAB Engine an ein in MATLAB geschriebenes LCS gesendet, welches die Klassifikation übernimmt.

Ausführungsstellung
Um die Ausführungsstellung zu erfassen, wird das Skelett-Modell der Kinect verwendet, folgender Link gibt eine übersicht über die Funktionsweise des Algorithmus 10.

Die Kinect SDK liefert einen Algorithmus der Fähig ist innerhalb des Infrarottiefenbildes einen Menschlichen Körper zu erkennen. Mit Hilfe der OpenNI-Bibliothek kann diese Funktionalität auch in einem OpenCV Projekt genutzt werden, die dazugehörige Bibliothek heißt „SkeletonSensor.h“. Wurde ein Mensch erkannt wir eine neue User-ID angelegt und innerhalb dieser ID mit Hilfe des Kinect-Algorithmus ein Menschliches Skelet angelegt.

1 |[fh] text |[sh]
Skeleton SkeletonSensor::getSkeleton(const unsigned int uid)
{
    Skeleton result;
 
    // not tracking user
    if(!userG_.GetSkeletonCap().IsTracking(uid))
        return result;
 
    // Array of available joints
    const unsigned int nJoints = 15;
    XnSkeletonJoint joints[nJoints] = 
    {   XN_SKEL_HEAD,
        XN_SKEL_NECK,
        XN_SKEL_RIGHT_SHOULDER,
        XN_SKEL_LEFT_SHOULDER,
        XN_SKEL_RIGHT_ELBOW,
        XN_SKEL_LEFT_ELBOW,
        XN_SKEL_RIGHT_HAND,
        XN_SKEL_LEFT_HAND,
        XN_SKEL_RIGHT_HIP,
        XN_SKEL_LEFT_HIP,
        XN_SKEL_RIGHT_KNEE,
        XN_SKEL_LEFT_KNEE,
        XN_SKEL_RIGHT_FOOT,
        XN_SKEL_LEFT_FOOT,
        XN_SKEL_TORSO 
    };

Der Algorithmus erkennt innerhalb des Skelets verschiedene Körperteile(Joints). Entscheidend um die Ausführungsstellung der Gebärde zu erkennen, sind hierbei die Parameter Head, Left_Hand und Right_hand. Wurde mit getSkeleton ein Skelet angelegt kann z.B. mit head.x und head.y die Koordinaten des Kopfes ausgelesen werden. Dasselbe gilt für die Koordinaten der beiden Hände, somit ist es möglich die Handstellung beider Hände in Differenz zur Position des Kopfes zu ermitteln. Diese Koordinaten dienen als erstes Merkmal.

Erfassen der Handstellung
Mit Hilfe des getSkeleton Befehls kann die Position der beiden Hände erfasst werden, womit das Problem der Segmentierung der Hand bereits gelöst ist. Nachteilig ist jedoch das dadurch die Erkennung aus einem größeren Abstand erfolgen muss, da die Kinect den gesamten Körper aufnehmen muss um ein Skeletmodell zu erstellen, womit die zur Verfügung stehende Auflösung der Hand natürlich verkleinert wird. Zur Erfassung der Handstellungen wird als erstes Merkmal das aus der Gestenerkennung bekannte Verfahren der Konvexen Hülle verwendet. Als weiteres sollte der Fläche der Hand bestimmt werden und als weiteres Merkmal verwendet werden. Da die Fläche der Hand jedoch Abhängig vom Abstand ist, welchen die Hand zur Kamera besitzt, sollte mit Hilfe des hand.z Wertes (also der Tiefeninformation) ein Abstandsunabhängiger Flächenwert bestimmt werden. Die nachfolgenden Tabellen zeigen Messungen der Fläche der Hand, in den Tabellen wurde über Miteinbeziehung des Abstandes versucht ein Abstandsunabhängigen Flächenwert zu erhalten. Jedoch zeigt die Spalte des Verhältnisses das sich auch dieser Wert mit dem Abstand ändert, da mit der Änderung des Abstandes auch teilweise Teile des Unterarmes mit segmentiert wurden.

geöffnete Hand, Kinn Höhe
Fläche Abstand Verhältnis Normalisiert mit 75 Abweichung
3544 75 265800 3544 1
3599 74 266326 3551,013333 0,998024977
3432 80 274560 3660,8 0,968094406
3513 81 284553 3794,04 0,934096636
3467 81 280827 3744,36 0,946490188
3473 82 284786 3797,146667 0,933332397
3815 71 270865 3611,533333 0,981300648
3650 72 262800 3504 1,011415525
3758 63 236754 3156,72 1,122684305
3859 69 266271 3550,28 0,998231125
3815 71 270865 3611,533333 0,981300648
4128 65 268320 3577,6 0,990608229
4065 66 268290 3577,2 0,990718998
geöffnete Hand, Brusthöhe
Fläche Abstand Verhältnis Normalisiert mit 75 Abweichung
3884 82 318488 4246,506667 0,950899249
3951 82 323982 4319,76 0,934774154
3918 81 317358 4231,44 0,954285066
4341 77 334257 4456,76 0,906039365
4449 79 351471 4686,28 0,861664262
4270 78 333060 4440,8 0,909295622
4038 75 302850 4038 1
3727 74 275798 3677,306667 1,098086281
3666 72 263952 3519,36 1,147367703
4081 78 318318 4244,24 0,951407083
5190 85 441150 5882 0,68650119
4669 85 396865 5291,533333 0,763105842
5069 85 430865 5744,866667 0,702888376
4580 82 375560 5007,466667 0,806395782
4720 80 377600 5034,666667 0,802039195
geschlossene Hand, Kinn Höhe
Fläche Abstand Verhältnis Normalisiert mit 75 Abweichung
3056 82 250592 3341,226667 1,208538182
3288 82 269616 3594,88 1,123264198
3422 82 280604 3741,386667 1,079278984
3399 81 275319 3670,92 1,099996731
3735 75 280125 3735 1,081124498
3443 77 265111 3534,813333 1,142351694
3589 77 276353 3684,706667 1,095880993
4908 60 294480 3926,4 1,028422983
4875 60 292500 3900 1,035384615
3562 76 270712 3609,493333 1,11871657
3168 80 253440 3379,2 1,194957386
5335 86 458810 6117,466667 0,660077156
2710 85 230350 3071,333333 1,314738442
2818 84 236712 3156,16 1,279402819
3078 75 230850 3078 1,311890838
2806 79 221674 2955,653333 1,366195404
2711 84 227724 3036,32 1,329899352

Deswegen wurde stattdessen als weiteres Merkmal ein Verhältnis aus dem Umfang der Konvexen Hülle und der Handkontor verwendet. Da dieses Verhältnis Abstandsunabhängig ist.

Mimik
Die Mimik ist ein weiterer wichtiger Punkt der darüber entscheidet welche Bedeutung eine Handgeste besitzt. So verleiht die Mimik einer Gebärde vor allem die Bedeutung darüber ob sie Fragend oder Auffordernd gemeint ist. Die Miteinbeziehung der Mimik als weiteres Merkmal hätte die Qualität der Klassifikation zwar erhöht, wurde aus Zeitgründen in diesem Projekt aber ausgeklammert. Da eine zuverlässige Klassifizierung Menschlicher Mimik mit Hilfe einer Bilderkennungssoftware für sich alleine genommen schon eine große Herausforderung darstellt.

Bewegung
Um die Bewegungsrichtung der Handstellung feststellen zu können, werden die Merkmale Ausführung Stellung(Position der beiden Hände) und Handstellung kontinuierlich in einem Stack abgelegt und im LCS-Klassifikator mit der Übereinstimmung einer gelernten Handgeste verglichen. Eine komplette Handgeste besitzt eine Dauer von 1- 4 Sekunden, es stellt sich natürlich die Frage wie viele Frames also Strings aus Merkmalen innerhalb dieses Zeitraums gesammelt werden müssten, damit keine relevanten Informationen verloren gehen.

Grundsätzlich kann man sagen das eine Handgeste immer eine Startposition mit definierter Handstellung und eine Endposition mit definierter Handstellung besitzt. Je nach Handgeste können aber noch mehrere zwischen Bereiche auftreten, innerhalb dessen sich die Handstellung ändert. Aber auch auf das Tempo der Geste ist Entscheidend. Um das System erst einmal grundsätzlich zu Testen wurde deswegen ein Stack mit 2 Ausführungsstellungen gewählt, indem im Abstand von 2 Sekunden Handstellung und Ausführung Stellung in einem String festgehalten werden und zur Klassifikation an das LCS weitergeleitet werden. Diese Begrenzung führt natürlich dazu das die Anzahl der Gesten die unterschieden werden können sinkt.

Merkmalsvektor an MATLAB übergeben

Das Übergeben der Merkmale an das MATLAB Programm erfolgt über die MATLAB Engine. In folgendem Dokument 1. ist sehr ausführlich beschrieben wie die MATLAB-Engine in Betrieb genommen werden kann.

1 |[fh] text |[sh]
T = eng::mxCreateDoubleMatrix(1, 16, eng::mxREAL);
memcpy((void *)eng::mxGetPr(T), (void *)vMerkmal, sizeof(vMerkmal));
 
eng::engPutVariable(eng::ep, "Input", T); //T als Variable xy in MATLAB Konsole schreiben
eng::engEvalString(eng::ep, "[ cstring ] = ClassString( Input)");
eng::engEvalString(eng::ep, "[ classindex,Classifier,clselect ] = LCS( cstring)");
 
 
eng::mxArray *array_ptr = eng::engGetVariable(eng::ep, "clselect");
if (array_ptr == NULL)
{			
   printf("Could not get variable_name1 from MATLAB workspace.\n");
}
			double pr1 = (double)mxGetPr(array_ptr)[0];

Funktionen des MATLAB Programms

Die folgenden Programme müssen im Quellverzeichnis von MATLAB liegen,bei Windows 8 ist dies:
C:\Users\Benutzername\Documents\MATLAB

Während die .mat-files welche die Arithmetischen Mittelwerte (mwMerkm.mat) der Merkmalsvektoren und den Classifier (Classifer.mat) enthalten, im Installationsordner von Matlab abgelegt werden müssen. Dies darf nicht verwechselt werden!

ClassString - Bilden eines Klassenbezeichners für überlappende Klassen.

Die Funktion dient dazu folgendes Problem zu lösen. Aus dem Merkmalsvektor kann für die Klasse x beispielsweise der Wert für die X-Koordinaten der linken Hand, in einem Berreich von -330 bis 190 mit kontinuerlichen Werten schwanken. Für die Klassifikation im LCS werden jedoch diskrete Werte benötigt. Desweiteren kann ein spezifischer Wert für die X-Koordinate sich mit verschiedenen Klassen überschneiden, d.h im Fall das es viele Überschneidungen gibt würde Anzahl an Kombinationen immer weiter steigen.Folgende Funktion löst das Problem als Beispiel dient der Input der Merkmalswerte

Input = [32.148, 42.37, 12.12, 32.902, 112.472, 32.12, 32.54, 12.001, 11.32, 1266.9, 12.32, 90.12, 12.32, 32.32, 12.1, 120.31]

Eingelernte Werte für das Merkmal x1 (also der räumlichen Differenz zwischen der linken Hand, an Position 1 und dem Kopf), für die 8 Klassen.
x1 = [30 55 75 190 19,5 37 210 110]

Innerhalb der Funktion Classstring befindet sich eine for-Schleife in welcher die gespeicherter x1 Werte für die 8-Klassen durchlaufen und kontrolliert wird ob sich der Input x1, also die 32.148 innerhalb der Grenzen befindet, die Grenzen sind hierbei der Berreich in dem die kontinuierlichen Werte des Merkmals schwanken können.

1 |[fh] text |[sh]
load('mwMerkm','x1') 
for i=1:8 
    if (x1(1,i)-distx <= Input(1,1)) && (x1(1,i)+distx >= Input(1,1))
        [ cstring(1,1) ] = newclass( cstring(1,1),i ) % Funktion um andere Klasse anzuhängen
    end 
end
 
.
.
 
function [ in ] = newclass( in,count )
 
    if in == 0
        in =  in + count
    elseif in < 10
        in = in * 10 + count
    elseif in < 100 
        in = in * 10 + count
    elseif in < 1000
        in = in * 10 + count
    elseif in < 10000
        in = in * 10 + count
    elseif in < 100000
        in = in * 10 + count
    elseif in < 1000000
        in = in * 10 + count
    elseif in < 10000000
        in = in * 10 + count
    elseif in < 100000000
        in = in * 10 + count
 
    end
.
.

Im Falle dessen das sich das Input x1 innerhalb der Grenzen eines x1 des Speichers befindet wird nun die Funktion newclass aufgerufen. Die Funktion dient dazu einen neuen Klassenstring zu generieren der sich aus allen Klassen zusammensetzt die innerhalb der Grenzen des Input x1 befinden. Im Falle des Beispiels befindet sich aus x1. Der 1.Wert = 30, der 2.Wert =55, der 5.Wert = 19.5 und der 6.Wert = 37 innerhalb des Inputs von 32.148. Der erzeugte neue Klassenstring wäre also 1256 in der ersten Zeile von cstring.

Entsprechend wird innerhalb der Funktion mit den gespeicherten Inhalten von x2,x3,x4,y1,y2,y3,y4,r1,r2,r3,r4,d1,d2,d3,d4 verfahren.

LCS – Klassifizierung

Zur Klassifizierung wurde eine LCS verwendet 7. Der Classifier Classifier.mat wird über den Matlab-Befehl load zunächst aus dem Speicher geladen. Durch das Speichern des Classifier Arrays können die Werte eines Trainings auch nach erneutem Programmstart weiterverwendet werden.

Der Classifier Array ist folgendermaßen aufgebaut

1 2 3 4 5 67 8 9 10 11 12 1314 1516 17 18 19 20 21 22 23 2425
Index M M M M MM M M M M M MM MM M F F F F F F FF
1-x x1 y1 r1 d1 x2 y2 r2 d2 x3 y3 r3 d3 x4 y4 r4 d4 G1 G2 G3 G4 G5 G6 G7 G8

Wobei die erste Zeile der Index des Classifers ist und die nächsten 16 Zeilen mit M die bereits bekannten Merkmale sind, die letzten 8 Zeilen F enthalten die Fitnesswerte für die einzelnen Gesten G1-G8. Der Index wird innerhalb der Variablen clselect gespeichert.

Als Input dienen der Klassenstring cstring aus der ClassString-Funktion. Das LCS sucht zunächst im Classifier nach einem identischen Eintrag von cstring.

1 |[fh] text |[sh]
.
.
.
[r,c]=size(Classifier);
 
        %Classifier mit Input vergleichen
        for i=1:r
            equal = 0;
            for j=1:16
                if (Classifier(i,j+1)) == (cstring(1,j)) %Alle Classifier mit aktuellem Input vergleichen
                   equal = equal + 1;
                end
             end  
             if equal == 16 %Wenn die Inputdaten bereits bekannt sind
                classindex = i; %Index (Zeile) des aktuell gültigen Classifiers
                break  
             end 
        end
 
        if equal == 16
             %Höchsten Fitnesswert auswählen
             fitnessselect = [0,0,0,0,0,0,0,0]; % Array zum zwischenspeichern der Fitnesswerte
             for k=1:8
                fitnessselect(1,k) = Classifier(classindex,k+17);
             end
 
             [mfitness,clselect] = max(fitnessselect); %Maximaler Wert bei gleicherheit der Wert ganz links
        End
.
.
.

Wenn ein identischer Eintrag gefunden wurde wird der Index Klasse mit dem höchsten Fitnesswert in clselect zurückgeben. Im Falle das noch kein identischer Eintrag besteht wird ein neuer Eintrag zum Classifier hinzugefügt und eine zufällige Klasse ausgewählt. In der Variablen classindex wird die Zeile des aktuellen aktiven Classifiers zwischengespeichert so das anhand der Zeileninformation(classindex) und der Spalteninformation(clselect), sollte im OpenCV Programm der Trainingsmodus aktiviert worden sein, der Fitnesswert aktualisiert werden kann. Dies geschieht in der Funktion Fitness.

Fitness – Anpassen der Fitnesswerte des aktiven Classifiers im Trainingsmodus.

1 |[fh] text |[sh]
function [ Classifier ] = Fitness(clselect,classindex )
%UNTITLED Summary of this function goes here
%   Detailed explanation goes here
 
load('Classifier') %Läd die Datei mit den Classifiern
clselect = evalin( 'base', 'clselect' );
classindex = evalin( 'base', 'classindex' );
 
 
Classifier(classindex,clselect+17)=Classifier(classindex,clselect+17)+1; % Fitnesswert erhoehen
 
 
save('Classifier') %Läd die Datei mit den Classifiern
 
end

Merkmalsgrenzen – Bilden von Durchschnittswerten der Merkmale beim Training
Über die Variable Response werden für die Klassen im Speicher die Durchschnittswerte der Merkmale aufgrund der Klassifizierung über die Tastatureingabe aus dem OpenCV Programm angepasst.

1 |[fh] text |[sh]
function [ Response ] = Merkmalsgrenzen( Input,Response )
 
Response = evalin( 'base', 'Response' );
Input = evalin( 'base', 'Input' );
 
load('mwMerkm') 
load('mwMerkm','x1') 
x1(1,Response) = (x1(1,Response) + Input(1,1))/2;
 
....
...
..

In der aktuellen Version ist nur das Hinzufügen von positiven Fitnesswerten implementiert, es gibt also noch kein verlernen.

Einlernen der Gesten

Nachdem das Programm gestartet hat, kann über dem Fenster Tiefenbild, mit dem Slider bestimmt werden ob Eintrainiert werden soll, oder eine ausgeführte Geste nur erkannt werden soll. Beim ausführen der Geste wird im Fenster Tiefenbild angezeigt an welche Position die Hand bewegt werden soll. Hände an 1.Position bewegen bedeutet, es soll die Ausführungsstellung am Anfang einer Geste gezeigt werden, nach 2 Sekunden wird im Fenster Tiefenbild, Hände an 2.Position bewegen angezeigt. Nun soll die Ausführungsstellung am Ende einer Geste gezeigt werden. Innerhalb dieser 2 Sekunden wird ein Arithmetisches Mittel der Merkmale berechnet, um die Klassifikation zu verbessen. Wurde mit dem Slider ausgewählt das Eintrainiert werden soll, hält das Programm nach dem Erreichen der 2.Position an und wartet auf eine Tastatureingabe mit der die gemachte Geste eintrainiert werden soll.

Einlernen der Geste für „anrufen“.

Einlernen der Geste für „Erdgeschoss“.

Einlernen der Geste für „lernen“.

Einlernen der Geste für „mitbringen“.

Fazit

Merkmale
Während des Trainings zeigte sich das bereits angesprochene Problem das dadurch das für die Erstellung des Skelettes die Kinect den gesamten Körper scannen muss. Die Auflösung mit der die Hand im Bild erscheint sinkt. Dies ergab den Nachteil das die Convexity-Defects der Handstellungen kaum noch erkannt werden konnten also meistens 0 waren womit dieses Merkmal quasi wegfällt. Womit Effektiv nur noch das Verhältnis aus Convexer Hülle und Handkontur als Merkmal zur Unterscheidung der Handstellungen zum Einsatz kommt, was viel zu wenig wäre um die Vielzahl an möglichen Gebärden im DGS unterscheiden zu können. Eine Möglichkeit wäre es ein Pattern-Matching zu verwenden mit dem das Inventar der Handstellungen eingelernt werden kann. Folgendes ebenfalls mit Matlab entstanden Programm beschäftig sich mit diesem Problem. 8

Problematisch ist hierbei jedoch wieder das dieses Programm so ausgelegt ist das eine Hand direkt in die Kamera gehalten wird also die Maximale Auflösung zu Verfügung hat. Weswegen auch hier wieder die Güte in Frage steht. Um trotzdem die Handstellung besser erfassen zu können, da die Auflösung mit der die Kinect die Tiefenbilder erzeugt fix ist wäre die Möglichkeit zu prüfen eine Kamera mit höher Auflösung mit der Kinect zu verbinden. Folgendes Projekt zeigt hierfür ein Beispiel 9

Klassifizierung
Während des Trainings der Daten zeigte sich bei dem Programm beim Einlernen der 8 Gesten das selbst nach mehreren Hundert Trainingsbeispielen kein großer Lernerfolg des System zu erkennen war. Der Classifier hatte des Weiteren ebenfalls über hundert Einträge. Um die Ursachen genauer zu untersuchen wurde die Datei in dem der Classifier gespeichert ist Classifer.mat gelöscht und diesmal wurden nur 2 Gesten eingelernt diesmal hatte der Classifier nur 26 Einträge es stellte sich auch schneller ein Lernerfolg ein. Es wurden die Gesten für Raum und Computer eingelernt.

Classifer für 2 Klassen

Index M M M M M M M M M M M M M M M M F F F F F F F F
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
2 3 1 13 13 13 13 13 13 13 1 13 13 13 1 13 13 0 0 0 0 0 0 0 0
3 3 13 13 13 13 13 13 13 13 1 13 13 13 1 13 13 4 0 0 0 0 0 0 0
4 13 13 13 13 13 13 13 13 13 1 13 13 13 1 13 13 6 0 0 0 0 0 0 0
5 13 1 13 13 13 13 13 13 13 1 13 13 13 1 13 13 6 0 0 0 0 0 0 0
6 13 1 13 13 13 13 13 13 1 1 13 13 13 1 13 13 3 0 0 0 0 0 0 0
7 13 13 13 13 13 13 13 13 13 3 13 13 13 3 13 13 0 0 21 0 0 0 0 0
8 0 13 13 13 13 13 13 13 13 1 13 13 13 1 13 13 3 0 0 0 0 0 0 0
9 1 13 13 13 13 13 13 13 13 1 13 13 13 1 13 13 2 0 0 0 0 0 0 0
10 3 13 13 13 13 13 13 13 3 3 13 13 13 3 13 13 0 0 1 0 0 0 0 0
11 13 13 13 13 13 13 13 13 3 3 13 13 13 3 13 13 0 0 1 0 0 0 0 0
12 3 13 13 13 13 13 13 13 13 3 13 13 13 13 13 13 0 0 2 0 0 0 0 0
13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 5 1 6 0 0 0 0 0
14 13 13 13 13 13 13 13 13 13 3 13 13 13 13 13 13 0 0 3 0 0 0 0 0
15 13 13 13 13 13 13 13 13 13 3 13 0 13 13 13 13 0 0 1 0 0 0 0 0
16 13 13 13 13 13 13 13 13 13 1 13 13 13 13 13 13 3 0 0 0 0 0 0 0
17 13 3 13 13 13 3 13 13 13 3 13 13 13 3 13 13 0 0 0 0 0 0 0 0
18 3 3 13 13 13 13 13 13 13 1 13 13 13 1 13 13 0 0 0 0 0 0 0 0
19 13 3 13 13 13 13 13 13 13 1 13 13 13 1 13 13 0 0 0 0 0 0 0 0
20 3 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 1 0 0 0 0 0 0 0
21 1 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 2 0 0 0 0 0 0 0
22 13 13 13 13 13 3 13 13 13 13 13 13 13 13 13 13 1 0 0 0 0 0 0 0
23 13 13 13 13 13 13 13 13 13 13 13 13 13 3 13 13 0 0 1 0 0 0 0 0
24 0 13 13 13 13 13 13 13 0 13 13 13 13 13 13 13 0 0 0 0 0 0 0 0
25 0 13 13 13 13 13 13 0 0 13 13 13 13 13 13 13 0 0 0 0 0 0 0 0
26 0 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 0 0 0 0 0 0 0 0
27 13 13 13 13 13 13 13 13 13 13 13 13 13 1 13 13 0 0 0 0 0 0 0 0
28 13 13 13 13 13 0 13 13 13 1 13 13 13 1 13 13 0 0 0 0 0 0 0 0

Hierbei kann man in der 17.Spalte gut sehen das, das Merkmal der Convexity-Defects keinerlei Einfluss auf die Klassifizierung hat. Aber auch in Zeile 13 beispielsweise das dort die Merkmale für beide Klassen übereinstimmen. Da sich die Geste für Raum und Computer von der Ausführungsstellung her ziemlich ähnlich sind. Dass heißt nach aktuellem Stand des Programms würde mit anwachsender Klassenanzahl auch die Anzahl unterschiedlicher Kombinationsmöglichkeiten der Klassen zu stark anwachsen und damit ein erfolgreiches Training des Systems unrealistisch machen. Deswegen sollte getestet werden verschiedene zusammenhängende Merkmale wie zum Beispiel die Koordinaten zu Blöcken zusammenzufassen und diese dann einer Vektorquantisierung zu unterziehen und dann das Ergebnis der Vektorquantisierung an das LCS zu übermitteln.

Source-Code

Literatur

[1] MATLAB ExternalInterfaces, http://www.mathworks.com/help/pdf_doc/matlab/apiext.pdf ;3.7.2013

[2] How to program using OpenNI in Visual C++ , http://www.technolabsz.com/2012/08/how-to-program-openni-using-visual-c.html ;3.7.2013

[3] Windows 8 Driver Install Error, http://supportsystem.livehelpnow.net/article/8205/24097/ ; 3.7.2013

[4] Nadine Leßmann, Thomas Plötz, Alexander Rüegg, Jörg Waltemathe. Zeichen & Gebärden. Universität Bielefeld Technische Fakultät, 2000

[5] Kinect-Hand-Processing, https://github.com/bmwesting/Kinect-Hand-Processing; 3.7.2013

[6] Allgemeines Gebärdenwörterbuch, http://www.sign-lang.uni-hamburg.de/alex/lemmata/indizes/indexa.htm ;3.7.2013

[7] Gerd Doeben-Henisch.Engineering of Intelligent Evolutionary Semiotic Systems http://www.uffmm.org/EoIESS-TH/gclt/node58.html ;3.7.2013

[8] Point Pattern Matching Algorithm for Hand Gesture / American Sign Language (ASL) Recognition http://www.mathworks.nl/matlabcentral/fileexchange/30447-point-pattern-matching-algorithm-for-hand-gesture-american-sign-language-asl-recognition ;3.7.2013

[9] RGBDToolkit beta 005 http://www.rgbdtoolkit.com/tutorials.html ;3.7.2013

[10] The Anatomy of the Kinect Algorithms Explained http://siliconangle.com/blog/2011/03/30/the-anatomy-of-the-kinect-algorithms-explained/ ;6.7.2013

de/universeller_bayescher_bilderkenner/gestenkinect.txt · Zuletzt geändert: 2014/11/24 13:20 (Externe Bearbeitung)