Face detection in color images Verslag
Domien Nowicki 0522689 Bjorn Schobben 0522953
Inhoudstabel Inleiding...................................................................................................................................... 3 Gezichtsdetectiealgoritme........................................................................................................... 3 Gezichtsmasker aanmaken.......................................................................................................... 4 Belichting compensatie........................................................................................................... 5 Niet-lineaire transformatie naar Y/Cb/Cr kleurruimte............................................................ 6 Huidskleurdetectie door ellips model..................................................................................... 6 Gezichtskandidaten aanmaken.................................................................................................... 7 Eye en Mouth map aanmaken..................................................................................................... 7 Features zoeken........................................................................................................................... 8 Voorbeelden.............................................................................................................................. 10 Gelepasfoto.jpg..................................................................................................................... 10 Familie.jpg............................................................................................................................ 11 Lindsay.jpg............................................................................................................................ 11 Ballmer.jpg............................................................................................................................ 11 Mieke.jpg.............................................................................................................................. 12 Brigit.jpg............................................................................................................................... 12 Referenties................................................................................................................................ 12
Inleiding Het doel van dit project is het implementeren van een kleurgebaseerd gezichtsdetectiealgoritme dat beschreven staat in [1] met behulp van Matlab.
Gezichtsdetectiealgoritme Het gezichtsdetectiealgoritme zal een input beeld aannemen, en zal daarop de verschillende kandidaat gezichten, ogen en monden op markeren. We kunnen het algoritme opdelen in verschillende fasen, waarbij we elke fase apart zullen bespreken: - Gezichtsmasker aanmaken - Gezichtskandidaten aanmaken - Eye en Mouth map aanmaken - Features zoeken Eerst wordt er een globaal gezichtsmasker aangemaakt op basis van de huidskleur. Dit masker wordt opgedeeld in verschillende blobs, waarbij elke blob die groot genoeg is beschouwd wordt als een gezichtskandidaat (bij onze implementatie is een gezichtskandidaat minimum 13x13 groot). Van elk zo een gezichtskandidaat worden de oog kandidaten en mond kandidaten gezocht, en gemarkeerd op de tekening. Het hele proces kan samengevat worden tot 1 matlab functie: Matlab: function markedimg = FaceDetection(img) img input (n x m x 3) RGB beeld waar gezichtsdetectie moet uitgevoerd op worden markedimg output (n x m x 3) RGB beeld waar gezichten op gemarkeerd werden Voor het markeren hebben we enkele hulpfuncties geschreven: Matlab: function markedimg = MarkCandidates(img, candidates, color) img input (n x m x 3) RGB beeld waar gezichtsdetectie moet uitgevoerd op worden candidates input (k x 2) matrix van kandidaat posities color input (1 x 3) RGB markeer kleur markedimg output (n x m x 3) RGB beeld waar kandidaten op gemarkeerd werden Matlab: function markedimg = MarkBoundingBox(img, color, topleftx, toplefty, bottomrightx, bottomrighty)
img
input
color topleftx, toplefty, bottomrightx, bottomrighy markedimg
input input
output
(n x m x 3) RGB beeld waar gezichtsdetectie moet uitgevoerd op worden (1 x 3) RGB markeer kleur Coördinaten van de bounding box
(n x m x 3) RGB beeld waar de bounding box op gemarkeerd werd
De verschillende gevonden gezichtskandidaten worden omkaderd met een rode kleur, de oog kandidaten worden gekleurd met een groene stip, en de mond kandidaten met een blauwe stip. Bij onze implementatie is het maximum aantal oog kandidaten 8, en het maximum aantal mond kandidaten 5. In het voorbeeld hier rechts, is het maximaal aantal kandidaten voor ogen en monden gevonden.
Figuur 1: Gedetecteerd gezicht
Gezichtsmasker aanmaken In deze fase wordt een binair gezichtsmasker aangemaakt op basis van de huidskleur. Om de huidskleur te bepalen, wordt dit probleem opgedeeld in verschillende deeltaken: - Belichting compensatie - Niet-lineaire transformatie naar Y/Cb/Cr kleurruimte - Huidskleurdetectie door ellipsmodel Omdat het bekomen gezichtsmasker nog “gaten” kan vertonen, worden deze opgevuld zodat het gezichtsmasker een mooi oppervlak is. Matlab: function [Mask, Y, NLCb, NLCr] = FaceMask(img) img input (n x m x 3) RGB beeld waar binair masker wordt van aangemaakt Mask output (n x m x 1) binair gezichtsmasker Y output (n x m x 1) Y beeld map, met doubles in range 16..235 NLCb output (n x m x 1) Y-onafhankelijk Cb beeld, met doubles in range 0..255 NLCr output (n x m x 1) Y-onafhankelijk Cr beeld, met doubles in range 0..255
Figuur 2: Oorsponkelijk beeld
Figuur 3: Gezichtsmasker met gaten
Figuur 4: Gezichtsmasker
In het voorbeeld wordt het haar hier ook gezien als huidskleur, dit komt omdat niet alleen blanke huidskleur, maar ook zwarte huidskleur wordt gedetecteerd.
Belichting compensatie Eerst moeten de overheersende kleuren door belichting (color bias) worden gecorrigeerd, zodat huidskleurdetectie beter zal werken. We kijken hoeveel pixels van de top 5% luma (pixels met Y waarde >= 223.5/255) in het beeld aanwezig zijn, indien dit meer dan 100 is gaan we verder met de belichting compensatie. We noemen deze pixels “white reference” pixels, en berekenen de gemiddelde R, G en B waarden hiervan. Vervolgens gaan we het volledige het input beeld compenseren door elke pixel zijn R, G, en B te vermenigvuldigen met (1/M) waarbij M = gemiddelde R, G of B waarde. Elke waarde die groter is dan 1 wordt gelijk gesteld aan 1.
Matlab: function rgbout = LightingCompensate(rgbin) rgbin input (n x m x 3) RGB beeld (n x m x 3) RGB beeld dat belichting gecompenseerd werd, met rgbout output doubles in range 0..1
Figuur 5: Pasfoto met gele overheersende kleur
Figuur 6: Gezichtsmasker met gaten, en zonder belichting compensatie
Figuur 8: Pasfoto met belichting compensatie
Figuur 9: Gezichtsmasker met gaten, met belichting compensatie
Figuur 7: Gezichtsmasker zonder belichting compensatie
Figuur 10: Gezichtsmasker, met belichting compensatie
Niet-lineaire transformatie naar Y/Cb/Cr kleurruimte Dan wordt het belichting gecompenseerde RGB beeld omgevormd naar een niet-lineaire (Yonafhankelijke) Y/Cb/Cr kleurruimte. Dit gebeurd volledig volgens de formules in de paper, en met de gevolgde errata ervan. Om het RGB beeld te converteren naar Y/Cb/Cr maken we gebruik van de Matlab functie rgb2ycbcr. Matlab: function [Y, NLCb, NLCr] = NLTransform(rgbmap) rgbmap input (n*m x 3) RGB beeld map, met doubles in range 0..1 Y output (n*m x 1) Y beeld map, met doubles in range 16..235 (n*m x 1) Y-onafhankelijk Cb beeld map, met doubles in range NLCb output 0..255 (n*m x 1) Y-onafhankelijk Cr beeld map, met doubles in range NLCr output 0..255 Voor de niet-lineaire transformatie hebben we enkele hulpfuncties geschreven die de formules, zoals beschreven in de paper, evalueren. (waarbij Cx = Cb of Cr): Matlab: function NLCx = CxAccent(Y, Cx) Y input (n*m x 1) Y beeld map, met doubles in range 16..235 Cx input (n*m x 1) Cx beeld map, met doubles in range 0..255 (n*m x 1) Y-onafhankelijk Cx beeld map, met doubles in range NLCx output 0..255 Matlab: function cx = CxStreep(Y) Y input (n*m x 1) Y beeld map, met doubles in range 16..235 cx output (n*m x 1) Geëvalueerde Cx functie zoals in de paper Matlab: function wcx = WCx(Y) Y input (n*m x 1) Y beeld map, met doubles in range 16..235 wcx output (n*m x 1) Geëvalueerde WCx functie zoals in de paper
Huidskleurdetectie door ellips model Vervolgens wordt de Y-onafhankelijke Cb en Cr beeld mappen gebruikt om te detecteren als we te maken hebben met een huidskleur of niet. Dit gebeurd door de Y-onafhankelijke Cb en Cr beeld mappen om te zetten naar ellips coördinaten, en dan moet men nagaan als deze coördinaten zich bevinden in de “huidskleur” ellips. Deze formules hebben we ook gebruikt van de paper, evenals de constanten voor de huidskleur ellips.
Matlab: function MaskMap = IsSkinColor(NLCb, NLCr) NLCb input (n*m x 1) Y-onafhankelijk Cb beeld map, met doubles in range 0..255 (n*m x 1) Y-onafhankelijk Cr beeld map, met doubles in range NLCr input 0..255 MaskMap output (n*m x 1) binair gezichtsmasker beeld map Het verkregen beeldmap wordt terug omgezet naar een 2-dimensionaal beeld (n x m x 1), om er makkelijker mee te kunnen werken.
Gezichtskandidaten aanmaken Eens het gezichtsmasker aangemaakt is, kunnen we verschillende gezichtskandidaten (blobs) onderscheiden door gebruik te maken van de Matlab functie bwlabel. Vervolgens zoeken we de bounding box voor elke kandidaat, en snijden we deze gezichtskandidaat eruit, voor verdere verwerking. Deze kandidaat uitsnij code is geimplementeerd in de functie FaceDetection, die al eerder aan bod kwam. Matlab: function [topleftx, toplefty, bottomrightx, bottomrighty] = BoundingBox(Mask)
Mask topleftx, toplefty, bottomrightx, bottomrighty
input
(n x m x 1) binair masker
output
coördinaten van de bounding box van het masker
De functie BoundingBox maakt gebruik van de Matlab functie regionprops. In het voorbeeld hier rechts ziet men een aantal gezichtskandidaten omkaderd in een rode kleur.
Figuur 11: Gezichtskandidaten
Eye en Mouth map aanmaken Eens een gezichtskandidaat uitgesneden werd, gaat men hiervoor de Eye en Mouth map aanmaken. Deze Eye en Mouth maps werden aangemaakt zoals dat werd beschreven in de paper. Voor de dilatie en erosie hebben we gebruik gemaakt van een cirkel als structuring element, in plaats van een hemispheric structuring element, omdat dit makkelijker om mee te werken was.
Bij de chroma eye map hebben we gebruik gemaakt van de Matlab functie histeq, om de histogram equalisatie uit te voeren. Matlab: function [EM, MM] = ConstructEyeMouthMaps(Y, Cb, Cr, FaceMask) Y input (n x m x 1) binair masker (n x m x 1) (Y-onafhankelijk) Cb beeld, met doubles in range Cb input 0..255 (n x m x 1) (Y-onafhankelijk) Cr beeld, met doubles in range Cr input 0..255 FaceMask input (n x m x 1) binair masker beeld EM output (n x m x 1) Eye-map beeld, met doubles in range 0..1 MM output (n x m x 1) Mouth-map beeld, met doubles in range 0..1 We hebben ook een hulpfunctie geschreven die een beeld kan normalizeren, omdat dit een veel gebruikte operatie was bij het opbouwen van de eye en mouth maps. Matlab: function normalizedimg = Normalize(img, factor) img input (n x m x 1) beeld, eender welke range factor input Gewenste hoogste waarde in het beeld normalizedimg output (n x m x 1) genormalizeerd beeld, in range 0..factor
Figuur 12: Oorsponkelijk beeld
Figuur 13: Eyemap
Figuur 14: Mouthmap
Features zoeken Vervolgens moeten we uit zo een Eye map, of Mouth map de posities van de features (kandidaat ogen/mond) kunnen uithalen. Dit doen we door pyramide decompositie en iteratieve thresholding. We berekenen het aantal pyramide levels zoals beschreven in de paper. In onze implementatie hebben wij ook Fc = 7 en Fe = 12.
Nu dat we het aantal pyramide levels weten, berekenen we op basis daarvan de pyramide breedte en lengte voor elke level. We maken hiervoor gebruik van de Matlab functie linspace. Vervolgens berekenen we de alpha levels voor elke level, met de begin en eind alpha beschreven in de paper. Ook hiervoor maken we gebruik van de Matlab functie linspace. We berekenen ook de drempel waarde (threshold) voor elke level, op basis van de alpha zoals beschreven in de paper. Dan beginnen we door de gegeven Eye- of Mouth-map te herschalen naar het kleinste pyramide level formaat. Hiervoor maken we gebruik van de Matlab functie imresize. Vervolgens maken we een binair beeld aan door het herschaalde beeld te splitsen op basis van de drempelwaarde voor de huidige pyramide level, gevolgd door morfologische sluiting. Vervolgens gebruiken we de Matlab functie bwlabel om te tellen hoeveel features (blobs) er gevonden zijn. Indien dit gelijk of meer is dan het gewenste aantal maximum features, stopt het algoritme, en worden de huidig gevonden features teruggegeven. Indien dit niet zo is, wordt het beeld vergoot naar de volgende pyramide level, en gebeurd het hele proces opnieuw. De positie van elke feature wordt berekend door het “zwaartepunt” te berekenen van deze feature (blob). Ook wordt er aan elke feature een gewicht gehangen, waarbij een feature met vele heldere pixels een groter gewicht krijgt dan een feature met minder heldere pixels. Op deze manier worden de features gesorteerd op grootste gewicht eerst, zodat de posities van features die teruggegeven worden, de posities van de meest heldere en grootste features zijn die we gevonden hebben. Voor het sorteren hebben we de Matlab functie sortrows gebruikt.
Matlab: function candidates = FeaturePyramid(FaceMask, Map, MaxFeatures) FaceMask input (n x m x 1) binair gezichtsmasker beeld (n x m x 1) Eye- of Mouth-map beeld, met doubles in range Map input 0..1 MaxFeatures input Aantal features dat maximaal gevonden moet worden candidates output (m x 2) matrix met posities van de features Matlab: function [ThresholdImage, FeatureCount] = CreateThreshold(Map, Th)
Map Th ThresholdImage FeatureCount
input input
(n x m x 1) Eye- of Mouth-map beeld Drempelwaarde (n x m x 1) binair drempel beeld, met morfologische output sluiting output Aantal features dat gevonden werd
Matlab: function [xcenter, ycenter] = CalculateCenterPoint(Mask) Mask input (n x m x 1) binair masker beeld xcenter, output Coördinaten van het zwaartepunt van het masker ycenter
Figuur 15: Pyramide levels
Voorbeelden Gelepasfoto.jpg
De ogen en mond zijn te vinden bij de kandidaten, alhoewel de neus ook gevonden werd als een mogelijke mond kandidaat.
Familie.jpg
De verschillende gezichtskandidaten overlappen met meerdere gezichten, dit komt omdat de verschillende gezichten dicht bij elkaar zijn, en ze als 1 geheel gezien worden. Ook zijn de oog en mond maps niet zo goed gelukt, omdat de ogen en mond zeer klein zijn.
Lindsay.jpg
Ballmer.jpg
Mieke.jpg
Brigit.jpg
Referenties [1] R.-L. Hsu, M. Abdel-Mottaleb, and A. K. Jain, "Face detection in color images," IEEE Trans. Pattern Analysis and Machine Intelligence, vol. 24, no. 5, pp. 696-706, May 2002. http://citeseer.ist.psu.edu/article/hsu02face.html.