Gebarentaal herkennen met de Microsoft Kinect Joery Vannieuwenhuyse
Promotor: prof. dr. ir. Benjamin Schrauwen Begeleiders: Pieter-Jan Kindermans, Sander Dieleman Masterproef ingediend tot het behalen van de academische graad van Master in de ingenieurswetenschappen: computerwetenschappen
Vakgroep Elektronica en Informatiesystemen Voorzitter: prof. dr. ir. Jan Van Campenhout Faculteit Ingenieurswetenschappen en Architectuur Academiejaar 2012-2013
Gebarentaal herkennen met de Microsoft Kinect Joery Vannieuwenhuyse
Promotor: prof. dr. ir. Benjamin Schrauwen Begeleiders: Pieter-Jan Kindermans, Sander Dieleman Masterproef ingediend tot het behalen van de academische graad van Master in de ingenieurswetenschappen: computerwetenschappen
Vakgroep Elektronica en Informatiesystemen Voorzitter: prof. dr. ir. Jan Van Campenhout Faculteit Ingenieurswetenschappen en Architectuur Academiejaar 2012-2013
Voorwoord Ik heb in eerste instantie gekozen voor een masterproef waarin gebruik wordt gemaakt van de Kinect camera omdat ik reeds langer de intentie had om met de voornoemde camera te werken. Echter was er altijd iets belangrijker dat me verhinderde om met zo een projectje te beginnen. Bij deze heb ik dan de kans gegrepen om met de Kinect te werken. Hiernaast is er gekozen om met gebarentaal te werken omdat dit een populaire toepassing van de Kinect aan het worden is waar ook veel onderzoek rond gebeurt. Echter had ik deze masterproef niet kunnen verwezenlijken zonder de hulp van een aantal personen, die ik dan ook expliciet wens te bedanken voor de geleverde bijdragen. David Verstraeten, Sander Dieleman en Pieter-Jan Kindermans hebben me op de vergaderingen, maar ook daarbuiten, bijgestaan met raad en tips. Ik kon te allen tijde een beroep doen op hun eigen ervaringen en meningen over bepaalde beslissingen. Deze bijstand heeft een cruciale rol gespeeld tijdens de uitvoering van deze masterproef. Voor het opnemen van de dataset wens ik expliciet Jean-Pierre Ball en Siegfried Ball te bedanken. Voor het nalezen van deze masterproef wens ik Sander Dieleman, Pieter-Jan Kindermans en Jean-Pierre Ball te bedanken. Als laatste zou ik ook nog mijn familie, vrienden en vele kennissen willen bedanken voor de steun en getoonde interesse tijdens de uitvoering van deze masterproef en mijn studies in het algemeen.
Joery Vannieuwenhuyse, 25 mei 2013
Toelating tot bruikleen De auteur geeft de toelating deze scriptie voor consultatie beschikbaar te stellen en delen van de scriptie te kopi¨eren voor persoonlijk gebruik. Elk ander gebruik valt onder de beperkingen van het auteursrecht, in het bijzonder met betrekking tot de verplichting de bron uitdrukkelijk te vermelden bij het aanhalen van resultaten uit deze scriptie.
Joery Vannieuwenhuyse, 25 mei 2013
Overzicht Gebarentaal herkennen met de Microsoft Kinect Joery Vannieuwenhuyse Promotor: Prof. Dr. Ir. Benjamin Schrauwen Begeleiders: Ir. Sander Dieleman, Ir. Pieter-Jan Kindermans Masterproef ingediend tot het behalen van de academische graad van Master in de ingenieurswetenschappen: computerwetenschappen Vakgroep Elektronica en Informatiesystemen Voorzitter: Prof. Dr. Ir.Jan Van Campenhout Faculteit Ingenieurswetenschappen en Architectuur Academiejaar 2012–2013 Universiteit Gent
Samenvatting In het eerste hoofdstuk wordt er meer algemene informatie gegeven over gebarentaal waarbij meer precies de Vlaams Belgische gebarentaal het belangrijkste is. Dat hoofdstuk dient de lezer meer achtergrond bij te brengen in verband met gebarentaal om deze masterproef te kunnen volgen en deze ook op de hoogte te stellen van de doelstelling. Daarnaast worden er ook twee use-cases besproken waarbij een commerci¨ele applicatie voor herkenning van gebaren nuttig kan zijn. Het tweede hoofdstuk geeft een overzicht van onderzoek dat reeds werd uitgevoerd en nauw aansluit bij de masterproef. Hierbij wordt gekeken naar onderzoek rond het bekomen van de nodige data voor het herkennen van gebaren, de reeds toegepaste methoden voor het effectief herkennen van gebaren alsook enkele specifieke werken waarbij de Kinect camera reeds werd gebruikt voor herkenning van gebaren. De gebruikte apparatuur en software wordt besproken in het derde hoofdstuk. Bij die bespreking kan de gebruiker meer inzicht verwerven in de Kinect alsook de verschillende software die bekeken en gebruikt is. Daarbij worden er een aantal bevindingen in verband met de software aangehaald en kan er voor meer informatie in verband met de installatie van de software gebruik worden gemaakt van de bijhorende Bijlage. Hoofdstuk vier beschrijft de vingerdetectie die gebruikt is om tot de nodige data voor
het herkennen van gebaren te komen. Deze vingerdetectie is voor het overgrote deel eigen werk waarbij dan ook verschillende methoden ge¨ımplementeerd werden. In het hoofdstuk zijn de meest interessante implementaties opgenomen met een beschrijving van de werking. Uit alle methodes werd vervolgens de beste geselecteerd voor verder gebruik op basis van het behaalde aantal frames per seconde en de daarmee gepaard gaande accuraatheid. En als laatste wordt er ook nog een vorm van vingerclustering beschreven die toelaat om de data op niveau van de vingers te achterhalen. In hoofdstuk vijf worden twee vormen van smoothing besproken, met name moving average en exponenti¨ele smoothing. Beide vormen worden besproken gevolgd door de beschrijving van enkele uitgevoerde testen die de methode die definitief gebruikt zou worden diende aan te duiden. Het zesde hoofdstuk geeft een woordje uitleg bij het tot stand komen van de dataset. Dit omvat de mogelijkheid om extern bestaande datasets te gebruiken, de voorwaarden voor het opnemen van de eigen dataset alsook de uiteindelijke opbouw van de zelf opgenomen dataset. Hoofdstuk zeven draait volledig rond een vorm van machinaal leren. Meer precies draait het om het gebruik van Hidden Markov Modellen. Het verantwoordt de keuze om met HMMs te werken en geeft een beknopte introductie tot de opbouw en het gebruik ervan. Na wat theoretische achtergrond volgt er dan een overzicht van de verschillende HMMs die binnen deze masterproef zijn gebouwd en gebruikt. In hoofdstuk acht worden de bekomen resultaten uitgezet. Gezien het grote aantal testen dat is uitgevoerd konden niet alle resultaten worden opgenomen en is er dus een selectie van de meest relevante resultaten gemaakt. Bij de bespreking van de resultaten wordt telkens op bepaalde fenomenen gewezen die dan ook zo goed mogelijk verklaart worden. Het negende en tevens laatste hoofdstuk geeft een beknopte conclusie die uit de masterproef getrokken kan worden.
Trefwoorden Gebarentaalherkenning, Kinect, Vingerdetectie, Handdetectie, Hidden Markov Modellen
Sign Language recognition using the Microsoft Kinect Joery Vannieuwenhuyse Supervisor(s): Pieter-Jan Kindermans, Sander Dieleman Abstract— Today there is still a gap left between speech and sign language recognition whereby sign language recognition is staying behind. This leads to limitations for deaf people because they are only able to communicate with other people when both know sign language. Although some signs can be interpreted by people who do not know sign language, a great deal of signs will bring difficulties when communicating with someone who lacks the necessary skills to interpret them. This is where a system for automatic sign language recognition could be useful. In this article I will explain one approach towards building such a system by using Hidden Markov Models (HMMs). For this system a dataset of twenty signs was recorded and led to 85.33% accuracy in detection of those signs. Keywords— Sign language recognition, Microsoft Kinect, Hidden Markow Models
I. I NTRODUCTION A. Sign language recognition Sign language refers to a language whereby people communicate through the use of gestures instead of spoken words. This means that it is a highly visual language and the users actually use their eyes to listen to another signer. Due to the lack of hearing people that understand sign language, deaf people might run into serious problems when trying to communicate. But for every problem there is a solution and in this case the deaf people could use text writing or data interpreters to communicate. However the use of text writing makes the deaf people more uncomfortable while data interpreters are scarce and most of the time expensive as well. The solution to this problem that is most user friendly is the use of a camera to interpret the sign language and output the right words or sentences. The Microsoft Kinect is a camera which is commercially available for the price of C100.00. Furthermore this camera possesses the ability to calculate and offer three dimensional datapoints. These three dimensional points are of interest for the method described in this article. Sign language itself takes place in four dimensions: shape, rotation, position and movement of the hands. Besides these four dimensions there are more elements that can take part in sign language such as facial expressions and the amount of hands that are used. There are signs that use only one hand but where the signer can use two hands to describe two things at once. For instance a story about two people whereby each hand J. Vannieuwenhuyse is a Master student in Computer Science, Ghent University (UGent), Gent, Belgium. E-mail:
[email protected] .
represents one person. In this work however I will only focus on the four main dimensions. B. Previous work A lot of work has been done on sign language recognition whereby a lot of different methods where used. However before the recognition of signs itself it is of utmost importance to trace the hands of a user. To achieve this many different approaches have been developed. One of these methods is segmentation of the video stream by using skin color and afterwards excluding the user ’s head [1]. The problem of this method is that the user has to wear clothing with long sleeves as it would otherwise greatly hinder the detection of the hands. To make the first method more accurate one could use 3D data to easily differentiate between the hands and the head [2]. But the problem of the uncomfortable sleeves remains. The solution came after research from Microsoft [3] whereby they used only 3D data to detect a person followed by fitting a skeleton on the person. This skeleton then allows easy detection of the hands or any other body part of the user. It is exactly this method that was implemented in the Microsoft Kinect SDK to detect a user. After detection of the hands the recognition of signs could continue. Previous research on the sign recognition itself has shown that it is possible to recognise signs with highly accurate results [4]. To achieve sign recognition a lot of methods have been used in the past such as convolutional networks and Hidden Markov Models. Also the training methods of these systems have very different approaches ranging from a recorded dataset as small as five recordings per gesture up to a live stream of a TV-show with gestures and subtitles. However most of the work that has been done did not take depth data into consideration when trying to recognise gestures. The few works that have been performed on sign language recognition that make use of depth data where all based on the usage of the Kinect camera. Argyros [5] has proven that it is possible to accurately and efficiently detect the handpose in real time using depth data and this at a framerate of 15Hz. Thus suggesting that it is possible to achieve accurate sign language recognition using depth data which is exactly what was achieved with the system d in this article. I also achieved 15Hz framerate on my user tracking algorithm that will not be explained as it is merely a tool to extract the necessary
data from the hands. C. Dataset The dataset that was used for this research was recorded with the Kinect camera using the standard 640 by 480 resolution. In total the dataset consisted of twenty signs that where chosen by the other participants who had no knowledge of the used method or its pros and cons. Thus allowing the use of neutral dataset. The signs where recorded fifteen times each and this for each of the 3 persons resulting in a total of nine hundred recordings. Furthermore none of the persons had any real experience with sign language resulting in some variety for the signs between persons. II. H IDDEN M ARKOV M ODELS As mentioned before I have used HMMs to detect sign language. This means that some HMMs had to be trained in recognizing the gestures whereafter they could be tested. Since there is no labeled data I made use of unlabeled training of the HMMS whereby one HMM per sign was used. The parameters that where used for training included the number of fingers, position and direction of both hands as well as the position and direction of the individual fingers. Thus for each parameter itself another HMM was needed in order to look at the standard detection of gestures based on only one parameter. Naturally the number of fingers is discrete and can take only seven states including a default state that is used when a hand cannot be detected. On the other hand all the remaining parameters can take on a wide range of values in three dimensions (X,Y,Z) with small variances resulting in a continuous distribution. For these parameters a Gaussian distribution was used. Strangely enough multiple test have shown that the results get better when using a specific default value for these Gaussian models instead of a default value with noise. There have also been extensive tests with either standard positions for the fingers as well as positions that were made relative in relation to the center position of the hand. These have shown that relative positions for the fingers give better accuracy for the HMMs based on them. Furthermore there still remains the matter of the amount of hidden states that was used. Again tests have shown that the best amount of hidden states to be used is fixed at three. Up till now I have only spoken about the basic HMM models, however it is also possible to combine multiple HMMs. I have used the method whereby the resulting probabilities after evaluation of an input sequence are multiplied with one another. Keep in mind that the results have to be from the same sign. In other words the probabilities can be summed when working in the logarithmic domain. It is better to be working in the logarithmic domain in order to prevent underflow as a
Fig. 1. Confusion matrix for the optimal combined HMM.
result of continuously multiplying small floating point numbers. In the end the best results were achieved using a combined HMM with three hidden states that uses only the amount of fingers, position and direction of the hands. The results of such a model will be described in the next section. III. R ESULTS The best model that I was able to build uses a combined HMM with three hidden states that makes use of the amount of fingers, position and direction of the hands. Figure 1 shows the result of a test with such a model. This model achieved an accuracy of 84.33% correctly estimated signs. Fifteen recordings of each sign where shuffled in a testset and given to the system for detecting the signs. In the confusion matrix of the figure the amount of correctly detected signs can be seen on the main diagonal. The vertical axis represents the actual signs while the horizontal axis represents the detected signs. It is obvious that the diagonal is interrupted at sign eleven, the reason for this is the almost identical sign three that was detected nine times instead of the sign eleven. Both signs are identical with exception of the initial state. This means that the system is having problems with identical data that a deaf person could interpret by using the context it is used in. There is not really an obvious solution to this problem by looking only at HMMs. However, more complex models that combine results of different methods might be able to differentiate between these two signs. IV. C ONCLUSION I have been able to prove that the usage of depth data within HMMs can lead to highly accurate detection of sign language. Furthermore experiments that were not described in this article have shown that the method generalizes fairly well to datasets with more signs. This means that the method that has been described surely has the potential for future research. Although I was
unable to detect the signs in real time, I can extract the necessary data from a live stream at 15Hz which is a good first step towards real time detection. What is left to be done to achieve this is segmentation of the live stream. ACKNOWLEDGMENTS First of all I want to thank David Verstraeten, PieterJan Kindermans and Sander Dieleman for the support and advice they provided at regular meetings as well as at unplanned moments. I also want to thank the signers that have participated in the recordings for the dataset. Without Jean-Pierre Ball and Siegfried Ball I wouldn’t have had the dataset that was used in my work, which would have led to less accurate conclusions. R EFERENCES [1]
[2]
[3] [4] [5]
Antonis A. Argyros, Manolis I.A. Lourakis, “Tracking Skincolored Objects in Real-time”, invited contribution to the Cutting Edge Robotics book, ISBN 3-86611-038-3, Advanced Robotic Systems International, 2005. S. E. Ghobadi, O. E. Loepprich, K. Hartmann, O. Loffeld, “Hand Segmentation using 2D/3D Images”, Proceedings of Image and Vision Computing New Zealand 2007, pp. 6469, Hamilton, New Zealand, December 2007. J. Shotton, A. Fitzgibbon, M. Cook, T. Sharp, M. Finocchio, R. Moore, A. Kipman, A. Blake, “Real-time human pose recognition in parts from single depth images”, In In CVPR, 2011. H. Cooper, Eng-Jon ONG, N. Pugeault, R. Bowden, “Sign Language Recognition using Sub-Units”, Journal of Machine Learning Research 13 (2012), 2205-2231. I. Oikonomidis, N. Kyriazis and A.A. Argyros, “Efficient model-based 3D tracking of hand articulations using Kinect”, in Proceedings of the 22nd British Machine Vision Conference, BMVC2011, University of Dundee, UK, Aug. 29-Sep. 1, 2011.
INHOUDSOPGAVE
i
Inhoudsopgave 1 Inleiding 1.1
1.2
1.3
1
Gebarentaal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
1.1.1
Het ontstaan van gebarentaal . . . . . . . . . . . . . . . . . . . . . . .
1
1.1.2
Gebarentaal en gesproken taal . . . . . . . . . . . . . . . . . . . . . .
2
1.1.3
De opbouw van gebarentaal . . . . . . . . . . . . . . . . . . . . . . . .
3
1.1.4
Vlaamse gebarentaal . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
Mogelijke use-cases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
1.2.1
Scenario ´e´en: Communicatie met een stomme . . . . . . . . . . . . . .
5
1.2.2
Scenario twee: Het aanleren van gebarentaal . . . . . . . . . . . . . .
6
Doelstelling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6
2 Voorgaande studies
7
2.1
Verwerven van data voor de handen . . . . . . . . . . . . . . . . . . . . . . .
7
2.2
Herkenning van gebaren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8
2.3
Herkening van gebaren met de Kinect . . . . . . . . . . . . . . . . . . . . . .
9
3 Apparatuur en Software
11
3.1
Microsoft Kinect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
11
3.2
ROS (Robot Operating System) . . . . . . . . . . . . . . . . . . . . . . . . . .
14
3.3
PCL (Point Cloud Library) . . . . . . . . . . . . . . . . . . . . . . . . . . . .
14
3.4
OpenNI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15
3.5
MLPack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15
4 De vingerdetectie
17
4.1
Kalibratie van een nieuwe gebruiker . . . . . . . . . . . . . . . . . . . . . . .
17
4.2
Het cre¨eren van een 3D puntenwolk . . . . . . . . . . . . . . . . . . . . . . . .
18
4.3
Voorbehandeling van de puntenwolk voor de hand . . . . . . . . . . . . . . .
19
4.4
Detectie van de vingers
20
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
INHOUDSOPGAVE
ii
4.4.1
Punt per punt filter met een kleine bol . . . . . . . . . . . . . . . . . .
21
4.4.2
Punt per punt filter met een grote bol . . . . . . . . . . . . . . . . . .
23
4.4.3
Punt per punt filter met grote kubus . . . . . . . . . . . . . . . . . . .
24
4.4.4
Een dubbel filter voor hogere accuraatheid
. . . . . . . . . . . . . . .
25
4.4.5
Een dubbel filter met raster voor hogere framerate . . . . . . . . . . .
26
4.4.6
Clustering van de vingers . . . . . . . . . . . . . . . . . . . . . . . . .
27
5 Smoothing
30
5.1
Moving average . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
30
5.2
Exponenti¨ele smoothing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
32
5.3
Testresultaten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
33
6 De dataset
37
6.1
Datasets van derden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
37
6.2
Richtlijnen voor opname . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
38
6.3
Opbouw van de dataset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
39
7 Machinaal leren 7.1
41
Hidden Markov Modellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
41
7.1.1
Training . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
43
7.1.2
Evaluatie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
43
7.1.3
Decodering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
44
7.1.4
Logaritmisch domein . . . . . . . . . . . . . . . . . . . . . . . . . . . .
44
7.1.5
Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
44
8 Resultaten
48
8.1
Uitgevoerde testen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
48
8.2
Dataset 7 gebaren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
49
8.2.1
Eenvoudige modellen . . . . . . . . . . . . . . . . . . . . . . . . . . . .
49
8.2.2
Gecombineerde modellen
. . . . . . . . . . . . . . . . . . . . . . . . .
52
Dataset 20 gebaren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
55
8.3
9 Conclusie
59
A ROS (Robot Operating System)
61
A.1 Het raamwerk opzetten
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
61
A.2 De opbouw van het raamwerk . . . . . . . . . . . . . . . . . . . . . . . . . . .
62
INHOUDSOPGAVE
A.3 De werking van vinger-detectie . . . . . . . . . . . . . . . . . . . . . . . . . . B PCL (Point Cloud Library) B.1 Het installeren van PCL Kinect Fusion . . . . . . . . . . . . . . . . . . . . . .
iii
68 70 71
C Uitgebreide resultaten van smoothing
74
D Gebruikte gebaren
76
Gebruikte afkortingen
OpenNI
Open Natural Interaction
PCL
Point Cloud Library
ROS
Robot Operating System
MLPack
Machine Learning Pack
HMM
Hidden Markov Model
INLEIDING
1
Hoofdstuk 1
Inleiding 1.1
Gebarentaal
Het begrip gebarentaal verwijst naar een taal waarbij gecommuniceerd of gesproken wordt aan de hand van uitgebeelde gebaren. Dergelijke taal wordt hoofdzakelijk door doven en slechthorenden gebruikt waarbij men het hele lichaam gebruikt om te communiceren en de ogen om te luisteren door middel van interpretatie van uitgebeelde gebaren. In deze sectie zal er dieper worden ingegaan op gebarentaal en zal er onder meer worden gekeken naar de opbouw en het ontstaan van gebarentaal, verder wordt er een vergelijking gemaakt met gesproken taal en als laatste wordt ook nog een woordje uitleg gegeven over de Vlaams Belgische gebarentaal. De toelichtingen tot gebarentaal zullen vrij beperkt zijn en hebben enkel tot doel voldoende inzicht te hebben in gebarentaal om deze masterproef te kunnen begrijpen.
1.1.1
Het ontstaan van gebarentaal
Gebarentaal bestaat al sinds het begin der tijden. De mens zocht namelijk steeds naar manieren om te communiceren en indien dit niet met gesproken taal kon werd het lichaam gebruikt om dingen uit te beelden en op die manier toch communicatie mogelijk te maken. Deze uitbeeldingen waren in het begin echter een eigen uiting die ieder op zijn manier bracht zonder dat er een bepaalde structuur aanwezig was. Dit soort van gebarentaal werd dan ook gebruikt bij communicatie met doven, slechthorenden of anderstaligen, ook in het heden wordt dit soort gebarentaal nog veel gebruikt door toeristen die de lokale taal niet beheersen. Dove mensen begonnen echter hun eigen taal te cre¨eren waardoor er een overvloed aan regiogebonden gebarentalen en dialecten ontstonden, terwijl ook niet-doven een bepaalde vorm van gebarentaal ontwikkelden om te kunnen communiceren zonder dat derden het gesprek
1.1 Gebarentaal
2
kunnen volgen. Vanaf 1755, wanneer de eerste school voor doven werd opgericht, begonnen gebarentalen zich vooral nog te ontwikkelen rond deze scholen. Het was pas in de jaren zestig dat men gebarentaal als een officieel communicatiemiddel aanvaarde toen William Stokoe, een Amerikaanse taalkundige, bewees dat gebarentaal net als gesproken talen bestaat uit een aantal bouwstenen. Gebarentalen hebben over het algemeen geen direct verband met de gesproken taal in het land waar de gebarentaal is ontstaan en veelal zijn gebarentalen dan ook van elkaar afgeleid of een combinatie van verschillende andere gebarentalen.
1.1.2
Gebarentaal en gesproken taal
Er wordt nog al eens snel verondersteld dat gebaren zijn vastgelegd oftewel uitgevonden door horenden, echter uit vorige sectie is al snel af te leiden dat dit volkomen verkeerd is en dat de meeste gebaren zijn ontstaan uit het gebruik ervan door doven. Net als gesproken taal heeft ook gebarentaal een volledig alfabet, dat bij de definitie van nieuwe gebaren wel eens wordt gebruikt om een handvorm te bepalen. Zo kan de handvorm de eerste letter van het uit te beelden woord voorstellen, echter bestaat er tussen woorden en gebaren geen enkelvoudig verband. Een gebaar kan dus meerdere woorden voorstellen waarbij het woord enkel bepaald kan worden door inzicht en kennis van de daarrond gebruikte gebaren. Dit zorgt er enerzijds voor dat de gebarentaal minder gebaren bevat dan een gesproken taal woorden bezit terwijl het anderzijds de gebarentaal bemoeilijkt. Ondanks dat er geen direct verband bestaat tussen gebarentaal en gesproken taal zijn er toch gebaren die voor beide een identieke betekenis hebben en dan ook binnen beide talen worden gebruikt. Deze gebaren zijn dan ook door iedereen verstaanbaar verondersteld zoals bijvoorbeeld een duim omhoog voor goed en een duim omlaag voor slecht. Verder zijn er ook nog andere gebaren uit de gebarentaal die intu¨ıtief herkenbaar zijn omdat ze een eigenschap, handeling of kenmerk van een woord voorstellen. Zo is er bijvoorbeeld auto alsook rijden waarbij de handen een denkbeeldig stuur vasthouden, jagen waarbij men een denkbeeldig vuurwapen vasthoud en duwen waarbij men de hand van zich weg duwt. Dus het is niet zo dat gebarentaal volledig onverstaanbaar is, er zijn gebaren die door iemand zonder enige kennis van gebarentaal verstaanbaar zijn. Toch zijn er ook nog steeds veel gebaren die zonder kennis niet geplaatst kunnen worden of dat iets verkeerd wordt ge¨ınterpreteerd omdat een gebaar meerdere betekenissen bezit die afhankelijk zijn van de context. De overstap van gesproken taal naar het leren van gebarentaal is ook niet voor iedereen even eenvoudig omdat de persoon in kwestie geneigd is de woordvolgorde van de gesproken taal uit te beelden terwijl deze volgorde in gebarentaal veelal verschillend is net zoals dit het geval is tussen vele verschillende gesproken talen.
1.1 Gebarentaal
1.1.3
3
De opbouw van gebarentaal
Om deze masterproef te kunnen verwezenlijken en dus ook deze scriptie te kunnen volgen is het belangrijk om voldoende inzicht te hebben in de opbouw van gebarentaal. Allereerst is het belangrijk om te begrijpen dat gebarentaal zich in vier dimensies uit doordat er gebruik wordt gemaakt van de driedimensionale ruimte rondom het lichaam maar ook van een extra dimensie die de tijd voorstelt. Een gebaar kan namelijk uit meerdere handelingen bestaan waardoor de tijd mee in rekening moet worden gebracht. Daarnaast is een gebaar opgebouwd uit een aantal onderdelen zoals een woord in gesproken taal is opgebouwd uit verscheidene klanken. En net zoals bij deze klanken hebben de onderdelen op zich geen betekenis, maar kunnen ze samen toch het gebaar voor een woord voorstellen. Deze onderdelen zijn de volgende: De handvorm.
Er zijn een aantal handvormen in gebarentaal die op zich geen betekenis hebben maar in combinatie met de andere onderdelen toch een gebaar kunnen vormen. Het gaat hier dan wel om gebaren die verschillen van de handvormen voor het alfabet aangezien de gebaren voor deze laatste vrij statisch zijn. De rotatie van de hand.
Door de rotatie van de hand die een bepaalde vorm heeft kan men een bepaalde handvorm voor meerdere gebaren gebruiken. Er bestaan dan ook gebaren die door een simpele rotatie van de hand een andere betekenis krijgen. Zo is er bijvoorbeeld het gebaar voor Antwerpen dat een duim omhoog is ter hoogte van de schouder terwijl bel een duim in horizontale richting is ter hoogte van de schouder. De positie van de handen ten opzichte van het lichaam.
Ook de positionering van de handen kan een invloed hebben op het gebaar, echter is het moeilijk om hier een voorbeeld van te geven omdat een gebaar meestal gepaard gaat met een beweging die dan ook nog eens hetzelfde moet zijn. De verplaatsing van de handen.
De manier waarop de handen verplaatst worden kan voor dezelfde rotatie en handvorm een andere betekenis aan een gebaar geven. Zo zijn de gebaren boven en hoog zeer gelijkaardig op de beweging na, hoog zal namelijk een grotere verticale verplaatsing hebben dan boven. Naar aanleiding van de hier vernoemde onderdelen zal in deze masterproef gewerkt worden met zowel de handen als de vingers waarbij de positie en richting van de handen en vingers
1.2 Mogelijke use-cases
4
in rekening worden gebracht alsook de tijd om de verplaatsing mee in rekening te brengen. De handvorm zit dan reeds mee vervat in de data voor de vingers. Ook de samenwerking van beide handen is belangrijk in de gebarentaal, zo zijn er gebaren met maar ´e´en hand (bel, Antwerpen, hoog, boven) alsook gebaren die een uitbeelding met twee handen vereisen (auto, rijden, fietsen, aanvallen, aanhalingsteken). Er zijn daarnaast ook nog gebaren waarbij de twee handen worden gebruikt om individuele gebaren voor te stellen die een verband hebben, op die manier kan er meer data in een tijdsmoment worden overgebracht met gebarentaal, wat met gesproken taal onmogelijk is. Met dit laatste zal binnen deze masterproef geen rekening worden gehouden. Met het gebruik van twee handen zal wel rekening moeten worden gehouden in deze masterproef, er zullen dus zowel gebaren met ´e´en hand als met twee handen worden gebruikt. Als laatste moet er nog worden toegevoegd dat de ruimte rond de gebruiker een belangrijke rol speelt en een bepaalde positie in die ruimte kan gebruikt worden in combinatie met een gebaar om een geografische positie of een bepaalde persoon aan te duiden.
1.1.4
Vlaamse gebarentaal
In deze sectie wordt vrij beknopt wat gezegd over de Vlaamse gebarentaal omdat dit de gebarentaal is waarmee binnen deze masterproef wordt gewerkt. Alle gebruikte en detecteerbare gebaren zullen dus uit de set van Vlaamse gebaren komen, [1] is een goede bron voor de gebaren alsook extra informatie. De Vlaamse gebarentaal is een gebarentaal die tot dezelfde familie van talen behoort als de Nederlandse, Franse en Amerikaanse gebarentaal. Ze is ontstaan in Belgi¨e en meer precies in Vlaanderen. Na onderzoek is aangetoond dat de gebarentalen uit de verschillende provincies in Vlaanderen meer gelijkenis hebben dan men oorspronkelijk dacht, waardoor men het geheel dus omvat onder de term Vlaamse gebarentaal. Echter was het pas in 2006 dat de Vlaamse gebarentaal officieel erkend werd door het Vlaams Parlement als volwaardige taal voor de dovengemeenschap. Aan deze erkenning ging een lange strijd van de Vlaamse dovengemeenschap vooraf. Zo een strijd is een blijvend fenomeen dat optreedt bij de poging tot erkenning van verscheidene gebarentalen.
1.2
Mogelijke use-cases
In deze sectie zullen enkele mogelijke scenarios besproken worden waarbij het herkennen van gebaren met de Kinect zijn nut kan hebben en het leven van de gebruikers kan vereenvoudigen.
1.2 Mogelijke use-cases
1.2.1
5
Scenario ´ e´ en: Communicatie met een stomme
Stel je een situatie voor tussen twee personen waarvan ´e´en persoon stom is waarbij deze een conversatie willen of moeten voeren. De stomme zal gebarentaal beheersen en dit als hoofdzakelijk communicatiemiddel gebruiken, terwijl de tweede persoon wel kan spreken en dus gesproken taal als communicatiemiddel prefereert. Indien bidirectionele communicatie tussen deze twee personen vereist is zal dit moeilijkheden met zich meebrengen. De stomme kan wel verstaan en interpreteren wat de tweede persoon zegt maar voor deze tweede persoon is het moeilijk of onmogelijk om te begrijpen wat de stomme wil zeggen omdat hij geen kennis bezit van gebarentaal. Er zijn een aantal mogelijke oplossingen voor dit probleem die nu bekeken zullen worden. Ten eerste kan er een tolk worden ingezet om de gebarentaal te interpreteren en om te zetten naar gesproken taal. Dit zal echter een deel van de privacy wegnemen aangezien de tolk te allen tijde aanwezig moet zijn tijdens het gesprek. Bovendien dient men de tolk te vertrouwen om correcte vertalingen te maken en geen eigen interpretatie te geven aan de gebarentaal. Een tolk brengt uiteraard ook een kost met zich mee die met ieder uur stijgt en afhankelijk is van de prijs die de tolk vraagt voor zijn diensten. Een tweede oplossing is dat de stomme een speciale handschoen aandoet die gebaren kan detecteren en deze omzet naar tekst op een zichtbare display. Nog beter is het rechtstreeks omzetten van gebaren naar spraak met dergelijke handschoenen. Deze handschoenen bestaan reeds en maken gebruik van inwendige sensors, accelerometers, gyroscopen en kompassen voor de detectie van gebaren. Ze zijn echter niet erg praktisch in gebruik omdat ze de bewegingsvrijheid van de gebruiker beperken en zijn bovendien nogal duur. Een laatste oplossing is het systeem dat in deze masterproef verwezenlijkt zal worden waarbij de Kinect of een andere gesture recognition camera gebruikt kan worden. In deze masterproef wordt er een Kinect gebruikt die commercieel verkrijgbaar is voor ¿100,00, wat in vergelijking met een handschoen of een tolk niet veel is. Verder zal de bewegingsvrijheid niet beperkt worden zoals bij de handschoen, de enige beperking die hier nog rest is dat de gebruiker zich in het gezichtsveld van de camera moet bevinden opdat de gebaren herkend zouden worden. Na het bepalen van de gebaren kan de uitgebeelde zin worden weergegeven als tekst of zelfs als gesproken taal worden afgespeeld via luidsprekers. Het systeem dat ik hierbij in gedachten heb kan dus gebruikt worden om een conversatie met een stomme mogelijk te maken.
1.3 Doelstelling
1.2.2
6
Scenario twee: Het aanleren van gebarentaal
Om te kunnen communiceren met een doofstomme ben je genoodzaakt zelf gebarentaal te begrijpen en te kunnen uitbeelden. Uiteraard kan je hiervoor lessen volgen via avondschool of in bepaalde studierichtingen. Maar je kan gebarentaal ook op jezelf leren, er bestaan tal van boeken over gebarentaal, gaande van de geschiedenis en evolutie tot het zelf uitvoeren van gebarentaal. Er is echter ´e´en probleem bij het leren van gebarentaal op jezelf en dat is dat je niet kan controleren of je de gebaren correct uitvoert zodat een stomme of doofstomme ze kan begrijpen. Hier kan het systeem dat in deze masterproef ontwikkeld werd een handig hulpmiddel zijn. Het enige dat je nodig hebt is een Kinect camera en een boek of online cursus voor het leren van gebarentaal. Je kan de gebaren dan uitvoeren voor de Kinect om na te gaan of je ze goed uitvoert. Indien de Kinect de gebaren niet kan herkennen weet je dat er een fout is in de uitvoering en kan je vervolgens nagaan wat deze fout is. Uiteraard ben je niet beperkt tot de Kinect en zou deze methode in theorie ook mogelijk moeten zijn met andere gesture recognition camera’s.
1.3
Doelstelling
De ultieme doelstelling van deze masterproef is het detecteren van gebaren in ware tijd, en dit specifiek door gebruik te maken van 3D data voor de handen die verkregen kan worden met behulp van de Kinect camera. Door te focussen op de 3D data voor de handen moet het in theorie mogelijk zijn om gelijkaardige gebaren van elkaar te kunnen onderscheiden, wat dan ook wordt nagegaan binnen deze masterproef.
VOORGAANDE STUDIES
7
Hoofdstuk 2
Voorgaande studies Er is in het verleden reeds onderzoek gebeurd rond het herkennen van gebarentaal om de grote achterstand ten opzichte van spraakherkenning weg te werken. In dit hoofdstuk zal een overzicht worden gegeven van verscheidene studies die reeds gebeurd zijn.
2.1
Verwerven van data voor de handen
Alvorens over te kunnen gaan tot het herkennen van gebaren moet men eerst in staat zijn om de nodige lichaamsdelen, met name de handen terug te vinden in videobeelden. Om dit te verwezenlijken zijn meerdere methoden bedacht. E´en van deze methoden die ook nu nog regelmatig wordt gebruikt bij onderzoek rond het herkennen van gebarentaal is segmentatie aan de hand van huidskleur. Hierbij worden pixels die een huidskleur voorstellen uit de data gefilterd voor verder gebruik. Argyros onderzocht in [2] dergelijke methode waarbij een Bayesian classifier werd gebruikt om de juiste pixels te bepalen. Deze methode bleek heel robuust en onafhankelijk van veranderingen in lichtcondities te zijn. Ook uit ander onderzoek [3] is gebleken dat gebruik van een Bayesian classifier tot de beste resultaten leidt voor het herkennen van lichaamsdelen aan de hand van huidskleur. Deze methode vereist echter wel dat de gebruikers kleding met lange mouwen dragen indien men de handen verder wil analyseren. Later werd er gebruik gemaakt van zowel 2D als 3D data om de handen van een persoon te verkrijgen ten einde deze te gebruiken voor het herkennen van gebaren [4]. Bij deze combinatie zal men de intensiteit van 2D beelden gebruiken om te segmenteren op huidskleur waardoor de handen en het hoofd gevonden worden. Vervolgens wordt de dieptedata gebruikt om de handen van het hoofd te onderscheiden, hierbij gaat men er vanuit dat de handen zich dichter bij de camera bevinden dan het hoofd. Uit de resultaten bleek de methode snel en robuust
2.2 Herkenning van gebaren
8
te zijn. Er traden echter wel problemen op wanneer de afstand tot de camera en intensiteit van de handen hetzelfde waren als deze van het hoofd. Hierdoor wordt het moeilijk om te bepalen wat de handen zijn en wat het hoofd is waardoor foute voorspellingen optreden. Naast het werken met huidskleur of een combinatie van 2D en 3D data werd er ook nog gebruik gemaakt van enkel 3D data onder de vorm van een dieptemap. Zowel de Universiteit van Stanford als Microsoft hebben hier onderzoek rond gedaan [5] [6]. Het onderzoek van Stanford heeft aangetoond dat het mogelijk is om alle pixels die een persoon voorstellen uit dieptedata te verkrijgen en hieruit verder een aantal belangrijke punten te gebruiken om lichaamsdelen te onderscheiden. Microsoft heeft soortgelijk onderzoek gedaan waarbij gebruik werd gemaakt van een pixel per pixel analyse. Zo kunnen zeer nauwkeurig verschillende lichaamsdelen van elkaar onderscheiden worden zonder enige afhankelijkheid van de lichaamsbouw of houding van de gebruiker. Deze methoden worden nu toegepast voor onder meer gaming, human-computer interactie en in de gezondheidszorg. Naast het verkrijgen van data over de nodige lichaamsdelen is er bij gebarentaal, zoals in het vorige hoofdstuk beschreven ook nog een beweging aanwezig. Deze bewegingen zouden mee in rekening moeten gebracht worden. In [7] wordt de beweging van een gebruiker en individuele lichaamsdelen bekeken. Hierbij maakt men gebruik van de GPU om het filter algoritme te versnellen, echter behaalde men nog steeds slechts vier tot zes frames per seconde met vrij goede accuraatheid.
2.2
Herkenning van gebaren
Voor de detectie van gebaren in gebarentaal zal men deze meestal opsplitsen in subunits die dan apart geclassificeerd worden om vervolgens de resultaten van deze classificaties terug samen te brengen ten einde het gebaar te kunnen herkennen. De meest gebruikte subunits zijn de handvorm, rotatie en positie zoals in hoofdstuk 1 reeds beschreven werden, beweging is ook nog een mogelijke subunit maar wordt meestal achterwege gelaten. Bij het detecteren van gebaren met subunits wordt het probleem van gebarentaalherkenning dus als het ware opgesplitst in meerdere deelproblemen. Voor elk van de deelproblemen zal men dan een toestand bepalen. Ter bepaling van deze toestanden worden technieken uit het machinaal leren gebruikt. In een laatste stap worden dan de toestanden van de verschillende subunits samengenomen om het gebaar te bepalen. De resultaten die in het onderzoek met subunits zijn besproken [8] [9] [10] [11] [12] zien er veelbelovend uit. De laatste publicatie is hierbij veruit de meest interessante omdat ze gebruik hebben gemaakt van een grote data set (bijna 1000 gebaren) waarbij meerdere methodes worden bekeken. Bij deze grote dataset halen ze
2.3 Herkening van gebaren met de Kinect
9
een nauwkeurigheid van 73% terwijl de nauwkeurigheid op een dataset van 20 gebaren 99,9% bedraagt. Verder volgde hier ook uit dat de nauwkeurigste resultaten bekomen worden door gebruik te maken van 3D in plaats van 2D data. Naast het detecteren van gebarentaal waarbij gebruik wordt gemaakt van een dataset is er ook reeds onderzoek verricht rond het filteren van gebaren uit een vloeiende reeks aaneengesloten gebaren. Hieruit zijn dan ook algoritmes ontstaan die in staat zijn om vrij nauwkeurig bepaalde gebaren uit een reeks opeenvolgende gebaren te filteren zonder dat hierbij gebruik wordt gemaakt van gekleurde handschoenen of handschoenen met sensoren [13] [14]. Beide publicaties zijn van dezelfde auteurs en nauw verwant met elkaar. In een eerste stap bleek de gebruikte techniek kleine problemen te ondervinden bij het filteren van een gebaar door de verschillende contexten waarin het gebruikt kan worden. Hierbij was het de overgang tot het betreffende gebaar die soms moeilijk te detecteren was. Van dit probleem was in de tweede publicatie geen sprake meer, noch werd er een oplossing voor dit probleem beschreven. In [15] wordt er nog een ander medium gebruikt om een systeem voor herkenning van gebaren te trainen. Er wordt namelijk gebruik gemaakt van een TV-programma met gebarentaal en ondertiteling om het systeem te trainen. De resultaten van deze methode bleken positief te zijn bij gebruik van een state-of-the-art tracker voor het bovenlichaam, data die de handen beschrijven en een enorme hoeveelheid trainingsdata. Aan de andere kant zijn er ook onderzoekers die de training van het systeem zo laag mogelijk willen houden zonder al te veel aan accuraatheid in te boeten. In [16] is men erin geslaagd, aan de hand van Hidden Markov Modellen, om 164 gebaren te herkennen met een nauwkeurigheid van 74%, waarbij ieder gebaar slechts 10 keer werd gebruikt voor training.
2.3
Herkening van gebaren met de Kinect
Uiteraard is er ook reeds onderzoek verricht rond herkenning van gebarentaal door gebruik te maken van de Microsoft Kinect camera. Het voordeel van een Kinect camera is niet zo zeer de beeldkwaliteit, want deze is lager dan vele andere camera’s die gebruikt worden voor herkenning van gebaren. De Kinect is echter een goedkope camera die naast RGB-beelden ook 3D data opneemt. In [17] wordt bijvoorbeeld de Kinect gebruikt in een aangepaste versie van een bestaand spelletje om gebarentaal te leren aan kinderen, waardoor deze geen handschoenen met sensoren meer moeten dragen. Volgens de resultaten is de prestatie met gebruik van de Kinect vergelijkbaar aan die van de oudere versie, maar is het best dat de gebruiker rechtstaand speelt omdat een zittende houding resulteert in fouten voor het skelet-
2.3 Herkening van gebaren met de Kinect
10
tracking algoritme dat de gebruikers moet detecteren. Dit probleem met de zittende houding is voor de in deze masterproef besproken implementatie van gebarentaal herkenning echter geen probleem geweest. Verder heeft [18] aangetoond dat gebruik van GPU acceleratie in combinatie met de Kinect en een goede optimalisatie kan resulteren in robuuste en effici¨ente tracking van de volledige handvorm en dit aan een framerate van 15Hz. Binnen mijn onderzoek was er echter geen mogelijkheid om gebruik te maken van GPU acceleratie omdat er met eigen hardware gewerkt werd. Deze hardware bevat geen Nvidia kaart, wat het gebruik van GPU acceleratie dus onmogelijk maakt.
APPARATUUR EN SOFTWARE
11
Hoofdstuk 3
Apparatuur en Software 3.1
Microsoft Kinect
Figuur 3.1: De Microsoft Kinect camera.
De Microsoft Kinect [19] is geen camera met de functionaliteiten van een webcam. De Kinect is tot veel meer in staat door de combinatie van een RGB-camera, een diepte-sensor en een ingebouwde microfoon. Deze drie ingredi¨enten zijn verpakt in een rechthoekige behuizing die rust op een kleine voet. Tussen deze behuizing en de voet zit nog een mechanisme om de camera in de juiste positie te kunnen zetten zonder enige manuele ingreep. Om een beter idee te geven hoe deze camera er in werkelijkheid uitziet kan u Figuur 3.1 raadplegen. De RGB-camera is vrij standaard en neemt gewoon kleurenbeeld op. Deze camera heeft een 8-bit VGA resolutie van 640 bij 480 pixels met een Bayerfilter om de kleuren te bepalen. Een Bayerfilter is een kleurenfilter dat gebruik maakt van speciale algoritmes om alle kleuren uit een beeld te reconstrueren met enkel rode, blauwe en groene pixels. Hierdoor kan de kleur van een pixel niet op zich bepaald worden, maar dienen de kleuren van naburige pixels ook gekend te zijn om de originele kleur van een pixel te reconstrueren. Dergelijk filter of
3.1 Microsoft Kinect
12
varianten ervan worden veelal toegepast in digitale camera’s. De diepte-sensor bestaat uit een infrarood lichtbundel die een puntenpatroon projecteert op de zichtbare ruimte, wat door een CMOS sensor gedetecteerd wordt. Een CMOS sensor kan de diepte van een object bepalen aan de hand van het lichtpatroon dat erop geprojecteerd wordt. Doordat de Kinect zijn eigen lichtpatroon uitstuurt is hij niet afhankelijk van de belichting binnen de omgeving, hij zal dus ook detectie en tracking kunnen uitvoeren in een donkere kamer. Er is tijdens het testen echter wel gebleken dat de belichting de accuraatheid in kleine mate be¨ınvloedt, en reflecties van zonlicht aanleiding kunnen geven tot fouten. De diepte-sensor cre¨eert net zoals de RGB-camera een video stream met een resolutie van 640 bij 480 pixels waarbij een diepte van 11 bit wordt gebruikt. Dit resulteert in 2048 detectieniveaus. Een voorbeeld van het dieptebeeld en het geprojecteerde puntenpatroon is te zien in Figuur 3.2. De combinatie van zowel de RGB-camera als diepte-sensor stelt de Kinect in staat om de positie van objecten en personen in het zichtbare bereik te bepalen. Dit zichtbare bereik bedraagt ongeveer een 6 m2 gecentreerd voor het toestel. Naast het bepalen van de positie is de Kinect ook in staat om personen te onderscheiden van de omgeving waarbij vervolgens bepaalde bewegingen herkend kunnen worden. Het detecteren en traceren van meerdere personen is ook mogelijk.
Figuur 3.2: Het dieptebeeld met niveaus (links) en het lichtpatroon uitgestuurd door de Kinect (rechts).
De ingebouwde microfoon maakt het mogelijk om gesproken commando’s te herkennen en de daarbij horende actie uit te voeren. Oorspronkelijk was de Kinect het antwoord van Microsoft op het Move systeem van Sony en de Wii van Nintendo, waarbij alle drie deze technologie¨en bedoeld zijn als entertain-
3.1 Microsoft Kinect
13
mentsysteem of als toevoeging aan een entertainmentsysteem. Maar voor de Kinect bleef het niet bij het gebruik voor entertainment omdat de mensen meer potentieel zagen voor het toestel. Velen begonnen te experimenteren met het toestel waarbij het uiteindelijk gehackt werd. Een kleine zeven maanden na deze hack heeft Microsoft een Kinect SDK vrijgegeven voor Windows zodat het publiek programma’s kon gaan ontwikkelen voor de Kinect. Deze SDK was echter vrij beperkt en liet enkel ontwikkeling toe met C++, C# en Visual Basic. Ondertussen zijn er ook al open-source varianten beschikbaar die de functionaliteiten van de Windows Kinect SDK bezitten met nog extra uitbreidingen. Zo zijn er onder andere OpenKinect en OpenNi die communicatie met de Kinect toelaten en zijn er functionaliteiten van de Kinect opgenomen in raamwerken voor 3D bewerking en robotics zoals PCL en ROS. We zullen nu enkele sectoren opsommen waarvoor de Kinect nuttig kan zijn en waarrond reeds onderzoek is verricht. Gezondheidszorg
In de gezondheidszorg en specifiek in ziekenhuizen draait alles rond het minimaliseren van het risico op besmetting voor de pati¨enten. Zo zijn dokters verplicht zicht te scrubben vooraleer ze een steriele ruimte betreden, ook al is het maar voor ´e´en minuut. Verder worden operaties tegenwoordig gedaan aan de hand van 3D-videobeelden die de dokter begeleiden, net zoals een GPS je de weg wijst in de auto. Maar natuurlijk is het niet handig om telkens te moeten scrubben indien de beelden bekeken of aangepast worden, aangezien dit tijd kost waardoor de operatie langer zal duren. Die aanpassingen gebeuren normaal in een andere ruimte omdat het gebruik van toetsenbord, muis of touchscreen gevaar met zich meebrengt, deze kunnen namelijk bacteri¨en dragen. De Kinect zou hiervoor een oplossing kunnen bieden omdat de dokter dan in staat is om de beelden met intu¨ıtieve bewegingen aan te passen naar wens zonder enige apparatuur te moeten aanraken [20][21]. Commercieel
E-shoppen wint steeds meer aan populariteit, maar hoe kan je nu voor het overgaan tot een aankoop weten of een bepaald kledingstuk je siert? Hierbij kan de Kinect een handige tool zijn om de kledingstukken virtueel aan te doen. Je gaat voor de camera staan, kiest een kledingstuk en vervolgens zie je jezelf met het kledingstuk aan. Er zijn reeds applicaties ontwikkeld die dit mogelijk maken [22]. De reacties van klanten die dergelijk systeem getest hebben waren positief, maar het kost nog wel vrij veel tijd en moeite om een virtuele bibliotheek met de kleren aan te maken. Onderwijs
3.2 ROS ( Robot Operating System)
14
In het hedendaags onderwijs tracht men de interactie tussen leerkrachten en leerlingen alsook tussen leerlingen onderling te vergroten, en dit vooral in het lager onderwijs. Op deze manier wil men de aandacht van de leerlingen langer bij de les houden en tegelijkertijd het lesgeven geen routinewerk maken voor de leerkracht. Met de intrede van het interactief bord (beter bekend als smartboard ) is men hier dan ook gedeeltelijk in geslaagd en kunnen de leerlingen zelf meer input leveren tijdens de lessen. Maar met de Kinect zou men dit nog verder kunnen drijven. Door zijn eenvoudige en intu¨ıtieve bediening kan men beelden die verschijnen aanpassen of er aantekeningen aan toevoegen. Bovendien kan de Kinect meerdere gebruikers detecteren en volgen waardoor met meer personen tegelijk kan worden gewerkt op ´e´enzelfde beeld. Ook de prijs van de Kinect in vergelijking met die van een smartboard maakt de overstap interessant. Uit onderzoek blijkt dat een Kinect meer interactie veroorzaakt en bijna alle functionaliteiten bezit van een interactief bord [23]. Dit zijn nog maar enkele voorbeelden waarbij de Kinect nuttig kan zijn. [24] Geeft nog een aantal mogelijke situaties waarin of waarvoor de Kinect nuttig kan zijn.
3.2
ROS (Robot Operating System)
ROS is een software raamwerk dat vooral gebruikt wordt voor het sturen van robots van allerlei soort. Maar ook de medewerkers van het ROS raamwerk hebben het potentieel van de Kinect gezien en deze dan ook opgenomen in het raamwerk. Er zijn vervolgens enkele Kinect demo’s ter beschikking gekomen die in de repository eenvoudig zijn terug te vinden onder een gegroepeerde naam mit-ros-pkg. Onder deze demo’s zijn onder andere handdetectie, vingerdetectie, virtueel piano spelen en nog meer terug te vinden. De voor deze masterproef meest interessante demo was de vingerdetectie. Deze zou gebruikt kunnen worden om zowel de handen als de vingers te detecteren. Met de data van zowel handen als vingers ter beschikking hoopte ik meer accurate resultaten te kunnen bekomen bij het herkennen van gebaren dan bij voorgaande studies [25]. Meer informatie over dit raamwerk en de vingerdetectie zit vervat in Bijlage A.
3.3
PCL (Point Cloud Library )
PCL is een open source raamwerk dat verscheidene state of the art algoritmes implementeert voor het analyseren en bewerken van n-dimensionale puntenwolken. Deze puntenwolken kunnen van een omgeving, een bepaald object of zelfs personen afkomstig zijn. Wat het inter-
3.4 OpenNI
15
essantste is zijn de 3D analyse en bewerkingen om bijvoorbeeld objecten, personen of zelfs hele omgevingen in 3D te reconstrueren aan de hand van beelden die met een 2D camera zijn opgenomen. Hierbij kan onder andere gebruik worden gemaakt van de storingen in de camerabeelden om de 3D reconstructie te verbeteren. Er kan ook gebruik worden gemaakt van camera’s zoals de Kinect die reeds diepte informatie meegeven van de beelden zodat het behandelen van de beelden vereenvoudigd kan worden. Voor meer informatie over PCL verwijs ik u door naar Bijlage B. PCL was voor deze masterproef vooral interessant omdat het vele functies bevat om met 3D data te werken. Deze functies werden ook reeds gebruikt in de vingerdetectie van ROS waardoor het interessant was om de bruikbaarheid van PCL na te gaan.
3.4
OpenNI
OpenNI oftewel Open Natural Interaction is een open source SDK die toelaat om software te ontwikkelen voor 3D camera’s. De Kinect valt ook onder deze categorie en wordt ondersteund door de SDK. Let wel op dat de ondersteuning voor de Kinect onder Linux distributies niet langer aanwezig is in versie 2.0 en het dus het gebruik van een eerdere versie oplegt. De oorzaak hiervan is dat de SDK bij detectie van een Kinect in versie 2.0 gebruik zal maken van de MS Kinect SDK die niet werkt op Linux. De OpenNI SDK bevat vele voorbeeldapplicaties in verscheidene programmeertalen, die zeer nuttig zijn om op verder te werken. Er zijn ook reeds boeken verschenen over het gebruik van deze SDK die nuttig zijn geweest tijdens de uitvoering van deze masterproef. Het interessante aan OpenNI is de skelet tracking die de programmeur in staat stelt om skeletten (gebruikers) te detecteren via de Kinect. Hieruit kan dan de positie van de ledematen bepaald worden om zo sneller naar de vingers te kunnen zoeken. Aangezien de installatie van deze SDK niet moeilijk is en duidelijk beschreven staat op de webpagina [26] zal er niet verder op worden ingegaan.
3.5
MLPack
Mlpack [27] is een C++ bibliotheek die een vrij compleet pakket met functionaliteiten voor machinaal leren voorziet. Zo omvat het verschillende soorten algoritmes die gebruikt kunnen worden waarvan de Hidden Markov Model subbibliotheek het meest interessant is voor deze masterproef. Deze bibliotheek is relatief eenvoudig in gebruik eens de manier van input begrepen is, er wordt verder actief ondersteuning geboden voor alle vragen. Vragen worden
3.5 MLPack
16
dus vrij snel (binnen de week) beantwoord en moedigt de ontwikkelaars aan tot uitbreiding van de bibliotheek met meer functionaliteiten en documentatie. Wat de Hidden Markov Model bibliotheek betreft kunnen het Forward, Backward, Viterbi en Baum-Welch algoritme worden gehanteerd. Er kan dus eenvoudig een HMM worden getraind of een voorspelling worden gemaakt met logaritmische probabiliteiten door gebruik te maken van een eerder getrainde HMM.
DE VINGERDETECTIE
17
Hoofdstuk 4
De vingerdetectie Er is reeds gesproken over de functionaliteiten van ROS, PCL en OpenNI wat bestaande raamwerken zijn die in verband staan met de Kinect. Zo bevat ROS een hand- en vingerdetectie terwijl PCL meer gefocust is op de bewerking van 3D puntenwolken en OpenNI de nodige functionaliteiten bevat om met de Kinect te communiceren en gebruikers te tracken. Elk raamwerk heeft zijn voordelen en in een initi¨ele fase van deze masterproef zou er ´e´en van de bestaande raamwerken gebruikt en aangepast worden om er de nodige data voor classificatie mee te verkrijgen. Echter wogen de voordelen van de raamwerken niet op tegen de nadelen en is er besloten om zelf een vingerdetectie te implementeren. Deze nadelen omvatten het ontbreken van een hand of vingerdetectie in OpenNI en PCL en de lage prestatie van ROS vanwege het publish-subscribe systeem waarmee de modules onderling communiceren, waardoor dan ook nog eens dataverlies optreedt. De eigen implementatie moest in staat zijn om de data die nodig is voor classificatie van gebaren te verkrijgen. Deze data omvat een positie en richtingsvector voor zowel de hand als iedere gedetecteerde vinger. Dit hoofdstuk zal de eigen implementatie van vingerdetectie toelichten met daarbij een aantal geteste methodes om tot de uiteindelijke versie te komen. Iedere sectie in dit hoofdstuk zal een stap van de vingerdetectie behandelen waarbij regelmatig enkele resultaten worden aangehaald.
4.1
Kalibratie van een nieuwe gebruiker
De kinect bezit de mogelijkheid om een gebruiker te detecteren via de bibliotheken van OpenNI. Echter is het detecteren van een gebruiker niet voldoende en dient de camera voor de gedetecteerde gebruiker gekalibreerd te worden. Indien gebruik wordt gemaakt van versie 1.3 of een eerdere versie van OpenNI dient de gebruiker voor kalibratie van de camera
4.2 Het cre¨eren van een 3D puntenwolk
18
een bepaalde houding aan te nemen. Deze houding bestaat eruit dat de gebruiker naar de camera kijkt en beide handen alsook onderarmen in de lucht steekt zodat de bovenarmen een horizontale houding ter hoogte van de schouders aannemen zoals in Figuur 4.1. Vanaf versie 1.5 is er een autokalibratie voorzien die geactiveerd kan worden zodra een gebruiker gedetecteerd is. Dit neemt het ongemak van de nood voor een kalibratiehouding dus weg, wat zeker wenselijk is voor de vingerdetectie. Toch zal de autokalibratie nog steeds een obstakel vormen om gebruik te maken van een dataset met gebaren. Eens de camera gekalibreerd is voor een gebruiker kunnen de posities van vijftien punten op het lichaam worden verkregen. Deze punten zijn het hoofd, de nek, de romp (zijnde een centraal punt op de borstkas), de linkerschouder, de linkerelleboog, de linkerhand, de linkerheup, de linkerknie, de linkervoet en de rechter varianten van de laatste zes uit deze lijst. Een deel van deze punten zijn ook in Figuur 4.1 (rechts) te zien als contactpunten van de getekende lijnen. In de volgende sectie zal het nut van deze posities worden aangehaald.
Figuur 4.1: OpenNI kalibratiehouding.
4.2
Het cre¨ eren van een 3D puntenwolk
De nood om een 3D puntenwolk te cre¨eren van de camerabeelden ontstaat door gebruik te maken van de functionaliteiten die PCL biedt in plaats van deze zelf te gaan implementeren. Wetende dat OpenNI een kleurenmap alsook een dieptemap van het beeld zoals gezien door de Kinect levert kan er eenvoudig een omzetting gebeuren van de dieptemap naar een 3D puntenwolk (bij deze omzetting is het belangrijk er rekening mee te houden dat de afstanden in een dieptemap van OpenNI in millimeter zijn uitgedrukt terwijl dit voor een PCL-puntenwolk in meter wordt verondersteld). De omzetting van een dieptemap naar een puntenwolk zal
4.3 Voorbehandeling van de puntenwolk voor de hand
19
een aantal berekeningen per punt, of pixel, met zich meebrengen en dus enige tijd vragen. Aangezien een near-real-time vingerdetectie gewenst is, is het belangrijk om de rekentijd te minimaliseren. Hierdoor is er besloten om niet de gehele dieptemap om te zetten in een puntenwolk, maar in plaats daarvan enkel de belangrijke data op te nemen in de puntenwolk. Onder de belangrijke data vallen de punten die binnen de omgeving liggen waarbinnen gebaren kunnen plaatsvinden, zijnde een volledige armlengte aan weerszijden van de romp en van de heupen tot een halve armlengte boven de positie van het hoofd. Dit bleek echter nog steeds een overvloed aan informatie te zijn en dus is er nog een extra beperking opgelegd met positieve invloed op de prestatie. Er is namelijk beslist om enkel de data rond de handen op te nemen in een puntenwolk aangezien enkel deze data nodig is voor de detectie van de vingers. Hier komen dan ook de posities voor rechter- en linkerhand, zoals verkregen via OpenNI, goed van pas. Er zal namelijk een kubus rond iedere hand worden gelegd met de positie van de hand als centraal punt, waarna een puntenwolk wordt gecre¨eerd van alle punten binnen de kubus. De halve lengte van de zijden van deze kubus kan worden ingesteld met een parameter die standaard op elf centimeter is ingesteld om een verscheidenheid van handgroottes te kunnen behandelen. Om nog even samen te vatten zijn er in deze stap puntenwolken gecre¨eerd voor iedere hand, met mogelijk nog wat ruispunten die binnen de kubus vielen en in een later stadium worden weggefilterd. Indien een hand niet gedetecteerd werd of de onzekerheid van de detectie ervan hoger is dan vijftig procent, wordt de hand in kwestie niet behandeld. Door toepassing van de hier beschreven methode worden de bewerkingen om tot puntenwolken voor de handen te komen geminimaliseerd om zo de prestatie van deze fase te maximaliseren.
4.3
Voorbehandeling van de puntenwolk voor de hand
Alvorens over te gaan tot de effectieve vingerdetectie wordt er eerst een kleine voorbehandeling uitgevoerd op de puntenwolken voor de handen: er wordt nagegaan of de hand open of gesloten is. Een puntenwolk zoals verkregen uit OpenNI door omzetting is te zien in Figuur 4.2. Hou er wel rekening mee dat de puntenwolk in de figuur een omzetting is naar 2D, dit zal in figuren veelal het geval zijn om het eenvoudiger interpreteerbaar te maken. Om na te gaan of een hand open is zullen de eigenwaarden voor de drie dimensies van de puntenwolk worden berekend, waarna deze met elkaar worden vergeleken. Als het resultaat van deze vergelijking lager is dan een opgelegde grens (zoals in de ROS hand-detectie werd gebruikt) kan er besloten worden dat de hand gesloten is. De afwijking tussen de eigenwaarden is namelijk laag in het geval de hand een vuist vormt. Echter is deze manier van werken niet goed genoeg aangezien het opsteken van ´e´en vinger slechts een marginale invloed zal hebben
4.4 Detectie van de vingers
20
op de eigenwaarden en dus moeilijk te detecteren valt. Om dit te compenseren wordt er, na het besluiten dat de hand gesloten is, nog een extra controle uitgevoerd. Bij deze controle wordt gezocht naar de grootste x en de grootste y afstand voor de hand, er wordt dus gezocht naar een metrieke afstand voor de dimensies van de hand. Het berekenen van de maximale z afstand is hierbij overbodig omdat een vinger die recht naar de camera wijst niet gezien wordt door de Kinect. Vervolgens zal de maximale x afstand vergeleken worden met de maximale y afstand om na te gaan of er alsnog een vinger is uitgestoken en de hand als open aanzien moet worden. Het geval waarbij vijf vingers zijn uitgestoken, dus een volledig open hand, zal gelijkaardige x en y afstanden hebben maar wordt reeds als open gezien in de eerste test en vormt daardoor geen probleem. Er wordt dus nagegaan of de hand open of gesloten is met het idee, geen verdere bewerkingen uit te voeren om de vingers te zoeken in het geval van een gesloten hand om zo de nodige berekeningen zo laag mogelijk te houden. Een direct gevolg hiervan is dat voor gesloten handen een hogere framerate bereikt kan worden in het uiteindelijke programma.
Figuur 4.2: Voorbeeld van een puntenwolk voor de hand.
4.4
Detectie van de vingers
De detectie van het aantal vingers per hand is een belangrijk onderdeel van de totale vingerdetectie met tot doel het detecteren van gebaren. Het aantal vingers is al een goede start voor latere classificatie van gebaren, die verder verbeterd kan worden door meer data van de handen in rekening te brengen zoals de richting en positie van de handen alsook van iedere vinger. Er is dan ook een aanzienlijke tijd gespendeerd aan de implementatie voor de detectie van het aantal vingers waarbij verschillende methodes zijn bedacht. Het centrale idee bij deze
4.4 Detectie van de vingers
21
methodes is om de puntenwolk voor iedere hand zodanig te bewerken dat de handpalm van de vingers gescheiden kan worden. Hiervoor is geopteerd om de handpalm zo goed mogelijk te gaan zoeken in de puntenwolk om deze vervolgens te verwijderen. Er is ook nagedacht over het rechtstreeks zoeken van de vingers in plaats van de handpalm. Echter is het laatste idee snel opgeschort omdat die manier complexer is en meer rekentijd zou vragen dan gewenst is, bovendien maakt de vorm en de hoge concentratie van punten voor de handpalm de detectie ervan voor verwijdering aantrekkelijker. Het is dan ook het gebruik van puntenconcentraties binnen een bepaald (wiskundig) lichaam dat in alle methodes wordt gebruikt om de handpalm te vinden. Tabel 4.1 geeft reeds een aantal resultaten van de verschillende methodes die getest werden. Een aantal van deze methodes zullen in deze sectie aan bod komen en in meer detail worden toegelicht (ROS vingerdetectie is toegevoegd ter volledigheid). Voor het bekomen van deze resultaten zijn geen specifieke regels gevolgd waardoor geen getallen worden gebruikt voor de accuraatheid. Het behaalde aantal frames is opgemeten door de tijd in milliseconden bij iedere frame op te meten en vervolgens na te gaan hoeveel frames er in ´e´en seconde worden getoond. De accuraatheid is gerankt volgens eigen bevindingen tijdens langdurige live test waarbij een verschillend aantal vingers werd gebruikt, in een later hoofdstuk zullen specifieke cijfers voor de accuraatheid worden vermeld. In een laatste sectie wordt dan nog een vorm van clustering besproken die gebruikt wordt om de vingers van elkaar te onderscheiden. Tabel 4.1: Vingerdetectie resultaten Methode
4.4.1
Frames per seconde
Accuraatheid
ROS vingerdetectie
2
FFF
Met kleine bollen
1
FFFFF
Met kleine kubussen
2
FFFF
Met grote bol
4
FFFF
Met grote kubus
6
FFF
Dubbel filter
6
FFFFF
Raster met bol
15
FFFF
Raster met bol en kubus
15
FFFFF
Punt per punt filter met een kleine bol
Zoals de titel reeds doet vermoeden zal er in deze methode gebruik worden gemaakt van een bol met kleine straal. Hierbij is het belangrijk om de straal van de bol groter te nemen
4.4 Detectie van de vingers
22
dan de halve diameter van de dikste vinger, zijnde de duim. Indien dit niet het geval is, zal de concentratie van punten voor de duim slechts marginaal afwijken van deze voor punten binnen de handpalm wat de detectie aanzienlijk moeilijker maakt. Bij het testen is er gebruik gemaakt van een straal van twee centimeter. Op dit punt van de masterproef werden er enkel testen op mezelf verricht en bewees deze waarde een goede afmeting te zijn voor mijn hand. In een later stadium is er overgegaan tot afmetingen die bepaald worden tijdens de uitvoering van het programma zodat het adaptief wordt naar andere gebruikers toe. Bij deze methode wordt de voornoemde bol punt per punt over de puntenwolk van een hand verplaatst terwijl voor ieder van de punten, waar de bol rond gelegd wordt, de puntenconcentratie binnen de bol berekend wordt. Wanneer deze concentratie groter is dan een opgelegd percentage worden de punten in de bol als deel van de handpalm gezien en gemarkeerd voor verwijdering. De punten worden niet meteen verwijderd omdat ze dan niet meer in rekening kunnen gebracht worden voor een andere bol. Na het bekijken van ieder punt in de puntenwolk worden alle gemarkeerde punten uit de totale puntenwolk verwijderd om zo enkel de vingers met eventueel wat ruispunten over te houden. Figuur 4.3 illustreert de werking met een visueel voorbeeld. Hou er wel rekening mee dat hier zoals voorheen voor de eenvoud een 2D weergave is gebruikt en de linkse afbeelding een standaard puntenwolk van de hand voorstelt terwijl de rechtse afbeelding een rechtstreeks resultaat is na toepassing van de methode. Deze methode is accuraat voor het onderscheiden van de handpalm ten opzichte van de vingers maar vereist veel bewerkingen en is dus enorm traag, er werd namelijk maar ´e´en frame per seconde verwerkt zoals aangegeven in Tabel 4.1. Om de snelheid op te drijven kan er worden overgegaan tot het gebruik van kleine kubussen in plaats van bollen omdat de berekening om te kijken of een punt binnen een kubus valt eenvoudiger is dan die om te kijken of het binnen een bol valt. De kubussen hadden hierbij een zijde die gelijk is aan de diameter van de eerder vernoemde bol (dus vier centimeter). Wat de werkwijze betreft was deze volledig gelijklopend met de werkwijze voor een bol, deze zal dus ook niet verder worden toegelicht. Uit de resultaten bij een kubus bleek inderdaad dat er een kleine versnelling plaatsvond en twee frames per seconde werden bereikt terwijl de nauwkeurigheid lichtjes verminderde (zie Tabel 4.1). Maar dit is uiteraard nog te traag voor gebruik dus is er verder gezocht naar andere benaderingen.
4.4 Detectie van de vingers
23
Figuur 4.3: Voorstelling van methode met een kleine bol: links de puntenwolk van een hand met de uit te knippen bollen, rechts de resterende puntenwolk.
4.4.2
Punt per punt filter met een grote bol
Om de snelheid te verhogen zonder al te veel verlies aan accuraatheid kan gebruik worden gemaakt van ´e´en grote bol om de handpalm te detecteren. Uit theoretisch oogpunt alsook uit tests is namelijk gebleken dat het gebruik van een bolle vorm tot meer accurate resultaten leidt dan een kubusvormig lichaam. Daarom zijn er een aantal mogelijkheden bekeken waarbij op een andere manier gebruik wordt gemaakt van een bol. Een mogelijke benadering is om te vertrekken van een zeer grote bol die de hele hand omhult met als middelpunt het centraal punt van de hand. Vervolgens kan de bol verkleind worden totdat de puntenconcentratie nog maar weinig afwijking vertoont ten opzichte van die voor de vorige bolgrootte, op dat moment zouden de vingers zich buiten de bol moeten bevinden. Theoretisch gezien zou dit mogelijk moeten zijn, maar de variaties in puntenconcentratie waren zeer klein wat het moeilijk maakt om de detectie van de handpalm correct uit te voeren. Aldus werd deze benadering al snel verworpen. Ook de omgekeerde manier, van een kleine naar een grote bol gaan, kon dus meteen verworpen worden vanwege de gelijkaardige werking. Wat wel werkt en werd ge¨ımplementeerd is het gebruik van een bol met vaste grootte die op een punt per punt manier over de puntenwolk wordt verplaatst. De straal van de bol werd voor mijn hand op zes centimeter vastgelegd. Het bepalen van de grootte voor deze straal kan ook tijdens de uitvoering van het programma worden vastgelegd door gebruik te maken van de maximale x en y afstanden voor de hand. Hierbij wordt dan de helft van de kleinste van deze twee waarde gebruikt omdat die de breedte van de handpalm zal vertegenwoordigen. Het verschil met de vorige methode is dat er nu niet wordt gezocht naar punten waarvoor de puntenconcentratie binnen de bol een grenswaarde overschreidt, maar deze keer worden de puntenconcentraties voor ieder middelpunt bijgehouden. Na het bekijken van ieder punt uit
4.4 Detectie van de vingers
24
de puntenwolk wordt dan teruggegaan naar het punt waarvoor de concentratie het grootst was om alle omringende punten die binnen de bol vielen uit de volledige puntenwolk te verwijderen. Figuur 4.4 illustreert het idee achter deze werkwijze. Zoals in Tabel 4.1 is aangegeven is deze manier van werken vrij accuraat en dus acceptabel. In tegenstelling tot de theoretische verwachtingen bleek deze methode toch sneller te zijn dan het gebruik van een kleine bol, er werden vier frames per seconde bereikt. Ondanks de acceptabele accuraatheid is deze manier van werken alsnog afgeschreven omdat ze te traag is om aan detectie van gebaren te doen.
Figuur 4.4: Voorstelling van methode met een grote bol: links de puntenwolk van een hand met de gevonden uit te knippen bol, rechts de resterende puntenwolk.
4.4.3
Punt per punt filter met grote kubus
Om de snelheid te verhogen bij acceptabele accuraatheid is er een implementatie gebeurd met een grote kubus. De werkwijze is gelijkaardig aan die waarbij gebruik werd gemaakt van een grote bol met als enige verschil het gebruik van een grote kubus in plaats van een bol. Een zijde van de kubus heeft de afmeting van de diameter van de bol uit de methode met een grote bol (zijnde 12 centimeter) en kan op dezelfde manier worden bepaald tijdens uitvoering. Zoals verwacht is het gebruik van een kubus in plaats van een bol ook hier iets sneller, er worden namelijk zes frames per seconde bereikt. Echter is de accuraatheid afgenomen wat het onderscheiden van de vingers onderling aanzienlijk bemoeilijkt door de blijvende verbindingspunten tussen de vingers. Bovendien zijn zes frames per seconde niet echt een noemenswaardige verbetering ten opzichte eerdere methodes. Figuur 4.5 toont ook hier het idee van de methode en het resultaat ervan voor een open handvorm waarbij de verbindingspunten tussen vingers duidelijk zichtbaar zijn.
4.4 Detectie van de vingers
25
Figuur 4.5: Voorstelling van methode met een grote kubus: links de puntenwolk van een hand met de gevonden uit te knippen kubus, rechts de resterende puntenwolk.
4.4.4
Een dubbel filter voor hogere accuraatheid
Naast de snelheid is ook de accuraatheid zeer belangrijk om later tot goede classificatie over te gaan. Daarom is er gebruik gemaakt van een dubbel filter waarbij het tweede filter de accuraatheid moet verhogen. Het probleem dat kan optreden en aanleiding geeft tot minder accuraatheid is de aanwezigheid van ruispunten die de verschillende vingers met elkaar verbinden. Door deze ruispunten zullen regelmatig meerdere vingers als ´e´en geheel worden aanzien wat foute parameters als uiteindelijk gevolg zal hebben. Een eerste filter is een punt per punt filter met een grote kubus zoals beschreven in sectie 4.4.3. Het tweede filter moet de puntenconcentraties binnen een klein lichaam met als middelpunt de punten op de rand van de grote kubus bekijken om eventueel overgebleven hoge concentraties alsnog te verwijderen. Het lichaam dat gebruikt wordt voor het tweede filter kan een bol of kubus zijn zoals gebruikt in sectie 4.4.1 met gelijkwaardige afmetingen. Zoals uit de resultaten blijkt zal het gebruik van een bol tot hogere accuraatheid leiden ten opzichte van het gebruik van een kubus. In Figuur 4.6 is dan ook enkel de werking van het gebruik van de bollen ge¨ıllustreerd. Hierin valt meteen op dat er iets minder punten per vinger zijn, dit is geen echt minpunt omdat niet perfect alle punten van een vinger noodzakelijk zijn om mee verder te werken. Het gebruik van dit dubbel filter zorgt voor een merkbare stijging in accuraatheid zonder een meetbare invloed te hebben op het aantal frames per seconde in vergelijking met de methode uit sectie 4.4.3. Theoretisch zou dit echter iets lager moeten worden ten gevolge van de toegevoegde berekeningen die moeten gebeuren.
4.4 Detectie van de vingers
26
Figuur 4.6: Voorstelling van methode met een dubbel filter: links de puntenwolk van een hand met de gevonden uit te knippen kubus en bollen aan de rand, rechts de resterende puntenwolk.
4.4.5
Een dubbel filter met raster voor hogere framerate
Denkend aan de aangeleerde kennis rond multimedia, kwam het alom gekende gebruik van een raster in gedachten. In de multimedia wordt een raster veelal gebruikt bij videobeelden om bewegingen te bepalen of zelfs te voorspellen. Dit heeft dan ook aanleiding gegeven om een raster te gebruiken voor het bepalen van de hand. Het gebruik van het raster verschilt hier omdat er geen gebruik wordt gemaakt van de vakjes maar wel van de punten die ten minste twee lijnen van het raster met elkaar verbinden, ik zal dit van nu af verbindingspunten noemen. Aangezien het center van de hand gekend is kan er een driedimensionaal raster rond dit punt gevormd worden om dan enkel de verbindingspunten te gaan gebruiken. Het gebruik van een raster zorgt ervoor dat er aanzienlijk minder punten moeten bekeken worden in de verdere loop van deze methode. De tweede stap is afgeleid van de methode uit sectie 4.4.2, er zal dus rond ieder verbindingspunt een grote bol worden gelegd waarvoor de puntenconcentratie die erbinnen zit wordt berekend en bijgehouden. Vervolgens wordt het punt met de hoogste puntenconcentratie gebruikt als middelpunt van een grote kubus met als zijde de diameter van de bol. Er wordt overgestapt van een grote bol naar een grote kubus omdat een bol de hoogste accuraatheid heeft voor het vinden van de handpalm terwijl de kubus eventueel overblijvende ruispunten die de vingers met elkaar zouden verbinden mee verwijdert. Op deze manier gaan er ook wat extra punten van de vingers verloren maar zoals eerder aangegeven is dit niet erg voor het verdere gebruik van de overgebleven puntenwolk. Bovendien zijn de afmetingen van het raster, de bol en dus ook de kubus bepaald tijdens de uitvoering aan de hand van de gedetecteerde hand in kwestie waardoor het geheel adaptief en bruikbaar wordt voor derden.
4.4 Detectie van de vingers
27
Deze methode heeft een hoge accuraatheid alsook snelheid waardoor ze gekozen is als te gebruiken methode. Er werden vijftien frames per seconde gehaald met deze methode. Figuur 4.7 illustreert het raster waarbij eerst de positie van een grote bol wordt bepaald om vervolgens over te stappen op een kubus. De kubus is in de figuur iets groter getekend om het geheel overzichtelijk te houden.
Figuur 4.7: Voorstelling van methode met raster en dubbel filter: links de puntenwolk van een hand met het raster met daarop de gevonden cirkel en de uit te knippen kubus, rechts de resterende puntenwolk.
4.4.6
Clustering van de vingers
Figuur 4.8: De vorming van clusters voor vingers.
Met het clusteren van vingers wordt bedoeld het samenvoegen of groeperen van punten die dicht bij elkaar liggen om zo de vingers te bekomen. Na het verwijderen van de punten die corresponderen met de handpalm uit de puntenwolk blijft er een puntenwolk met minder data over zoals zichtbaar in het rechtse deel van Figuren 4.3 - 4.7. De bedoeling van het clusteren is het opdelen van de overgebleven puntenwolk in kleinere puntenwolken die dan later een vinger kunnen representeren. Figuur 4.8 illustreert op zeer eenvoudige wijze de werking van het clusteren die nu zal worden toegelicht. In eerste instantie is het nodig om
4.4 Detectie van de vingers
28
op zijn minst ´e´en nieuwe puntenwolk te cre¨eren om het eerste punt in op te slaan. Hierna zal voor ieder punt worden gekeken of er een kleine puntenwolk bestaat waarin minstens ´e´en punt zit dat op minder dan twee millimeter van het huidige punt verwijderd is om het beschouwde punt vervolgens in de puntenwolk die hieraan voldoet op te slaan. Indien er zo geen tweede punt bestaat zal er een nieuwe puntenwolk worden gecre¨eerd voor het beschouwde punt, en dit tot ieder punt van de oorspronkelijke puntenwolk is bekeken. Op deze manier worden n kleine puntenwolken gecre¨eerd, deze zullen echter nog geen vingers representeren omdat vanwege de vorm van de hand en de manier waarop over de punten wordt gelopen (wat afhankelijk is van de handrotatie) punten die op minder dan twee millimeter van elkaar verwijderd zijn alsnog in verschillende puntenwolken terecht kunnen komen. Om tot de vingers te komen zal er dus tussen de puntenwolken onderling nog eens gekeken moeten worden of er zijn die mogen samengevoegd worden. Iedere puntenwolk wordt dus met iedere andere puntenwolk vergeleken waarbij de punten die in elk van deze puntenwolken zitten worden vergeleken om te tellen hoeveel punten er op minder dan twee millimeter van elkaar verwijderd zijn. Vervolgens zullen de puntenwolken met de meeste punten die op minder dan twee millimeter van elkaar verwijderd zijn worden samengevoegd. Deze samenvoeging van puntenwolken gebeurt iteratief tot er geen meer kunnen worden samengevoegd. Na al de bovenstaande stappen is er nog steeds geen zekerheid dat alle overgebleven puntenwolken vingers voorstellen. Om dit toch te garanderen worden de puntenwolken met minder dan honderd punten verwijderd. Uit tests is gebleken dat clusters met minder dan honderd punten nog overblijvende ruis bezitten. De kleinste puntenwolk die een vinger voorstelt is die voor de pink en deze bezit steeds meer dan tweehonderd punten. Indien er dan nog meer dan vijf puntenwolken overblijven worden de vijf grootste puntenwolken bijgehouden omdat dit de vingers moeten zijn. Figuur 4.9 toont een aantal resultaten na het clusteren van de vingers, hierin vertegenwoordigt iedere kleur een vinger en zijn in het klein ook steeds de handvormen toegevoegd ter verduidelijking.
4.4 Detectie van de vingers
29
Figuur 4.9: Resulterende puntenwolken na het clusteren van vingers met de bijhorende handvorm.
SMOOTHING
30
Hoofdstuk 5
Smoothing De eigen implementatie voor de detectie van vingers had acceptabele prestatie en nauwkeurigheid, echter is uit testen gebleken dat er nog regelmatige kleine foutsequenties aanwezig zijn bij het detecteren van het aantal vingers. Het wegwerken van deze kleine foutsequenties kan op verschillende manieren en kan al snel de eindresultaten positief be¨ınvloeden. Hierdoor is er overgegaan tot het toevoegen van een vorm van smoothing alvorens over te gaan tot de training van en classificatie met Hidden Markov Modellen. Er bestaan verschillende algemeen bekende smoothing algoritmes en smoothing filters waaronder Additieve, Kernel, Laplaciaanse, Exponenti¨ele smoothing, Butherworth, Kalman, Recursief filter en Moving average. Na het bekijken van de toepasbaarheid van iedere vorm van filtering op de vingerdetectie kwamen Moving average en Exponenti¨ele smoothing er als beste uit, deze twee zijn dan ook ge¨ımplementeerd en getest. In dit hoofdstuk zullen beide filters worden toegelicht waarna de tests en resultaten worden besproken.
5.1
Moving average
Moving average oftewel voortschrijdend gemiddelde is een analytische methode die onder meer wordt gebruikt bij analyse van beurskoersen. De methode zal een bestaande reeks waarden omvormen tot een nieuwe reeks van gemiddelde waarden en is in staat om korte fluctuaties in waarden weg te filteren. Dit is dan ook waarom het binnen deze thesis handig zou kunnen zijn. Moving average kan worden toegepast om de kleine fouten die voorkomen bij het detecteren van vingers weg te werken. Eerst zal kort worden beschreven hoe dit algoritme in theorie werkt waarna een kleine toelichting volgt over de manier van implementatie binnen deze masterproef. Er wordt voor dit algoritme van uit gegaan dat er een hele reeks waarden ter beschikking
5.1 Moving average
31
zijn om telkens de gemiddelden van te berekenen. Over hoeveel waarden het gemiddelde genomen moet worden is instelbaar met een eenvoudige parameter die gedefinieerd wordt als n. Indien nu elke waarde voor smoothing wordt voorgesteld door de letter x en na smoothing door de letter s met een index, waarbij de index van de meest recente waarde t is, kan het huidige resultaat van moving average als volgt berekend worden:
st =
xt + xt−1 + · · · + xt−(n−1) n
(5.1)
In de initialisatie, wanneer er nog geen n waarden beschikbaar zijn, worden slechts het aantal beschikbare waarden in rekening gebracht en wordt er gedeeld door dat aantal waarden. Op ieder moment wordt er dus een nieuwe waarde berekend door rekening te houden met de laatste n waarden. Dit heeft tot direct gevolg dat fluctuaties in waarden van langere duur (n/2) niet kunnen weggefilterd worden en dat het bij een verandering van een waarde die voor langere duur wordt aangehouden minstens n/2 waarden zal duren vooraleer de nieuwe waarde zichtbaar wordt bij gebruik van moving average. Er zal dus steeds een vertraging optreden bij een waardeverandering. Nog een nadeel is dat de laatste n waarden steeds ter beschikking moeten zijn wat bij implementatie meer geheugen vereist dan bijvoorbeeld de implementatie van het exponenti¨ele filter (sectie 5.2). Het grootste voordeel van dit algoritme is de lage complexiteit. Figuur 5.1 geeft een fictief voorbeeld van toepassing van dit algoritme waarbij enkel met 5 en 3 als geobserveerde waarden wordt gewerkt. Zoals zichtbaar op de grafiek wijkt de implementatie af van het theoretische model, dit is doordat de resultaten voor de implementatie gediscretiseerd worden. De enige mogelijke waarden voor het aantal vingers zijn immers nul, ´e´en, twee, drie, vier of vijf. Net als in het voorbeeld zal ook in de implementatie binnen deze masterproef een gemiddelde van n waarden worden bekeken waarna wordt beslist of het huidige aantal vingers voldoet aan het resultaat van moving average. Indien dit het geval is wordt de huidige data behouden, maar indien dat niet het geval is zal de meest recente meting met dezelfde hoeveelheid vingers worden gebruikt als huidige meting. Op deze manier worden sommige metingen dus dubbel gebruikt teneinde de kleine fluctuaties in aantal vingers ten gevolge van storingen weg te werken.
5.2 Exponenti¨ele smoothing
32
Figuur 5.1: Illustratie van moving average met venstergrootte n=5.
5.2
Exponenti¨ ele smoothing
Een exponenti¨ele smoother is iets complexer dan moving average en wordt in de praktijk meer gebruikt zowel voor algemene smoothing alsook om voorspellingen uit af te leiden. In tegenstelling tot moving average houdt een exponenti¨ele smoother rekening met alle waarden uit het verleden. Alle waarden moeten hiervoor niet worden bijgehouden, het algoritme is zodanig opgebouwd dat enkel de huidige waarde en het vorige resultaat van exponenti¨ele smoothing gekend moeten zijn. Dit spaart in vergelijking met moving average geheugen uit en zorgt voor een snellere werking van het algoritme. Eerst zal even de opbouw van het algoritme bekeken worden om vervolgens over te gaan tot een korte toevoeging over de implementatie binnen deze masterproef. Het algoritme bestaat uit twee delen. Een initialisatie waarbij het eerste resultaat gewoon gelijk wordt gesteld aan de eerste waarde en een formule die van toepassing is op alle volgende waarden. Een exponenti¨ele smoother kan beschreven worden met de volgende formules:
s0 = x0
(5.2)
st = αxt + (1 − α)st−1 , t > 0
(5.3)
De x parameter stelt de originele waarden voor waarbij de index t staat voor de huidige
5.3 Testresultaten
33
waarde en 0 voor de eerste waarde, s duidt op de waarde na smoothing met index t voor de huidige en t-1 voor de vorige waarde. Verder is α de smoothing factor die bepaalt in welke mate de huidige waarde wordt be¨ınvloed door het verleden. In deze formulering zal een stijging van α resulteren in minder invloed van het verleden, indien α gelijk aan 1 wordt genomen zal er geen smoothing plaatsvinden. Deze formule komt soms ook voor in een lichtjes andere vorm waarbij α en 1-α zijn verwisseld waardoor een hogere α overeenkomt met meer invloed van waarden uit het verleden. Het grote voordeel van dit algoritme is de snellere respons op verandering in waarden dan bij moving average het geval was. Bij een exponenti¨ele smoother zal het minder lang duren voordat een verandering in waarden merkbaar wordt, deze tijdsduur is wel nog voor een stuk afhankelijk van de α factor. Het wegfilteren van kortstondige fouten wordt ook be¨ınvloed door de α factor waardoor de keuze van deze factor uitermate belangrijk is voor de goede werking. Figuur 5.2 geeft hier een illustratief voorbeeld van de exponenti¨ele smoothing. Hierbij werden dezelfde ingangswaarden gebruikt als in Figuur 5.1 en is bij vergelijking te zien dat in dit geval reeds een fout meer is weggewerkt op tijdstip 9. Daarnaast is ook hier te zien dat de implementatie afwijkt van het theoretische model omdat de waarde gediscretiseerd worden naar het aantal vingers. In de implementatie binnen deze masterproef is er opnieuw gebruik gemaakt van het aantal vingers voor de exponenti¨ele smoother. Deze keer wordt er gekeken hoe dicht het aantal vingers van de vorige en huidige meting bij het resultaat van de smoother liggen en wordt de dichtste meting als huidige meting ingesteld. Indien beide metingen een gelijk aantal vingers vertonen zal steeds de meest recente meting worden gebruikt.
5.3
Testresultaten
De vingerdetectie met toevoeging van smoothing omvat een groot deel van deze masterproef. Er zijn dan ook een aantal testen uitgevoerd om de prestatie van de smoothing methodes na te gaan. In deze sectie zullen de resultaten van deze de uitgevoerde testen besproken worden. Er zijn tests uitgevoerd met moving average waarbij verschillende waarden voor n zijn gebruikt alsook tests met exponenti¨ele smoothing met een verscheidenheid aan α factoren. Voor moving average zal de n parameter zijnde het aantal waarden waarover het gemiddelde wordt genomen benoemd worden als venstergrootte omdat het kan aanzien worden als het plaatsen van een venster rond n opeenvolgende waarden. Wat de exponenti¨ele smoother betreft zullen geen nieuwe benamingen gehanteerd worden. Bij de verschillende ingestelde parameters zijn vervolgens de vertragingstijden en het aantal fouten opgemeten. Deze fouten
5.3 Testresultaten
34
Figuur 5.2: Illustratie van exponenti¨ele smoothing met factor α=0.2.
zijn dan nog eens wat dieper bekeken door de grootste en kleinste foutsequentie in rekening te brengen. Om tot representatieve testresultaten te komen zijn er een aantal opnames uitgevoerd die dan gebruikt werden voor de tests. Deze opnames staan volledig los van de in een later hoofdstuk besproken dataset. Dit wil zeggen dat deze opnames niet gebruikt worden in de dataset en ook de opnameregels van de dataset niet volledig volgen. Er is een opname uitgevoerd waarbij de gebruiker een handvorm aanneemt en tijdens de opname overgaat naar een handvorm met een ander aantal vingers, dit om de vertraging bij overgangen te kunnen opmeten. Om de tijden op te meten werd bij ieder resultaat ook de tijd in milliseconden meegegeven. Om te bepalen hoeveel fouten er optreden bij een bepaalde smoothing methode met specifieke parameters zijn er zes opnames gebeurd. Bij elk van deze opnames zal de gebruiker een handvorm met nul, ´e´en, twee, drie, vier of vijf zichtbare vingers aannemen en deze willekeurig bewegen voor de Kinect tot er duizend frames bekomen zijn. Door met opnames te werken is er zekerheid dat telkens op dezelfde data wordt gewerkt waardoor de resultaten met elkaar vergeleken kunnen worden. Er zal eerst worden gekeken naar de optredende vertraging. Hiervoor zijn vele waarden voor de venstergrootte alsook voor de α parameter gebruikt. Figuur 5.3 toont de opgemeten resultaten. Er is bij moving average slechts tot een venstergrootte van zestien gegaan omdat een hogere venstergrootte te veel vertraging met zich meebrengt. Hierbij treed een vertraging
5.3 Testresultaten
35
Figuur 5.3: Opgemeten delay bij smoothing algoritmes.
van meer dan 800ms op, aangezien er aan 15 frames per seconde wordt gewerkt wil dit zeggen dat het ongeveer ´e´en seconde zal duren vooraleer een verandering aan de ingang zichtbaar wordt aan de uitgang. Bij moving average is meteen duidelijk dat er een stijging in de vertragingstijd plaatsheeft bij een stijgende venstergrootte. Een venstergrootte van 8 zou nog aanvaardbaar kunnen zijn maar daarboven wordt de vertraging veel te groot. Als er gekeken wordt naar de resultaten bij een exponenti¨ele smoother is er te zien dat een α factor dichter bij ´e´en een kleinere vertraging met zich meebrengt. Dit wil zeggen dat de vertraging die optreedt bij een waardeverandering afneemt wanneer de resultaten uit het verleden minder invloed hebben wat ook logisch is aangezien dit wil zeggen dat een nieuwe waarde minder moet voorkomen vooraleer ze merkbaar wordt. Ook hier is voor een α van 0.1 reeds een ongewenste vertraging zichtbaar en zal dus met een α factor van minimaal 0.2 worden gewerkt. Tabel 5.1 geeft enkele resultaten van de vingerdetectie na toepassing van de verschillende smoothing modes. Deze resultaten zijn procentueel weergegeven om ze eenvoudiger te kunnen interpreteren. Er zijn voor iedere test 1000 metingen uitgevoerd waarbij het belangrijk is ook op te merken dat een groot deel van de fouten optreedt in de initi¨ele fase, zijnde de tijd tussen kalibratie van de gebruiker en het effectief aannemen van de handvorm. Dat is dan ook de reden dat de grootste, kleinste en gemiddelde foutpercentages zijn gebruikt. Alle drie deze waarden zijn nodig om een volledige vergelijking te kunnen maken. Uit de resultaten die hier zijn vermeld komt moving average er als beste uit. Echter zijn deze resultaten opgetreden bij een venstergrootte van 16 waarmee een vertraging van meer dan 800ms gepaard gaat. Dit is overduidelijk een onacceptabele vertraging in tegenstelling tot de vertraging die optreedt bij exponenti¨ele smoothing. Voor exponenti¨ele smoothing met een α factor van 0.1 bedraagt de vertraging slechts 570ms voor resultaten die niet zo enorm veel afwijken van deze voor moving average smoothing met venstergrootte 16 terwijl de resultaten toch nog beter zijn dan zonder smoothing. Meer uitgebreide resultaten van de uitgevoerde
5.3 Testresultaten
36
Tabel 5.1: Foutpercentages bij vingerdetectie. Kleinste
Grootste
Gemiddelde
3%
26.9%
20%
Moving average (n = 16)
0.2%
24.5%
11.9%
Exponentieel (α = 0.1)
2.5%
24.6%
17.4%
Normaal
testen zijn terug te vinden in Bijlage C. Ondanks dat met een grote venstergrootte bij moving average een hogere accuraatheid kan bekomen worden is er toch gekozen om verder te werken met de exponenti¨ele smoothing. De doorslaggevende factor bij deze beslissing is de vertraging die optreedt bij moving average, deze is aanzienlijk lager voor exponenti¨ele smoothing. Hierbij is bovendien gekozen voor een α factor van 0.2 omdat de betere accuraatheid bij een lagere factor niet opweegt tegen de bijkomende vertraging.
DE DATASET
37
Hoofdstuk 6
De dataset Na het detecteren van de handen en vingers waarbij voldoende parameters kunnen achterhaald worden zoals het aantal vingers, de positie en richtingsvector voor iedere vinger alsook de hand dient er uiteraard nog een vorm van classificatie voor de gebaren plaats te vinden. Voor de classificatie zelf wordt gebruik gemaakt van Hidden Markov modellen die later aan bod komen. Dit brengt de nood aan training van het systeem met zich mee wat aanleiding geeft tot dit hoofdstuk. Er is dan ook gekeken hoe het beste met een dataset kan gewerkt worden en wat zoal de vereisten zijn. De dataset moet bestaan uit opnames van gebaren die bij voorkeur met een Kinect zijn opgenomen om zowel de RGB als dieptedata ter beschikking te hebben. Er zijn eerst mogelijkheden bekeken om gebruik te maken van een bestaande datasets van derden. Dit was echter niet mogelijk en de reden hiervoor zal in dit hoofdstuk worden toegelicht. Verder zal er nog gekeken worden naar een aantal opgestelde regels voor het opnemen van een dataset alsook de opbouw van de uiteindelijk gebruikte dataset.
6.1
Datasets van derden
Zoals reeds vermeld is er eerst gekeken in hoeverre bestaande datasets bruikbaar zijn binnen deze masterproef. Er bestaat een verscheidenheid aan datasets die vrij beschikbaar zijn, echter wordt deze groep al veel kleiner door de nood aan dieptedata. Van de overblijvende datasets zijn er nog veel afgevallen doordat de meeste datasets opnames bevatten van objecten of ruimtes met tot doel het gebruik bij onderzoek rond 3D reconstructie door middel van opnames. Uiteindelijk bleven er nog twee datasets over die mogelijk bruikbaar zouden zijn. Een eerste dataset was er ´e´en die door Prof. Mieke van Herreweghe zou worden opgenomen met gebruik van een Kinect camera. Na opvraging van de plannen rond de dataset bleek deze gepland te zijn tegen september 2013 wat het gebruik ervan binnen deze masterproef
6.2 Richtlijnen voor opname
38
onmogelijk maakt. De tweede mogelijkheid was het gebruik van een dataset die werd opgenomen voor gebruik in een masterproef van vorig academiejaar [25]. In deze dataset zaten vijftig gebaren die tien keer waren opgenomen met de Kinect voor drie verschillende personen. Hierbij kwamen telkens enkele gelijkaardige gebaren voor met zowel ´e´en hand als twee handen. Er zaten zowel voorbewerkte alsook onbewerkte opnames in deze dataset. Het eerste probleem met deze dataset was dat alle opnames in avi formaat stonden en OpenNI (het Kinect raamwerk dat gebruikt wordt) dit formaat niet kan inlezen. OpenNI kan enkel bestanden in oni formaat, wat een veel gebruikt formaat is voor opnames met de Kinect, inlezen. Bovendien bezit OpenNI geen enkele mogelijkheid om een oni bestand te maken van een avi bestand. Zo een oni bestand kan aan OpenNI gegeven worden om de initialisatie te starten waarbij de verwerking van de beelden in het oni bestand verder gebeurt zoals wanneer ze rechtstreeks van de kinect worden gestreamed. Om toch met de avi bestanden te kunnen werken is een programma geschreven dat in staat is om de avi bestanden om te zetten naar oni bestanden voor gebruik met OpenNI. In dit conversieprogramma wordt een bestaand oni bestand gebruikt om een virtuele Kinect te initialiseren. Daarna wordt voor iedere frame in een avi bestand de data gekopieerd naar een frame zoals opgeslagen in een oni bestand. Op die manier kan de conversie toch geschieden door pixel per pixel te kopi¨eren. De beschikbaarheid van een oni bestand als template is noodzakelijk om de nieuwe bestanden op de juiste manier op te slaan met alle extra relevante data voor de Kinect erbij. Na omzetting van de opnames voor ´e´en gebaar werd het nieuwe oni bestand aan de vingerdetectie gegeven om de resultaten ervan al eens te bekijken. Deze resultaten waren niet aanwezig, er vond dus geen kalibratie van de gebruiker plaats met tot gevolg dat de handen niet gedetecteerd werden. De oorzaak hiervan was de resolutie van de opnames die slechts 170 bij 128 pixels bedroeg, met als gevolg dat er niet genoeg details uit de beelden verkregen kunnen worden voor detectie van de handen en al zeker niet voor het vinden van de vingers. Voor de masterproef van voorgaand academiejaar was die resolutie wel hoog genoeg omdat er andere methoden werden toegepast. Er was dus nood ontstaan aan het opnemen van een eigen dataset voor gebruik binnen deze masterproef. Meer details over deze dataset worden in de volgende secties uitgezet.
6.2
Richtlijnen voor opname
Om over te kunnen gaan tot het opnemen van een dataset is het belangrijk om een aantal regels en specificaties op te stellen waaraan de opnames moeten voldoen. Op die manier komt er enige uniformiteit in de opnames en kunnen fouten bij de opnames vermeden worden.
6.3 Opbouw van de dataset
39
Wat de regels voor de omgeving betreft is het belangrijk om te voorkomen dat er fel zonlicht in de opnameruimte kan optreden. Fel zonlicht zal het beeld dat de Kinect opneemt verstoren omdat het puntenpatroon dat deze uitstuurt hierdoor grondig verstoord wordt. Anderzijds is het best er voor te zorgen dat de ruimte goed verlicht is, hoewel dit geen absolute vereiste is zorgt het wel voor betere beelden om op verder te werken. Indien er te weinig licht is kunnen de persoon alsook zijn handen nog steeds gedetecteerd worden via de dieptedata waarvoor het lichtpatroon wordt gebruikt. De RGB beelden zullen echter wel invloed ondervinden van een tekort aan belichting. Het is tevens ook belangrijk ervoor te zorgen dat er ten allen tijde slechts ´e´en persoon in beeld is. Er zal slechts detectie worden toegepast op ´e´en persoon dus indien meerdere personen in beeld zijn wordt een extra selectie van de persoon noodzakelijk. Wat de opstelling betreft is het belangrijk om een afstand van ongeveer anderhalve meter te voorzien tussen de camera en de plaatst waar de persoon zich zal bevinden. Deze afstand is dusdanig gekozen dat er genoeg details uit het beeld kunnen verkregen worden zonder dat de persoon te dicht bij de camera staat. Indien de persoon te dicht bij de camera staat zal voor grotere personen niet het volledige bovenlichaam zichtbaar zijn waardoor de gebruikersdetectie fouten kan vertonen. De Kinect zelf wordt op een verhoogd platform gezet van ongeveer ´e´en meter hoog, hier mag spelling opzitten aangezien de Kinect nog omlaag of omhoog kan getilt worden. Figuur 6.1 illustreert een mogelijke opstelling. Als laatste is het ook belangrijk om een aantal technische specificaties voor de opgenomen beelden vast te leggen. Het is niet noodzakelijk om alle data op te nemen, voor de opgenomen dataset is dan ook besloten om het opnemen van geluid achterwege te laten. Geluid zal voor het herkennen van gebaren geen meerwaarde leveren en is dus overbodig. Ondanks dat er enkel gebruik wordt gemaakt van de dieptedata is ook de RGB data opgenomen met de mogelijkheid van het gebruik van de dataset in de toekomst in het achterhoofd. Voor alle beelden (RGB en diepte) is een VGA resolutie van 640 bij 480 pixels gebruikt.
6.3
Opbouw van de dataset
Alle geselecteerde gebaren zijn gekozen uit een lijst met gebaren uit de vlaamse gebarentaal [1]. Er zijn zowel gebaren met ´e´en hand als met twee handen gebruikt en met verschillende handvormen. Hiermee wordt bedoeld dat het aantal vingers verschilt tussen gebaren. Uiteraard zijn er ook gebaren die zeer gelijkaardige handvorm hebben en waarbij enkel de positie waar het gebaar wordt uitgebeeld verschilt. De eerste vijf gebaren die een kleine startersdataset vormden zijn door mezelf geselecteerd, gebaren die achteraf werden toegevoegd zijn
6.3 Opbouw van de dataset
40
Figuur 6.1: Voorbeeld van een opstelling om dataset op te nemen.
geselecteerd door andere personen die hebben meegewerkt aan de dataset. Die andere personen hebben geen inzicht in de werking van de vingerdetectie die de parameters moet achterhalen waarop geclassificeerd zal worden. Zij waren dus niet op de hoogte van de sterktes en zwaktes van de detectie. Op die manier is er geen voorkeur gegeven aan bepaalde gebaren en kan er getest worden met een verscheidenheid aan gebaren. Voor de opnames zijn drie personen gebruikt (waaronder mezelf) die telkens vijftien opnames per gebaar uitvoerden. Bij die opnames diende de gebruiker in beeld te wandelen en het gebaar uit te beelden. Het in beeld wandelen is noodzakelijk voor de kalibratie van de gebruiker. Verder zijn er geen bepaalde regels opgelegd voor de opnames en was er de meewerkende personen opgedragen niets te forceren en het gebaar uit te voeren zoals ze het zouden gebruiken in een gesprek. Voor gebaren met ´e´en hand is er dus geen bepaalde positie of houding voor de tweede hand opgelegd. Het enige punt dat van belang was en werd meegedeeld is dat gebaren die een verplaatsing in de richting van de camera bevatten worden uitgevoerd met de beweging naar het ledje op de Kinect gericht. Dit om de hand of handen ten allen tijde in beeld te houden bij een beweging. In Bijlage D zijn de gebruikte gebaren terug te vinden.
MACHINAAL LEREN
41
Hoofdstuk 7
Machinaal leren Om over te kunnen gaan tot de effectieve detectie van gebaren dient er eerst een techniek van machinaal leren geselecteerd te worden. Voor het herkennen van gebaren is hierbij gekozen voor Hidden Markov Modellen omdat dit een uitstekende techniek is voor het werken met sequenti¨ele data. Een gebaar bestaat namelijk uit een sequentie van handelingen in de tijd, zijnde een bepaalde beweging en/of verandering van handvorm. Daarnaast zijn Hidden Markov modellen in staat om overlappende clusters van datapunten te onderscheiden. Zulke clusters kunnen ook voorkomen bij de detectie van gebaren waarbij twee gebaren gemeenschappelijke posities bevatten bij een beweging. Aldus zullen Hidden Markov Modellen gebruikt worden. Er zal in dit hoofdstuk eerst een beschrijving van Hidden Markov modellen aan bod komen waarbij ook de verschillende mogelijkheden die er zijn bij het gebruik van dergelijke modellen besproken worden. Deze mogelijkheden zijn het trainen van een Hidden Markov model, het evalueren en decoderen van een sequentie van observaties. Als laatste zullen er ook nog enkele specifieke Hidden Markov modellen besproken worden die binnen de masterproef gebruikt zijn.
7.1
Hidden Markov Modellen
Een Hidden Markov model oftewel HMM is een statistisch model dat zeer populair is en toepassingen kent in herkenning van spraak, geschrift, kentekenplaten en gebaren. Hieruit blijkt meteen dat deze modellen reeds zijn gebruikt bij het herkennen van gebaren en dit meestal met goede resultaten. Een HMM is in theorie een Markov model met onbekende toestanden. Dit wil zeggen dat in tegenstelling tot een Markov model, waar de toestandssequentie die een bepaalde sequentie van observaties veroorzaakt eenvoudig te achterhalen is, bij een HMM de toestandssequentie die een sequentie van observaties veroorzaakt heeft on-
7.1 Hidden Markov Modellen
42
Figuur 7.1: Eenvoudige voorstelling van een Hidden Markov Model.
bekend is. Bij een gewoon Markov Model wordt dan ook meestal enkel over observaties gesproken om verwarring te voorkomen. Voor een HMM kan echter wel worden nagegaan wat de waarschijnlijkheid is dat de sequentie van observaties veroorzaakt is door een bepaald model alsook wat de meest waarschijnlijke toestandssequentie is. Dit laatste is binnen deze masterproef minder belangrijk aangezien er voor ieder gebaar een HMM wordt gebouwd om vervolgens bij de detectie na te gaan welke het meest waarschijnlijke HMM (en dus gebaar) is. Figuur 7.1 geeft een grafische voorstelling van een HMM in zijn eenvoudigste vorm. Op de figuur zijn zowel de verborgen toestanden ’z’ als observaties ’x’ terug te vinden waarbij de index duidt op een tijdstip oftewel de positie van die waarde in een reeks van opeenvolgende data. Er is ´e´en uitzonderlijk geval zijde de initi¨ele toestand ’i’ die bij het gebruik van een HMM moet worden bepaald. Zoals reeds eerder vermeld is ook in de figuur te zien dat een observatie steeds het gevolg is van de verborgen toestand op dat moment, waar ook steeds een emissie ’B’ met gepaard gaat. Tussen de verschillende verborgen toestanden vindt ook een transitie ’A’ plaats met een bepaalde kans. De twee termen emissie en transitie behoeven enige verklaring. Een transitie wordt bijgehouden in een transitiematrix, zo een matrix bevat de probabiliteiten om van een verborgen toestand naar een andere of dezelfde verborgen toestand over te gaan. Dit is dus een vierkante matrix met dimensie gelijk aan het aantal verborgen toestanden. Dit aantal verborgen toestanden kan bij het bouwen van een HMM worden vastgelegd. Een emissie zit in een emissiematrix die de probabiliteit op een bepaalde verborgen toestand voor een gegeven observatie bezit. Zo een emissiematrix heeft rijen gelijk aan het aantal verborgen toestanden en kolommen gelijk aan het aantal mogelijke observaties. Het net beschreven geval is enkel van toepassing op een HMM met discrete distributie. Wanneer er een gaussiaanse distributie wordt gebruikt zullen de emissies bestaan uit een matrix met gemiddelde waarden voor de observaties alsook een covariantiematrix per dimensie
7.1 Hidden Markov Modellen
43
van de observatie en dit per verborgen toestand. Een HMM wordt dus volledig gedefinieerd door zijn transitiematrix, emissiematrix en initi¨ele toestand. In deze masterproef zijn HMMs met zowel discrete als Gaussiaanse distributies gebruikt.
7.1.1
Training
Het doel van de training is het bekomen van de defini¨erende parameters van een HMM, zijnde de transitiematrix, emissiematrix en initi¨ele toestand. Hiervoor zal het HMM moeten leren wat de verborgen toestanden zijn en wat de probabiliteiten zijn voor transities en emissies. Er kunnen bij training twee methoden onderscheiden worden. Allereerst is er training met toezicht (beter bekend als supervised training) waarbij zowel de input als output van een proces gekend is. Deze methode zal niet gebruikt worden binnen deze masterproef omdat de output data niet gekend is. Dan is er anderzijds nog training zonder toezicht (beter bekend als unsupervised training) waarbij enkel de input data gekend is zoals het geval is in deze masterproef. Het is voor deze trainingsfase dat de dataset belangrijk is. Er moet voldoende data ter beschikking zijn om een model te trainen, maar tegelijkertijd mag er ook geen overfitting optreden. Overfitting treedt op bij gebruik van een te complex model. Dit wil zeggen dat de aanwezigheid van ruis in de trainingsdata bij een te complex model mee wordt opgenomen, als direct gevolg wordt de kans op een correcte detectie negatief be¨ınvloed. Voor het effectief unsupervised trainen van een HMM wordt het Baum-Welch algoritme gebruikt. Dit algoritme zal hier niet worden uitgelegd, maar is volledig terug te vinden in [28].
7.1.2
Evaluatie
Voor evaluatie wordt er van uitgegaan dat er reeds training heeft plaatsgevonden en een HMM gedefinieerd kan worden. Bij evaluatie wordt dan een sequentie van observaties gebruikt om de probabiliteit dat de sequentie is ontstaan uit het gedefinieerde HMM na te gaan. In andere woorden omvat evaluatie het nagaan hoe goed een HMM een gegeven sequentie van observaties kan produceren. Dit is een zeer belangrijke fase binnen deze masterproef omdat hiermee wordt nagegaan welk gebaar volgens gegeven observaties gedetecteerd is. Stel dat er n gebaren in de dataset aanwezig zijn. Dan zijn er n HMMs getraind zodat deze gedefinieerd kunnen worden door middel van de emissiematrix, transitiematrix en initi¨ele toestand. Bij evaluatie kan dan voor ieder van de HMMs de probabiliteit berekend worden dat de sequentie van observaties erdoor geproduceerd werd waarna het HMM met de hoogste probabiliteit het gebaar voorstelt. Zo kan dus voor iedere sequentie van observaties het bijhorende gebaar achterhaald worden.
7.1 Hidden Markov Modellen
44
Het algoritme dat gebruikt wordt voor evaluatie is het voorwaarts (oftewel Forward ) algoritme en staat volledig beschreven in [28].
7.1.3
Decodering
Ook voor decodering wordt er verondersteld dat er reeds een HMM getraind is en gedefinieerd kan worden. Indien dit het geval is kan door decodering de meest waarschijnlijke sequentie van verborgen toestanden die een gegeven sequentie van observaties geproduceerd heeft achterhaald worden. Hiervoor wordt het Viterbi algoritme gebruikt. Dit is zeer gelijkaardig aan het voorwaarts algoritme met als verschil dat de probabiliteiten gemaximaliseerd worden in plaats van ze op te tellen. Het volledig algoritme is terug te vinden in [28]. Echter wordt decodering op geen enkel moment gebruikt binnen deze masterproef en is het enkel toegevoegd ter volledigheid.
7.1.4
Logaritmisch domein
Bij het implementeren van HMMs kan underflow van floating-point types een probleem vormen. Dit omdat bij gebruik van het Viterbi of het Forward algoritme bij lange sequenties zeer kleine probabiliteiten kunnen ontstaan ten gevolge van vermenigvuldigingen op kleine kommagetallen. Voor het Viterbi algoritme wordt dit opgelost door gebruik te maken van probabiliteiten in het logaritmische domein en deze op te tellen in plaats van te vermenigvuldigen. Wat het Forward algoritme betreft wordt er gewerkt met schalingsfactoren die de probabiliteiten in een acceptabel bereik houden. Dit heeft dan wel tot gevolg dat de schalingsfactoren voor ieder tijdstip moeten bijgehouden worden.
7.1.5
Types
Uit de beelden die verkregen zijn van de Kinect worden een aantal parameters bepaalt. Deze zijn: het aantal vingers, positie en richtingsvector voor de handen en voor iedere individuele vinger. Door elk van deze parameters apart in rekening te brengen en later combinaties te maken zijn enkele types van HMMs ontstaan. Er kunnen dus per gebaar meerdere HMMs zijn, namelijk een HMM per parameter. De verschillende types van HMMs zullen in deze sectie besproken worden waarbij ook reeds een aantal conclusies worden vermeld. De experimenten die tot deze conclusies hebben geleden zijn terug te vinden in Hoofdstuk 8.
7.1 Hidden Markov Modellen
45
Vingers Dit type HMM is gebouwd om enkel rekening te houden met het aantal vingers. Er kan meteen gesproken worden over een discrete distributie met ´e´en dimensie voor de observaties doordat er slechts zeven mogelijke waarden voor een observatie zijn. Namelijk nul, ´e´en, twee, drie, vier of vijf vingers plus nog een extra toestand voor het geval de hand niet gevonden is en er dus geen vingers gedetecteerd konden worden. Door enkel rekening te houden met het aantal vingers kunnen de gebaren met een verschillend aantal vingers reeds goed van elkaar onderscheiden worden. Echter doordat er meerdere gebaren met eenzelfde aantal vingers in de dataset zijn opgenomen is dit niet voldoende en kan de totale accuraatheid van de detectie niet als goed worden aanzien. Bij deze gebaren met eenzelfde aantal vingers is er wel steeds een verschil in rotatie, positie of beweging waardoor er zeker mogelijkheid is tot verbetering door meer parameters in rekening te brengen. Handposities Een andere mogelijkheid bij het trainen van de HMMs is door gebruik te maken van de positie van de handen. Dit is niet langer een discrete distributie omdat de handen zich overal in het gezichtsveld van de Kinect kunnen bevinden waardoor zeer veel waarden mogelijk zijn. Bovendien zullen tussen verschillende opnames van eenzelfde gebaar variaties aanwezig zijn bij de positie. Deze variaties zijn willekeurig doordat de persoon op een iets andere plaats in de ruimte staat. Daarbovenop zijn er ook nog verschillen tussen personen (zoals de lengte van de persoon) die meespelen. Toch zal de data van verschillende opnames voor eenzelfde gebaar steeds geclusterd kunnen worden. Voor dit geval is er dus gekozen voor een Gaussiaanse distributie met dimensie van de observaties gelijk aan drie. Er wordt gebruik gemaakt van 3D data dus zijn er drie dimensies noodzakelijk (X,Y,Z) en onbekende data voor een hand die niet gevonden werd krijgt een fictieve waarde. Het gebruiken van de posities levert meestal betere resultaten dan bij gebruik van enkel de vingers doordat er weinig gebaren zijn die precies dezelfde positie gebruiken. Overlap tussen de gaussiaanse verdelingen van verschillende gebaren is echter altijd mogelijk en zorgt dan ook steeds voor optredende fouten. Voor de richtingsvector van de handen kan hetzelfde type gebruikt worden. Omdat we ook in dat geval werken met continue data met mogelijk afwijkingen tussen opnames voor eenzelfde gebaar. Bij gebruik van de richtingsvectoren bleek uit testen ook reeds een goede correctheid op te treden, wat onverwacht was.
7.1 Hidden Markov Modellen
46
Vingerposities Als laatste eenvoudige type is er nog een HMM dat enkel rekening houdt met de posities van individuele vingers. Hierbij is bij testen een onderscheid gemaakt tussen normale posities die relatief zijn ten opzichte van het centraal punt voor de Kinect en posities die relatief zijn gemaakt ten opzichte van de bijhorende handpositie. Maar hierover zal in de resultaten nog meer worden gezegd. Deze posities zijn allen ondergebracht in ´e´en HMM waardoor de observaties een dimensie van vijftien krijgen. Deze dimensie van vijftien is het gevolg van werken met 3D data op vijf vingers waarbij voor onbekende data een fictieve waarde wordt gebruikt. Er is opnieuw gekozen voor een gaussiaanse distributie omwille van dezelfde reden als bij het vorige type. Het gebruik van de posities van de vingers levert ondermaatse correctheid op wat het gebruik ervan al snel heeft stopgezet. Opnieuw kan er voor de richtingsvectoren per vinger hetzelfde type worden gebruikt maar ook dit leidde tot ondermaatse accuraatheid waardoor het verder niet meer gebruikt werd. Combinaties Naast de HMMs die rekening houden met ´e´en parameter kan er ook rekening worden gehouden met meerdere parameters door gebruik te maken van verschillende HMMs. Deze kunnen op twee manieren gecombineerd worden. De eerste en eenvoudigste manier is het evalueren van een sequentie van observaties voor alle types HMMs en vervolgens de probabiliteiten voor de HMMs van de gewenste types voor eenzelfde gebaar op te tellen. Indien bijvoorbeeld gebruik wordt gemaakt van het aantal vinger en de handposities moeten deze types HMMs getraindd worden en bij evaluatie kunnen beide types voor gebaar1 apart bekeken worden, dit resulteert in een probabiliteit voor het aantal vinger en een probabiliteit voor de handposities. Na het achterhalen van de probabiliteiten kunnen ze opgeteld worden om tot de totale probabiliteit voor gebaar1 te komen. Hierbij wordt er vanuit gegaan dat er met logaritmische probabiliteiten wordt gewerkt. Deze methode levert reeds goede resultaten en kan zonder twijfel gebruikt worden indien de verschillende observaties geen direct verband hebben met elkaar. Een tweede methode bestaat eruit de observaties te gaan combineren en een HMM te trainen voor die combinatie om dan detectie uit te voeren met een combinatie van observaties van dezelfde soort. Dit wil dus zeggen dat er een hoger aantal dimensies gebruikt zal worden. Een direct gevolg hiervan is dat de trainingsfase aanzienlijk langer zal duren. Echter is deze methode enkel noodzakelijk indien de eerste methode geen goede resultaten levert en werd
7.1 Hidden Markov Modellen
ze binnen deze masterproef niet toegepast.
47
RESULTATEN
48
Hoofdstuk 8
Resultaten Bij de afwerking van deze masterproef zijn er een aantal testen uitgevoerd die aanleiding hebben gegeven tot een aantal resultaten. In dit hoofdstuk zal getracht worden om de meeste resultaten op een overzichtelijk manier zo goed mogelijk te beschrijven. Zo zal er eerst worden gestart met een uiteenzetting van de verschillende testen waarna de resultaten in relevante groepen zullen worden besproken.
8.1
Uitgevoerde testen
Allereerst is er reeds een onderscheid tussen twee gebruikte datasets waarbij het verschil aanwezig is in het aantal gebaren dat gebruikt wordt. Zo is er een dataset met zeven gebaren gebruikt voor initi¨ele validatie van verschillende modellen waarna is overgestapt op een grotere dataset met 20 gebaren om de prestatie op grotere schaal te bekijken. Voor elk van de datasets op zich is er dan nog eens een verschil tussen normale testen en testen met kruisvalidatie op niveau van de gebruiker met tot doel na te gaan hoe de modellen generaliseren naar andere gebruikers. Onder kruisvalidatie wordt binnen deze masterproef verstaan het uitvoeren van verschillende testen waarbij telkens een ander deel van de dataset wordt afgezonderd voor validatie. De resultaten die zo bekomen worden zullen dan ook apart bekeken worden. Aangezien er met HMMs gewerkt wordt is het nodig de dataset op te splitsen in een deel voor training en een deel voor validatie. Dit houdt in dat 2/3 van de data gebruikt wordt voor training terwijl de overige 1/3 gebruikt wordt voor het valideren. Aldus zijn verschillende combinaties mogelijk zoals in Figuur 8.1 visueel zichtbaar is gemaakt. Er is in de figuur duidelijk te zien dat er bij de kruisvalidatie telkens ´e´en gebruiker wordt gereserveerd voor het valideren terwijl op de andere data getraind wordt, zoals kruisvalidatie eerder gedefinieerd werd, in tegenstelling tot de normale mode waarbij voor iedere persoon
8.2 Dataset 7 gebaren
49
Figuur 8.1: Gebruikte opsplitsingen van de dataset voor tests.
een stuk wordt getraind. Van hieraf zal naar de verschillende modes verwezen worden met de namen die in de Figuur zijn vermeld. Als laatste kan ook nog een onderscheid worden gemaakt door rekening te houden met de gebruikte data voor training en validatie. Mogelijke data omvat het aantal vingers, de positie van de handen, de richtingsvectoren van de handen, de posities van de vingers, de richtingsvectoren van de vingers of combinaties van de voornoemde mogelijkheden. De opbouw van het HMM voor elk van deze types is terug te vinden in Hoofdstuk 7 en zal niet opnieuw behandeld worden.
8.2
Dataset 7 gebaren
In eerste instantie werd er gebruik gemaakt van een basis dataset bestaande uit zeven gebaren (de eerste zeven uit Bijlage D). Hierop zijn de meeste testen uitgevoerd en konden dan ook reeds mede door het onderscheid tussen eenvoudige en gecombineerde HMMs een aantal conclusies getrokken worden.
8.2.1
Eenvoudige modellen
De eenvoudige modellen bestaan uit slechts ´e´en data parameter en geven een idee van de basis detectie van gebaren. Figuur 8.2 geeft een overzichtvan de resultaten bij gebruik van de eenvoudige HMMs voor de verschillende soorten testen bij gebruik van 3 verborgen toestanden. Uit deze resultaten is meteen te zien dat de normale test betere resultaten oplevert
8.2 Dataset 7 gebaren
50
dan gebruik van kruisvalidatietesten. Dit is op zich logisch omdat voor de kruisvalidatietesten niet getraind werd voor de testpersoon. Verder is ook te zien dat de eenvoudige modellen met uitzondering van de vingerposities en richting van de vingers reeds aanleiding geven tot goede resultaten voor de correcte detectie van gebaren, er wordt reeds 89% accuraatheid behaald in het beste geval. De slechte prestatie van de data op niveau van de vingers is te wijten aan de gevoeligheid aan kleine afwijkingen op die data. Kleine afwijkingen in datapunten ten gevolge van ruis zullen op de vingerdata reeds een aanzienlijke invloed hebben waardoor het gebruik van deze data ontmoedigd wordt. Deze conclusie kan overigens worden doorgetrokken naar alle uitgevoerde testen, met andere woorden zullen de datapunten op niveau van de vingers in geen geval tot betere resultaten leiden. Over het algemeen worden de minst goede resultaten behaald op basis van het aantal vingers indien de positie en richting van de vingers achterwege wordt gelaten. Dit is te danken aan de opbouw van de dataset waarbij verschillende gebaren met eenzelfde aantal vingers aanwezig zijn waardoor het moeilijk wordt om detectie uit te voeren op enkel die data. De positie en richting van de handen voor de gebaren verschilt dan weer wel tussen de gebaren onderling wat zich ook reflecteert in de accuraatheid bij gebruik van deze data. Voor de kruisvalidatie is echter wel steeds een lagere accuraatheid merkbaar die toch nog tot degelijke resultaten kan leiden in de gecombineerde modellen die later aan bod komen. Wat persoon 3 betreft worden steeds de minst goede resultaten behaald voor alle testen. Dit toont aan dat er toch enige afhankelijkheid is tussen de personen voor training en de persoon voor het testen. Deze prestatie zal vanuit theoretisch oogpunt dan ook verbeteren indien de trainset uit meer dan 2 personen zou bestaan. In de tot nog toe gebruikte resultaten werd er steeds vanuit gegaan dat de onbekende data voor training en validatie van de HMMs een vaste fictieve waarde kreeg toegewezen. Deze onbekende data kan plaatsvinden wanneer een hand niet gedetecteerd kan worden of indien op niveau van de vingers bepaalde vingers niet zichtbaar zijn (denk hierbij aan een handvorm met twee vingers). Echter is het ook mogelijk om in plaats van een vaste fictieve waarde een beperkte ruis te te voegen aan de waarde. Door toevoeging van de ruis kan gegarandeerd worden dat de verdeling bij de Gaussiaanse distributies niet te nauwer wordt, waarbij in het slechtste geval ´e´en enkele piekwaarde kan overblijven. Dit is dan ook mee opgenomen in de testen en gaf aanleiding tot de resultaten uit Figuur 8.3. Bij het gebruik van fictieve waarden waar een ruis op aanwezig is bleek de prestatie met enkel de richting of posities van de vingers te verbeteren, hetzelfde fenomeen treedt ook op bij gecombineerde modellen met deze data. Voor alle andere eenvoudige modellen alsook gecombineerde modellen blijkt de toegevoegde
8.2 Dataset 7 gebaren
51
Figuur 8.2: Resultaten bij gebruik van eenvoudige modellen met 3 verborgen toestanden voor de verschillende testen.
Figuur 8.3: Resultaten bij gebruik van eenvoudige modellen met 3 verborgen toestanden voor de verschillende testen waarbij fictieve waarden ruis bevatten.
8.2 Dataset 7 gebaren
52
ruis tot minder goede prestatie te leiden in tegenstelling tot wat er verwacht werd. Door toevoeging van ruis kan de data als te variabel aanzien worden waardoor deze niet veel invloed zou mogen hebben op de training terwijl bij het gebruik van een vaste waarde de data mee als “nuttig” wordt aanzien en deel van het gebaar gaat uitmaken. Het blijkt dus beter te zijn om de fictieve waarden vast te nemen zodat ze zeker deel van het gebaar gaan uitmaken. Ook deze vaststelling is van toepassing op alle andere uitgevoerde testen (met gecombineerde data of een ander aantal verborgen toestanden). Om nog even alles samen te vatten is er reeds geconcludeerd dat het gebruik van de positie en richting van de vingers geen meerwaarde met zich meebrengt net zoals het gebruik van fictieve waarden met ruis de resultaten niet positief be¨ınvloedt. Op het gebruik van de posities van de vingers wordt later nog even teruggekomen, maar vanaf nu wordt er alvast verondersteld dat alle testen gebruik maken van vaste fictieve waarden voor onbekende data.
8.2.2
Gecombineerde modellen
Naast de eenvoudige modellen kan er ook nog gebruik worden gemaakt van gecombineerde datamodellen voor de HMMs waarbij rekening wordt gehouden met meer dan ´e´en parameter. Deze combinatie gebeurt op de eenvoudigste manier door vermenigvuldiging van de probabiliteiten van de eenvoudige HMM modellen. Indien wordt overgegaan naar het logaritmische domein komt dit overeen met het optellen van de probabiliteiten. Het doel van het gebruiken van gecombineerde modellen is het verhogen van de accuraatheid omdat combinatie van twee modellen met middelmatige prestatie theoretisch resulteert in een nieuw model met betere resultaten dan de individuele modellen. Figuur 8.4 geeft de resultaten voor een stap per stap uitgebreid HMM waarbij telkens meer data in rekening wordt gebracht en dit voor 3 verborgen toestanden bij de verschillende testen. Uit de resultaten blijkt dat ook hier de normale test het beste presteert. De resultaten die hier zijn bekomen voor de normale test zijn tevens de beste resultaten die verkregen zijn voor de dataset van zeven gebaren. Verder is het ook hier nog eens duidelijk dat de posities en richtingen van de vingers geen meerwaarde met zich meebrengen en de resultaten enkel aanzienlijk slechter maken. Het is tevens ook zichtbaar dat het gebruik van het aantal vingers, handposities en richting van de hand betere prestaties oplevert dan wanneer de richting van de handen niet in rekening wordt gebracht. Hieraan kan dan meteen de opbouw van een gebaar gerelateerd worden. Aangezien een gebaar bestaat uit een handvorm met een bepaalde rotatie waar nog een beweging bij komt kijken is het te verwachten dat de beste resultaten optreden bij het in rekening brengen van deze elementen. Dit is dan ook wat gedaan wordt door de drie voornoemde parameters te gebruiken in het
8.2 Dataset 7 gebaren
53
model dat hier resulteert in een accuraatheid van 94,29%. Ook voor kruisvalidatie zijn de resultaten toegenomen en werden er accuraatheden bekomen die wijzen op de bruikbaarheid van het systeem voor personen waarvoor niet getraind werd indien de dataset voor training meer personen zou bevatten. Toch is het best om bij commercialisatie van dergelijke systemen het geheel te calibreren voor de gebruiker door deze bijvoorbeeld een aantal gebaren te laten uitbeelden. Naast alle testen die reeds besproken zijn is er ook nog een speciaal geval. Dat is namelijk het geval waarbij gebruik wordt gemaakt van vingerposities relatief ten opzichte van het centraal punt van de hand in plaats van de posities te gebruiken zoals verkregen van de camera. De resultaten van deze verandering zijn te zien in Figuur 8.5. Ondanks dat er een aanzienlijke prestatieverbetering optreedt door de vingerposities relatief te maken ten opzichte van de hand, blijft de prestatie door deze data mee in rekening te brengen minder goed dan wanneer er gebruik wordt gemaakt van het tot nu toe optimale model dat resulteert in 94.29% accuraatheid. Uitzonderlijk zien we de resultaten wel ´e´en keer verbeteren voor de kruisvalidatie. In zijn totaliteit en bij het in rekening brengen van alle resultaten (die terug te vinden zijn op de bijgevoegde DVD) kan echter alsnog geconcludeerd worden dat het in rekening brengen van de positie en/of richting van de vingers geen meerwaarde oplevert. Ondertussen is het misschien reeds opgevallen dat er telkens met drie verborgen toestanden werd gewerkt. Dit is niet toevallig zo gekozen maar is doordat daarbij de beste prestaties worden behaald. Om dit te bewijzen worden nu de resultaten bekeken voor een verschillend aantal verborgen toestanden. Hierbij zal gebruik worden gemaakt van de bekomen resultaten voor het optimale model waarbij rekening wordt gehouden met het aantal vingers en de positie en richting van de handen met vaste fictieve waarden. Deze resultaten zijn opgenomen in Figuur 8.6. Uit de figuur valt eerst en vooral op dat drie verborgen toestanden tot de beste resultaten leidt. Anderzijds is er ook nog te zien dat het resultaat voor ´e´en en twee verborgen toestanden identiek is, ook de bekomen confusion matrices zijn voor beide steeds identiek (ook terug te vinden op de DVD). Dit is een fenomeen dat opnieuw voor alle uitgevoerde testen is waargenomen en waarvoor geen directe verklaring werd gevonden. Dat er voor ´e´en en twee verborgen toestanden dezelfde resultaten worden bekomen betekent dat een HMM met twee verborgen toestanden hetzelfde is als een Naive Beyes classifier (wat een HMM met ´e´en verborgen toestand in weze is). Om alles samen te vatten kan er dus gesteld worden dat het beste model gebruik maakt van het aantal vingers en de positie en richting van de handen waarbij een vaste fictieve waarde wordt gebruikt, en dit alles bij drie verborgen toestanden. Voor dit model zijn nog
8.2 Dataset 7 gebaren
54
Figuur 8.4: Resultaten bij gebruik van gecombineerde modellen met 3 verborgen toestanden voor de verschillende testen.
Figuur 8.5: Resultaten bij gebruik van gecombineerde modellen met 3 verborgen toestanden voor de verschillende testen met gerelativeerde vingerposities.
8.3 Dataset 20 gebaren
55
eens alle resultaten weergegeven voor normale test in Figuur 8.7.
8.3
Dataset 20 gebaren
Naarmate de masterproef evolueerde zijn er op regelmatige momenten uitbreidingen gedaan aan de dataset. Deze uitbreidingen resulteerden in een uiteindelijke dataset met twintig gebaren die opgenomen zijn voor drie personen. Op deze dataset is een finale test uitgevoerd voor het optimale model om na te gaan in hoeverre de in deze masterproef gehanteerde methode voor herkenning van gebaren schaalt naar een grotere dataset. Echter is er alsnog gekeken naar een aantal verborgen toestanden hoger dan drie, met name vier en vijf. Dit omdat er meer overlap tussen gebaren aanwezig kan zijn waardoor een hoger aantal verborgen toestanden de prestatie zou kunnen be¨ınvloeden. De resultaten die in Figuur 8.8 zijn opgenomen bewijzen dat drie verborgen toestanden het optimale model blijft. Hoewel drie en vier verborgen toestanden dezelfde resultaten oplevert voor de normale test is dit bij kruisvalidatie niet het geval en worden daar steeds minder goede resultaten behaald voor een hoger aantal verborgen toestanden. De enige uitzondering hierop is persoon 1 waarbij voor vijf verborgen toestanden 39,33% wordt behaald, echter is dit toch nog lager dan het resultaat voor drie verborgen toestanden en dus blijft het optimale model voor de dataset van zeven gebaren ook hier gelden. Voor kruisvalidatie is echter wel een duidelijke daling in prestatie te zien bij het gebruik van twintig gebaren. Het is dus noodzakelijk om bij een groter aantal gebaren trainingsdata op te nemen voor iedere gebruiker uit de testset. Hoewel de 85,33% die hier behaald wordt voor de normale test lager ligt dan de 94,29% bekomen bij de dataset van zeven gebaren kunnen deze niet rechtstreeks worden vergeleken. Om ze toch tegenover elkaar af te wegen zullen de random percentages in rekening worden gebracht waarbij wordt nagegaan hoe goed beide presteren in vergelijking met een random classifier. Voor de dataset van zeven gebaren komt het random percentage uit op 14,29% wat wil zeggen dat het optimale model met HMMs 6,6 keer beter presteert dan een random classifier. De dataset van twintig gebaren heeft een random percentage van 5% waardoor het model met HMMs 17 keer betere prestatie oplevert. Er kan dus besloten worden dat de prestatie bij een dataset van twintig gebaren niet per se slechter is dan de prestatie bij een dataset van zeven gebaren ondanks dat er geen rechtstreekse vergelijking mogelijk is. Als laatste zal de confusion matrix voor normale test met drie verborgen toestanden in meer detail bekeken worden. Deze confusion matrix is te zien in Figuur 8.9. In deze confusion matrix stelt de horizontale as het voorspelde gebaar voor terwijl de verticale as het eigenlijke gebaar voorstelt. De waarden die in de matrix terug te vinden zijn stellen het aantal
8.3 Dataset 20 gebaren
56
Figuur 8.6: Resultaten bij gebruik van optimale model met vaste fictieve waarde bij verschillende aantallen verborgen toestanden.
Figuur 8.7: Resultaten bij gebruik van het optimale model voor zeven gebaren.
8.3 Dataset 20 gebaren
57
Figuur 8.8: Resultaten bij gebruik van het optimale model voor twintig gebaren bij verschillende aantallen verborgen toestanden.
Figuur 8.9: Confusion matrix van de normale test met optimaal model voor twintig gebaren.
8.3 Dataset 20 gebaren
58
detecties voor, wetende dat elk gebaar vijftien keer voorkomt in de dataset wil dit zeggen dat een vijftien op de diagonaal een perfect voorspelbaar gebaar is. Wat meteen opvalt in deze confusion matrix is de onderbreking in de diagonaal bij gebaar elf. Dit gebaar is geen enkele keer correct voorspeld en heeft dus een grote invloed gehad op de totale accuraatheid. Het is wel negen keer als gebaar drie voorspeld wat op de initi¨ele houding bij uitvoering van het gebaar na identieke gebaren zijn. Gebaar drie is hierbij aanraken terwijl gebaar elf gooien voorstelt. Het onderscheid tussen deze gebaren is dus moeilijk te maken door de software aan de hand van de verkregen data omdat die initi¨ele toestand maar van zeer korte duur is. Verder zijn er nog wat afwijkingen te zien die meestal vrij klein zijn en het gevolg zijn van ´e´en element van het gebaar dat identiek is zijnde het aantal vingers, de positie of richting van de handen. Zoals bij gebaar twintig dat vier keer verward wordt met gebaar negen doordat de positie van de handen amper verschilt.
CONCLUSIE
59
Hoofdstuk 9
Conclusie In deze masterproef werd onderzocht of er goede herkenning van gebaren kan verwezenlijkt worden door gebruik te maken van 3D data. Om tot de 3D data te komen werd gebruik gemaakt van opnames die hebben plaatsgevonden met de Kinect camera. Uit die opnames werden vervolgens het aantal vingers, de positie en richting van de handen alsook de positie en richting van de vingers gehaald met zelf ontworpen software die gebruik maakt van bestaande bibliotheken en raamwerken. Voor het effectief detecteren van de gebaren zijn een aantal HMMs geconstrueerd die dan getraind werden om er testen mee te kunnen uitvoeren. Deze HMMs werden dan ook nog eens gecombineerd om tot hogere accuraatheid bij de detectie van gebaren te komen. Ondanks het vele onderzoek dat reeds is gebeurd omtrent het herkennen van gebaren bleek het gebruik van 3D data meestal achterwege te blijven en aldus was er geen software ter beschikking voor het achterhalen van de data in 3D. Als eerste deel werd er dan ook een eigen vingerdetectie ge¨ımplementeerd die na het detecteren van een gebruiker deze zijn handen uit het beeld moest knippen. Na het uitknippen van de handen diende er nog een aantal stappen te gebeuren om tot de nodige datapunten voor iedere gevonden hand te komen voor training van de HMMs. Naast de vingerdetectie werd er ook nog een smoothing ge¨ımplementeerd en getest om de afwijkingen die optreden ten gevolge van storingen in de videobeelden van de Kinect zo veel mogenlijk te minimaliseren. Dit was allemaal onverwacht werk dat nodig was om verder te kunnen bij het herkennen van gebaren aan de hand van de 3D data. Uit de resultaten is gebleken dat er goede herkenning van gebaren kan plaatsvinden door gebruik te maken van 3D data in HMMs. Hoewel het uitgevoerde werk niet meteen kan vergeleken worden met ander werk duiden de hoge behaalde accuraatheden van 94,27% bij zeven gebaren en 85,33% bij twintig gebaren duidelijk op potentieel voor het gebruiken van 3D data bij het herkennen van gebaren. Het achterwege laten van de positie en richting
CONCLUSIE
60
voor de vingers was onverwacht maar deze data bracht duidelijk geen meerwaarde met zich mee bij de herkenning van gebaren door de gevoeligheid aan afwijkingen. De overblijvende data, zijnde aantal vingers, positie en richting van de handen, leidde met een eenvoudige methode van gecombineerde HMMs reeds tot goede resultaten. Dit doet vermoeden dat er nog hogere resultaten bereikt kunnen worden door de data samen onder te brengen in ´e´en HMM. Echter brengt dit nog heel wat werk mee omdat het dan een HMM met zowel discrete als continue distributie moet zijn waarvoor nog geen bestaande machine learning bibliotheek ondersteuning bied. Bij het gebruik van twintig gebaren is gebleken dat twee bijna identieke gebaren niet onderscheiden kunnen worden en er steeds naar ´e´en van beide gebaren wordt afgedwaald. Hiervoor zijn andere methoden misschien beter geschikt maar in geen enkel van de werken die ik reeds heb bestudeerd heb ik iets terug gevonden over de prestatie bij bijna identieke gebaren. Indien dit gebaar niet aanwezig was en een ander gebaar was gebruikt zou het percentage van correct voorspelde gebaren ongetwijfeld hoger liggen maar door het toeval bij samenstelling van de dataset ben ik toch tot deze conclusie kunnen komen. De overstap van een dataset met zeven gebaren naar een dataset met twintig gebaren heeft aangetoond dat de in deze masterproef gehanteerde methode goed generaliseert naar meerdere gebaren. De gebarenset kan dus worden uitgebreid zonder al te veel in te boeten aan de accuraatheid van detectie. Echter zijn er nog steeds twee punten die een rem zetten op de prestatie hoewel dit niet duidelijk is uit de resultaten. Enerzijds is er de kalibratie van de gebruiker, hoewel deze automatisch gebeurt speelt deze toch mee bij het achterhalen van de data uit de dataset omdat er steeds zekerheid moet zijn van kalibratie. Indien de kalibratie iets langer dan normaal zou duren gaan er een aantal datapunten verloren wat onrechtstreeks invloed kan hebben op de accuraatheid. Anderzijds is er ook de eigen vingerdetectie waarvoor maar een beperkte tijd kon worden uitgetrokken met als gevolg dat deze ongetwijfeld verder geoptimaliseerd kan worden. Om alles nog even samen te vatten ben ik in deze masterproef tot een accurate detectie van gebaren gekomen die gebruik maakt van HMMs met drie verborgen toestanden. De datapunten die hierbij gebruikt worden zijn het aantal vingers, de positie en richting van de handen. Ik ben niet gekomen tot het herkennen van gebaren in ware tijd. Hoewel de geschreven code wel ondersteuning bied voor een live stream van de Kinect waarbij ook de datapunten achterhaald worden dient er voor de herkenning van gebaren nog een fragmentatie in de tijd te gebeuren. Hierbij zou nog heel wat werk komen kijken.
ROS (ROBOT OPERATING SYSTEM)
61
Bijlage A
ROS (Robot Operating System) In deze appendix is meer informatie over het ROS raamwerk terug te vinden zoals onder meer het opzetten van het raamwerk alsook de Kinect demo’s, een lijst met de mogelijke commando’s en de werking van de vinger-detectie demo. Veel van de informatie die hier beschreven staat is ook terug te vinden op de ROS webpagina, echter zijn er hier eigen toevoegingen gedaan en vormt het een beknopte leidraad tot het opzetten en gebruiken van de vinger-detectie demo.
A.1
Het raamwerk opzetten
Om ROS te installeren kan je beginnen vanaf [29], als besturingssysteem raad ik persoonlijk Ubuntu 11.10 aan. Indien je toch een nieuwere versie van Ubuntu wenst te gebruiken zal je te kampen krijgen met problemen omdat er voor die versies nog geen ondersteuning voorzien werd voor de Kinect demo’s. Verder is het uitermate belangrijk om iedere stap van de installatie te volgen zoals op de website aangegeven, indien een stap wordt overgeslagen of vergeten is het lastig om te achterhalen welke stap dit is om het vervolgens recht te zetten. Hier volgt een kort stappenplan voor het installeren van ROS met het oog op gebruik van de Kinect demo’s: Kies een versie, bij voorkeur electric Installeer het desktop pakket van de door u gekozen ROS versie Installeer de openni packages met de nodige tools Installeer een Kinect demo naar keuze
Zorg er ook zeker voor dat de werkomgeving in het bashrc bestand is aangepast, de commando’s die hiervoor zorgen worden best met root rechten (sudo) uitgevoerd om het
A.2 De opbouw van het raamwerk
62
toevoegen te garanderen. Na de installatie zou je in staat moeten zijn om de Kinect demo’s uit te voeren op voorwaarde dat de Kinect aangesloten is.
A.2
De opbouw van het raamwerk
De ROS depository is in de loop der jaren blijven groeien en is vandaag dus zeer groot geworden, daarom hebben we dan ook het desktop pakket ge¨ınstalleerd en niet alles dat in de electric versie is opgenomen. Wat de versies betreft zijn er nog 2 oudere versies alsook twee nieuwere versies beschikbaar, waarbij de nieuwere versies geen ondersteuning bieden voor de Kinect demo’s. ROS bevat zeer veel packages die in een aantal stack zijn opgenomen, bovendien kunnen er meerdere stacks aanwezig zijn binnen een ROS versie. De packages omvatten de eigenlijke modules oftewel nodes van ROS die elk hun eigen functionaliteiten bevatten. Om het navigeren tussen en manipuleren van al deze mappen te vereenvoudigen heeft ROS een eigen versie van verscheidene Unix commando’s ge¨ımplementeerd. Roscd en rosls zijn de ROS varianten voor cd en ls. Met roscd kan je door de naam van een stack of package mee te geven meteen navigeren naar de hoofdirectory van die stack of package. Rosls laat dan weer toe om de inhoud van de meegegeven stack of package te bekijken zonder heel het pad in te geven. Rosstack en rospack laten toe om naar bepaalde stacks of packages te zoeken door de naam ervan als argument mee te geven. Beide commando,s geven het pad naar de stack of package terug indien deze gevonden is, het is dus een handig vervangmiddel om niet het volledige pad te moeten invullen bij het aanmaken van scripts. Indien gewenst kan er ook andere informatie worden opgevraagd door extra argumenten mee te geven. Rosmake laat toe om een package te compileren door de naam van de package als argument mee te geven, wat veel gebruiksvriendelijker is dan helemaal naar de package te moeten navigeren om deze vervolgens met make te compileren. Rosdep is een belangrijk commando om na te gaan welke dependencies een package heeft, en deze dan ook meteen te compileren. Indien een dependency niet gevonden is zal deze automatisch ge¨ınstalleerd worden op voorwaarde dat het als root wordt uitgevoerd. Rosrun laat toe om een node uit te voeren door de naam ervan mee te geven als argument. Hou er wel rekening mee dat de node bereikbaar moet zijn vanuit ROS PACKAGE PATH en dat deze daarnaast ook reeds gecompileerd is. Indien ´e´en van deze voorwaarden niet voldaan is zal er een foutmelding worden gegeven. Rostopic stelt de gebruiker in staat om alle informatie over een topic op te vragen. Dit commando kan ook gebruikt worden om alle topics of een specifieke topic te bekijken. Bij
A.2 De opbouw van het raamwerk
63
het opvragen kan de informatie die de topic ontvangt of verzend bekeken worden. Rosnode laat toe om alle draaiende nodes te bekijken, onafhankelijk of deze individueel gestart zijn of via een master node. Er kan ook gekozen worden om meer informatie van een draaiende node te bekijken, deze node te stoppen, pingen en dergelijke. Roscore is een absolute must indien meerdere nodes gebruikt worden. Dit commando zal een aantal benodigde nodes opstarten die de communicatie tussen nodes onderling mogelijk zullen maken. Het uitvoeren van dit commando zal drie ROS elementen starten: Master
De communicatie binnen ROS gebeurt volgens een publisher-subscriber patroon waarbij de ROS master instaat voor het registreren en de naamgeving van alle nodes uit het raamwerk. Zo kunnen nodes met elkaar communiceren en elkaar services aanbieden of deze van elkaar gebruiken. De master is dus noodzakelijk om verschillende nodes connectie te laten maken met elkaar, waarna ze peer-to-peer kunnen communiceren. Parameter server
Deze zogenaamde server is volledig gedeeld met alle nodes om ze in staat te stellen parameters op te slaan of te verkrijgen. Het is echter niet ontworpen voor zware lasten en kan dus best enkel gebruikt worden voor opslag van parameters voor de configuratie van nodes. Volgende parameter types zijn toegestaan: – 32-bit integer – boolean – string – double – iso8601 datum – list – base64-ge¨encodeerde binaire data Rosout
Dit is een node die instaat voor het bijhouden van logs. Roslaunch stelt de gebruiker in staat om een ROS package uit te voeren zonder naar de directory te navigeren. Dit kan enkel gebruikt worden op voorwaarde dat de package in kwestie gevonden kan worden door ROS en dat deze daarnaast ook nog een launch file bevat. Over de launch files volgt later nog meer.
A.2 De opbouw van het raamwerk
64
Om al deze commando’s en nog anderen te bekijken alsook meer inzicht te krijgen in de opbouw en de werking van het ROS raamwerk is het sterk aangeraden om de tutorials te doorlopen. Deze tutorials zijn terug te vinden op de wiki en laten je zelf een volledige package maken waardoor de structuur en werking ervan meteen duidelijk worden. Naast al deze commando’s bevat ROS ook nog een aantal tools om te bekijken wat er gebeurt in ´e´en of meerdere nodes of om een visueel beeld te krijgen van de werking van bepaalde nodes. Rxplot geeft een weergave van de data voor ´e´en of meerdere ROS topics in de vorm van een grafiek. Rxgraph laat de verschillende nodes zien alsook de relaties tussen elkaar door gebruik te maken van ovalen en connectielijnen. Deze tool kan zeer handig zijn om meer inzicht te krijgen in de nodes die gebruikt worden voor bepaalde packages. In Figuur A.1 zijn de nodes en bijhorende relaties te zien voor de vinger-detectie, bij de lijnen staat de naam van de bijhorende topic en in een ovaal staat de naam van de bijhorende node. Het is meteen duidelijk dat er al een aantal nodes vereist zijn bij de uitvoering van de vinger-detectie demo. Rosbag kan gebruikt worden om een datastroom op te nemen en deze vervolgens ook op te slaan in een bestand met extensie ’.bag’. De opgenomen data kan dan later opnieuw worden afgespeeld door het opgeslagen bestand te gebruiken, hierbij kan onder meer de afspeelsnelheid worden aangepast. Dit is vooral bruikbaar voor het opnemen van data die achteraf regelmatig terug gebruikt zal worden zodat deze niet steeds opnieuw moet worden uitgevoerd maar gewoon kan worden afgespeeld. Rviz is voor deze scriptie een zeer handige tool omdat deze toelaat de omgeving te vizualizeren in 3D op de manier waarop de camera of sensoren deze zien of detecteren. Er kan vrij nauwkeurig worden ingesteld wat er juist zichtbaar moet zijn en wat overbodig is. Bij de vinger-detectie bijvoorbeeld is er niet veel nut aan de omgeving en zijn enkel de handen belangrijk. Rziv kan dan worden ingesteld zodat we enkel dit te zien krijgen zoals zichtbaar is in Figuur A.2. In de figuur zien we hoe de Kinect met behulp van de vinger-detectie code twee handen detecteert, waarvan ´e´en thumbs-up en een open hand met de palm naar de Kinect gericht. Nu zullen we nog even kijken naar de van een launch file. Zoals reeds eerder aan bod is gekomen kunnen de launch files uitgevoerd worden via het roslaunch commando, maar wat omvat dergelijke launch file dan precies? Een launch file is geschreven in een vorm van XML en kan zowel nodes als parameters bevatten. De files kunnen bestaan uit een hi¨erarchy van andere files waarbij een depth-first algoritme wordt toegepast voor de uitvoering, zodat de diepste files eerst uitgevoerd worden. Een parameter
A.2 De opbouw van het raamwerk
65
Figuur A.1: Rxgraph van de vinger-detectie uit het ROS raamwerk.
beschrijving omvat een naam en waarde voor de parameter waarbij ook substitutieargumenten zoals $ROS PACKAGE PATH gebruikt kunnen worden. Indien meerdere parameters met dezelfde naam gedefinieerd zijn, zal de laatste definitie gebruikt worden als waarde. Nodes bevatten een naam, een package naam, een type en eventueel argumenten. Verder zijn er nog enkele mogelijkheden die beschikbaar zijn voor de launch files waaronder if en unless. If zal een tag, zijnde het parameters of nodes, in rekening brengen indien aan een bepaalde voorwaarde voldaan is terwijl deze met unless uitgesloten kunnen worden door aan de voorwaarde te voldoen. Hoewel een launch file voornamelijk bestaat uit parameters en nodes kunnen er daarnaast ook nog andere tags gedefinieerd worden: Launch is het hoofdelement waarbinnen alle andere tags gedefinieerd worden. Machine definieert het toestel waar de nodes uitgevoerd kunnen worden, maar is niet
toepasselijk aangezien we lokaal zullen werken. Include wordt gebruikt om andere launch files te integreren in de huidige launch file. Remap laat naamveranderingen toe voor argumenten van de ROS node. Env gebruikt men om variabelen in te stellen voor nodes die gestart zullen worden. Rosparam kan parameters ophalen uit en opslaan op de parameter server, die zoals
eerder vermeld gestart wordt door roscore.
A.2 De opbouw van het raamwerk
66
Figuur A.2: Rviz voorbeeld van de vinger-detectie uit het ROS raamwerk.
Group laat toe om groepen te maken in een launchfile zodat instellingen toegepast
worden toegepast op een groep van nodes. Test is in principe hetzelde als een node tag maar benadrukt specifiek dat het om een
te testen node gaat. Hou er wel rekening mee dat de tags enkel kleine letters bevatten en de hoofdletters hier enkel waren toegevoegd om de opmaak proper te houden. Ter illustratie zullen we nu de launch file voor vinger-detectie bekijken aan de hand van een korte toelichting.
l a u n c h k i n e c t s e n s o r −−>
<node pkg=” h a n d i n t e r a c t i o n ” type=” d e t e c t s k e l h a n d s ” name=”h a n d d e t e c t o r ” output=” s c r e e n ” respawn=”t r u e ” />
A.2 De opbouw van het raamwerk
67
s e g m e n t a t i o n . . . −−> <node pkg=” d y n a m i c r e c o n f i g u r e ” type=”dynparam” name=” r e s s e t t e r ” a r g s=” s e t / o p e n n i c a m e r a p o i n t c l o u d r e s o l u t i o n 1” />
<node pkg=” s k e l e t a l t r a c k e r ” type=” t r a c k e r ” name=” s k e l t r a c k e r ” output=” s c r e e n ” respawn=”t r u e ” />
<node pkg=” h a n d i n t e r a c t i o n ” type=”a n a l y z e h a n d s ” name=” f i n g e r d e t e c t o r ” output=” s c r e e n ” respawn=”t r u e ” />
<node pkg=” r v i z ” type=” r v i z ” name=” r v i z ” a r g s=”−d
$ ( f i n d h a n d i n t e r a c t i o n ) / h a n d d e t e c t i o n . vcg ” /> −−>
We merken meteen de eerste launch tag die gestart wordt aan het begin van de file en pas op het einde van de file wordt gesloten. Dit is zoals eerder vermeld om erop te duiden dat het hier om een launch file gaat. Vervolgens komt er een regel met commentaar, let hierbij op de syntax die identiek is aan deze van XML. Op de derde lijn vind de eerste actie plaats, namelijk het includeren van een andere launch file om de openni camera te starten. We zullen niet ingaan op deze launch file aangezien die al vrij complex en omvangrijk is, maar we weten reeds dat deze nieuwe launch file eerst afgehandeld wordt door het depth-first algoritme van roslaunch. Op de vijfde regel wordt er een node gedefinieerd die gestart zal worden net zoals de daarop volgende nodes. Let ook even op de argumenten die met een node worden meegegeven. De pkg en het type zijn vastgelegd door het ROS raamwerk en moeten hierin aanwezig zijn, alle daarop volgende argumenten zijn optioneel en kunnen naar wens worden ingevuld. Het starten van nodes gebeurt in de volgorde zoals ze in de file staan en kunnen dus in theorie ook manueel in verschillende terminals gestart worden. Dit kan op voorwaarde dat eerst de roscore wordt opgestart, ondanks dat deze niet in de launch file staat zal hij automatisch gestart worden door gebruik van het roslaunch commando. We zijn erin geslaagd om de volledige vinger-detectie demo te laten draaien zonder gebruik te maken van de launch file. Hierbij hebben we wel gemerkt dat de tweede node (dynamic configure) geen invloed heeft omdat de resolutie standaard reeds 320 bij 240 bedraagt. Let ook op de laatste node die als comment is beschreven, dit is de visualisatie met rziv die standaard niet getoond zal worden voor deze demo. In de hierop volgende sectie zullen we de werking van
A.3 De werking van vinger-detectie
68
de vinger-detectie zelf bespreken.
A.3
De werking van vinger-detectie
In deze sectie zullen we trachten om de vinger-detectie te verduidelijken, door middel van gewone taal zullen we stap voor stap uitleggen hoe men in het ROS raamwerk tot de vingerdetectie komt. Vooraleer er ook maar iets te detecteren valt dient de applicatie gestart te worden, wat enkel mogelijk is indien de Kinect camera is aangesloten. Als de camera niet is aangesloten zal de applicatie blijven proberen om connectie te maken, wat toelaat om de Kinect ook na het starten van de applicatie aan te sluiten. Het starten van de applicatie gebeurt met het volgende commando: roslaunch hand interact finger detector.launch. We zullen er nu vanuit gaan dat de camera gedetecteerd werd het primesense venster verschenen is. In dit venster krijg je een beeld van wat de camera waarneemt. Er worden hierbij verschillende grijstinten gebruikt om de diepte van het beeld op iedere positie aan te duiden waarnaast kleuren gebruikt worden om gedetecteerde personen aan te duiden. In het primesense venster is er dus een stream van het opgenomen beeld te zien waarop kleine bewerkingen mogelijk zijn door bepaalde toetsaanslagen als volgt: b: tekenen of verbergen van de achtergrond x: tekenen of verbergen van pixels s: tekenen of verbergen van het skelet (enkel zichtbaar indien persoon gedetecteerd
werd) i: tonen of verbergen van tekst labels l: ID en status of enkel ID tonen als label p: pauzeren van het beeld
Hou er wel rekening mee dat deze toetsaanslagen moeten gebeuren in het primesense venster zelf, en niet in het terminal venster zoals bij de ROS tutorials, om geregistreerd te worden. Tijdens het streamen van de data wordt er ook continu gezocht naar mogelijke personen in de scene aan de hand van de diepte. Indien een gebruiker is gevonden zal deze gekleurd worden om deze te benadrukken in het primesense beeld. Nu dient de gebruiker de callibratiehouding gedurende enkele seconden aan te houden om de detailtracking toe te passen, met name de
A.3 De werking van vinger-detectie
69
vinger-detectie in dit geval. De callibratiehouding is een rechtstaande houding met de ellebogen zijwaarts gericht en de bovenarmen omhoog wijzend, wanneer de callibratie succesvol is zal er in het geel een skelet worden getekend dat getraceerd wordt door de code. Indien de gebruiker de scene zou verlaten dient geen nieuwe callibratie plaats te vinden wanneer deze de scene terug betreedt, het skelet zal automatisch terug op de persoon worden gefit. Voor het skelet op zich zullen 15 POI’s getracked worden. Het is deze data van het skelet in combinatie met een puntenwolk van de persoon die verder gebruikt worden om de handen te vinden in de scene. Met de gecombineerde data van de puntenwolk en het skelet wordt de positie van de handen bepaald door middel van de onderarm en de puntenwolk die daarmee verbonden is (de hand zelf). In een volgende stap wordt de puntenwolk die de hand voorstelt inwendig een beetje verwijderd van de arm om de hand beter te kunnen detecteren en analyseren, dit wordt toegepast voor beide handen indien deze beide gedetecteerd zijn. Om te bepalen waar de arm zich bevindt ten opzichte van de hand wordt de densiteit van de puntenwolk bekeken, die veel hoger is aan de arm dan aan de vingers. Een niet gedetecteerde hand wordt gewoon weggelaten en dus wordt ´e´en hand als voldoende beschouwd. Nu dat de hand is gedetecteerd, kan worden overgegaan tot de analyse van ´e´en of twee handen indien ze beide aanwezig zijn. Voor de gegevens van de hand te bepalen zal men eerst het centraal punt van de handpalm vastleggen door het center van de puntenwolk te bepalen zonder rekening te houden met de vingers. Vervolgens wordt de richting van de hand bepaald door gebruik te maken van de grootste lengte van het centraal punt tot de rand van de puntenwolk, wat steeds resulteert in de zijde met de vingers. Deze richting wordt bijgehouden als zijnde de eigenvector van de hand. Dus tot nu toe zijn een skelet en al dan niet beide handen gedetecteerd en geregistreerd. Nu blijven enkel de vingers nog over, die bepaald worden door op zoek te gaan naar plaatsen binnen de puntenwolk van de hand waar de densiteit van de puntenwolk vermindert en waarbij nog soortgelijke plaatsen nabij zijn (andere vingers). Indien deze plaatsten gevonden zijn kan men hieruit bepalen welke nu juist de duim is door de afstand tot de aanliggende vingers te bepalen, waarbij de duim de grootste afstand zal hebben. Nu dat de positie van de duim is bepaald kunnen de andere vingers in de juiste volgorde gezet worden door de afstand tot de duim te gebruiken. Voor elke vinger apart wordt nu een individuele puntenwolk, een centraal punt, een eigenvector en drie richtingsvectoren bijgehouden. Deze data wordt gedurende de loop van de demo continu berekend en kan door middel van rziv ook zichtbaar worden gemaakt. Om dit geheel dus vloeiend uit te voeren is een vrij zware werkomgeving vereist.
PCL (POINT CLOUD LIBRARY)
70
Bijlage B
PCL (Point Cloud Library) Deze appendix omvat instructies voor het installeren van PCL. Aangezien dit niet vanzelfsprekend gaat en veel moeite heeft gekost is dit mee opgenomen in de masterproef. Het PCL raamwerk is volledig in C++ geschreven en is opgebouwd uit verschillende modules die hier even kort aangehaald worden: Filters zijn ontworpen om ruis, zoals overbodige pixels en afwijkingen, uit de beelden
te halen. Keypoints bevat algoritmes om belangrijke statische of eenvoudig te detecteren punten
in beelden te bepalen. Registration bevat algoritmes om de transformaties tussen keypoints van meerdere
beelden te bepalen. KdTree gebruikt FLANN om nearest-neightbour searches uit te voeren om een omgev-
ing rond ´e´en of meerdere punten te bepalen Octree maakt een hi¨erarchy om de data van een puntenwolk op een gestructureerde
manier weer te geven. Segmentation kan een puntenwolk opdelen in clusters om afhankelijke data te groeperen. Sample Consensus bevat modellen voor primitieve lichamen die gebruikt kunnen
worden om bepaalde modellen en de daarbij horende parameters te bepalen. Surface bevat de handelingen die nodig zijn om de oppervlakken van objecten in een
omgeving te reconstrueren.
B.1 Het installeren van PCL Kinect Fusion
71
Range Image regelt het construeren en bewerken van dieptemappen, dit zijn afbeeldin-
gen waarbij de kleur de afstand tot de pixel voorsteld en is zeer gelijkaardig aan Figuur 3.2. IO regelt zoals de naam reeds doet vermoeden de communicatie met een verscheidenheid
aan camera’s alsook het schrijven en lezen van PCL data files. Visualization laat toe om algoritmes die op 3D data uitgevoerd worden te visualizeren. Common omvat de meeste basis structuren en methodes die door vele andere modules
gebruikt worden. Search implementeert verschillende methodes om te zoeken naar neirest neighbours in
PCL data. Dit raamwerk heeft vooral onze aandacht getrokken omdat ze een open source implementatie van Kinect fusion hebben gemaakt [30], die mogelijk meer accurate data kan opleveren dan de vingerdetectie van ROS. Vandaar dat dit raamwerk overwogen werd als mogelijke basis voor de analyse van de handen. Uiteraard dient dit raamwerk net zoals ROS eerst opgezet te worden. Hoe dit in zijn werk gaat zal in de volgende sectie worden behandelt.
B.1
Het installeren van PCL Kinect Fusion
Bij het opzetten van het PCL raamwerk zijn er heel wat punten waarmee rekening moet gehouden worden alsook een aantal dependencies die eerst dienen ge¨ınstalleerd te worden. We hebben dit raamwerk opgezet onder Ubuntu 10.04 en er is ook een poging ondernomen om dit te doen onder Ubuntu 12.4. Hieruit is meteen gebleken dat Ubuntu 12.4 aanzienlijk minder problemen geeft voor het opzetten van het raamwerk. Dit is vooral te danken aan het up-to-date zijn van Ubuntu 12.4 waardoor de meeste dependencies reeds aanwezig zijn, in tegenstelling tot Ubuntu 10.04 waarvoor geen updates en ondersteuning meer voorzien worden. In de verdere bespreking zal er vanuit worden gegaan dat Ubuntu 12.04 gebruikt wordt. Vooraleer nog verder te gaan is het zeer belangrijk om na te gaan of er een Nvidia grafische kaart aanwezig is in de te gebruiken computer. Bovendien dient deze kaart CUDA te ondersteunen aangezien dit raamwerk hierop steunt om de applicaties te versnellen. De kaart dient in het bezit te zijn van ten minste 750MB geheugen. Indien je een NVIDIA kaart hebt met ondersteuning voor CUDA maar minder geheugen, zal je nog steeds het raamwerk kunnen compileren. De meeste demo’s zullen echter niet uitvoerbaar zijn wegens te weinig
B.1 Het installeren van PCL Kinect Fusion
72
geheugen. Onder deze demo’s valt ook de Kinect fusion implementatie oftewel kinfu. Naast de CUDA ondersteuning en 750MB is het ook aangeraden om een kaart te hebben met een GPU van ten minste de Fermi generatie. We hebben zelf problemen ondervonden met het uitvoeren van kinfu omdat de kaart ter beschikking niet voldeed aan de bovenstaande eisen, en deze ook pas achterhaald werden nadat de kinfu applicatie een geheugenerror gaf bij het opstarten. Nu dat de grafische kaart behandeld is kan worden overgegaan tot installatie van de dependencies. Om te beginnen kan CUDA ge¨ınstalleerd worden, waarbij versie 4.2 aangeraden wordt omdat bij deze versie de drivers, toolkit en SDK nog apart ge¨ınstalleerd kunnen worden. Hierdoor is het eenvoudiger om mogelijke problemen tijdens de installatie af te handelen. Het is ook zeer belangrijk om de native grafische drivers van ubuntu op een blacklist te zetten alvorens de installatie te starten. Voor meer details over deze installatie kan u steeds het internet raadplegen waar meerdere guides voor de installatie snel terug te vinden zijn. Nu zijn er nog vier dependencies noodzakelijk om het raamwerk te kunnen compileren. Deze vier zijn relatief eenvoudig te installeren en worden dus maar even kort aangehaald met de nodige opmerking indien nodig. Boost 1.46 Eigen 3.0 Flann 1.7.1 VTK 5.6: Hierbij is het zeer belangrijk om de makefile aan te passen zodat ook de
SHARED LIBS gecompileerd en ge¨ınstalleerd worden. De hierboven vernoemde versies zijn de minimum vereiste versies nodig om het raamwerk te compileren, je kan dus uiteraard ook met meer recente versies werken zolang de installatieinstructies voor iedere dependency gevolgd worden. Het kan ook nuttig zijn om voor de installatie even te kijken op de PCL installatiepagina [31] om na te gaan of de minimum versies nog hetzelfde zijn. Dit kan veranderen aangezien het raamwerk nog continue in ontwikkeling is. Wanneer alle dependencies ge¨ınstalleerd zijn is het tijd om PCL zelf op te zetten. Hiervoor is het noodzakelijk de trunk versie te downloaden zoals op de installatiepagina is beschreven, de stabiele versie bevat namelijk niet de kinfu applicatie die ons interesseert. Het downloaden van de trunk is zoals op de webpagina beschreven, het compileren echter vereist enkele aanpassingen dus vanaf hier vervangt deze bespreking de webpagina. Na het downloaden maak je best een map aan in de hoofddirectory die je build noemt waar vervolgens naar genavigeerd wordt. Hierna kunnen de make bestanden gegenereerd worden met cmake ../ zodat
B.1 Het installeren van PCL Kinect Fusion
73
deze vervolgens kunnen aangepast worden met ccmake ../. In de voorgaande stap zou een lijst moeten verschijnen met build mogelijkheden en de dependencies met bijhorende paden. Indien de dependencies niet gevonden zijn dien je het pad naar de dependency in kwestie handmatig in te geven (dit is meestal noodzakelijk voor flann). Controleer in de lijst ook of BUILD GPU en BUILD VISUALIZATION aan staan vooraleer de configuraties te bevestigen. Na de bevestiging kan je de make bestanden opnieuw genereren voor de al dan niet gewijzigde configuratie. Verifieer bij het maken van de nieuwe make bestanden of gpu kinfu gecompileerd zal worden, indien dit niet het geval is kan je in de lijst van niet te compileren onderdelen nagaan welke dependency vereist is voor het compileren van kinfu zodat je dit opnieuw kan aanpassen in de make bestanden. Nu zijn er twee mogelijkheden voor compilatie: indien je enkel de kinfu applicatie wenst te gebruiken kan je naar de map kinfu navigeren op het pad gpu/kinfu en daar make uit te voeren, indien je ook andere applicaties wenst te gebruiken kan je simpelweg make uitvoeren in de build map. Het is nu nog steeds mogelijk dat er een fout optreed bij het compileren van kinfu in het bestand kinfu app.cpp. Indien dit het geval is mag je de regel waar dit voorvalt als commentaar zetten en het compileren opnieuw starten. De compilatie zou nu compleet moeten zijn, dus kan er worden overgegaan tot de uitvoering van de kinfu applicatie die terug te vinden is in de map /build/bin.
UITGEBREIDE RESULTATEN VAN SMOOTHING
74
Bijlage C
Uitgebreide resultaten van smoothing Hieronder zijn de uitgebreide resultaten van de testen met verschillende smoothing methodes terug te vinden. Bij deze resultaten zijn telkens de grootste en kleinste foutsequenties alsook het totaal aantal fouten opgenomen. Voor elke test zijn er 1000 metingen uitgevoerd waarbij er ook rekening mee moet worden gehouden dat er een groot deel van de optredende fouten plaatsvond in de initi¨ele fase, zijnde de tijd tussen calibratie van de gebruiker en het effectief aannemen van de handvorm. Wanneer wordt gekeken naar de verschillende venstergroottes voor moving average is meteen duidelijk dat een grotere venstergrootte het aantal fouten verminderd maar de grootste foutsequentie lichtjes kan verhogen. Dit fenomeen treed op omdat een foutsequentie langer kan aanhouden indien niet voldoende juiste waarden na elkaar komen (indien er dus afwisselend foute en correcte waarden optreden). Indien wordt gekeken naar de α factoren voor de exponenti¨ele smoother is te zien dat een kleinere factor aanleiding geeft tot grotere foutsequenties aangezien de meest recente meting minder invloed zal hebben en dus langer moet voorkomen om het resultaat te doen veranderen. Aan de andere kant is er een daling in het totaal aantal fouten te zien doordat regelmatige kleine fouten minder invloed hebben bij kleinere α factor indien er een grote sequentie correcte waarde aan vooraf ging. In vergelijking met de resultaten zonder smoothing is steeds een vermindering in het aantal fouten waar te nemen, wat de bedoeling was van de smoothing.
UITGEBREIDE RESULTATEN VAN SMOOTHING
75
Tabel C.1: Resultaten vinger-detectie met toevoeging van smoothing Zonder smoothing Aantal vingers
0
1
2
3
4
5
Aantal fouten
30
207
296
248
260
Grootste foutsequentie
6
42
17
23
28
8
Kleinste foutsequentie
1
1
1
1
1
1
5
159
Met moving average (venstergrootte 10) Aantal vingers
0
1
2
3
4
Aantal fouten
8
234
266
184
145
70
Grootste foutsequentie
5
47
40
25
40
12
Kleinste foutsequentie
3
1
1
1
1
6
5
Met moving average (venstergrootte 13) Aantal vingers
0
1
2
3
4
Aantal fouten
4
128
257
161
132
51
Grootste foutsequentie
4
48
46
38
42
12
Kleinste foutsequentie
4
2
1
1
1
6
5
Met moving average (venstergrootte 16) Aantal vingers
0
1
2
3
4
Aantal fouten
2
156
245
139
123
47
Grootste foutsequentie
2
49
43
33
40
12
Kleinste foutsequentie
2
1
1
1
9
5
5
Met exponenti¨ele smoother (α = 0.2) Aantal vingers
0
1
2
3
4
Aantal fouten
27
242
258
228
242
131
Grootste foutsequentie
6
42
43
39
41
11
Kleinste foutsequentie
1
1
1
1
1
1
5
Met exponenti¨ele smoother (α = 0.1) Aantal vingers
0
1
2
3
4
Aantal fouten
25
241
246
229
174
131
6
42
43
37
41
11
Grootste foutsequentie
GEBRUIKTE GEBAREN
Bijlage D
Gebruikte gebaren 1. Aanhalingsteken 2. Aankloppen 3. Aanraken 4. Aanvallen 5. Ademhaling 6. Draak 7. Vandaag 8. Behanger 9. Cactus 10. Examen 11. Gooien 12. Hoog 13. Inzoomen 14. Jullie 15. Kast 16. Lifter 17. Min
76
GEBRUIKTE GEBAREN
18. Weduwe 19. Vierde 20. Solide
77
BIBLIOGRAFIE
78
Bibliografie [1] http://gebaren.ugent.be/ [2] Antonis A. Argyros, Manolis I.A. Lourakis, “Tracking Skin-colored Objects in Realtime”, invited contribution to the Cutting Edge Robotics book, ISBN 3-86611-038-3, Advanced Robotic Systems International, 2005. [3] Phung, SL, Bouzerdoum, A & Chai, D, “Skin segmentation using color pixel classification: analysis and comparison”, IEEE Transactions on Pattern Analysis and Machine Intelligence, January 2005, 27(1), 148-154. [4] S. E. Ghobadi, O. E. Loepprich, K. Hartmann, O. Loffeld, “Hand Segmentation using 2D/3D Images”, Proceedings of Image and Vision Computing New Zealand 2007, pp. 6469, Hamilton, New Zealand, December 2007. [5] Plagemann C., Ganapathi V., Koller D., Thrun S., “Real-time identification and localization of body parts from depth images”, IEEE International Conference on Robotics and Automation, May 2010, 3108-3113. [6] J. Shotton, A. Fitzgibbon, M. Cook, T. Sharp, M. Finocchio, R. Moore, A. Kipman, A. Blake, “Real-time human pose recognition in parts from single depth images”, In In CVPR, 2011. [7] Ganapathi V., Plagemann C., Koller D., Thrun S., “Real time motion capture using a single time-of-flight camera”, IEEE conference on Computer Vision and Pattern Recognition, June 2010, 755-762. [8] Konstantinos G. Derpanis, Richard P. Wildes, John K. Tsotsos, “Hand Gesture Recognition within a Linguistics-Based Framework”, York University, 2004. [9] V. Pitsikalis, S. Theodorakis, C. Vogler, “Advances in Phonetics-based Sub-Unit Modeling for Transcription Alignment and Sign Language Recognition”, IEEE CVPR Workshop on Gesture Recognition, June 2011.
BIBLIOGRAFIE
79
[10] J. Han, G. Awad, A. Sutherland, “Modelling and segmenting subunits for sign language recognition based on hand motion analysis”, Pattern Recognition Letters 30, 623-633, 2009. [11] H. Cooper, R. Bowden, “Sign Language Recognition using Linguistically Derived SubUnits”, University of Surrey, 2010. [12] H. Cooper, Eng-Jon ONG, N. Pugeault, R. Bowden, “Sign Language Recognition using Sub-Units”, Journal of Machine Learning Research 13 (2012), 2205-2231. [13] Sunita Nayak, Sudeep Sarkar, Barbara L. Loeding, “Automated extraction of signs from continuous sign language sentences using Iterated Conditional Modes”, CVPR’09, 2583-2590, 2009. [14] Sunita Nayak, Kester Duncan, Sudeep Sarkar, Barbara Loeding,“Finding Recurrent Patterns from Continuous Sign Language Sentences for Automated Extraction of Signs ”, 25892615, 2012. [15] P. Buehler, M. Everingham, A. Zisserman, “Learning sign language by watching TV (using weakly aligned subtitles)”, IEEE Conference on Computer Vision and Pattern Recognition (CVPR) 2009. [16] Kadir T., Bowden R., Ong E. J., Zisserman, A., “Minimal Training, Large Lexicon, Unconstrained Sign Language Recognition”, British Machine Vision Conference, 2004. [17] Z. Zafrulla, H. Brashear, T. Starner, H. Hamilton, P. Presti, “American Sign Language Recognition with the Kinect”, ICMI ’11 Proceedings of the 13th international conference on multimodal interfaces, 279-286, 2011. [18] I. Oikonomidis, N. Kyriazis and A.A. Argyros, “Efficient model-based 3D tracking of hand articulations using Kinect”, in Proceedings of the 22nd British Machine Vision Conference, BMVC2011, University of Dundee, UK, Aug. 29-Sep. 1, 2011. [19] Microsoft Corp. Redmond WA., “Kinect for Xbox360”. [20] Gallo L., “Controller-free exploration of medical image data: Experiencing the Kinect”, Computer-Based Medical Systems (CBMS), 2011. [21] Lars C. Ebert, Gary Hatch, Garyfalia Ampanozi, Michael J. Thali, Steffen Ross, “You Can’t Touch This, Touch-free Navigation Through Radiological Images”, International Association of Forensic Sciences, September 2011.
BIBLIOGRAFIE
80
[22] Stevie Giovanni, Yeun Chul Choi, Jay Huang, Eng Tat Khoo, KangKang Yin, ”Virtual Try-on using Kinect and HD camera”, National University of Singapore, EonReality. [23] Hui-mei Justina Hsu, “The Potential of Kinect as Interactive Educational Technology”, Fo Guang Universify of Taiwan, 2011 2nd International Conference on Education and Management Technology. [24] Stefano Bussolon, “Kinect: natural or involuntary interface?”, Universit`a degli Studi di Trento, 2010. [25] Roel Verschaeren, “Gesture Recognition using the Microsoft Kinect”, Master Thesis University of Ghent, 2012. [26] http://www.openni.org/ [27] http://www.mlpack.org/ [28] L. Rabiner, “A tutorial on hidden markov models and selected applications in speech recognition”, Proceedings of IEEE, 1989. [29] http://www.ros.org/wiki/mit-ros-pkg/KinectDemos [30] http://pointclouds.org/news/kinectfusion-open-source.html [31] http://www.pointclouds.org/downloads/source.html