Categoriseren van personen op basis van leeftijd en ge

FACULTEIT INDUSTRIELE
INGENIEURSWETENSCHAPPEN
CAMPUS DE NAYER
Categoriseren van personen
op basis van leeftijd en geslacht
Bjorn HUYSMANS
Promotor:
Prof. Dr. Ir Toon Goedeme´
Masterproef ingediend tot het behalen van
de graad van master of Science in de
¨ wetenschappen: Elektronica-ICT
industriele
Afstudeerrichting informatie- en
communicatietechnieken
Academiejaar 2013 - 2014
FACULTEIT INDUSTRIELE
INGENIEURSWETENSCHAPPEN
CAMPUS DE NAYER
Categoriseren van personen
op basis van leeftijd en geslacht
Bjorn HUYSMANS
Promotor:
Prof. Dr. Ir Toon Goedeme´
Masterproef ingediend tot het behalen van
de graad van master of Science in de
¨ wetenschappen: Elektronica-ICT
industriele
Afstudeerrichting informatie- en
communicatietechnieken
Academiejaar 2013 - 2014
c Copyright KU Leuven
Zonder voorafgaande schriftelijke toestemming van zowel de promotor(en) als de auteur(s) is over¨
nemen, kopieren,
gebruiken of realiseren van deze uitgave of gedeelten ervan verboden. Voor aanvragen tot of informatie i.v.m. het overnemen en/of gebruik en/of realisatie van gedeelten uit deze
publicatie, wend u tot KU Leuven campus De Nayer, Jan De Nayerlaan 5, B-2860 Sint-KatelijneWaver, +32-15-316944 of via e-mail [email protected].
Voorafgaande schriftelijke toestemming van de promotor(en) is eveneens vereist voor het aanwenden van de in deze masterproef beschreven (originele) methoden, producten, schakelingen
en programma’s voor industrieel of commercieel nut en voor de inzending van deze publicatie ter
deelname aan wetenschappelijke prijzen of wedstrijden.
Dankwoord
Vooraleer deze masterproef tot stand kon komen, heb ik het genoegen gehad met een aantal
personen te mogen samenwerken alsook met het bedrijf Eavise. Mijn promotor Prof. Dr. Ir. Toon
Goedeme´ wil ik hierbij bedanken voor de steun en het advies dat ik gekregen heb tijdens het
uitwerken van deze masterproef. Steven Puttemans wil ik bedanken voor de hulp voor het vinden
van de juiste info en de documentatie van OpenCV en voor het zoeken in reeds bestaande software
naar fouten. Floris De Smedt bedank ik voor de hulp bij het opzetten van libccv .
Ook zonder de hulp van familieleden, vrienden en buren zou deze masterproef nooit enig resultaat
opgeleverd hebben. Hierbij wil ik deze bedanken om er voor mij te zijn en klaar te staan voor de
verschillende testsessies, fotoshoots en video-opnames.
ix
Abstract
Deze thesis is een project van de onderzoeksgroep EAVISE en heeft als doel het ontwikkelen van
een programma dat de reclame-industrie mogelijk maakt om reclame weer te geven afhankelijk van
de aanwezige doelgroep. Dit wilt zeggen dat door middel van een camera vlak bij het reclamebord,
mensen zullen kunnen gedetecteerd worden en aan elk van deze personen een groep zal toegekend worden. Hoe deze categorisatie moet gebeuren en op basis van welke kenmerken, zullen we
in deze thesis onderzoeken. Dit programma zal gebruikt kunnen worden door bedrijven die zich
bezighouden met het presenteren van reclame indien zij hieraan nog extra software koppelen voor
de weergave van de reclame.
De classificatie waarop wij ons gaan richten is op basis van de leeftijd en het geslacht van een
persoon. Door middel van een camera zullen we informatie uit de omgeving verzamelen, hierop
de personen detecteren en deze classificeren. Om deze beelden te verwerken, maken we gebruik
van het programma OpenCV. Dit is een gratis bibliotheek waarin gecodeerd kan worden in C++.
Deze bevat reeds een personendetector en vele functies om onze eigen detectoren en classifier te
trainen.
Ons algoritme is opgedeeld in zes onderdelen. Allereerst zullen we personen detecteren in de
ontvangen beelden. Vervolgens zullen we het gezicht van deze personen detecteren. Omdat het
systeem real-time moet presteren, is het belangrijk de verwerkingssnelheid optimaal te houden.
We kunnen de gezichtsdetectie versnellen door enkel het bovenste deel van de personen, door
de persoonsdetector gedetecteerd, door te geven aan de gezichtsdetector in plaats van de gehele
afbeelding. Wanneer een gezicht gedetecteerd is, kunnen we hiermee het geslacht bepalen. Dit
zullen we doen door middel van een Haar-detector of LBP-detector die getraind is op mannengezichten. Aangezien we reeds weten dat het een persoon is en er een gezicht aanwezig is, kunnen
we ook besluiten dat indien het geen man is, het een vrouw moet zijn. De leeftijd van de personen zullen we bepalen afhankelijk van hun geslacht en lengte. Deze twee kenmerken kunnen we
koppelen aan statistieken omtrent de gemiddelde lengte op bepaalde leeftijden.
Het resultaat van deze categorisatie is beperkt. We kunnen namelijk een slechte opdeling maken
in leeftijden omdat we ons enkel baseren op de lengte. Oudere personen (50+) kunnen we niet
aparte categoriseren omdat we hiervoor te weinig informatie hebben. De geslachtsdetectie werkt
enorm vlot, met de beperking dat het gezicht van de aanwezige personen frontaal in beeld moet
komen. De lengtebepaling is vrij onstabiel en de oorzaak ligt bij de personendetector. De grootte
van de detecties verandert continu en aangezien we ons hierop baseren, is er dus enorm veel ruis
op de berekende lengte. Toch werkt het systeem volledig real-time en is het een enorm flexibel
systeem waarbij de gebruiker verscheidene parameters kan aanpassen zodat het algoritme werkt
naar zijn normen.
xi
Abstract (English)
This thesis is a project by the research group EAVISE and its purpose is to develop software which
gives publishing companies the ability to show ads adapted to the people around their billboards.
By using a camera located near the billboard, persons can be detected and categorised. How this
categorisation happens and what features are used to do so, shall be researched in this thesis. This
program can be used by companies whose business is to make ads if they use or create additional
software which is linked to the result of our program.
The classification we are going to implement is based on the gender and age of the persons on
the images. By using one camera, we will be able to gather information of the surroundings. With
this information, which are images, we will detect persons and categorise them. To process these
images, we will use software called OpenCV. This is a free vision library coded in C++. This library
already contains a pedestrian-detector and many other functions to train our own detectors and
classifiers.
Our algorithm is divided into six parts. First, we’ll detect pedestrians in the captured images.
afterwards, we will detect the faces of those pedestrians Because our system has to work in realtime, we have to consider any speed improvements. A nice speed improvement is to only send the
upper part of the pedestrian image to the face-detector as its detection-speed will be increased.
When a face is detected, this face is sent to the gender-detector. This detector detects male faces
based on Haar- or LBP-techniques. Because we already know it is a person and the face of this
person is aimed at the camera, we can conclude that if the face is not male, the face has to be
female. The age of the pedestrian will be estimated based on the length and the gender of the
pedestrian. These two features of persons can be linked to statistics about average length on
certain ages which gives us the ability to classify the pedestrian.
The results of this categorisation is limited. Because our age estimation is solely based on the
length of the pedestrian, we can only divide them into a limited number of categories. Elderly
pedestrians (50+) won’t be divided into a separate group because of the lack of information. The
gender-detection performs very good with the limitation that the faces have to be aimed at the
camera. Otherwise, no gender can be determined. The length estimation is quite unstable. This is
due to the fact that the size of the pedestrian-detection varies a lot which results in a lot of noise on
the output. Yet, the system performs in real-time and it is very flexible. The user of the software is
able to adapt various parameters so the algorithm works to his likings.
xiii
Short Summary
In this thesis, we are going to research the ability of categorising pedestrians based on their gender
and age. The gender-detection makes use of the face of the pedestrians while the age-classification
is based on the gender and the length of the pedestrian. We will use OpenCV as our software to
develop the gender-detector while using the pedestrian- and face-detectors already included in
OpenCV.
Background
EAVISE, which stands for Embedded Artificially intelligent VISion Engineering, is a multidisciplinary
research group based at Campus De Nayer in Sint-Katelijne-Waver focusing on applications of
advanced computer vision and artificial intelligence. The research goal of EAVISE is applying stateof-the-art computer vision techniques as a solution for industry-specific vision problems. EAVISE
figured out that companies advertising their product are wasting their money when their ads are
shown to the wrong target group. For example when people walk past a billboard in the shopping
mall. If a system is developed which is able to categorise the pedestrians, ads could be shown
specifically for a target category. In this thesis, a system that categorises pedestrians real-time and
based on their age and gender is proposed.
The algorithm
The algorithm we implemented consists of six parts which we execute directly after each other. This
implementation is called a cascade and is widely used. It also gives our algorithm the flexibility it
needs. Whenever an additional step is necessary, one can add it to the cascade without interfering
the other steps. The same can be applied when removing a step, besides from the necessary steps
which could be changed for other methods. To develop such a system, we are in need of software.
Even though we would like to use libccv because of its performance, we will be using OpenCV as
this vision-library has a lot of documentation and we were not able to set-up the libccv environment
correctly.
The first part of our algorithm is the detection of pedestrians in the given image. The pedestriandetector we use is packed within the free library of OpenCV. As one of our requirements is a
real-time classification, we will cut out the detected pedestrians from the original image and give
the upper part of this image to the next step: the face-detector. By doing this, the face-detector
has a smaller area to detect faces which will be a huge speed improvement. The full pedestrian
image will be used for the determining the length. The face-detector, also available in the OpenCV
library, will give us the information whether we are able to classify the pedestrian or not. If a face
xv
xvi
is detected, we can continue our own gender-detector and age-determination part. The way the
detectors pass their information to each other is visualised in figure 1
Figure 1: Visualisation of the information sent to the different detectors with a) pedestrian-detector, b) facedetector and c) gender-detector
In this thesis, we trained several gender-detectors based on the face of the pedestrians, each with
another technique. We used Haar-features, LBP-features and HOG-features in our training and
compared the results in terms of speed and accuracy. After our gender is determined, we have to
determine the actual length of the pedestrian. With enough information from the cameras, there
would be no problem. However, we would like to use only one camera which makes this a little bit
more difficult.
To calculate the real length of a pedestrian from a single camera, a few parameters about the
environment have to be known. That is why we created a calibration function. In this function, the
camera has to be set-up and the user has to give some input to the system which includes the
distance from the camera till the bottom of the actual frame (image). The distance from the camera
till the endpoint of the ground on the frame and where those points are located on the frame itself
(pixel-wise) are also needed. With these values, the camera-constant is calculated which is needed
to estimate the length of a pedestrian on an image from the camera.
The age classification is a combination of both gender and length. When we use these two characteristics, we are able to classify the pedestrians by using the average length at certain ages. We
have now categorised the pedestrians based on their gender and age.
Results
The results of our approach were satisfactory, but not exceptional. We do have some additional
requirements because we chose to classify them by using their face and length. First of all, the system works real-time with multiple people walking in front of the camera. However, the pedestrians’
body have to be fully visible on the image to be able to classify them. Also their face should be facing towards the camera. Another shortcoming of this approach is that when our age-classification
xvii
is only based on the length and gender, we do not have enough information to determine many
age categories. Pedestrians who are older than 12 years can not be further categorised without
additional information. While the gender-detection is quite stable, our length-determination is not.
This is because the calculated length is based on the size of the pedestrian-detection. This detection varies quite a lot and so does our length. However, when the average length is calculated, the
result equalises the actual length.
Though our system has some shortcomings, it can be easily extended or adapted to achieve better
results or to add additional categories. The following images show our final results.
Figure 2: Full algorithm on a boy and a man
Figure 3: Full algorithm on a woman
Inhoudsopgave
1 Inleiding
1.1 Algemene probleemstelling
1
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
1.2 Organisatie van deze tekst . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2
2 Situering en doelstelling
3
2.1 Situering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3
2.2 Doelstelling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3
3 Literatuurstudie
5
3.1 Introductie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5
3.2 Technieken . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5
3.2.1 Haar-like Features . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5
3.2.2 Histogram of Oriented Gradients . . . . . . . . . . . . . . . . . . . . . . . .
7
3.2.3 Local Features with Implicit Shape Model . . . . . . . . . . . . . . . . . . .
9
3.2.4 Local Binary Patterns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
´ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.2.5 Dollar
9
3.2.6 Support Vector Machines . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3.3 Leeftijdsbepaling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.3.1 Facial Age Paterns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.3.2 Skin Wrinkle Analysis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.4 Geslachtsbepaling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.4.1 Local Binary Patterns en Support Vector Machines . . . . . . . . . . . . . . 14
3.4.2 Gender Recognition from Body . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.5 Platformen en omgevingen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.5.1 OpenCV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3.5.2 Libccv . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3.6 Evaluatie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3.7 Conclusie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
4 Uitwerking
19
4.1 Algemene Flow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
xix
xx
INHOUDSOPGAVE
4.1.1 Geslachtsbepaling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
4.1.2 Leeftijdsbepaling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
4.1.3 Conclusie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
4.2 Programmeeromgeving
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
4.3 Voorbereiding van de beelden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
4.4 Persoonsdetectie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
4.4.1 Haar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
4.4.2 HOG
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
4.4.3 Evaluatie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
4.4.4 Besluit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
4.5 Gezichtsdetectie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
4.5.1 Haar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
4.5.2 LBP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
4.5.3 Evaluatie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
4.5.4 Besluit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
4.6 Geslachtsclassificatie
4.6.1 Datasets
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
4.6.2 Cascade training . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
4.6.3 Evaluatie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
4.6.4 Besluit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
4.7 Lengtebepaling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
´ en
´ camera . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
4.7.1 E
4.7.2 Kalibratie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
4.8 Leeftijdsbepaling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
5 Resultaten
33
5.1 Algemene performantie
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
5.2 Nauwkeurigheid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
5.3 Totale algoritme
6 Besluit
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
37
6.1 Toekomstig werk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
A Programma code
41
Lijst van figuren
1
Visualisation of the information sent to the different detectors with a) pedestriandetector, b) face-detector and c) gender-detector . . . . . . . . . . . . . . . . . . . xvi
2
Full algorithm on a boy and a man . . . . . . . . . . . . . . . . . . . . . . . . . . . xvii
3
Full algorithm on a woman . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvii
1.1 Elektronisch reclamebord waarbij doelgerichte reclame wordt afgebeeld . . . . . . .
1
3.1 Soorten features . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6
3.2 Feature representatie bij gezichtsdetectie . . . . . . . . . . . . . . . . . . . . . . .
7
3.3 Star Model, (a) Toepassing van enkel de hoofdfilter, (b) Hogere resolutie deeltjes
filters en (c) een spatiaal model als relatie tot de hoofdfilter . . . . . . . . . . . . . .
8
3.4 Methode van grenswaarden bij LBP en drie uitbreidingen: a) basis LBP, b) circulaire
(8,1) regio, circulaire (8,2) regio en d) circulaire (8,3) regio . . . . . . . . . . . . . . 10
´ combinatie van verschillende channels
3.5 Dollars
. . . . . . . . . . . . . . . . . . . . 10
3.6 SVM techniek met a) verschillende mogelijke scheidingslijnen en b) optimale scheidingslijn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.7 Evolutie van het ouder worden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.8 Rimpelmap. Bevat de regio’s waarin naar rimpels gezocht moet worden . . . . . . . 13
3.9 Resultaat van edgedetectie door middel van snakes
. . . . . . . . . . . . . . . . . 14
3.10 LBP methode op gezichten. (a) Preprocessed faces, (b) Bijhorende LBP faces, (c)
Bijhorende 5x5 rooster LBP faces . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.11 Voorstelling van de verschillende technieken. (a) originele afbeelding, (b) edge map,
(c) Histogram of Oriented Gradients (HOG) . . . . . . . . . . . . . . . . . . . . . . 15
3.12 Resultaten van de verschillende technieken op verschillende datasets bij het detecteren van personen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
4.1 Flow van het algoritme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
4.2 Grafische voorstelling van de detectoren in het algoritme met a) persoonsdetectie,
b) gezichtsdetectie en c) geslachtsbepaling . . . . . . . . . . . . . . . . . . . . . . 21
4.3 Histogram van een afbeelding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
4.4 Histogram equalization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
4.5 Visualisatie van de persoonsdetectie met rechts de uitgeknipte persoon . . . . . . . 25
4.6 Visualisatie van de gezichtsdetectie met rechts het uitgeknipte gezicht . . . . . . . . 26
xxi
xxii
LIJST VAN FIGUREN
4.7 Parameters nodig voor de lengtebepaling . . . . . . . . . . . . . . . . . . . . . . . 29
4.8 Camerastandpunt bij lengtebepaling . . . . . . . . . . . . . . . . . . . . . . . . . . 29
4.9 Groeicurve van jongens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
4.10 Groeicurve van meisjes
5.1 Foutive geslachtsdetectie
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
5.2 Lengte- en leeftijdsbepaling van een jongen . . . . . . . . . . . . . . . . . . . . . . 35
5.3 Lengte- en leeftijdsbepaling van een man . . . . . . . . . . . . . . . . . . . . . . . 35
5.4 Resultaat van het algoritme op een man . . . . . . . . . . . . . . . . . . . . . . . . 36
5.5 Resultaat van het algoritme op een vrouw . . . . . . . . . . . . . . . . . . . . . . . 36
Verklarende lijst van afkortingen en
symbolen
Detector Software die objecten detecteert in beelden
Classifier Software die gedetecteerde objecten categoriseert
CPU Central Processing Unit is hardware dat de basis instructies van een computerprogramma
uitvoert
GPU Graphical Processing Unit is hardware dat specifiek grafische bewerkingen uitvoert
CUDA Compute Unified Device Architecture is GPU-technologie die het mogelijk maakt om algoritmes uit te voeren op de GPU
LTS Long Term Support is software waarvoor lange tijd hulp (support) zal worden aangeboden
LBP Local Binary Patterns is een techniek om features (kenmerken) uit een afbeelding te halen
en voor te stellen
xxiii
Hoofdstuk 1
Inleiding
1.1
Algemene probleemstelling
Reclame, we worden er regelmatig mee geconfronteerd: op de bus, op het internet, op de televisie,
in het winkelcentrum,... ] Producenten weten reeds lange tijd dat producten nu eenmaal vaak beter
verkopen als ze extra in de verf worden gezet. Een miljoenenbusiness. En hoewel de publishers
proberen om de juiste locaties en tijdstippen te zoeken voor bepaalde reclame, toch zal veel van
deze reclame zijn doelgroep missen. Reclame is meestal bedoeld voor een specifieke groep van
personen. De huidige manier van reclame maken, kan hier moeilijk op inspelen.
Reclame tonen die afhankelijk is van de doelgroep die zich het meest profileert in de omgeving van
het reclamebord, dat zou de producenten enorm wat geld besparen. Dit willen we in deze thesis
verder uitdiepen. Als we in staat zijn de mensen in de nabije omgeving te detecteren via een camera en deze personen te classificeren, kunnen we bepalen welke doelgroep het meest aanwezig
is op dat moment. Dit gekoppeld aan software dat, afhankelijk van het resultaat, specifieke reclame
kan weergeven, zorgt ervoor dat de reclame op het juiste moment en dus aan de juiste personen
wordt getoond. Natuurlijk kunnen we dit moeilijk toepassen bij de mensen thuis. Daarom zullen
we ons baseren op een opstelling waarbij er een camera vlak bij een elektronisch reclamebord
gepositioneerd wordt, waarvan we beelden zullen ontvangen die we vervolgens zullen verwerken.
Figuur 1.1: Elektronisch reclamebord waarbij doelgerichte reclame wordt afgebeeld
1
2
1 Inleiding
Het resultaat van de verwerking zou de personen moeten classificeren op basis van hun leeftijd en
hun geslacht. Hiermee kunnen we de reclame- industrie helpen om geld te besparen en het voor
de mensen aangenamer te maken om naar reclame te kijken die specifiek voor hen bedoeld is.
1.2
Organisatie van deze tekst
Deze masterthesis is als volgt opgebouwd. We beginnen met een situering en een duidelijke bepaling van onze doelstelling in hoofdstuk 2. In hoofdstuk 3 zal een studie gemaakt worden rond
het detecteren van personen, hoe we classificaties kunnen uitvoeren, welke de beste technieken
zijn om dit te doen en waarom. We zullen ook een studie doen naar hoe we de leeftijd en het
geslacht van personen kunnen bepalen. In hoofdstuk 4 komt de uitgewerkte methode aan bod
met hierin de gebruikte datasets en aangeleerde classifiers. Hoe ons algoritme tot stand gekomen
is, het waarom en een korte evaluatie zal hier uitgelegd worden. Hoofdstuk 5 zal gaan over de
resultaten van de verschillende onderdelen van ons algoritme. We eindigen met hoofdstuk 6 met
het besluit en eventuele opmerkingen omtrent ons algoritme. Hierin zullen ook eventuele verbeteringen voor komende studies te vinden zijn. In de bijlage vindt u een DVD met de sourcecode van
de verschillende geschreven programma’s, gebruikt beeldmateriaal en een digitale versie van deze
thesis.
Hoofdstuk 2
Situering en doelstelling
2.1
Situering
¨ intelligentie gesitueerd op
Eavise, een onderzoeksgroep gericht op computer vision en artificiele
Campus De Nayer in Sint-Katelijne-Waver, is er van overtuigd dat een systeem, waarbij personen
gecategoriseerd worden op basis van geslacht en leeftijd, kant-en-klaar beschikbaar moet zijn voor
de reclame-industrie. EAVISE staat voor Embedded Artificially Intelligent Vision Engineering en
behoort tot de onderzoeksgroep van de KU Leuven en de Thomas More Technische Universiteit.
¨ onderdeel
Het visie onderdeel van hun onderzoeksgroep is ge¨ıntegreerd met VISICS, het artificiele
met DTAI. Ze hebben reeds veel onderzoek gedaan naar het implementeren van beeldverwerkende
software en algoritmes. Aangezien ze hierdoor al heel wat technieken en algoritmes bezitten, willen
ze een methode uitwerken en het nodige doen, zodat er gerichtere reclame kan getoond worden
en dus minder geld verloren gaat in de reclame-industrie.
2.2
Doelstelling
Mensen komen in alle maten en gewichten voor. Gelukkig zijn er ons reeds velen voorgegaan in
het domein van het detecteren van personen in beelden, maar het bepalen van de leeftijd en het
geslacht is een heel andere opgave. We zullen ons enkele doelen voor ogen moeten stellen voordat we kunnen starten met het zoeken naar mogelijke oplossingen.
Onze doelstelling is het maken van een flexibel en real-time systeem dat personen classificeert
´ camera.
op basis van hun leeftijd en geslacht en dit met slechts e´ en
Vereisten:
• Categorisatie moet gebeuren op basis van leeftijd en geslacht
• Reclame moet real-time aangepast worden, dus de classificatie moet real-time functioneren
´ camera
• Maximaal gebruik van e´ en
Met deze vereisten in het achterhoofd, kunnen we deelonderzoeksvragen opstellen op basis hiervan.
3
4
2 Situering en doelstelling
Leeftijd en geslacht
• Op basis van welke kenmerken kunnen we simpel en snel de leeftijd bepalen?
• Zijn er specifieke vereisten voor de positie en/of de stand van de persoon voor de classificatie?
• Wat is een snelle manier om het geslacht te bepalen?
• Welke techniek levert de beste prestaties?
Real-time
• Is het mogelijk zo een systeem real-time te maken?
Camera
´ camera?
• Is het mogelijk zo’n classificatie uit te voeren met slechts e´ en
• Kunnen we hiermee een flexibel en instelbaar programma maken?
Nu onze onderzoeksvraag en deelonderzoeksvragen vast liggen, kunnen we starten aan het uitzoeken van een algoritme. We zullen onderzoeken welke technieken reeds getest zijn en wat de
resultaten van deze studies waren. We doen dit in hoofdstuk 3: de literatuurstudie.
Hoofdstuk 3
Literatuurstudie
3.1
Introductie
In deze literatuurstudie stellen we ons de vraag hoe we mensen kunnen detecteren in een omgeving en hoe we deze mensen kunnen categoriseren. Indien men dergelijk systeem wilt ontwikkelen,
is een grondige voorafgaande studie noodzakelijk. Ons doel is om een algoritme te bedenken dat
het mogelijk maakt om via een camera, dat zich vlakbij een digitaal reclamebord bevindt, personen
te detecteren en deze kan indelen op basis van hun leeftijd en geslacht. Om dit te bereiken, moeten
we eerst onderzoeken wat de reeds verschillende onderzochte technieken zijn om dit soort detecties uit te voeren en hoe we de algemene flow van ons algoritme moeten opstellen. De daarop
volgende onderdelen van deze studie zullen mogelijke onderdelen van ons algoritme uitleggen.
Zo staan er in 3.2 de mogelijke technieken om detecties uit te voeren, bijvoorbeeld voor de persoonsdetectie. Onderdeel 3.3 legt de mogelijkheden uit om de leeftijd van personen te bepalen en
op welke kenmerken deze steunen. De mogelijkheden om het geslacht van personen te bepalen
door middel van beeldverwerking, zijn uitgelegd in 3.4. In 3.5, het laatste onderdeel van deze
literatuurstudie, bekijken we mogelijke platformen en besturingssystemen waarop we beeldverwerkendesoftware kunnen ontwikkelen.
3.2
Technieken
Aan de hand van onze onderzoeksvragen kunnen we nu een studie uitvoeren naar mogelijke technieken om objecten in een beeld te detecteren of om classificaties uit te voeren. Afhankelijk van
de techniek zullen we resultaten verkrijgen op performantie- en nauwkeurigheidsvlak. Deze zullen
beslissend zijn om te bepalen welke techniek toegepast zal worden in ons onderzoek.
3.2.1
Haar-like Features
Haar-like features is een techniek waarbij het systeem gebruik maakt van features of kenmerken in
een afbeelding in plaats van te werken met de pixelintensiteit. Ook in de studie van Papageorgiou
et al. (1998) worden deze features berekend door afgeleiden van Haar Basis functies. Om de
snelheid van deze bepaling te verhogen, en ook toe te kunnen passen op verschillende schalen,
wordt deze berekening niet uitgevoerd op de oorspronkelijke afbeelding, maar op de Integral Image.
De integral image is een voorstelling van de oorspronkelijke afbeelding. Deze is op positie x,y gelijk
5
6
3 Literatuurstudie
aan de som van de pixels boven en links van x,y met x en y inclusief:
ii(x, y) =
∑
i(x0 , y0 )
(3.1)
x0 ≤x,y0 ≤y
waarbij ii(x,y) de integral image is en i(x,y) de originele afbeelding. Eens deze Integral image
berekend is, kan elke soort Haar-like feature bepaald worden op elke schaal en in een constante
tijd. De techniek van Viola and Jones (2001) maakt gebruik van 3 soorten features:
• Two-rectangular feature
• Three-rectangular feature
• Four-rectangular feature
De two-rectangular feature maakt gebruik van twee rechthoeken. Het resultaat is het verschil van
de som van de pixels van de twee rechthoeken. Beide rechthoeken hebben dezelfde grootte en
vorm. De three-rectangular feature gebruikt drie rechthoeken. Hierbij is het resultaat gelijk aan
het verschil van de som van de twee buitenste rechthoeken met de binnenste rechthoek. De fourrectangular feature heeft vier rechthoeken en het resultaat is het verschil tussen de som van de
twee diagonale paren rechthoeken. De resultaten zijn te zien in fig 3.1.
Figuur 3.1: Soorten features
Deze rechthoekige features zijn weliswaar vrij primitief ten opzichte van andere bestaande alternatieven. Rechthoekige features zijn gevoelig voor randen, balken of andere eenvoudige structuren
¨
maar niet voor details. Ook wanneer de orientatie
van belang is, zijn de rechthoekige features geen
goede keuze. Zo zijn ze voor gezichtsdetectie enkel handig wanneer het gezicht zich recht voor
de camera bevindt, zoals te zien is op figuur 3.2. Toch blijft deze techniek sterk. Door zijn enorm
¨ rekenwerk, kan deze techniek goed getraind worden en compenseert deze zo zijn mindere
efficient
flexibiliteit.
De techniek van Viola and Jones (2001) is al lange tijd bekend en er is een hele reeks aan implementatie mogelijkheden beschikbaar. Er zijn zowel algoritmes beschikbaar op de CPU als op de
GPU en dit in verschillende programmeertalen (C++, Cuda,...). Dit is een bijzonder groot voordeel
3 Literatuurstudie
7
Figuur 3.2: Feature representatie bij gezichtsdetectie
aangezien er velen ons al voor gegaan zijn en er dus verschillende hulpmiddelen zijn voor de implementatie. Via dit principe zijn er een aantal persoons- en gezichtsdetectoren beschikbaar. Het
is een techniek dat veel gebruikt wordt voor gezichtsdetectie.
We kunnen hieruit besluiten dat haar-features een oude techniek is die wel real-time mogelijkheden
biedt, doch bestaan er al andere, betere en snellere detectietechnieken. Niettemin kunnen we de
beschikbare detectoren gebruiken.
3.2.2
Histogram of Oriented Gradients
HOG of Histogram of Oriented Gradients haalt features uit een afbeelding door te zoeken naar
de overgangen tussen pixels. Deze overgangen kunnen te maken hebben met de intensiteit van
de pixel, maar ook door een verandering van kleur en werkt dus pixelgewijs. Als we de afbeelding
verdelen in kleinere delen of cellen, kunnen we door middel van een mask de richting van de veran´
dering zoeken. De optredende veranderingen kunnen we bijhouden in een nieuwe afbeelding, e´ en
die een voorstelling weergeeft van de originele afbeelding. Het resultaat kunnen we vergelijken met
eerder aangeleerde voorstellingen en hieruit kunnen we het object op de afbeelding categoriseren.
De techniek van een mask over de afbeelding schuiven, noemen we de sliding window approach.
De detector van Dalal and Triggs (2005) werkt via deze methode en maakt gebruik van een enkele
filter gebaseerd op het HOG algoritme. Door aan deze detector een afbeelding te geven, een positie in deze afbeelding en een schaal, kunnen we bepalen of het object tot een bepaalde categorie
8
3 Literatuurstudie
behoort of niet en dit aan de hand van een score. De score kon als volgt berekend worden:
β.φ(x)
(3.2)
Hierbij is β de filter, x is de afbeelding met een specifieke plaats en schaal en φ(x) is een feature
vector.
Felzenszwalb (2010) innoveerde deze techniek door gebruik te maken van een star-structured
part-based model dat voortkomt uit een root filter of hoofdfilter (die vergelijkbaar is met de DallalTriggs filter) met hier bovenop een verzameling van deeltjesfilters en vervormingsmodellen. De
resulterende score in deze techniek is de score van de hoofdfilter opgeteld bij de som van de
maxima van de deeltjesfilters minus een vervormingkost. Deze vervormingskost is de afwijking van
de deeltjes ten opzichte van hun ideale positie.
De score van de hoofdfilter en deeltjesfilter zijn beide het product van een filter, bestaande uit
een set van gewichten, en een subwindow van de afbeelding. Wanneer meerdere delen in een
afbeelding gebruikt worden, noemt men dit een star model zoals te zien op figuur 3.3.
Figuur 3.3: Star Model, (a) Toepassing van enkel de hoofdfilter, (b) Hogere resolutie deeltjes filters en (c)
een spatiaal model als relatie tot de hoofdfilter
Dankzij deze aanpak heeft de techniek nog een veel betere detectiegraad. Indien we zelfs een
combinatie van stermodellen maken, kunnen we deze detecteren en hieraan een andere categorie
toewijzen.
De implementatiemogelijkheden van deze techniek zijn niet zo uitgebreid als andere technieken.
Hoewel dit een sterke techniek is en er reeds enkele implementatiemogelijkheden zijn, is de implementatie niet zo vanzelfsprekend. Mogelijke implementaties bevinden zich op het ccv of het
OpenCV platform.
3 Literatuurstudie
9
Aangezien wij personen willen categoriseren, zal deze techniek al mogelijk in aanmerking komen.
Door zijn sterke detectiegraad en gebruik van vervormingsmodellen, is HOG reeds een goede
kandidaat. Voor de detectie van gezichten is dit een techniek die minder gebruikt wordt.
3.2.3
Local Features with Implicit Shape Model
Deze techniek steunt op 2 principes, namelijk een Codebook of Local Appearances en een Implicit
Shape Model. Het eerste bevat informatie over welke lokale structuren zich kunnen bevinden op
modellen van de te zoeken categorie. Het tweede bepaalt waar op het object deze structuren
mogen voorkomen. Door deze aanpak worden geen expliciete modellen aangemaakt maar wordt
er bepaald of iets toegestaan is. Hierdoor is deze techniek enorm flexibel en zijn er heel wat minder
trainingsmodellen nodig om mogelijke objectvoorkomens aan te leren.
Een ISM voor een bepaalde objectencategorie bevat een verzameling van mogelijke lokale kenmerken die typisch zijn voor de gegeven objectencategorie en een mogelijke verdelingsgraad die
bepaalt waar elk lokaal kenmerk (Code book entry) mag gevonden worden. Een voorwaarde die
gesteld wordt, is dat deze verdelingsgraad onafhankelijk bepaald is voor elke structuur. De tweede
voorwaarde is dat deze verdelingsgraad bepaald is zonder parameters. Hierdoor is dit geen wiskundige verdeling zoals bij vele andere technieken, maar een verdeling die bepaald is door de
training wat veel preciezer is.
De manier waarop het codebook gegenereerd wordt, rust op het werk van Agarwal et al. (2004).
Implementatiemogelijkheden van deze techniek zijn enorm beperkt. Er is weinig tot geen gemakkelijk implementeerbare code beschikbaar.
3.2.4
Local Binary Patterns
Local Binary Patterns, of LBP, is een techniek ontwikkeld door Ojala et al. (2002) en is een zeer
sterke techniek als feature beschrijving. De techniek hierachter maakt gebruik van de grenswaarde
van pixels van een afbeelding in een 3x3 regio. Hierbij wordt de waarde van de centrale pixel als
grenswaarde gebruikt en het resultaat van de vergelijking met deze grenswaarde is een binair getal.
´ staat voor een getal groter of gelijk aan de grenswaarde, een nul voor een waarde kleiner.
Een e´ en
Dit resultaat wordt vervolgens in een reeks omgezet met de rechterbovenhoek van de 3x3 matrix
als start. Een voorbeeld van deze grenswaardetechniek is te zien op figuur 3.4.
Een groot nadeel van deze techniek is de kleine regio waardoor grote structuren in een afbeelding,
wat eerder dominante features zouden zijn, niet voorgesteld zullen worden. Dit kan verholpen
worden door gebruik te maken van grotere regio’s, wat ook door Ojala et al. (2002) bestudeerd is.
Deze uitbreiding maakt gebruik van circulaire regio’s en billineaire interpolatie van de pixelwaarden.
Hiermee is het mogelijk te kiezen hoe groot de straal van de cirkel is en dus hoeveel pixels zich in
de regio bevinden. Ook op figuur 3.4 is hiervan een voorstelling gemaakt.
3.2.5
´
Dollar
´ et al. (2009) maakt gebruik van een combinatie van vorige opgenoemde technieken om
Dollar
zodanig een betere detectiegraad te kunnen garanderen. Eerst zal hij verschillende afbeeldingskanalen berekenen op een zowel lineaire als non-lineaire manier. Een afbeeldingskanaal is een kopie
van de originele afbeelding waarbij de resulterende pixels berekend worden volgens een bepaalde
formule bijvoorbeeld het inverse. Vervolgens komt de extractie van de features aan de beurt. Dit
10
3 Literatuurstudie
Figuur 3.4: Methode van grenswaarden bij LBP en drie uitbreidingen: a) basis LBP, b) circulaire (8,1) regio,
circulaire (8,2) regio en d) circulaire (8,3) regio
gebeurt door gebruik te maken van sommen over lokale rechthoekige regio’s. De features komen
¨
zowel van Haar-like wavelets als lokale histogrammen waarbij alle sommen op de meest efficiente
manier berekend worden via de integral image. Deze features noemen we integral channel features.
Integral channel features combineren de rijkheid en diversiteit aan informatie die te verkrijgen is uit
¨
de afbeeldingskanalen, met de rekenefficientie
die de detectiemehode van Viola and Jones (2001)
biedt. Een voorbeeld van de verschillende kanalen is te zien in figuur 3.5.
´ combinatie van verschillende channels
Figuur 3.5: Dollars
Een combinatie van oudere technieken zal qua detectiegraad en snelheid altijd een verbetering
zijn. Deze techniek lijkt dan ook het meest belovend om een real-time detectie-algoritme te maken
dat personen kan categoriseren. Op basis van deze techniek zijn er slechts weinig bestaande
detectors voor personen of gezichten. We kunnen deze techniek dus gebruiken voor het bepalen
van het geslacht.
´ techniek kent ook verschillende implementatiemogelijkheden. Zo is er een implementatie
Dolars
´ de beste
in ccv en in OpenCV. Beide implementaties zijn enorm sterk maar er kan er maar e´ en
zijn. Het blijkt dat ccv een snellere implementatiemethode is dan OpenCV en de nauwkeurigheid
ligt ook iets wat hoger. Dit zal een doorslaggevende factor zijn.
3.2.6
Support Vector Machines
Support Vector Machines, ofwel SVM, is een algoritme voor het aanleren van patroonclassificatie
dat door Vapnik (1995) bedacht is. Door het uitzetten van de featurevoorstellingen in een tweedimensionaal vlak, is het mogelijk te zoeken naar een lijn die een scheiding maakt tussen de twee
soorten featurevoorstellingen (wanneer we willen classificeren in twee groepen). Uiteraard zijn er
meerdere scheidingslijnen mogelijk, zoals figuur 3.6 voorgesteld is.
3 Literatuurstudie
11
De vraag blijft welke scheidingslijn nu de beste is. We kunnen hier intu¨ıtief een criterium rond
stellen:
Een scheidingslijn is slecht wanneer het zich te kort bij de punten bevindt en dit omdat
bij kleine aanpassing van de feature (of dus van de afbeelding) het object niet juist
geclassificeerd zal worden. De meest optimale scheidingslijn bevindt zich het verst
van alle punten.
Het algoritme zal dus de grootste minimumafstand zoeken tussen de punten van de verschillende
groepen (figuur 3.6). Deze afstand wordt in SVM-termen de margin genoemd.
Figuur 3.6: SVM techniek met a) verschillende mogelijke scheidingslijnen en b) optimale scheidingslijn
Wanneer een nieuwe afbeelding geclassificeerd wordt, zullen we eerst een featurevoorstelling maken en deze dan tegen de SVM testen. Afhankelijk van waar het nieuwe punt komt te liggen,
´ van de aangeleerde categorieen.
¨
behoort deze tot e´ en
3.3
Leeftijdsbepaling
De leeftijd van een persoon in een beeld kunnen we op verschillende manieren bepalen. Enkele
methodes gevonden in de literatuur komen hier aan bod waardoor we in 4.1 kunnen concluderen
welke techniek wij zullen hanteren.
3.3.1
Facial Age Paterns
In de studie van Geng et al. (2006) is er getracht de leeftijd van personen te bepalen door middel
van de AGES (AGing pattErn Subspace) methode. Het basis idee van deze techniek houdt in
dat het ouder worden van personen in bepaalde patronen gegoten kan worden, vooral wanneer
men zich specifiek op het gezicht concentreert. Wanneer deze patronen in een computermodel
ge¨ıntegreerd worden, is het mogelijk om een nog niet geclassificeerd gezicht te projecteren in het
patroon waarmee dit gezicht het best mee gereconstrueerd wordt. De positie in dit patroon bepaalt
dan de leeftijd van dit gezicht.
Eerst zal de evolutie van het ouder worden van personen worden aangeleerd. Figuur 3.7 toont aan
dat men op verschillende stadia van het ouderworden, features extraheert en deze bijhoudt in een
12
3 Literatuurstudie
vector. Deze vector noemt men een subspace. Er zullen verschillende subspaces ontstaan, elk
met hun eigen patroon. Subspaces met gelijkaardige patronen zullen worden samengevoegd tot
´ subspace om de hoeveelheid subspaces te limiteren.
e´ en
Figuur 3.7: Evolutie van het ouder worden
Indien men nu de leeftijd wilt bepalen van een nieuw gezicht, biedt men dit gezicht aan aan eenzelfde feature extractor als in de opstelling van de vector gebruikt is. Om de exacte leeftijd te
kunnen bepalen, zullen twee stappen nodig zijn:
1. Bepaling van het meest bruikbare patroon (subspace)
2. Bepalen van de juiste positie in dit patroon
Het bepalen van het juiste patroon gebeurt via de minimum-reconstructie-fout. Dit is de afwijking
aanwezig bij de reconstructie van het gezicht door middel van waarden van de positie in het patroon. Alleen is deze positie niet gekend en kan deze afwijking dus niet berekend worden. De
enige mogelijkheid om dit probleem op te lossen is om de nieuwe afbeelding op alle mogelijke
posities te plaatsen en hieruit de corresponderende afwijking te berekenen. Vervolgens wordt het
minimum van al deze berekeningen bepaald en dit minimum bepaalt ook onmiddellijk het patroon
en de positie in dit patroon. Uiteindelijk wordt de geassocieerde leeftijd teruggegeven.
De performantie van dit algoritme indien men de Hit Rate bekijkt, ligt veel hoger dan andere technieken. De conclusie van Geng et al. (2006) vertelt ons dan ook dat het een enorm performant
algoritme is ten opzichte van anderen en dat het succes te danken is aan de nieuwe technieken en
¨
ideeen.
3 Literatuurstudie
3.3.2
13
Skin Wrinkle Analysis
Een andere methodiek maakt gebruik van de rimpels op de gezichten van mensen. Kwon and
Lobo (1999) bestudeerden hoe effectief zo’n techniek is. Deze techniek maakt het niet mogelijk om
de exacte leeftijd te bepalen maar wel om de gezichten te classificeren in een leeftijdscategorie.
De techniek heeft twee onderdelen:
1. Zoeken van pimaire features zoals ogen, neus en mond en hiermee ratio’s berekenen voor
¨
het onderscheid tussen de leeftijdscategorieen
2. Zoeken van secundaire features door middel van een geografische map van rimpels en ook
hiermee ratio’s berekenen
Beide ratio’s worden dan samengebracht en getest volgens een bepaalde regel. De conclusie geeft
ons aan tot welke groep het gezicht behoort.
Figuur 3.8: Rimpelmap. Bevat de regio’s waarin naar rimpels gezocht moet worden
De rimpel analyse wordt uitgevoerd door middel van de rimpelkaart zoals te zien is op figuur 3.8.
Op de aangeduide plaatsen zullen er snakelets geplaatst worden en daar gezocht worden naar rimpels. Snakes worden gebruikt als Active Contour Model. Met deze techniek is het de bedoeling de
best mogelijke vorm van een rand aan te nemen, wat is dit geval duidt op een rimpel. Soms kunnen
gewone randdetectiealgoritmes voldoende zijn maar soms is het resultaat waardeloos. Door gebruik te maken van een minimale energie oplossing, is het mogelijk om deze randen nauwkeuriger
te detecteren.
Figuur 3.9 toont aan hoe dit precies gebeurt. Dit probleem wordt opgelost door krachten op de
omlijning toe te passen. In dit voorbeeld is er een kracht op de omlijning van het vliegtuig. Deze
kracht wijst naar het vliegtuig en trekt er dus de lijn naar toe. Zo zal de lijn uiteindelijk mooi het
vliegtuig omsluiten en is de rand (overgang van wit naar zwart in dit voorbeeld) vrij nauwkeurig
gedetecteerd.
3.4
Geslachtsbepaling
In dit deel van de literatuurstudie worden verschillende methodes toegelicht om het geslacht van
een persoon in beeldverwerkende toepassingen te bepalen. In 4.1 zullen we concluderen welke
14
3 Literatuurstudie
Figuur 3.9: Resultaat van edgedetectie door middel van snakes
techniek wij zullen toepassen en waarom.
3.4.1
Local Binary Patterns en Support Vector Machines
Een eerste methode om het geslacht van personen te bepalen is de methode die bestudeerd werd
door Lian and Lu (2006). Hierin is de bepaling van het geslacht afhankelijk van zowel de vorm als
de textuur dat gevonden kan worden in het gezicht van een persoon. Door het gezicht op te delen
¨
in kleinere delen, waarvan dan LBP histogrammen kunnen geextraheerd
worden, is het mogelijk
vectoren op te stellen die gebruikt kunnen worden door support vector machines (SVM’s).
De twee keypoints in het bepalen van het geslacht van een persoon in een afbeelding zijn de feature
extractie en de patroonclassificatie. De feature extractie zal gebeuren op basis van het Local Binary
Patterns algoritme, uitgelegd in 3.2. De resulterende histogrammen bevatten informatie over de
verdeling van lokale patronen zoals randen of egale oppervlakken. De techniek van Lian and Lu
(2006) zorgt eerst voor de bepaling van de positie van de ogen en normaliseert. Hierop het LBPalgoritme uitgevoerd, resulteert in een zogenaamd LBP gezicht zoals te zien in figuur 3.10. Dit
gezicht wordt dan opgedeeld in een rooster en de histogrammen vormen zo een vector dat aan de
gender classifier gegeven kan worden.
Figuur 3.10: LBP methode op gezichten. (a) Preprocessed faces, (b) Bijhorende LBP faces, (c) Bijhorende
5x5 rooster LBP faces
Deze vector wordt vervolgens door de SVM geanalyseerd en hieruit wordt beslist tot welk geslacht
deze vector, of dus het gezicht in beeld, behoort. Deze methode bevat zeer performante technieken
3 Literatuurstudie
15
(LBP en SVM) en tegelijk een hoge detectiegraad van 96.75% op de CASPEAL dataset.
3.4.2
Gender Recognition from Body
Een andere methodiek is het bepalen van het geslacht op het volledige lichaam van de persoon
in beeld. Cao et al. (2008) heeft hiernaar een studie gedaan. Dit was op dat moment de eerste
in zijn soort omdat er een grote natuurlijke variatie is van het menselijk lichaam. Door eerst de
afbeelding op te splitsen in kleinere modellen, kunnen ze kenmerken detecteren die het geslacht
van de persoon kunnen bepalen. Al deze kenmerken worden dan aan een algoritme aangeboden
die van die lichaamsdelen weet bij welk geslacht bepaalde kenmerken horen.
Voor zo’n aanpak is het belangrijk te weten welke karakteristieken belangrijk zijn voor de geslachtsbepaling. Indien deze bekend zijn, moet er bepaald worden hoe een beslissing genomen wordt op
basis van deze karakteristieken. De specifieke eigenschappen worden gedetecteerd door twee
verschillende technieken te combineren: een edgedetectie voor de ruwe vorm en een HOG voorstelling. Deze verschillende technieken op een afbeelding toegepast zijn te zien op figuur 3.11
Figuur 3.11: Voorstelling van de verschillende technieken. (a) originele afbeelding, (b) edge map, (c) Histogram of Oriented Gradients (HOG)
In de conclusie van deze studie is het duidelijk dat deze aanpak een heel hoge nauwkeurigheid
biedt. Toch is er een groot nadeel aan: de pose van de persoon in beeld blijft belangrijk. Een
afwijkende pose kan ervoor zorgen dat de persoon niet gedetecteerd wordt of dat het geslacht
foutief bepaald wordt.
3.5
Platformen en omgevingen
Om ons gehele algoritme uit te kunnen voeren, zullen we beroep moeten doen op software en een
besturingssysteem. In deze paragraaf onderzoeken we welke verschillende softwaremogelijkheden
we hebben en op welk besturingssysteem deze beschikbaar zijn. Deze studie is afhankelijk van de
bestudeerde technieken in 3.2.
Omdat het besturingssysteem voor ons niet de beslissende factor is, beginnen we met het zoeken naar de verschillende softwaremogelijkheden. Enkele bekende programma’s om beeldverwerkende toepassingen te schrijven zijn:
• OpenCV
• Libccv
16
3.5.1
3 Literatuurstudie
OpenCV
´ van de meest gebruikte bibliotheken in de wereld van de computervisie. De reden
OpenCV is e´ en
is heel simpel: vele technieken zijn volledig uitgewerkt in deze bibliotheek en deze is open-source.
Het is dan ook niet bijzonder moeilijk om aan de slag te gaan met dit pakket. Ook dankzij de vele
online documentatie en fora, is het mogelijk om als nieuweling in de computervisie een simpele
detector aan de praat te krijgen. OpenCV gebruikt als programmeertaal C++, een taal die zeker
niet onbekend is bij ons. OpenCV is een bibliotheek die makkelijk aanspreekbaar is en waarover
veel informatie te vinden is, wat zeker een pluspunt is als er problemen optreden.
Wanneer we spreken over vele technieken, zijn dit uiteraard niet alle technieken. Technieken zoals
´ zijn wel te vinden voor OpenCV, maar zitten er niet standaard bij. Technieken zoals
die van Dollar
Viola en Jones (haar-cascade), LBP en HOG zitten dan wel standaard in deze bibliotheek met zelfs
voorgetrainde persoons- en gezichtsdetectoren.
OpenCV is beschikbaar voor zowel Windows, Linux als Mac.
3.5.2
Libccv
Libccv is ook een open-source bibliotheek. Het is een Modern Computer Vision Library dat ons in
staat stelt moderne visie-algoritmes te gebruiken in eigen geschreven software. Deze bibliotheek
bevat minder implementaties dan OpenCV, maar de ge¨ıntegreerde implementaties zijn enorm geoptimaliseerd. Hoewel deze bibliotheek afhankelijk is van andere bibliotheken voor de beste performantie en features, werkt het ook wanneer de algoritmes gewoon in een reeds bestaand project
gebruikt worden.
De schrijvers van de libccv bibliotheek zijn er aich bewust van dat er geen tekort is aan performante
en goede algoritmes, maar eerder aan goede implementaties. Dit is waarvoor libccv echt staat:
extra snelle en goede implementaties in C++ van de nieuwe algoritmes. Omdat libccv een kleiner
project is, is er jammer genoeg ook minder informatie over te vinden. Dit kan leiden tot het vastlopen
van het onderzoek of het aanpassen van onze aanpak.
Libccv is enkel beschikbaar voor Linux.
3.6
Evaluatie
De bedoeling van dit hoofdstuk was onderzoek doen naar reeds bestaande technieken om objecten te detecteren in beelden, technieken om deze detecties te classifceren, welke denkwijzes reeds
uitgeprobeerd zijn om het geslacht en de leeftijd van personen in beelden te bepalen en wat de performantie en nauwkeurigheid van deze methodes is. Ook is bestudeerd welke softwarepakketten
voor handen zijn om beeldverwerkende toepassingen te maken.
We zullen nu al deze kennis bundelen en een vergelijking maken tussen de verschillende bestudeerde technieken en methodes. Hiermee kunnen we in 4 een concreet besluit vormen.
´
Indien we de verschillende technieken uit 3.2 met elkaar vergelijken, steekt de techniek van Dollar
er met kop en schouders bovenuit. Op figuur 3.12 is er een vergelijkende studie getoond tussen de
verschillende besproken technieken. Deze figuur zet de miss-rate uit tegenover de false positives in
een afbeelding. Elke techniek tracht zo weinig mogelijk false positives te behalen, dit zijn namelijk
foutive detecties. Men tracht ook de miss-rate zo laag mogelijk te houden aangezien deze duidt
op het aantal ontbrekende detecties ten opzichte van het totale aantal detecties. Hiermee ligt het
3 Literatuurstudie
17
optimale punt op deze grafieken in 0,0 (linksonder). Op dit punt worden er namelijk geen foutive
detecties uitgevoerd en worden er ook geen te detecteren objecten gemist.
Figuur 3.12: Resultaten van de verschillende technieken op verschillende datasets bij het detecteren van
personen
´ et al. (2009), tonen de resultaten van het detecteren van persoDeze grafieken, gehaald uit Dollar
´ (ChnFltrs)
nen op verschillende datasets. Hieruit is duidelijk te besluiten dat de techniek van Dollar
de beste resultaten boekt.
´
Libccv is de bibliotheek met de meest geoptimaliseerde technieken en ook de de techniek van Dollar
et al. (2009) is hierin ge¨ımplementeerd. Toch zullen we kiezen voor OpenCV omdat dit een bibliotheek is dat reeds verschillende detectoren bevat en waarvan enorm veel documentatie beschik´ et al. (2009) waardoor we zullen
baar is. OpenCV bevat standaard geen implementatie van Dollar
kiezen voor drie technieken die enorm makkelijk te gebruiken zijn in deze bibliotheek: de Haar-,
LBP- en HOG-techniek.
3.7
Conclusie
¨
Om onze conclusie te vormen, keken we naar de mogelijke technieken, hun efficientie
en imple´ de techniek is met de beste performantie, zullen
mentatiemethoden. Hoewel de techniek van Dollar
we ervoor kiezen een studie te maken rond drie andere technieken: Haar, LBP en HOG. Aangezien
OpenCV een sterke documentatie heeft en reeds verschillende detectoren bevat, kiezen we dit als
onze bibliotheek voor het schrijven van ons algoritme. We kunnen nu aan de slag met het opstellen
van een algmene werkwijze, het schrijven van het algoritme en het vergaren van resultaten.
Hoofdstuk 4
Uitwerking
In dit hoofdstuk beschrijven we de volledige uitwerking van deze thesis. In de literatuurstudie in
hoofdstuk 3 hebben we reeds vele technieken en methodieken bestudeerd. We zullen dus eerst
starten met het verduidelijken van de grote lijnen van ons algoritme en dit gebeurd in 4.1. Vervolgens zullen we de verschillende onderdelen van ons algoritme in detail bespreken. We starten
met het opzetten van onze programmeeromgeving en met het preprocessen van de beelden in 4.3.
De beelden zijn dan klaar om aan onze eerste detector gegeven te worden: de persoonsdetector
( 4.4). Indien er personen gedetecteerd worden, zullen deze naar de volgende stap in ons algoritme
gebracht worden: de gezichtendetector ( 4.5). Deze zal eventuele gevonden gezichten doorsturen
naar de geslachtsclassifier( 4.6). De gedetecteerde personen zullen ook gebruikt worden om in de
lengte te bepalen ( 4.7). Al deze informatie wordt dan gebundeld in 4.8: de leeftijdsbepaling.
4.1
Algemene Flow
Vooraleer we kunnen starten met een dieper onderzoek, moeten we vastleggen hoe we ons probleem zullen aanpakken. Er staan namelijk enkele vragen op een antwoord te wachten:
• Hoe verloopt ons algoritme in het algemeen?
• Op welke basis voeren we de leeftijdsbepaling uit?
• Welke techniek willen we gebruiken om het geslacht te bepalen?
4.1.1
Geslachtsbepaling
In de literatuurstudie hebben we gezien dat er verschillende methodes bestaan om het geslacht
´ en
´ van de bestudeerde methodes classificeert op basis van de
van een persoon te bepalen. E
gehele persoon, dus het gehele lichaam. Een nadeel van deze techniek is om zo een detector te
trainen voor onze opstelling, een enorme hoeveelheid aan trainingsvoorbeelden nodig zullen zijn
om de personen te kunnen classificeren in de verschillende posities. Een ander nadeel is dat er
´ keer.
nadien weinig mogelijkheid tot aanpassing is want de detectie en classificatie gebeuren in e´ en
Toevoeging of lichte aanpassing van de features van het programma is dus niet mogelijk.
Wanneer we de andere methode gebruiken, diegene die zijn geslachtsbepaling baseert op het
gezicht, is het mogelijk de verschillende detecties uit elkaar te halen, wat meer ruimte geeft om
19
20
4 Uitwerking
nadien stappen toe te voegen of andere technieken te gebruiken. We kunnen eerst de personen
detecteren in ons beeld en in deze gedetecteerde regio’s zoeken naar gezichten van een bepaald
geslacht. Ook hierin maken we een opsplitsing om te onderzoeken of onze gebruikte techniek
betere prestaties oplevert dan de prestaties van Lian and Lu (2006). Wij zullen in plaats van het
zoeken naar een mannelijk gezicht en een vrouwelijk gezicht, eerst een detectie doen op algemene
gezichten. Wanneer er geen gezicht gevonden is, weten we dat we ook geen geslachtsbepaling
´
zullen kunnen uitvoeren. Wanneer er wel een gezicht gevonden wordt, hoeven we slechts e´ en
detectie uit te voeren, namelijk een mannelijke. Indien deze detector een mannelijk gezicht detecteert, is dit ons resultaat. Indien er geen mannelijk gezicht wordt gedetecteerd, is het resultaat
een vrouw. Door eerst een detectie te doen naar het gezicht, kunnen we dit resultaat nadien nog
gebruiken om andere detecties of classificaties uit te voeren.
De techniek van het achter elkaar plaatsen van detectoren en classifier, heet een cascade. Het
zal ons later de mogelijkheid geven om additionele features aan het algoritme toe te voegen zoals
bijvoorbeeld delen van een persoon detecteren of andere detecties op het gezicht. Dit zorgt voor
een enorm flexibel algoritme en is voor gebruik in de reclame-industrie een belangrijke troef.
4.1.2
Leeftijdsbepaling
Wanneer het gaat over het bepalen van de leeftijd van een persoon, is het zelfs voor ons moeilijk om
dit te doen. Er zijn enkele factoren waarop we ons kunnen baseren, maar de verscheidenheid aan
mensen is enorm. Ook hier hebben we een studie naar gedaan en zijn er ook reeds verschillende
technieken bestudeerd.
De techniek die gebruik maakt van de rimpels, lijkt ons te moeilijk. We zullen namelijk geen gebruik
maken van High Definition camera’s wat het dan zeer moeilijk maakt om een nauwkeurige randdetectie uit te voeren. Een te kort aan details kan ervoor zorgen dat de leeftijdsbepaling volledig
mislukt.
Indien we gebruik willen maken van de evolutie van het ouderworden, vrezen we voor de perfor´ van onze vereisten is een real-time systeem en wanneer we moeten zoeken in tal van
mantie. E´ en
subspaces en leeftijden, zal het onmogelijk zijn om dit nog real-time uit te voeren. Ten tweede heeft
de reclame¨ındustrie geen nood aan een exacte leeftijd. Reclame wordt gemaakt voor leeftijdsgroepen, niet voor specifieke leeftijden. Daarom zullen wij een nog andere methode toepassen.
Onze methode categoriseert de personen in beeld in leeftijdsgroepen afhankelijk van hun lengte.
Door een statistiek te implementeren die de gemiddelde lengte van mannen en vrouwen op bepaalde leeftijden weergeeft, kunnen we afhankelijk van de lengte van de persoon en het geslacht
de persoon indelen in een groep. Het is dus wel nodig om eerst het geslacht en de lengte te
bepalen alvorens we de persoon kunnen classificeren in een leeftijdsgroep.
4.1.3
Conclusie
Onze drie vragen kunnen we nu beantwoorden. Onze eerste vraag over hoe het algoritme in
het algemeen verloopt, kunnen we beantwoorden met de cascademethodiek en dit wegens de
flexibiliteit.
Onze tweede vraag ging over de leeftijdsbepaling. Daar we er niet vanuit gaan dat onze camera
hogekwaliteitsbeelden levert, lijkt het ons veiliger om te werken met de lengte van de persoon. We
zullen hier dieper op ingaan in 4.7.
De derde vraag betreft het bepalen van het geslacht van een persoon. Volgens onze studie is het
4 Uitwerking
21
aangewezen om in plaats van de gehele persoon te gebruiken als basis voor het geslacht, enkel
het gezicht te benutten. Indien dit niet voldoende is, kunnen we nog extra detecties of classificaties
uitvoeren aangezien dit mogelijk is met de cascade van detectoren.
Onze algemene flow is nu opgesteld zoals we op figuur 4.1 kunnen zien. Figuur 4.2 geeft een
grafische voorstelling weer van hoe de drie detectoren de informatie aan elkaar zullen doorgeven.
We kunnen nu aan de slag gaan met het programmeren van het algoritme.
Figuur 4.1: Flow van het algoritme
Figuur 4.2: Grafische voorstelling van de detectoren in het algoritme met a) persoonsdetectie, b) gezichtsdetectie en c) geslachtsbepaling
4.2
Programmeeromgeving
Uit onze literatuurstudie kunnen we concluderen dat we het best OpenCV kunnen gebruiken ten
opzichte van libccv. Aangezien het besturingssysteem voor ons niet belangrijk is, hebben we besloten Linux te gebruiken. Deze linuxomgeving is Ubuntu 12.04 LTS(Long Term Support).
22
4.3
4 Uitwerking
Voorbereiding van de beelden
Om onze classificatie doeltreffend te maken, is het noodzakelijk ervoor te zorgen dat de beelden
die we gebruiken zich in een zo goed mogelijke staat bevinden. Daarom zullen we eerst enkele
stappen doorlopen om de beelden klaar te maken voor onze eerste detector.
De meeste cascadedetectoren houden geen rekening met de kleur van de beelden. Daarom is het
dus ook niet nodig deze informatie bij te houden. De eerste stap is dus de kleurenafbeelding om
te vormen naar een afbeelding met grijswaarden. De informatie die we verliezen betekent hier niet
dat we een slechtere detectie zullen maken. Het heeft zelfs het voordeel dat we geen tijd verliezen
met het bijhouden van deze informatie.
De tweede voorbereidende stap in ons algoritme is de histogram-equalisation. Het histogram van
een afbeelding geeft de verdeling van de intensiteit weer. Het telt het aantal pixels die een bepaalde
intensiteit hebben en zet deze uit in een histogram zoals in figuur 4.3. Om het contrast van een een
afbeelding te verbeteren, kan men de waarden van dit histogram proberen gelijk te trekken door
bepaalde pixelintensiteiten te verschuiven naar plaatsen van minder gebruikte intensiteiten zoals
aangeduid met de groene cirkels op 4.4. Deze figuur geeft ook het resultaat van deze bewerking:
een afbeelding met een hoger contrast.
Figuur 4.3: Histogram van een afbeelding
Figuur 4.4: Histogram equalization
Nu onze beelden klaar zijn voor verdere verwerking, kunnen we overgaan naar de detectie van de
personen.
4 Uitwerking
4.4
23
Persoonsdetectie
Om de geslachts- en leeftijdsbepaling te kunnen uitvoeren van voorbijgangers, is het noodzakelijk
eerst de voorbijgangers zelf te detecteren. De reden dat we de volledige persoon wensen te detecteren, komt van het feit dat we de leeftijdsbepaling willen uitvoeren op basis van de lengte van
de persoon en omdat we een enorm flexibel programma willen bouwen. Gelukkig bestaan er reeds
tal van persoonsdetectoren, ofwel pedestrian detectors, waarvan we enkele met elkaar zullen vergelijken. Een van de meest voorkomende soorten is diegene gebaseerd op de haar-wavelets. Een
andere techniek is HOG. In OpenCV zit reeds een persoonsdetector gebaseerd op een cascade
techniek.
¨
In OpenCV kunnen we aan de cascade detectoren vier parameters meegeven om hun efficientie
te verbeteren:
1. Vergrotingsfactor
2. Aantal overlappingen
3. Minimum grootte
4. Maximum grootte
De vergrotingsfactor bepaalt de verschillende schalen waarop gezocht wordt naar het object (in ons
geval een persoon). Een vergrotingsfactor van 1,1 zal elke keer als de volledige foto overlopen is,
de schaal vergroten met 10% en terug zoeken naar het object. Hoe kleiner de vergroting, op hoe
meer schalen er gezocht zal worden naar personen en dus hoe nauwkeuriger het resultaat zal zijn
maar ook hoe langer het proces zal duren.
Het aantal overlappingen bepaalt hoeveel er nodig zijn vooraleer de detectie een effectief resultaat
oplevert. Wanneer de detector ingesteld is op 8 overlappingen, zal op 8 verschillende schalen
op dezelfde plaats een detectie moeten gedaan worden vooraleer deze regio als een effectieve
detectie wordt aanschouwd.
De minimum en maximum grootte bepalen de extreemste waarden van de schaal waarop detecties
zullen uitgevoerd worden. Deze parameters kunnen enorme snelheidsoptimalisaties voortbrengen
wanneer deze ingevuld worden. Uiteraard is dit alleen mogelijk wanneer de toepassing dit toelaat.
In ons geval kunnen we van deze parameters gebruik maken.
4.4.1
Haar
De Haar-detector is een detector die standaard bij OpenCV zit. Het is een veelgebruikte persoonsdetector die, indien de parameters correct zijn ingesteld, goede resultaten oplevert. Het grote
nadeel aan de haar-detectoren is hun snelheid en dit is ook te merken wanneer we proberen realtime personen te detecteren. Wanneer we een schalingsfactor van 1,1 en een overlap van 10
toepassen, loopt het hele systeem traag. Enkel wanneer we de schalingsfactor genoeg vergroten
(1,2 tot 1,3), is het mogelijk detecties real-time uit te voeren.
4.4.2
HOG
Ook de HOG-detector zit bij OpenCV. Hierbij geldt dezelfde regel: bij een goede parameterinstelling
zal deze detector goed presteren. Deze detector maakt het mogelijk om de personen real-time te
24
4 Uitwerking
detecteren vanwege zijn goede verwerkingssnelheid. De meest optimale parameters zijn uiteraard
afhankelijk van de situatie maar in onze opstelling voor de HOG-detector zijn deze de volgende:
Schalingsfactor: 1.1
Overlap: 20
Minimum grootte: 100 x 100
Maximum grootte: 30 pixels minder dan de gebruikte afbeelding
4.4.3
Evaluatie
Beide technieken leveren resultaten op die te gebruiken zijn hoewel de Haar-detector de real-time
vereiste in gevaar kan brengen. De nauwkeurigheid van de detecties is enorm afhankelijk van de
schalingsfactor en aangezien de Haar-detector het systeem vertraagt bij nauwkeurige detecties,
zullen we deze niet gebruiken om personen te detecteren in onze afbeeldingen. Zoals in figuur 4.5
te zien is, hebben we een rode kader rond de detecties getekend voor een goede visualisatie en
wordt er ook aangetoont dat er regio’s foutief gedetecteerd worden. Dit kunnen we wegwerken
door de parameters aan te passen, of pas in een latere stap de visualisatie te maken wanneer we
zeker zijn dat dit een persoon is die we kunnen classificeren.
Om in de volgende stappen van ons algoritme een snelheidswinst te bekomen, zullen we de gedetecteerde personen uit de afbeelding halen en zullen we enkel de persoon doorgeven aan de
gezichtsdetector. Hiermee hoeft de gezichtsdetector niet over de gehele afbeelding te zoeken,
maar enkel over de persoon. Een nog eventuele aanpassing is slechts het bovenste deel van de
persoon door te geven, aangezien zich in het onderste deel geen gezichten bevinden.
We hebben ook voor een extra marge rondom de detectie gezorgd. Hiermee bedoelen we dat
we de eigenlijke detectie vergroot hebben met 60 pixels in hoogte (30 pixels onderaan en 30 pixels
bovenaan). Dit omdat de persoonsdetectie niet altijd even nauwkeurig is en niet steeds de volledige
persoon detecteert. Bij de lengtebepaling moeten we er zeker van zijn dat we de volledige persoon
doorsturen en dankzij deze marge is dit het geval.
4.4.4
Besluit
Beide technieken leveren goede resultaten op indien de parameters correct worden ingesteld maar
wij zullen de HOG-detector gebruiken omdat we de toepassing real-time willen uitvoeren. Ter
visualisatie van deze detectie wordt er een rode kader rond het gedetecteerde gebied getekend.
¨
Dit gebied wordt vervolgens gekopieerd
naar een nieuwe afbeelding die gebruikt zal worden door
de volgende detector. Nu we onze persoon hebben gedetecteerd, kunnen we doorgaan naar de
volgende stap in het algoritme: de gezichtsdetectie.
4.5
Gezichtsdetectie
Dankzij de pedestrian-detector van OpenCV hebben we nu onze persoon uit het beeld kunnen
halen. Uit onze studie hebben we besloten dat we eerst het gezicht van deze persoon willen lokaliseren vooraleer we het geslacht bepalen van de persoon in kwestie. Uiteraard moet het gezicht
van de persoon in de richting van de camera kijken. In OpenCV zit reeds een gezichtsdetector en
in dit onderdeel zullen we enkele testen uitvoeren.
4 Uitwerking
25
Figuur 4.5: Visualisatie van de persoonsdetectie met rechts de uitgeknipte persoon
4.5.1
Haar
Een beschrijving van de op de Haar gebaseerde techniek is ook terug te vinden in de bibliotheek
van OpenCV. We gebruiken deze detector voor het detecteren van de gezichten. Ook hier zijn
dezelfde parameters beschikbaar als bij 4.4.
Omdat de dimensies van de doorgestuurde persoon meestal veel kleiner zijn dan de volledige
afbeelding, kunnen we hier enorm nauwkeurig werken. Er zijn namelijk veel minder schalen mogelijk waarop een gezicht te detecteren valt. Daarom hebben we dan ook de schalingsfactor 1,05
gemaakt omdat dit ons de beste resultaten opleverde. Het aantal overlappingen hebben we gehouden op 5 en dit om ervoor te zorgen dat we het gezicht, indien het minder duidelijk is, toch kunnen
detecteren. De maximale grootte is vastgelegd omdat we trachtten een snelheidsverbetering te
bereiken. Aangezien het gezicht slechts een klein deel van de persoon is, kunnen we de maximale
grootte op 30% van de uitgeknipte persoon houden.
Schalingsfactor: 1.05
Overlap: 5
Minimum grootte: kleinst mogelijke
Maximum grootte: 30 pixels kleiner dan de uitgeknipte persoon
4.5.2
LBP
Ook een LBP-gezichtsdetector is aanwezig in OpenCV. Hierbij hebben we dezelfde parameterinstellingen gebruikt als bij de Haar-detector.
26
4.5.3
4 Uitwerking
Evaluatie
De gezichtsdetector is een vrij stabiele en nauwkeurige detector. Ook hier is er een groot verschil
in snelheid tussen Haar en LBP. De Haar-detector doet het met deze parameters bijzonder slecht in
snelheid, maar detecteert bijna alle gezichten. De LBP-detector presteert met dezelfde parameters
veel beter in snelheid, maar detecteert niet alle gezichten. We maken natuurlijk gebruik van zeer
nauwkeurige detecties (vele schalingen) omdat het gezicht ook in vele maten kan voorkomen.
We kunnen wel een optimalisatie toepassen door in plaats van de gehele persoon, enkel het bovenste deel van het lichaam door te sturen naar de gezichtsdetector. Hiermee verkleinen we nogmaals
de oppervlakte wat vooral voor de Haar-detector een verbetering is. De afbeelding van de gehele
persoon hebben we nog steeds nodig bij het bepalen van de lengte.
Zoals bij de persoonsdetectie hebben we hier ook gezorgd voor een extra marge rondom het gedetecteerd gezicht. We doen dit om een betere detectiegraad te bereiken met de geslachtsdetector.
We nemen hier een extra marge ter grootte van 30 pixels in hoogte en breedte.
Figuur 4.6: Visualisatie van de gezichtsdetectie met rechts het uitgeknipte gezicht
4.5.4
Besluit
We kunnen besluiten dat indien we onze vereisten willen halen, we beroep kunnen doen op de zowel de Haar- als de LBP-gezichtsdetector aangezien deze met zeer nauwkeurige parameters, snel
resultaat opleveren. In het geval van de Haar-detector is het wel noodzakelijk enkel het bovenste
deel van het lichaam te gebruiken omdat anders de verwerking niet real-time gebeurt. Wanneer
de gezichtsdetector een detectie maakt, weten we dat we verder kunnen gaan met het algoritme.
Wanneer dit niet het geval is, kunnen we dan ook de rest van ons algoritme overslaan aangezien
we dan niet voldoende informatie verzameld hebben om zowel het geslacht als de leeftijd te bepalen. We zouden wel de lengte van de persoon kunnen bepalen maar dit heeft geen nut. We kunnen
nu doorgaan naar de volgende stap in ons algoritme: de geslachtsdetectie.
4 Uitwerking
4.6
27
Geslachtsclassificatie
In dit onderdeel van de uitwerking zullen we een aantal testen uitvoeren en werkwijzen uitproberen
om het geslacht van een persoon op basis van zijn gezicht te bepalen.
4.6.1
Datasets
Wanneer we een detector of een classifier willen trainen, is het noodzakelijk een verzameling te
hebben van de objecten die we willen detecteren of classificeren. We noemen dit een dataset.
We zouden zelf een dataset kunnen samenstellen maar hiervoor hebben we enkele honderden
proefpersonen nodig wat we niet ter beschikking hebben.
Daarom zullen we beroep doen op verschillende instanties die dergelijke datasets aanbieden. In
onze training zullen we gebruik maken van volgende datasets:
• Labeled Faces in the Wild
• De BioID Face Database V1.2 (1507 frontale foto’s, 963 mannelijk)
• De Colorferet dataset (2722 frontale foto’s, 1715 mannelijk)
Dit wil zeggen dat delen van het onderzoek in deze thesis gebruik maken van de FERET database
van afbeeldingen van gezichten verzameld onder het FERET programma, gesponsord door de
DOD Counterdrug Technology Development Program Office.
4.6.2
Cascade training
Met deze datasets kunnen we nu onze algoritme trainen. We voeren de training in OpenCV uit via
de cascade methode die OpenCV ons biedt.
Om de training te starten, moeten we OpenCV laten weten wat de positieve en wat de negatieve
afbeeldingen zijn. De positieve afbeeldingen zijn in deze studie de mannengezichten en dit zijn
de gezichten die we wensen te detecteren. De negatieve zijn gezichten van vrouwen aangezien
deze niet gedetecteerd moeten worden. Deze aanpak is mogelijk omdat we reeds weten of er een
gezicht aanwezig is of niet. Wanneer dit gezicht geen mannengezicht is, moet het wel een vrouwengezicht zijn. We hoeven ook geen andere objecten toe te voegen bij de negatieve afbeeldigen
omdat we geen ander object zullen doorgeven aan de geslachtsdetector.
De verschillende datasets hebben we zelf gelabeld in mannen- en vrouwengezichten. De verschillende detectoren zijn getraind met:
• Posturen van mannen (hoofd tot schouders) vanuit de labeled faces in the wild dataset
• Zelf geannoteerde hoofden van mannen vanuit de labeled faces in the wild dataset
• Zelf geannoteerde hoofden van mannen uit de BioID Face dataset
• Gezichten van mannen door de facedetector geannoteerd vanuit de Color FERET dataset
• Gezichten van mannen door de facedetector geannoteerd vanuit de FERET en de BioID
datasets
28
4 Uitwerking
• Gezichten van mannen door de facedetector geannoteerd vanuit de FERET, BioID en LFW
datasets
Deze trainingen zullen gebeuren op basis van drie verschillende methodes:
• Haar
• LBP
• HOG
Al deze trainingen werden uitgevoerd met dezelfde parameters. Hierbij werd het aantal stages op
de standaard (20) gehouden en de grootte van de positieve afbeeldingen was steeds 24 op 24
pixels (dit was niet het geval voor de zelf geannoteerde trainingen aangezien de verhoudingen van
de hoogte en de breedte anders lagen). Het aantal positieve afbeeldingen hebben we gelijkgesteld
aan 85% van ons totaal aantal positieve afbeeldingen en dit om een aantal reserve afbeeldingen
over te houden voor het trainingsalgoritme. Alle andere parameters hebben hun standaardwaarde
behouden.
4.6.3
Evaluatie
De training is pas effectief wanneer we enkel de gezichten van de mannen gebruiken die door de
facedetector gedetecteerd zijn. De posturen geven alles behalve succesvolle detecties, alsook de
zelfgeannoteerde. De oorzaak van dit resultaat is te wijten aan het aantal positieve afbeeldingen
die aangeboden zijn aan de training.
Er is weinig verschil in detectiegraad tussen de Haar en de LBP technieken maar de tijd nodig
om een detector te trainen via de Haar-techniek is enkele malen groter dan op basis van de LBPtechniek. Zo duurde het voor de haar-techniek bij de voorlaatste training maar liefst 4 uur en 32
minuten terwijl de LBP-techniek de training afrondde in een 4-tal minuten. Ook de HOG-training
verliep bijzonder traag (5 uur en 29 minuten).
4.6.4
Besluit
Het is mogelijk om met OpenCV verschillende detectoren te trainen die steunen op verschillende
technieken. Het resultaat van deze trainingen is afhankelijk van de aangeboden afbeeldingen. De
trainingsduur is afhankelijk van de gebruikte techniek.
4.7
Lengtebepaling
We hebben een persoon en een gezicht in de afbeelding gevonden en we hebben ook het geslacht
van deze persoon kunnen bepalen. Nu is het de beurt aan de lengtebepaling.
4.7.1
´ en
´ camera
E
´ camera mogen gebruiken. Dit zorgt voor een moeiIn onze vereisten staat er dat we slechts e´ en
lijkheid want de wereld waarin wij leven is drie-dimensionaal en een camera kan slechts twee van
deze dimensies vastleggen. Wanneer de camera zich dus aan het bord bevindt, is de afstand tot
4 Uitwerking
29
de persoon (de diepte) onbekend. We zullen nu een methode verduidelijken waarmee we toch in
staat zijn deze afstand te berekenen om hiermee de werkelijke lengte van een persoon te bepalen.
Figuur 4.7: Parameters nodig voor de lengtebepaling
Figuur 4.8: Camerastandpunt bij lengtebepaling
Wanneer een object zich verder van de camera bevindt, zal het object kleiner voorgesteld worden
op het beeld. De diepte is dus een belangrijke factor. De afstand van de camera tot het punt
waar het beeld begint, noemen we de beginafstand. In deze studie nemen we dan wel aan dat dit
punt dan ook direct de ondergrond is. Als we ook weten wat de afstand tot de camera is op het
verste punt van de ondergrond, en we weten wat de pixelhoogte op het beeld hiervan is, kunnen we
´ pixel in het beeld voorstelt. Deze berekening gaat als volgt:
berekenen hoeveel cm in diepte e´ en
fdiepte =
deind − dbegin
yeind
(4.1)
Hierin is deind de afstand van de camera tot het einde van de ondergrond, dbegin de afstand van
¨
de camera tot de onderkant van het beeld en yeind de y-coordinaat
van pixel waar de ondergrond
op het beeld stopt. Dit kan bijvoorbeeld de horizon zijn. Wanneer de onderkant van het beeld
¨
van de camera nog niet de ondergrond voorstelt, zal ook de y-coordinaat
van het begin van de
30
4 Uitwerking
ondergrond in rekening gebracht moeten worden. Hieruit volgt dat deze beide pixelhoogtes van
elkaar afgetrokken zullen worden.
fdiepte =
deind − dbegin
yeind − ybegin
(4.2)
Het resultaat van deze bewerking zullen we de dieptefactor noemen. We kunnen nu de afstand
bepalen van de persoon tot aan de camera door de pixelhoogte van het onderste punt van de
persoon in beeld te vermenigvuldigen met deze dieptefactor en hier de beginafstand bij te tellen.
Het resultaat geeft ons de diepte in cm.
d pers = dbegin + ( fdiepte · yvoet )
(4.3)
¨
yvoet is de y-coordinaat
van de pixelpositie van de voet van de persoon. Een specifiek kenmerk
aan een normale camera is het feit dat wanneer een persoon op een bepaalde afstand een zekere
grootte heeft, dan zal deze grootte op het beeld twee keer verkleinen wanneer deze persoon dubbel
zo ver gaat staan. Dit moet ook in rekening gebracht worden en we zullen dit de cameraconstante
noemen. Deze constante volgt uit volgende vergelijking:
ctecam =
d pers · h pers,pixels
h pers,werk
(4.4)
met de d pers de afstand tot het object in werkelijkheid, h pers,pixel de hoogte in pixels van het object
op deze afstand en h pers,werk de werkelijke hoogte van het object.
Alle factoren van de camera zijn nu gevonden en we zijn nu instaat om de lengte van een persoon
te bepalen wanneer de persoon volledig in beeld is en op de grond staat:
l pers =
d pers · h pers,pixels (dbegin + ( fdiepte · yvoet )) · h pers,pixels
=
ctecam
ctecam
(4.5)
Uiteraard is het noodzakelijk dat het algoritme weet wat de afstanden en pixelhoogtes zijn. Deze
waardes staan hard gecodeerd maar zoals uitgelegd in het volgende onderdeel, is het mogelijk
deze waardes aan te passen. De hard gecodeerde waardes corresponderen met een camerahoogte van 120 cm en een hoek van 20 graden.
In ons algoritme bepalen we de hoogte van de persoon in pixels door middel van de hoogte van de
persoonsdetectie. Dit is een vrij ruwe schatting omdat de persoonsdetector nogal onstabiel is.
4.7.2
Kalibratie
Toen we startte met het uittesten van dit onderdeel van het algoritme, kwamen we al snel tot het
besluit dat de camera wel eens van plaats wisselt. Omdat het nogal eens voorkomt dat de camera
op moeilijke posities komt te staan en we dus niet altijd de mogelijkheid hebben om de hoogte en
de hoek juist te krijgen, hebben we besloten om een kalibratiefunctie te schrijven. Met de optie
’-calibrate’ kan de camera gekalibreerd worden afhankelijk van de situatie waarin hij staat. Deze
functie vraagt de gebruiker om enkele waarden:
• De afstand van het beginpunt van de ondergrond in beeld tot de camera (in cm)
• De afstand van het eindpunt van de ondergrond in beeld tot de camera (in cm)
4 Uitwerking
31
• Pixelhoogte van het beginpunt van de ondergrond
• Pixelhoogte van het eindpunt van de ondergrond
Om deze laatste twee waarden te verkrijgen, wordt er op het scherm het huidige beeld getoond.
Er moet vervolgens op het beginpunt en het eindpunt van de ondergrond geklikt worden en de rest
wordt verwerkt door de functie zelf. We gaan er wel vanuit dat de verhouding tussen de werkelijke
grootte en de afgebeelde grootte in functie van de diepte, constant is.
4.8
Leeftijdsbepaling
We hebben uitgelegd hoe we het geslacht en de lengte van een persoon kunnen bepalen en door
middel van deze twee factoren kunnen we een schatting van de leeftijd uitvoeren. We zullen beroep
doen op verschillende statistieken (figuur 4.9 en 4.10) omtrent de gemiddelde lengte per geslacht
en per leeftijd. We zullen geen exacte waarde berekenen, aangezien deze niet significant zijn,
¨
maar we zullen gebruikmaken van drie leeftijdscategorieen:
1. Personen tot en met een leeftijd van 6 jaar
2. Personen tussen 6 jaar en 12 jaar
3. Personen ouder dan 12 jaar
¨ ligt aan het feit dat de lengte naarmate de
De reden dat we kiezen voor deze drie categorieen
persoon verouderd, kleiner wordt. Om deze persoon dan in te kunnen delen in een andere categorie, bijvoorbeeld 50+, zullen we beroep moeten doen op nog andere kenmerken dan enkel de
lengte. Van Loghum (1998) geeft enkele grafieken (figuren 4.9 en 4.10) weer waarop we kunnen
zien wat de gemiddelde lengtes zijn van mannen en vrouwen tot 21 jaar. Hieruit halen we dat de
gemiddelde mannelijk persoon van 6 jaar 120,1 cm groot is, een vrouwelijk persoon van dezelfde
leeftijd is 118,7 cm groot. Een gemiddelde mannelijke persoon van 12 jaar is 154 cm groot en
een vrouwelijk persoon van deze leeftijd is 155,3 cm groot. Op basis van deze waarden zullen we
een indeling maken en hieruit blijkt ook dat we dus eerst het geslacht en de lengte zullen moeten
bepalen vooraleer we een leeftijd kunnen toekennen.
De toekenning van de leeftijdscategorie is eenvoudig. Als we het geslacht en de lengte hebben
bepaald, kunnen we de lengte vergelijken met de gemiddelde lengtes per geslacht. Wanneer deze
lengte 10% groter is dan die van een 6 jarige, behoort deze tot de eerste categorie (0 tot 6 jaar).
Wanneer de lengte groter is dan 10% van de lengte van een 12 jarige, dan behoort de persoon tot
de derde categorie. In het andere geval behoort deze persoon tot de tweede categorie.
32
4 Uitwerking
Figuur 4.9: Groeicurve van jongens
Figuur 4.10: Groeicurve van meisjes
Hoofdstuk 5
Resultaten
5.1
Algemene performantie
´ en
´ van de belangrijkste vereisten van ons programma is het real-time kunnen classificeren. WanE
neer we het volledige programma zijn werk laten doen, is dit systeem volledig real-time gebruik
makend van een webcam en een computer. Het systeem heeft geen moeilijkheden met het classificeren van meerdere personen in beeld, althans wanneer de parameters correct worden ingevuld.
Wanneer de schalingsfactor van de personendetector enorm laag ingesteld wordt, zal het voor het
systeem niet mogelijk zijn de verwerking real-time uit te voeren.
5.2
Nauwkeurigheid
De nauwkeurigheid van een detectiesysteem kunnen we bepalen door de detecties onder te verdelen. We kunnen deze opdelen in:
True positives (TP): is het aantal correct gedetecteerde objecten
False positives (FP): is het aantal incorrect gedetecteerde objecten
False negatives (FN): is het aantal niet gedetecteerde objecten
Met deze waarden kunnen we de precision en de recall van een detectiesysteem als volgt berekenen:
TP
T P + FP
TP
Recall =
T P + FN
Precision =
(5.1)
(5.2)
Precision staat voor het aantal correcte detecties ten opzichte van het totale aantal detecties. De
recall staat voor het aantal correcte detecties ten opzichte van het aantal relevante detecties waarbij
de relevante detecties ook de niet gedetecteerde objecten bevatten.
Omdat we zelf een geslachtsdetector getraind hebben, zullen we ook enkel hiervan de nauwkeurigheid bepalen. We hebben drie detectoren, werkende op een andere principe (Haar, LBP en
HOG), laten trainen op dezelfde afbeeldingen. Deze afbeeldingen zijn de verzameling van drie
33
34
5 Resultaten
verschillende datasets (Labeled Faces in the Wild, BioID Face Database en Color FERET dataset).
In totaal bevat deze verzameling 2642 positieve en 1438 negatieve afbeeldingen. De positieve afbeeldingen zijn bewerkt door middel van een gezichtsdetector zodat enkel het gezicht overblijft. De
negatieve afbeeldingen zijn onbewerkt.
Om nu de precision en recall waarden te berekenen, maken we gebruik van een vierde dataset:
de PICS dataset (Psychological Image Collection at Sterling). Hierop worden de drie detectoren
getest en hieronder vindt u de resultaten:
Haar: Precision: 82.7%, recall: 92.2%
LBP: Precision: 80.9%, recall: 94.3%
HOG: Precision: 93.3%, recall: 46.6%
Er is weinig verschil tussen de Haar- en de LBP-techniek wanneer men naar de resultaten kijkt
op statische afbeeldingen, maar zoals we reeds ontdekt hebben bij de persoonsdetectie, zal de
snelheid van verwerken van real-time afbeeldingen bij de LBP-detector veel hoger liggen. Ook de
trainingsduur van de LBP-detector ligt veel lager. Het is duidelijk dat de HOG-techniek geen goede
techniek is om geslachtsclassificaties te maken op basis van het gezicht.
Hoewel het geslacht van een persoon meestal correct is, is in sommige posities en bij sommige
personen de detectie verkeerd. Wanneer de detector nog beter getraind wordt, zal dit zeker de
resultaten verbeteren. Het verkeerd detecteren van het geslacht in sommige posities is op figuur 5.1
te zien.
Figuur 5.1: Foutive geslachtsdetectie
De nauwkeurigheid van de lengtebepaling in ons algoritme is enorm afhankelijk van de stabiliteit en
nauwkeurigheid van de persoonsdetector. De lengtebepaling gebeurd puur op de verkregen afmetingen van de persoonsdetector. Wanneer deze instabiel is, zal de lengte ook instabiel zijn. Indien
we een gemiddelde bepalen, komt de berekende lengte wel overeen met de werkelijke lengte. De
5 Resultaten
35
volledige categorisatie heeft hier niet veel problemen mee, behalve wanneer de schommelingen
zich net rond een kantelpunt bevinden. 5.2 en 5.3 zijn voorbeelden van de lengtebepaling in ons
algoritme. Hierop is het ook duidelijk dat de lengte schommelt, maar geen extreme waarden kent.
Figuur 5.2: Lengte- en leeftijdsbepaling van een jongen
Figuur 5.3: Lengte- en leeftijdsbepaling van een man
5.3
Totale algoritme
Het totale algoritme kunnen we enkel testen met voldoende beeldmateriaal. De verschillende testen die we uitgevoerd hebben, leverden ons vrij nauwkeurige resultaten op zoals in figuren 5.4
en 5.5 te zien is. Meestal worden de personen goed gedetecteerd, ook de gezichten en het geslacht. De lengte is onstabiel vanwege de onstabiele persoonsdetectie.
Toch zijn er enkele verkeerde detecties. Omdat alle gebruikte detectoren foutieve detecties kunnen
opleveren, zullen er ook in het eindresultaat fouten zitten. Soms wordt er een gezicht gedetecteerd
waar er helemaal geen gezicht aanwezig is. Onze aanpak zorgt ervoor dat dit in de meeste gevallen
wordt aanschouwd als een vrouw. Dit kan opgelost worden door naast de mannendetector, ook een
´ van deze detectoren
vrouwendetector te trainen. Het gezicht wordt dan eerst aangeboden aan e´ en
en indien deze geen detectie oplevert, wordt het gezicht opnieuw aangeboden aan de andere
detector. Hierdoor is het mogelijk foutieve gezichtsdetecties uit te sluiten.
36
5 Resultaten
Figuur 5.4: Resultaat van het algoritme op een man
Figuur 5.5: Resultaat van het algoritme op een vrouw
Hoofdstuk 6
Besluit
Het doel van deze thesis was het ontwikkelen van een programma voor de reclame-industrie dat
hen in staat stelt om personen te categoriseren op basis van hun leeftijd en geslacht. Dit heeft als
doel reclame te kunnen weergeven die nuttig is voor de doelgroep die momenteel bij het elektronisch reclamebord aanwezig is.
In onze literatuurstudie hebben we verschillende technieken bestudeerd. Hieruit hebben we con´ camera,
clusies gemaakt en wel zodanig dat onze vereisten, een real-time systeem met slechts e´ en
bereikt kunnen worden. We kwamen tot het besluit een cascade techniek te gebruiken omdat deze
enorme flexibiliteit geeft aan het totale pakket. We hebben vervolgens het algoritme in zes delen
opgedeeld: preprocessing, persoonsdetectie, gezichtsdetectie, geslachtsdetectie, lengtebepaling
en leeftijdsbepaling. Deze zes onderdelen hebben we volledig uitgewerkt in hoofdstuk 4 en hierbij
¨
zijn ook steeds de verschillende onderdelen geevalueerd.
De resultaten van het totale programma zijn in hoofdstuk 5 te vinden. Hieruit kunnen we besluiten dat onze vereisten bereikt zijn. We kunnen namelijk personen detecteren in een afbeelding
en deze categoriseren op basis van hun leeftijd en geslacht. We doen dit aan de hand van een
HOG-persoonsdetector die zijn informatie doorgeeft aan de LBP-gezichtsdetector. Wanneer een
gezicht gedetecteerd wordt, zal dit doorgegeven worden aan de Haar- of LBP-geslachtsdetector.
De lengte van de persoon wordt na de geslachtsdetector bepaald en dit resultaat samen met het
geslacht wordt gekoppeld aan een leeftijd. Dit categoriseren is mogelijk op videomateriaal en dit
´ camera en het programma is zovolledig in real-time. De categorisatie gebeurd slechts via e´ en
danig geprogrammeerd dat het mogelijk is voor de gebruiker om, door middel van verschillende
parameters, het programma aan te passen naar zijn wensen. Er wordt de mogelijkheid geboden
om verschillende trainingsmodellen te gebruiken en parameters voor het gebruik van deze modellen aan te passen. Het is wel noodzakelijk voor het programma dat de personen waarvan leeftijd en
geslacht bepaald moet worden, hun gezicht vrijwel frontaal in beeld komt. Ook is het enkel moge¨ te bepalen. Wanneer er onderscheid gemaakt moet worden
lijk om specifieke leeftijdscategorieen
¨ zullen extra detectiestappen kunnen toegevoegd worden. Om de
tussen meerdere categorieen,
nauwkeurigheid van het systeem te verhogen, lijkt het ons verstandig de geslachtsdetector te ver´ daarvan zoekt naar mannelijke gezichten en de andere
vangen door twee aparte detectoren. E´ en
naar vrouwelijke. Hiermee kunnen we foutieve detecties van de gezichtsdetector wegfilteren.
Het resultaat mag er zijn. Personen in beeld worden gedetecteerd en gecategoriseerd op basis
van hun geslacht en hun leeftijd en dit in real-time.
37
38
6.1
6 Besluit
Toekomstig werk
Ons programma is uitgewerkt met het gebruik van het gezicht van een persoon om het geslacht te
bepalen. Het lijkt ons zeker mogelijk om altijd het geslacht te kunnen bepalen indien er gebruik gemaakt wordt van het volledige lichaam of kenmerken van het lichaam. Deze verschillende detecties
zouden dan samengebracht kunnen worden en het resultaat is afhankelijk van de doorslaggevende
factor.
Als we kijken naar de leeftijdsbepaling, is het ook mogelijk meerdere detecties uit te voeren die
een nauwkeuriger resultaat geven en ervoor zorgen dat niet de gehele persoon in beeld moet
zijn. Hiermee is het dan wel mogelijk 50-plussers te classificeren en indien gewenst nog meer
¨
categorieen.
Bibliografie
Agarwal, S., Awan, A., and Roth, D. (2004). Learning to detect objects in images via a sparse,
part-based representation. IEEE Transactions on Pattern Analysis and Machine Intelligence,
26(11):1475–1490.
Cao, L., Dikmen, M., Fu, Y., and Huang, T. S. (2008). Gender recognition from body. In In ACM
Multimedia, pages 725–728.
Dalal, N. and Triggs, B. (2005). Histograms of oriented gradients for human detection. In In CVPR,
pages 886–893.
´ P., Tu, Z., Perona, P., and Belongie, S. (2009). Integral channel features. In BMVC.
Dollar,
Felzenszwalb, P. F. (2010). Object detection with discriminatively trained part based models.
Geng, X., Zhou, Z.-H., Zhang, Y., Li, G., and Dai, H. (2006). Learning from facial aging patterns
for automatic age estimation. In Nahrstedt, K., Turk, M., Rui, Y., Klas, W., and Mayer-Patel, K.,
editors, ACM Multimedia, pages 307–316. ACM.
Kwon, Y. H. and Lobo, N. D. V. (1999). Age classification from facial images. In In Proc. IEEE Conf.
Computer Vision and Pattern Recognition, pages 762–767.
Lian, H.-C. and Lu, B.-L. (2006). Multi-view gender classification using local binary patterns and
support vector machines. In Wang, J., Yi, Z., Zurada, J. M., Lu, B.-L., and Yin, H., editors, ISNN
(2), volume 3972 of Lecture Notes in Computer Science, pages 202–209. Springer.
¨
¨
¨ T. (2002). Multiresolution gray-scale and rotation invaOjala, T., Pietikainen,
M., and Maenp
a¨ a,
riant texture classification with local binary patterns. IEEE Trans. Pattern Anal. Mach. Intell.,
24(7):971–987.
Papageorgiou, C., Oren, M., and Poggio, T. (1998). A general framework for object detection. In
ICCV, pages 555–562.
Phillips, P. J., Moon, H., Rizvi, S. A., and Rauss, P. J. (2000). The FERET evaluation methodology
for face recognition algorithms. IEEE Trans, 22:1090–1104.
Phillips, P. J., Wechsler, H., Huang, J., and Rauss, P. (1998). The FERET database and evaluation
procedure for face recognition algorithms. Image and Vision Computing J, 16(5):295–306.
Van Loghum, B. S. (1998). Url: http://www.gratisbeloningskaart.nl/blog/groeidiagram-voor-delengte-en-gewicht-van-je-kind/.
39
40
BIBLIOGRAFIE
Vapnik, V. N. (1995). The Nature of Statistical Learning Theory. Springer-Verlag New York, Inc.,
New York, NY, USA.
Viola, P. and Jones, M. (2001). Robust real-time object detection. Second International Workshop
on Statistical and Computational Theories Of Vision.
Bijlage A
Programma code
1
/ ∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
2
3
4
5
Software f o r p e r f o r m i n g age and gender d e t e c t i o n based on a t r a i n e d p e d e s t r i a n ,
f a c e and gender model w i t h t h e a s s i s t a n c e o f an average
gender / l e n g t h −> age c h a r a c t e r i s t i c .
6
7
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗ /
8
9
10
11
/ / i n c l u d e s needed f o r r e a d i n g i n f i l e s c o r r e c t l y and c r e a t i n g o u t p u t
# i n c l u d e <fstream >
# i n c l u d e <iostream >
12
13
14
15
16
17
/ / OpenCV i n c l u d e s needed f o r c o r r e c t f u n c t i o n a l i t y
# i n c l u d e ” opencv2 / o b j d e t e c t / o b j d e t e c t . hpp ”
# i n c l u d e ” opencv2 / h i g h g u i / h i g h g u i . hpp ”
# i n c l u d e ” opencv2 / imgproc / imgproc . hpp ”
# i n c l u d e <opencv2 / core / core . hpp>
18
19
20
21
/ / I n c l u d i n g t h e used namespaces
u s i n g namespace s t d ;
u s i n g namespace cv ;
22
23
24
25
26
27
28
29
30
31
32
33
34
35
/ / Global v a r i a b l e s
C a s c a d e C l a s s i f i e r p e d e s t r i a n , face , gender ;
s t r i n g window name = ” Gender and age c l a s s i f i c a t i o n f o r camera i n p u t ” ,
p e d e s t r i a n w i n d o w = ” P e d e s t r i a n ” , face window = ” Face ” ;
s t r i n g pedModel , faceModel , genderModel ;
i n t webcamDevice = 0 ;
string videoFile = ” ” ;
b o o l webcam = f a l s e ;
bool video = f a l s e ;
bool capture = f a l s e ;
bool c a l i b r a t i o n = f a l s e ;
b o o l verbose = f a l s e ;
f l o a t d e p t h F a c t o r = 1 . 3 9 , d i s t a n c e 1 = 300;
36
37
38
Mat c u r r e n t f r a m e ;
i n t r o i x = 0 , r o i y = 0;
39
40
41
/ / S p e c i f i c v a r i a b l e s which can be changed based on i n p u t
/ / −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
41
42
42
43
44
45
46
A Programma code
/ / Length v a r i a b l e s
i n t avgFemaleLength = 166;
i n t avgMaleLength = 180;
i n t avgBoyLength = 120;
i n t a v g G i r l L e n g t h = 118;
47
48
49
50
51
52
53
54
55
56
/ / D e t e c t o r parameters
i n t pedMargin = 3 0 ;
i n t pedOverlap = 8 ;
i n t faceOverlap = 5;
i n t genderOverlap = 8 ;
f l o a t pedIncrease = 1 . 0 5 ;
f l o a t faceIncrease = 1.05;
f l o a t genderIncrease = 1 . 0 1 ;
/ / −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
57
58
59
63
/ / F u n c t i o n t o r e g i s t e r mouse b u t t o n a c t i o n s
/ / When t h e l e f t mousebutton i s used ,
/ / t h e c u r r e n t p o s i t i o n on t h e image i s saved ( x , y )
v o i d on mouse ( i n t event , i n t x , i n t y , i n t f l a g , v o i d ∗ param )
64
{
60
61
62
/ / A c t i o n when l e f t b u t t o n i s c l i c k e d
i f ( event == CV EVENT LBUTTONDOWN)
65
66
{
67
roi x = x;
roi y = y;
68
69
}
70
71
}
72
78
/ / F u n c t i o n t o c a l i b r a t e t h e camera
/ / C a l l i b r a t i o n needs some arguments
/ / 1 ) Size o f o b j e c t i n r e a l l i f e
/ / 2) Distance to o b j e c t f i r s t time
/ / 3 ) D i s t a n c e t o o b j e c t second t i m e
v o i d c a l i b r a t e C a m e r a ( VideoCapture i n p u t v i d e o )
79
{
73
74
75
76
77
80
81
string input ;
f l o a t d i s t a n c e 2 = 411 , basePoint1 = 0 , basePoint2 = 390;
82
83
84
85
86
87
88
89
90
91
92
c o u t << ” C a l i b r a t i o n w i z a r d ” << e n d l ;
c o u t << ” ################### ” << e n d l ;
c o u t << ” D i s t a n c e t o l o w e s t p a r t o f camera angle : ” ;
c i n >> i n p u t ;
distance1 = a t o f ( input . c s t r ( ) ) ;
c o u t << ” D i s t a n c e 1 = ” << d i s t a n c e 1 << e n d l ;
c o u t << ” D i s t a n c e t o h i g h e s t p a r t o f f l o o r : ” << e n d l ;
c i n >> i n p u t ;
distance2 = a t o f ( input . c s t r ( ) ) ;
c o u t << ” D i s t a n c e 2 = ” << d i s t a n c e 2 << e n d l ;
93
94
95
96
97
98
99
/ / Now d i s p l a y a frame
/ / I f e n t e r i s pressed , t a k e a new frame
/ / when mousebutton i s c l i c k e d , p o s i t i o n o f i t
bool basePointset1 = f a l s e ;
bool basePointset2 = f a l s e ;
w i l l be saved
A Programma code
43
namedWindow ( pedestrian window , WINDOW AUTOSIZE) ;
setMouseCallback ( pedestrian window , on mouse ) ;
100
101
102
103
while ( ! basePointset1 | ! basePointset2 )
104
{
i n p u t v i d e o >> c u r r e n t f r a m e ;
i n t key = 0 ;
105
106
107
110
imshow ( pedestrian window , c u r r e n t f r a m e ) ;
key = waitKey ( 0 ) ;
i f ( key == 105)
111
{
108
109
i f ( ! basePointset1 )
112
{
113
basePoint1 = r o i y ;
c o u t << ” Y = ” << basePoint1 << e n d l ;
basePointset1 = tr ue ;
114
115
116
}
117
118
else
119
{
basePoint2 = r o i y ;
c o u t << ” Y = ” << basePoint2 << e n d l ;
basePointset2 = tr ue ;
120
121
122
}
123
}
124
}
125
126
c o u t << ” C a l c u l a t i n g t h e t r a n s f o r m a t i o n f a c t o r s . . . ” << e n d l ;
destroyWindow ( p e d e s t r i a n w i n d o w ) ;
d e p t h F a c t o r = ( d i s t a n c e 2 − d i s t a n c e 1 ) / ( basePoint1 − basePoint2 ) ;
c o u t << d e p t h F a c t o r << e n d l ;
127
128
129
130
131
return ;
132
133
}
134
135
i n t main ( i n t argc , c o n s t char ∗∗ argv )
136
{
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
/ / Check i f arguments are g i v e n c o r r e c t
i f ( argc == 1 ) {
c o u t << ” Usage o f d e t e c t i o n & c l a s s i f i c a t i o n s o f t w a r e : ”
<< argv [ 0 ] << e n d l ;
c o u t << ” #### Model f i l e s #### ” << e n d l ;
c o u t << ” −pedModel <p e d e s t r i a n m o d e l . xml>” << e n d l ;
c o u t << ” −faceModel <face model . xml>” << e n d l ;
c o u t << ” −genderModel <gender model . xml>” << e n d l ;
c o u t << ” #### Webcam parameters ( i f no v i d e o ) #### ” << e n d l ;
c o u t << ” −webcam number < d e f a u l t = ” << webcamDevice << ”> ” << e n d l ;
c o u t << ” − c a l i b r a t e ( w i l l g i v e a c a l l i b r a t i o n w i z a r d ) ” << e n d l ;
c o u t << ” #### Video parameters ( i f no webcam ) #### ” << e n d l ;
c o u t << ”−v i d e o < v i d e o f i l e >” << e n d l ;
c o u t << ” #### A d d i t i o n a l model parameters #### ” << e n d l ;
c o u t << ” [− pedOverlap < d e f a u l t = ” << pedOverlap << ” >] ” << e n d l ;
c o u t << ” [− f a c e O v e r l a p < d e f a u l t = ” << f ac e O ve r l a p << ” <] ” << e n d l ;
c o u t << ” [− genderOverlap < d e f a u l t = ” << genderOverlap << ” <] ” << e n d l ;
c o u t << ” [− pedIncrease < d e f a u l t = ” << pedIncrease << ” <] ” << e n d l ;
c o u t << ” [− f a c e I n c r e a s e < d e f a u l t = ” << f a c e I n c r e a s e << ” >] ” << e n d l ;
c o u t << ” [− genderIncrease < d e f a u l t = ” << genderIncrease << ” >] ” << e n d l ;
c o u t << ” #### A d d i t i o n a l parameters ### ” << e n d l ;
44
A Programma code
c o u t << ”−v ( w i l l v i s u a l i z e more than n o r m a l l y ) ” << e n d l ;
c o u t << ”−c a p t u r e ( w i l l c a p t u r e t h e images from t h e webcam o r v i d e o f i l e ) ”
<< e n d l ;
return 0;
158
159
160
161
162
}
163
164
165
166
167
168
/ / Read t h e v a l u e s o f t h e arguments
f o r ( i n t i = 1 ; i < argc ; i ++ )
{
i f ( ! strcmp ( argv [ i ] , ”−pedModel ” ) )
{
pedModel = argv [++ i ] ;
169
170
}
171
e l s e i f ( ! strcmp ( argv [ i ] , ”−faceModel ” ) )
172
{
faceModel = argv [++ i ] ;
173
174
}
175
e l s e i f ( ! strcmp ( argv [ i ] , ”−genderModel ” ) )
176
{
genderModel = argv [++ i ] ;
177
178
}
179
e l s e i f ( ! strcmp ( argv [ i ] , ”−webcam ” ) )
180
{
webcamDevice = a t o i ( argv [++ i ] ) ;
webcam = t r u e ;
video = f a l s e ;
181
182
183
184
}
185
e l s e i f ( ! strcmp ( argv [ i ] , ”−v i d e o ” ) )
186
{
v i d e o F i l e = argv [++ i ] ;
video = t r u e ;
webcam = f a l s e ;
187
188
189
190
}
191
e l s e i f ( ! strcmp ( argv [ i ] , ”− c a l i b r a t e ” ) )
192
{
calibration = true ;
193
194
}
195
e l s e i f ( ! strcmp ( argv [ i ] , ”−v ” ) )
196
{
verbose = t r u e ;
197
198
}
199
e l s e i f ( ! strcmp ( argv [ i ] , ”−c a p t u r e ” ) )
200
{
capture = true ;
201
202
}
203
e l s e i f ( ! strcmp ( argv [ i ] , ”−pedOverlap ” ) )
204
{
pedOverlap = a t o i ( argv [++ i ] ) ;
205
206
}
207
e l s e i f ( ! strcmp ( argv [ i ] , ”−f a ce O v er l a p ” ) )
208
{
f a c e O v e r l a p = a t o i ( argv [++ i ] ) ;
209
210
}
211
e l s e i f ( ! strcmp ( argv [ i ] , ”−genderOverlap ” ) )
212
{
genderOverlap = a t o i ( argv [++ i ] ) ;
213
214
}
215
e l s e i f ( ! strcmp ( argv [ i ] , ”−pedIncrease ” ) )
A Programma code
{
216
pedIncrease = a t o f ( argv [++ i ] ) ;
217
}
218
219
e l s e i f ( ! strcmp ( argv [ i ] , ”−f a c e I n c r e a s e ” ) )
220
{
f a c e I n c r e a s e = a t o f ( argv [++ i ] ) ;
221
}
222
223
e l s e i f ( ! strcmp ( argv [ i ] , ”−genderIncrease ” ) )
224
{
genderIncrease = a t o f ( argv [++ i ] ) ;
225
}
226
}
227
228
229
230
231
232
233
234
/ / Load t h e p e d e s t r i a n model i n t o t h e model c o n t a i n e r
i f ( ! p e d e s t r i a n . l o a d ( pedModel ) ) {
c o u t << ” E r r o r l o a d i n g t h e p e d e s t r i a n model from t h e p r o v i d e d model f i l e ! ”
<< e n d l ;
r e t u r n −1;
};
235
236
237
238
239
240
241
/ / Load t h e f a c e model i n t o t h e model c o n t a i n e r
i f ( ! f a c e . l o a d ( faceModel ) ) {
c o u t << ” E r r o r l o a d i n g t h e f a c e model from t h e p r o v i d e d model f i l e ! ”
<< e n d l ;
r e t u r n −1;
};
242
243
244
245
246
247
248
/ / Load t h e gender model i n t o t h e model c o n t a i n e r
i f ( ! gender . l o a d ( genderModel ) ) {
c o u t << ” E r r o r l o a d i n g t h e gender model from t h e p r o v i d e d model f i l e ! ”
<< e n d l ;
r e t u r n −1;
};
249
258
/ / Open t h e v i d e o c a p t u r e i n t e r f a c e ;
VideoCapture i n p u t v i d e o ;
i f ( webcam )
i n p u t v i d e o = webcamDevice ;
else
input video = videoFile ;
i f ( ! i n p u t v i d e o . isOpened ( ) ) {
c o u t << ” Camera cannot be opened c o r r e c t l y . ” << e n d l ;
r e t u r n −1;
259
}
250
251
252
253
254
255
256
257
260
261
262
263
264
265
/ / C o n f i g u r e parameters f o r w r i t i n g images from v i d e o
v e c t o r <i n t > parameters ;
parameters . push back ( CV IMWRITE PNG COMPRESSION ) ; parameters . push back ( 0 ) ;
i f ( calibration )
calibrateCamera ( i n p u t v i d e o ) ;
266
270
/ / Parameters f o r making v i d e o
VideoWriter output video ;
VideoWriter output video2 ;
i f ( capture )
271
{
267
268
269
272
273
double w i d t h = i n p u t v i d e o . g e t ( CV CAP PROP FRAME WIDTH ) ;
double h e i g h t = i n p u t v i d e o . g e t ( CV CAP PROP FRAME HEIGHT ) ;
45
46
A Programma code
274
o u t p u t v i d e o . open ( ” c a p t u r e . a v i ” , CV FOURCC( ’D ’ , ’ I ’ , ’V ’ , ’X ’ ) , 15 ,
cvSize ( ( i n t ) width , ( i n t ) h e i g h t ) ) ;
o u t p u t v i d e o 2 . open ( ” c a p t u r e t r a c k . a v i ” , CV FOURCC( ’D ’ , ’ I ’ , ’V ’ , ’X ’ ) , 15 ,
cvSize ( ( i n t ) width , ( i n t ) h e i g h t ) ) ;
275
276
277
278
279
/ / Check i f t h e v i d e o s were opened f o r w r i t i n g
i f ( ! o u t p u t v i d e o . isOpened ( ) )
280
281
{
282
c e r r << ” Could n o t c r e a t e f i r s t o u t p u t v i d e o . ” ;
r e t u r n −1;
283
284
}
285
286
i f ( ! o u t p u t v i d e o 2 . isOpened ( ) )
287
{
288
c e r r << ” Could n o t c r e a t e second o u t p u t v i d e o . ” ;
r e t u r n −1;
289
290
}
291
292
}
293
294
295
296
297
298
299
300
301
302
303
304
305
/ / −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
/ / START ACTUAL ALGORITM
/ / −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
/ / Loop over each image i n t h e v i d e o o r webcam image stream and perform
/ / detections
for ( ; ; )
{
/ / Read i n t h e f i r s t image
i n p u t v i d e o >> c u r r e n t f r a m e ;
/ / Save c u r r e n t frame i n f i r s t v i d e o f i l e
i f ( capture )
o u t p u t v i d e o << c u r r e n t f r a m e ;
306
307
308
309
310
311
312
313
314
315
316
317
/ / Perform check i f a n y t h i n g goes wrong w i t h t h e v i d e o c a p t u r e o r i f t h e
/ / v i d e o f i l e i s a t t h e end
i f ( c u r r e n t f r a m e . empty ( ) ) {
i f ( webcam )
c o u t << ” L a s t frame grabbed was empty , something might be wrong ”
” w i t h t h e d e v i c e . ” << e n d l ;
else
c o u t << ” L a s t frame was grabbed , c l o s i n g t h e program ” << e n d l ;
break ;
}
318
319
320
321
322
323
324
325
/ / −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
/ / PREPARE FOR DETECTION
/ / −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
/ / S p e c i f i c v a r i a b l e s f o r t h e a c t u a l d e t e c t i o n phase
v e c t o r <Rect> o b j e c t s ;
Mat f r a m e g r a y ;
Size c u r r e n t s i z e = c u r r e n t f r a m e . s i z e ( ) ;
326
327
328
329
330
331
//
//
//
//
//
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
PREPROCESSING STEP
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
Convert t h e i n p u t frame t o g r a y s c a l e image and a p p l y l i g h t n i n g
n o r m a l i z a t i o n using histogram e q u i l i z a t i o n
A Programma code
332
333
47
c v t C o l o r ( c u r r e n t f r a m e , frame gray , CV BGR2GRAY ) ;
e q u a l i z e H i s t ( frame gray , f r a m e g r a y ) ;
334
335
336
337
338
339
//
//
//
//
//
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
PERFORM THE ACTUAL DETECTIONS
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
PHASE 1 : D e t e c t p e d e s t r i a n
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
340
341
342
343
/ / D e t e c t p e d e s t r i a n i n t h e g i v e n image based on i n p u t parameters
p e d e s t r i a n . d e t e c t M u l t i S c a l e ( frame gray , o b j e c t s , pedIncrease , pedOverlap ,
0 , Size ( 1 0 0 , 5 0 ) , Size ( c u r r e n t s i z e . width , c u r r e n t s i z e . h e i g h t ) ) ;
344
346
/ / Loop over found p e d e s t r i a n s i n image
f o r ( u i n t j = 0 ; j < o b j e c t s . s i z e ( ) ; j ++ )
347
{
345
348
349
350
351
/ / Some needed v a r i a b l e s l a t e r on
Mat cuttedPed , cuttedPedHead ;
v e c t o r <Rect> detectedFaces , detectedGender ;
b o o l male = f a l s e ;
352
353
354
355
356
357
358
/ / Save p o s i t i o n o f c u r r e n t o b j e c t i n v a r i a b l e s
/ / and add e x t r a margin i n l e n g t h
i n t xPositionPed = objects [ j ] . x ;
i n t y P o s i t i o n P e d = o b j e c t s [ j ] . y − pedMargin ;
i n t widthPed = o b j e c t s [ j ] . w i d t h ;
i n t heightPed = o b j e c t s [ j ] . h e i g h t + ( pedMargin ∗ 2) ;
359
360
361
362
363
364
/ / Check i f s t i l l w i t h i n window
i f ( yPositionPed < 0)
yPositionPed = 0;
i f ( heightPed + y P o s i t i o n P e d > c u r r e n t s i z e . h e i g h t )
heightPed = ( c u r r e n t s i z e . h e i g h t − y P o s i t i o n P e d ) ;
365
366
367
368
369
370
/ / Draw red r e c t a n g l e around found p e d e s t r i a n
r e c t a n g l e ( c u r r e n t f r a m e , P o i n t ( xPositionPed , y P o s i t i o n P e d ) ,
P o i n t ( x P o s i t i o n P e d + widthPed , y P o s i t i o n P e d + heightPed ) ,
S c a l a r ( 0 , 0 , 255) , 1 ) ;
371
372
373
374
375
376
377
/ / Cut o u t t h e p e d e s t r i a n d e t e c t i o n f o r n e x t d e t e c t o r
c u r r e n t f r a m e ( Rect ( xPositionPed , yPositionPed , widthPed ,
heightPed ) ) . copyTo ( cuttedPed ) ;
c u r r e n t f r a m e ( Rect ( xPositionPed , yPositionPed , widthPed ,
heightPed ∗ 0 . 3 ) ) . copyTo ( cuttedPedHead ) ;
Size p e d e s t r i a n S i z e = cuttedPed . s i z e ( ) ;
378
379
380
381
/ / V i s u a l i z e t h e c u t t e d p e d e s t r i a n and t h e f u l l image i f verbose
i f ( verbose )
{
imshow ( window name , c u r r e n t f r a m e ) ;
imshow ( pedestrian window , cuttedPed ) ; waitKey ( 0 ) ;
382
383
384
}
385
386
387
388
389
//
//
//
//
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
PHASE 2 : D e t e c t f a c e
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
Try t o d e t e c t f a c e i n c u t t e d p e d e s t r i a n image
48
A Programma code
f a c e . d e t e c t M u l t i S c a l e ( cuttedPedHead , detectedFaces , f a c e I n c r e a s e ,
faceOverlap , 0 ) ;
i f ( detectedFaces . s i z e ( ) > 0 && verbose )
c o u t << ” Faces d e t e c t e d : ” << detectedFaces . s i z e ( ) << e n d l ;
390
391
392
393
394
396
/ / Loop over d e t e c t e d f a c e s ( Can i t o n l y be one ? )
f o r ( u i n t k = 0 ; k < detectedFaces . s i z e ( ) ; k++ )
397
{
395
Mat cuttedFace ;
398
399
/ / Draw red r e c t a n g l e around found p e d e s t r i a n w i t h f a c e
/ / This gives less v i s u a l i z a t i o n s
i f ( ! verbose )
r e c t a n g l e ( c u r r e n t f r a m e , P o i n t ( xPositionPed , y P o s i t i o n P e d ) ,
P o i n t ( x P o s i t i o n P e d + widthPed , y P o s i t i o n P e d + heightPed ) ,
S c a l a r ( 0 , 0 , 255) , 1 ) ;
400
401
402
403
404
405
406
/ / Save p o s i t i o n o f c u r r e n t f a c e s i n v a r i a b l e s
/ / and add e x t r a margin i n w i d t h and l e n g t h
i n t extraWidth = 30;
i n t extraHeight = 30;
i n t xPosFace = x P o s i t i o n P e d + detectedFaces [ k ] . x − e x t r a W i d t h ;
i n t yPosFace = y P o s i t i o n P e d + detectedFaces [ k ] . y − e x t r a H e i g h t ;
i n t widthFace = detectedFaces [ k ] . w i d t h + e x t r a W i d t h ∗ 2;
i n t heightFace = detectedFaces [ k ] . h e i g h t + e x t r a H e i g h t ∗ 2;
407
408
409
410
411
412
413
414
415
/ / Check i f we are s t i l l i n s i d e our frame
i f ( xPosFace < 0 )
xPosFace = 0 ;
i f ( yPosFace < 0 )
yPosFace = 0 ;
i f ( xPosFace + widthFace > c u r r e n t s i z e . w i d t h )
widthFace = ( c u r r e n t s i z e . w i d t h − xPosFace ) ;
i f ( yPosFace + heightFace > c u r r e n t s i z e . h e i g h t )
heightFace = ( c u r r e n t s i z e . h e i g h t − yPosFace ) ;
416
417
418
419
420
421
422
423
424
425
/ / P r i n t o u t any i n f o r m a t i o n
i f ( verbose )
426
427
{
428
c o u t << ” Face l o c a t i o n : x : ” << xPosFace << ” y : ” << yPosFace
<< ” w i d t h : ” << widthFace << ” h e i g h t : ” << heightFace
<< e n d l ;
c o u t << ” Face l o c a t i o n w i t h o u t ped : x : ” << detectedFaces [ k ] . x
<< ” y : ” << detectedFaces [ k ] . y << ” w i d t h : ” << widthFace
<< ” h e i g h t : ” << heightFace << e n d l ;
429
430
431
432
433
434
435
r e c t a n g l e ( cuttedPed , P o i n t ( detectedFaces [ k ] . x , detectedFaces [ k ] . y )
436
,
437
438
439
440
P o i n t ( detectedFaces [ k ] . x + detectedFaces [ k ] . width ,
detectedFaces [ k ] . y + detectedFaces [ k ] . h e i g h t ) ,
S c a l a r ( 0 , 255 , 0 ) , 1 ) ;
imshow ( pedestrian window , cuttedPed ) ; / / waitKey ( 0 ) ;
441
442
443
444
445
446
/ / Draw r e c t a n g l e around
rectangle ( current frame ,
P o i n t ( xPosFace
S c a l a r ( 0 , 255 ,
f a c e i n green
P o i n t ( xPosFace , yPosFace ) ,
+ widthFace , yPosFace + heightFace ) ,
0) , 1) ;
A Programma code
49
/ / V i s u a l i s e t h e new drawn r e c t a n g l e
imshow ( window name , c u r r e n t f r a m e ) ; / / waitKey ( 0 ) ;
447
448
449
}
450
451
452
453
/ / Cut o u t t h e p e d e s t r i a n d e t e c t i o n f o r n e x t d e t e c t o r
c u r r e n t f r a m e ( Rect ( xPosFace , yPosFace , widthFace ,
heightFace ) ) . copyTo ( cuttedFace ) ;
454
455
456
457
/ / V i s u a l i z e the cutted face
i f ( verbose )
{
imshow ( face window , cuttedFace ) ; waitKey ( 0 ) ;
458
459
}
460
461
//
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
462
463
/ / PHASE 3 : Determine l e n g t h o f p e d e s t r i a n
//
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
464
465
466
467
468
469
470
471
472
473
474
475
476
477
/ / F u n c t i o n t o determine t h e a c t u a l l e n g t h o f t h e
/ / found p e d e s t r i a n
/ / T h i s e s t i m a t i o n i s based on t h e p o s i t i o n o f t h e
/ / f e e t of the pedestrian
/ / ( t h i s i s t h e r e f e r e n c e ) and t h e amount o f p i x e l s
/ / from t h e r e t i l l h i s / her
/ / head . Based on mean age / l e n g t h s t a t i s t i c s t h e
/ / person i s c a t e g o r i s e d by
/ / the r e s u l t .
/ / The p o s i t i o n o f t h e f e e t i s found by t a k i n g a p r e d e f i n e d
/ / margin from t h e
/ / a c t u a l d e t e c t i o n ( r e c t a n g l e ) and so i s t h e head .
Size pedSize = cuttedPed . s i z e ( ) ;
i n t pedHeight = pedSize . h e i g h t ∗ 0 . 9 ;
478
484
/ / Translate the p i x e l size to r e a l world size via
/ / translation factors
f l o a t depth = ( d e p t h F a c t o r ∗ ( c u r r e n t s i z e . h e i g h t − ( y P o s i t i o n P e d
+ heightPed ) ) ) + d i s t a n c e 1 ;
f l o a t a c t u a l S i z e P e d = ( depth ∗ pedHeight ) / 700;
i f ( verbose )
485
{
479
480
481
482
483
c o u t << ” Lowest p a r t : ” << y P o s i t i o n P e d + heightPed << e n d l ;
c o u t << ” From bottom t o f e e t : ”
<< c u r r e n t s i z e . h e i g h t − ( y P o s i t i o n P e d + heightPed ) << e n d l ;
c o u t << ” P e d e s t r i a n depth : ” << depth << e n d l ;
c o u t << ” A c t u a l p e d e s t r i a n s i z e : ” << a ct ua lS i ze Pe d << e n d l ;
486
487
488
489
490
491
}
492
493
494
//
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
495
496
/ / PHASE 4 : D e t e c t gender
//
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
497
498
499
500
/ / For each d e t e c t e d face , t r y t o determine gender
gender . d e t e c t M u l t i S c a l e ( cuttedFace , detectedGender , genderIncrease ,
genderOverlap , 0 ) ;
50
A Programma code
i f ( detectedGender . s i z e ( ) > 0 )
501
{
502
i f ( verbose )
c o u t << ” Male person d e t e c t e d ” << e n d l ;
503
504
505
/ / When a male person i s
/ / around f a c e
rectangle ( current frame ,
P o i n t ( xPosFace
Scalar (255 , 0 ,
male = t r u e ;
506
507
508
509
510
511
detected , draw b l u e r e c t a n g l e
P o i n t ( xPosFace , yPosFace ) ,
+ widthFace , yPosFace + heightFace ) ,
0) , 1) ;
}
512
513
else
514
{
i f ( verbose )
c o u t << ” Female person d e t e c t e d ” << e n d l ;
515
516
517
/ / When a female person i s detected , draw p i n k r e c t a n g l e
/ / around f a c e
r e c t a n g l e ( c u r r e n t f r a m e , P o i n t ( xPosFace , yPosFace ) ,
P o i n t ( xPosFace + widthFace , yPosFace + heightFace ) ,
S c a l a r ( 2 5 5 , 0 , 255) , 1 ) ;
male = f a l s e ;
518
519
520
521
522
523
}
524
525
//
526
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
/ / PHASE 5 : Guess t h e age by i t s gender and l e n g t h
//
527
528
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
i f ( male )
529
{
530
i f ( a c t u a l S i z e P e d > avgMaleLength ∗ 0 . 8 )
531
{
532
p u t T e x t ( c u r r e n t f r a m e , ”Man” , P o i n t ( xPosFace + widthFace ,
yPosFace + heightFace ) , FONT HERSHEY COMPLEX SMALL,
0 . 8 , c v S c a l a r ( 2 5 5 , 0 , 0 ) , 1 , CV AA ) ;
c o u t << ”Man d e t e c t e d ( age 12+) ” << e n d l ;
533
534
535
536
}
537
538
e l s e i f ( a c t u a l S i z eP ed > avgBoyLength ∗ 0 . 8 )
539
{
p u t T e x t ( c u r r e n t f r a m e , ” Boy ” , P o i n t ( xPosFace + widthFace ,
yPosFace + heightFace ) , FONT HERSHEY COMPLEX SMALL,
0 . 8 , c v S c a l a r ( 2 5 5 , 0 , 0 ) , 1 , CV AA ) ;
c o u t << ” Boy d e t e c t e d ( age 6 −12) ” << e n d l ;
540
541
542
543
}
544
545
else
546
{
p u t T e x t ( c u r r e n t f r a m e , ” L i t t l e boy ” , P o i n t ( xPosFace + widthFace
547
,
yPosFace + heightFace ) , FONT HERSHEY COMPLEX SMALL,
0 . 8 , c v S c a l a r ( 2 5 5 , 0 , 0 ) , 1 , CV AA ) ;
c o u t << ” L i t t l e boy d e t e c t e d ( age < 6 ) ” << e n d l ;
548
549
550
}
551
c o u t << ” A c t u a l p e d e s t r i a n s i z e : ” << a ct ua lS i ze Pe d << e n d l ;
/ / waitKey ( 0 ) ;
552
553
554
}
555
else
A Programma code
51
{
556
i f ( a c t u a l S i ze P ed > avgFemaleLength ∗ 0 . 8 )
557
{
558
p u t T e x t ( c u r r e n t f r a m e , ”Woman” , P o i n t ( xPosFace + widthFace ,
yPosFace + heightFace ) , FONT HERSHEY COMPLEX SMALL,
0 . 8 , c v S c a l a r ( 2 5 5 , 0 , 2 5 5 ) , 1 , CV AA ) ;
c o u t << ”Woman d e t e c t e d ( age 12+) ” << e n d l ;
559
560
561
562
}
563
564
e l s e i f ( a c t u al Si z eP ed > a v g G i r l L e n g t h ∗ 0 . 8 )
565
{
p u t T e x t ( c u r r e n t f r a m e , ” G i r l ” , P o i n t ( xPosFace + widthFace ,
yPosFace + heightFace ) , FONT HERSHEY COMPLEX SMALL,
0 . 8 , c v S c a l a r ( 2 5 5 , 0 , 2 5 5 ) , 1 , CV AA ) ;
c o u t << ” G i r l d e t e c t e d ( age 6 −12) ” << e n d l ;
566
567
568
569
}
570
571
else
572
{
putText ( current frame , ” L i t t l e
573
g i r l ” , P o i n t ( xPosFace +
widthFace ,
yPosFace + heightFace ) , FONT HERSHEY COMPLEX SMALL,
0 . 8 , c v S c a l a r ( 2 5 5 , 0 , 2 5 5 ) , 1 , CV AA ) ;
c o u t << ” L i t t l e g i r l d e t e c t e d ( age < 6 ) ” << e n d l ;
574
575
576
}
577
c o u t << ” A c t u a l p e d e s t r i a n s i z e : ” << a ct ua lS i ze Pe d << e n d l ;
/ / waitKey ( 0 ) ;
578
579
}
580
}
581
}
582
/ / −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
/ / VISUALIZE THE ACTUAL DETECTION
/ / −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
583
584
585
586
/ / Show t h e r e s u l t o f a l l t h e d e t e c t o r s
imshow ( window name , c u r r e n t f r a m e ) ;
587
588
589
/ / Save t h e t r a c k e d image t o t h e new
i f ( capture )
o u t p u t v i d e o 2 << c u r r e n t f r a m e ;
590
591
592
593
i n t key = waitKey ( 5 ) ;
i f ( key == 27 ) { break ; }
594
595
}
596
597
return 0;
598
599
}
Listing A.1: Volledige algoritme
FACULTEIT INDUSTRIELE INGENIEURSWETENSCHAPPEN
CAMPUS DE NAYER (@Thomas More)
Jan De Nayerlaan 5
2860 SINT-KATELIJNE-WAVER, België
tel. + 32 15 31 69 44
[email protected]
www.iiw.kuleuven.be