HOGESCHOOL GENT FACULTEIT BEDRIJF EN ORGANISATIE CAMPUS AALST
Gezichtsherkenning Patroonherkenning PAPER KENNISINTENSIEVE TOEPASSINGEN JELLE LIMPENS – THOMAS D ESLAGMEULDER – DRIES DE GENDT – THOMAS GHILAIN – TIMMY VAN LAETHEM – T OON DE QUICK 3TIB
2011-2012
Inhoudsopgave 1. Wat is patroonherkenning? .......................................................................................................................... 3 1.1 Enkele toepassingen .....................................................................................................................................3 2. Vereenvoudigen van complexe afbeeldingen .............................................................................................. 6 2.1 Inleiding ........................................................................................................................................................6 2.2 Technieken ....................................................................................................................................................6 2.2.1 RGB-Kleursysteem .................................................................................................................................6 2.2.2 Posterisatie ...........................................................................................................................................8 2.2.3 Monochroom .......................................................................................................................................11 2.2.4 Lichtheid/Contrast ...............................................................................................................................12 3. Edge Detection .......................................................................................................................................... 14 3.1 Definitie .......................................................................................................................................................14 3.2 Soorten ........................................................................................................................................................14 3.3 Canny Edge Detector ..................................................................................................................................17 4. Vormherkenning ........................................................................................................................................ 19 4.1 Inleiding ......................................................................................................................................................19 4.2 Vormpresentatie .........................................................................................................................................19 4.3 Invariantie ...................................................................................................................................................20 4.4 Neurale netwerken .....................................................................................................................................21 4.5 Met behulp van logica .................................................................................................................................22 4.6 K-Nearest Neighbor Algoritme ....................................................................................................................25 5. Gezichtsherkenning ................................................................................................................................... 27 5.1 Inleiding ......................................................................................................................................................27 5.2 Methodes ....................................................................................................................................................32 5.3 Storende factoren bij gezichtsherkenning ..................................................................................................34 5.4 Algoritmen ..................................................................................................................................................35 5.5 Applicaties ...................................................................................................................................................36 6. Robotic Vision ........................................................................................................................................... 37 6.1 Inleiding ......................................................................................................................................................37 6.2 Wat is Bump Mapping? ...............................................................................................................................38 7. Besluit ....................................................................................................................................................... 38 8. Voetnoot ................................................................................................................................................... 38 9. Woordenlijst .............................................................................................................................................. 39 10. Bronnen ................................................................................................................................................... 40
1. Wat is patroonherkenning? Patroonherkenning kan men omschrijven als een visuele perceptie door een computer die gebruikt maakt van geometrische eigenschapen. In het algemeen gaat dit over objectbeschrijvingen en onderlinge objectrelaties, en de integratie met de uit de artificiële intelligentie afkomstige kennisrepresentatie en cognitieve processor voor de interpretatie van ruimtelijke gegevens. Patroonherkenning is dus de studie over hoe machines de omgeving kunnen observeren. Hoe machines verschillende eigenschappen van objecten kunnen waarnemen, onderscheiden en opslaan om later te hergebruiken. Laten we dan denken aan bijvoorbeeld lengte, breedte, gewicht, aantal , vorm en meer.
1. ENKELE TOEPASSINGEN Barcodes Een barcode is een optische weergave van data, dat leesbaar is door een machine. Het bevat data over het object waar de barcode gerelateerd aan is. De barcode bestaat uit een opeenvolging van lijnen die een code weergeven. De code kan uit cijfers, letters en leestekens bestaan, afhankelijk van welk coderingsysteem ze gebruikt maakt. Lineaire codes De 1-dimensionaal barcode is diegene die we kennen van bijvoorbeeld de supermarkt. Informatie wordt enkel verticaal opgeslagen. De hoogte van de zwarte lijnen spelen geen rol. Daarom is ze ook beperkt, maximaal 48 karakters kunnen in een 1-dimensionale barcode geprint worden. Stacked codes Gestapelde codes hebben meer dan 1 regel waarvan elke regel een lineaire code bevat.
Tweedimensionale codes Deze bevat informatie zowel horizontaal als verticaal. Hierdoor wordt de opslag van karakters opgetrokken naar 2000 a 3000 karakters afhankelijk van welke variant er gebruikt wordt. Voorbeelden zijn de QR-code, MaxiCode, DataMatrix.
Voorbeeld van een 2D-Datamatrix
QR barcodescanner QR staat voor Quick Response. Een QR-code is een tweedimensionale streepjescode en werd ontwikkeld om snel decodeerbaar te zijn. De kleinste QR-code meet 21x21 cellen waarbij elke cell 1 bit representeert. De grootste QR-code meet 105x105 cellen. Vandaag de dag is het 1 van de meest populaire 2D barcodes en erg populair bij de huidige generatie smartphones. De QR-code kun je scannen met de camera van een smartphone door middel van een applicatie (bv: BarcodeScanner). Een paar mogelijkheden welke je kan verwerken in een QR code: *Een websitelink *Rechtstreekse download link voor een applicatie *Contactinformatie *Tekst (max. 7089 tekens)
*SMS *Telefoonnummer *Agenda afspraken
Betalen met QR-codes In december lanceert KBC voor Android en Apple smartphones betalen dmv het scannen van een QRcode, dit kreeg de naam “Scashen”. Dit is een uitbreiding van hun huidige applicatie, waarmee je reeds je rekeningen kon controleren, overschrijvingen doorvoeren en meer. Hoe werkt het? De ontvangende partij meldt zich aan in de KBC-mobile banking app. Hij geeft het bedrag in dat hij wilt ontvangen. Het bedrag wordt samen met zijn rekeninggegevens in een QR-code gestopt. De betalende persoon scant de gegenereerde QR-code met zijn smartphone op het scherm van de ontvanger. In feite wordt de betalingsopdracht gescand, waardoor de betaling via de mobiele applicatie veel sneller en foutlozer kan gebeuren.
Face Unlock op Android smartphone In de allernieuwste versie van Android 4.0, heeft google een face unlock systeem geïmplementeerd. Dit wil zeggen dat de camera op de voorzijde van de gsm gebruikt wordt om karakteristieke eigenschappen van een gezicht op te meten. Indien de karaktereigenschappen van het gescande gezicht overeenkomen met het ingestelde gezicht, dan krijgt u toegang tot de smartphone. Volgende karaktereigenschappen worden gescand: * Afstand tussen de ogen * Breedte van de neus * Diepte van de oogkassen * Vorm van de kaakbeenderen
Augmented reality Augmented reality vervaagt de lijn tussen de reële en virtuele wereld door superpositie van de computer-gegenereerde informatie over de beelden van de echte wereld te plaatsen. Het opent een compleet nieuwe dimensie.
Enkele toepassingen: *Vliegtuigen met head up displays: Informatie wordt in het gezichtsveld van de piloot getoond *Computerspellen: Gefilmde waarnemingen worden verwerkt in het spel/software. *Smartphones: Bij het richten van de camera op een herkent patroon, komt informatie te staan naast de gefilmde waarneming. *Navigatie instructies geprojecteerd op de voorruit dankzij de full color head-up display van BMW.
2.
Vereenvoudigen van complexe afbeeldingen
1. INLEIDING Met de fotografie apparatuur die tegenwoordig beschikbaar is, kan men tegenwoordig extreem realistisch en gedetailleerde foto’s nemen. Voor een computer is het natuurlijk niet voor de hand liggend om een afbeelding weer te geven met miljoenen verschillende kleuren. Hierdoor zijn enkele processen ontstaan die deze complexe afbeeldingen vereenvoudigen en zo makkelijkeren verwerken. Het belang van de patroonherkenning hierbij bestaat er dus in om de onnodige data van afbeeldingen te verwijderen. Ten eerste kan er een overvloed aan kleuren zijn, die de computer niet aankan. Ten tweede kunnen de afbeeldingen ook zo groot zijn, dat ze door de computer moeten onderverdeeld worden om ze te vatten . Ook kan de afbeelding zo onnodig gedetailleerd zijn, terwijl de computer enkel de grote lijnen moet evalueren van de afbeelding. 2. TECHNIEKEN A) RGB-KLEURSYSTEEM 1) INLEIDING
Het RGB-kleursysteem is een kleurcodering, een manier om een kleur uit te drukken met behulp van een combinatie van de drie primaire kleuren Rood-Groen-Blauw. De hoeveelheid van elke primaire kleur die benodigd is om de mengkleur te verkrijgen, wordt uitgedrukt in een getal dat meestal uit 8 bits bestaat en kan variëren tussen 0 en 255. Voor HTML-toepassingen wordt hiervoor veelal het hexadecimale stelsel gebruikt, waarbij de hoeveelheid van elke primaire kleur kan variëren tussen 00 en FF. In toepassingen waar een hogere kwaliteit vereist wordt worden ook wel 12, 16 of nog meer bits per kleur gebruikt, waarmee kleurwaardes tussen 0 en 4095 resp. 0 en 65535 of nog meer aangegeven kunnen worden. Zo bevatten RAW-bestanden van digitale camera's meestal 12-bits kleurwaarden. Hier zijn enkele voorbeelden van de RGB basiskleuren: Zuiver rood: R=255, G=0, B=0 Zuiver groen: R=0, G=255, B=0 Zuiver blauw: R=0, G=0, B=255 Wit: R=255, G=255, B=255 En bij zwart hebben we natuurlijk exact het omgekeerde: R=0, G=0, B=0 Als we een soort grijs willen verkrijgen, moeten de waarden van R, G en B gelijk zijn aan mekaar. Hoe dichter elke waarde bij de 0 is, hoe donkerder. Hoe dichter bij de 255, hoe lichter. Je kan ook bewerkingen doen met dit kleurensysteem: Bijvoorbeeld als je de kleuren met de waarden (160,0,0) en ( 0,0,160) met elkaar wilt mengen, doe je de volgende bewerking: ((160,0,0)+(0,0,160))/2 = (80,0,80). Of als je een kleur wil inverteren: (255,255,255)-( 120,50,20) = (135, 205, 235).
2) KLEURBEREIK RGB
In het plaatje in de link is een chromaticiteitsdiagram (ofwel xy-diagram) te zien, die gebaseerd is op waarden van het kleurenmodel xyY. De haaientand die te zien is, geeft een benadering van het gehele kleurbereik van het menselijk oog aan. RGB beslaat slechts een deel van dit diagram. De hoeken van de driehoek in het diagram geven de coördinaten van de componenten R, G en B weer. Alle mengsels van deze kleuren vallen binnen deze driehoek. Kleuren buiten deze driehoek kunnen dus niet worden weergegeven. Als benadering wordt dan een kleur op de rand van de driehoek gekozen die tenminste dezelfde tint heeft. Deze benadering heeft altijd een lagere verzadiging dan het origineel: het resultaat is enigszins flets. De op RGB-waarde gerangschikte tabel geeft een aantal toepasbare kleuren weer. De zichtbaarheid van deze kleuren op een computerscherm hangt af van de mogelijkheden van de monitor.
B) POSTERISATIE 1) INLEIDING
Posterisatie van een afbeelding is het beperken van het aantal kleuren in een afbeelding. Dit werd oorspronkelijk gedaan met een fotografisch proces om posters te ontwikkelen. Het beste voorbeeld van posterisatie is het GIF afbeeldings-formaat, waarbij om gemakkelijker de grote kleurvakken te kunnen comprimeren, gebruik wordt gemaakt van deze techniek om eerst de grote kleurvakken te creëren. Dit gaat samen met dithering, wat inhoudt dat de verschillen opgevuld worden door afwisselend de toegestane kleuren in stipvorm te gaan afwisselen. 2) TECHNIEK
Het proces van posteriseren gaat als volgt: - Kies een waarde van 1 tot 255 - Deel de waarden van elke pixel door een voorafgekozen waarde - Rond af tot de dichtstbijzijnde integer waarde - Vermenigvuldig opnieuw met de voorafgekozen waarde Een voorbeeld in de praktijk: (224, 135,35) met als deelwaarde 60 We krijgen dan de volgende RGB-waarden: R: 224/60 = 3,73 || R = 4x60 = 240 G: 135/60 = 2,25 || G = 2x60 = 120 B: 35/60 = 0,58 || B= 1x60 = 60 We krijgen nu het resultaat met de RGB-waarde (240,120,60). Als we zo pixel per pixel van een afbeelding
bewerken, wordt deze geposteriseerd. Hier volgen enkele voorbeelden van voor en na posterisatie:
3) OORZAAK
Het effect kan opzettelijk gebruikt worden, of kan ook per ongeluk voorkomen. Als artistiek effect kan posterisatie gecreëerd worden door de meeste photo-editing programma’s, of door fotografische processen te gebruiken. Ongewilde posterisatie, ook banding genoemd, kan voorkomen wanneer de kleur diepte onvoldoende is om accuraat de gradatie van de kleurtoon weer te geven. Posterisatie is een proces in de fotografie dat normale foto’s omzet in een afbeelding van onderscheiden gebieden van verschillende kleur tonen. Deze geposteriseerde afbeelding heeft hetzelfde algemene uitzicht, maar bepaalde delen van de originele afbeelding zijn vervangen door vlakken van meer algemene kleuren. 4) APPLICATIES
Meestal wordt posterisatie gebruikt voor het opsporen van de contouren en voor het vectorizeren van heel realistische afbeeldingen. Dit opsporingsproces start met 1 bit en gaat zo door tot 4 bits per kanaal. Wanneer de bits verhogen, stijgt het aantal niveaus van de helderheid van een kleur. Zo kan een artiest bijvoorbeeld een beschadigde afbeelding door JPEG-compressie posteriseren om zo de contouren van de afbeelding te herstellen.
Vectorisatie - In computer-gesteunde ontwerpen ( CAD’s ) worden de tekeningen , zoals blueprints , gescanned en gevectorizeerd naar CAD bestanden in een proces dat paper-to-CAD conversie of tekenconversie heet. Bvb.
- Geografische informatie system (GIS): Een geografisch informatiesysteem is een informatiesysteem waarmee gegevens of informatie over geografische objecten, zogeheten geo-informatie kan worden opgeslagen, beheerd, bewerkt, geanalyseerd, geïntegreerd en gepresenteerd. Een GIS is een operationeel, ondersteunend informatiesysteem waarbij de data een geografische dimensie hebben, zodat deze gerelateerd kunnen worden naar een bepaalde plek op aarde. Het heeft 3 praktische functies: a) Het omzetten van grote hoeveelheden topografische data in digitale vorm; b) Het ontwikkelen van relational database management systems; c) Het zorgt voor nieuwe vormen van output uit computers zoals plattegronden, kaarten en grafieken. De kracht van een GIS ligt in het vastleggen, combineren, analyseren en presenteren van gegevens met een ruimtelijke component om zo informatie te verkrijgen. Veel gegevens en informatie bevatten een ruimtelijke component zodat we die gegevens en informatie over objecten een plaats op een landkaart kunnen weergeven (geocoderen) en vervolgens de gegevens ruimtelijk met elkaar in verband kunnen brengen
Bvb.
- In grafisch ontwerpen en fotografie, worden de graphics vaak gevectorizeerd voor makkelijker gebruik. C) M ONOCHROOM
Monochrome afbeeldingen zijn afbeeldingen die enkel bestaan uit grijstinten. Zoals hiervoor reeds werd uitgelegd, zijn R, G en B gelijk aan mekaar. Het beste voorbeeld hiervan zijn zwart-wit foto’s. Dit proces is relatief simpel in vergelijking met andere processen zoals posterisatie en vectorisatie. Bij de omzetting naar een monochrome afbeelding gaan we als volgt te werk: we tellen de 3 verschillende waarden op en geven ze vervolgens alle drie het gemiddelde als hun nieuwe waarde. Vb. Op één pixel: (33, 102, 186) ‡ 33+102+186 = 321/3 = 107 ‡ Dus het resultaat wordt: (107,107,107)
D) LICHTHEID/CONTRAST
Het aanpassen van lichtheid en contrast kan van pas komen als laatste bewerking om toch nog het onderscheid te maken tussen donkere en lichte tinten. Contrast kan gebruikt worden om meer onderscheid te maken tussen de verschillende kleurschakeringen. Als er al geposteriseerd is of nog moet geposteriseerd worden dan zal een positieve verandering aan het contrast het aantal kleuren nog meer verminderen. Wat het toonbereik is, kan gecorrigeerd of bepaald worden met behulp van de lichtheidswaarde. Als een afbeelding te donker of te licht is kan er immers moeilijk het onderscheid gemaakt worden tussen de verschillende tonen. Bij posterisatie wordt dan alles ofwel zwart ofwel wit. a) De lichtheid van een afbeelding aanpassen doe je als volgt: - Vermenigvuldig de RGB waarden met een bepaalde factor : f < 1 = donkerder maken, F > 1 = lichter maken - Als de waarde groter is dan 255 dan is de waarde 255 - De formule: (R,G,B)*f Vb. op één pixel: (232,125,32) Voor R: 237*1.10= 260 dus 255 Voor G: 106*1.10=117 Voor B: 50*1.10=55 Dus het resultaat is (255,117,55) ‡ Doe dit op alle pixels en de afbeelding wordt 10% lichter
b) Het contrast van een afbeelding aanpassen doe je als volgt: - Bepaal een contrastwaarde tussen 0 en 1 - Kijk of de R waarde tussen 128 en 255 ligt - JA: tel bij de originele R waarde de contrastwaarde op vermenigvuldigt met128, min het inverse van de R waarde. - NEE: trek van de originele R de contrastwaarde af vermenigvuldigt met128 ,min de waarde van R. - Indien R groter is dan 255, dan is R = 255. Indien R kleiner is dan 0, dan is R = 0. - Herhaal dit voor G en B. De formule: a) Als R,G,B tussen de 128 en 255 ligt: (R,G,B) = (R,G,B)+(v*((128-(255-(R,G,B))))) , met v = contrastwaarde b) Als R,G,B groter is dan 255 dan is R,G,B = 255 c) Als R,G,B tussen de 0 en de 128 ligt: (R,G,B) = (R,G,B)-(v*((128-R))) d) Als R,G,B kleiner is dan 0 dan is R,G,B 0 Vb. op één pixel met contrastwaarde 0.2: (232,125,32) Voor R: 232 is tussen 128 en 255 232+(0.2*((128-(255-132)))=232+21=253 Voor G: 125 is tussen 0 en 128 125-(0.2*(128-125))=125-1=124 Voor B: 32 is tussen 0 en 128 32-(0.2*(128-32))=125-19=106 Dus het resultaat is (253,124,106) Doe dit voor alle pixels van de afbeelding, en je afbeelding zal 20% gecontrasteerd worden.
3. Edge detection 1. DEFINITIE Randdetectie is een methode die op zoek gaat naar betekenisvolle discontinuïteiten in grijswaarden van beelden. Een kleurenbeeld (RGB-waarden) moet dan ook eerst omgezet worden naar grijswaarden, dit kan via de formule grijswaarde = 0.299*R+0.587*G+0.114* B. Het is een methode van segmentatie, het opsplitsen van afbeeldingen in verschillende segmenten. Dit gebeurd volgens bepaalde eigenschappen van de afbeelding om zo de belangrijkste informatie eruit te halen. Een segment binnen een afbeelding wordt gevormd door verschillende pixels die bij elkaar horen en zo een groep vormen. Bij edge detection wordt er gekeken naar de overgang in intensiteit tussen de segmenten. Een overgang of rand duidt op een scheidingslijn tussen de verschillende segmenten. Hierbij moet wel rekening gehouden worden met het feit dat deze scheidingslijnen onderbroken kunnen zijn en dus geen duidelijk segment aanduiden. Hierbij bouwt men marges in om toch het onderscheid te kunnen maken.
Fig. Profiel van een ideale rand (links) en een reële rand (rechts).
De ideale rand heeft een stap-profiel met een verticale overgang. Dit is in praktijk echter niet altijd het geval. Om deze randen dan te berekenen gaat men afgeleiden nemen en hierop verder werken. Fig. Profiel, 1e en 2e afgeleide van een rand
2. SOORTEN Gradient Detection De gradiënt methode detecteert de randen door op zoek te gaan naar de minimum en maximum in de eerste afgeleide van de afbeelding. Voorbeelden van de gradiënt detection zijn Roberts’ Cross, de Sobel operator en de Prewitt operator. De Roberts cross-gradiënt operatoren zijn de meest eenvoudige, maar hebben geen duidelijk centrum. De 3x3-varianten worden vaker gebruikt. Via de Prewitt operatoren bijvoorbeeld kan via het eerste masker de gradiënt in x-richting worden benaderd, via het tweede masker de gradiënt in y-richting. Een variatie hierop zijn de Sobel operatoren, die meer gewicht geven aan het centrale punt en zo enigszins ruis onderdrukken. Enkel de punten waarbij de grootte van de gradiënt boven een bepaalde threshold (drempelwaarde) liggen, worden als randpunten in rekening gebracht.
Roberts Cross De Cross Roberts’ operator was één van de eerste randdetectoren en werd voorgesteld door Lawrence Roberts in 1963. De randen worden berekend via de gradiënt of helling van een afbeelding. De afbeelding wordt opgedeeld in een vierkant met een kruis, dat keer op keer terug wordt opgedeeld in kleinere vierkanten. (2x2 maskers) Men gaat kijken waar de contrasten het grootst zijn en hieruit dan de randen of edges berekenen. Hij neemt 1 masker met waarden en draait dit 90°, hij neemt de som van de waarden en kijkt naar de grootste contrasten.
Fig. Roberts’ Cross masker 1 en masker 2.
Sobel Operator De Sobel operator wordt gebruikt bij beeldverwerking, binnen de randdetectie algoritmen. Hij berekent de gradiënt van de beeldintensiteit op elk punt, hierdoor bekomt men de grootst mogelijke verandering van licht naar donker en het tempo van de verandering. Het resultaat hiervan toont hoe abrupt of vlot het beeld van kleur verandert en dus ook hoe waarschijnlijk het is dat er zich een edge of rand voordoet. De werking, in theorie, bestaat uit een paar van 3x3 maskers. Het tweede masker is hetzelfde als het eerste maar met een draaiing van 90°. De combinatie van deze 2 maskers wordt gebruikt om de absolute grootte van de gradiënt te berekenen.
Fig. Sobel 3x3 maskers. A: Bronbeeld Gx en Gy: 2 beelden die op elk punt de horizontale en vertikale benaderingen van de afgeleide bevatten.
Grijswaarden testbeeld
Genormaliseerde gradiënt van Sobel operator
Genormaliseerde X-gradiënt van Sobel operator operator
Genormaliseerde
Y-gradiënt
van
Sobel
Laplacian of Gaussian (LoG) Deze methode is een voorbeeld van het gebruik van de tweede afgeleide voor randdetectie. De tweede afgeleide of Laplaciaan is vrij gevoelig voor ruis, daarom wordt het beeld eerst Gaussiaans gefilterd alvorens de tweede afgeleide te berekenen. De Gaussiaanse filter zorgt ervoor dat de meeste ruis van de afbeelding verdwijnt door ze ‘glad’ te maken. Dit twee-stappen proces noemt men: Laplacian of Gaussian (LoG). - Afbeelding glad maken door een Gaussiaanse filter. - Tweede afgeleide berekenen van de afbeelding. Men laat een grijswaarde over de afbeelding lopen om de randen op te zoeken. Waar het beeld uniform is, zal de log-waarde nul zijn. Bij een donkerdere kleur geeft de log een positieve reactie en waar ze lichter is, een negatieve. Na deze berekening bekomt men als resultaat: - Nul bij gebieden met constante grijswaarden - Positieve waarden aan de ene kant van een rand - Negatieve waarden aan de andere kant van een rand - Nul bij een bepaald punt op de rand zelf. Het nadeel van de LoG-methode is dat niet enkel randen worden opgespoord maar soms ook gewone overgangen worden aangeduid.
Fig. Gaussian
Laplacian
Laplacian of Gaussian
3. Canny Edge Detector De Canny edge detector werd in 1986 ontworpen door John F. Canny en is één van de krachtigste methodes om randen te detecteren. De doeleinden voor de Canny Edge Detector werden expliciet vooropgesteld: - Goede detectie: zoveel mogelijk ”echte” randen lokaliseren en aanduiden. - Goede lokalisatie: minimale afstand tussen de gedetecteerde rand en de werkelijke rand. - Een rand mag slechts eenmaal aangeduid worden en ruis in het beeld moet zo weinig mogelijk extra randen creëren. De stadia van het Canny algoritme Ruisonderdrukking of smoothing Men gaat de ruis onderdrukken door een filter over de afbeelding te laten lopen, de Gaussiaans filter. Hierdoor bekomt men een beetje een wazige versie van het origineel. Dit zorgt ervoor dat de minder belangrijke pixels van de afbeelding worden vervaagd en zo geen extra onbelangrijke randen kunnen opleveren.
Het zoeken van de gradiënt Het Canny algoritme maakt gebruikt van 4 filters voor de detectie van horizontale, verticale en diagonale randen in het beeld. Voor de berekening van de hoek van deze randen gebruikt men afgeleiden van een operator (Roberts, Prewitt, Sobel). De hoek van de randrichting wordt dan afgerond naar één van de vier hoeken die de horizontale, verticale en diagonale richtingen vertegenwoordigen (0°, 45°, 90° en 135°). Een binaire rand kaart, afgeleid van de Sobel operator, met een drempelwaarde van 80. De randen zijn gekleurd om de richting van de rand aan te geven: - geel voor nul graden - groen voor 45 graden - blauw voor 90 graden - rood voor 135 graden.
Niet maximale suppressie Nu we de intensiteitvariatie in elk punt van de afbeelding kennen, moeten randen nu geplaatst worden waar maxima voor de gradiënt voorkomen en niet-maxima moeten onderdrukt worden. Op deze manier bekomt men een fijne lijn voor de rand.
-
Indien de afgeronde hoek 0° is: de intensiteit zal minder groot zijn aan de noord- en zuidkant van een punt en zal dus worden uitgeveegd.
-
Indien de afgeronde hoek 45° is: de intensiteit zal minder groot zijn aan de noordwest- en zuidoostkant van een punt en zal dus worden uitgeveegd.
-
Indien de afgeronde hoek 90° is: de intensiteit zal minder groot zijn aan de oost- en westkant van een punt en zal dus worden uitgeveegd.
-
Indien de afgeronde hoek 135° is: de intensiteit zal minder groot zijn aan de noordoost- en zuidwestkant van een punt en zal dus worden uitgeveegd.
Edge tresholding Canny gebruikt een drempelmethode met hysteresis. Hierbij worden 2 grenzen(drempels) meegegeven, hoog en laag. Als de waarde van een intensiteit boven de bovengrens ligt, wordt deze onmiddellijk aanvaard als een punt van een rand, ligt deze waarde onder de ondergrens, dan wordt deze onmiddellijk geweigerd. Als de waarde tussen de boven- en ondergrens ligt, wordt er gekeken of deze aansluiten bij een punt met een waarde boven de bovengrens. Hierdoor wordt eventuele ruis die nog overgebleven was na de smoothing ook verder geëlimineerd.
4.
Vormherkenning
1. INLEIDING In het woordenboek betekent vormherkenning: “het identificeren van vormen, patronen of configuraties met behulp van automatische middelen.” in dit hoofdstuk zullen we ons richten op de verschillende manieren waarop dit in de praktijk uitgevoerd wordt. Zo bespreken we onder meer 2 verschillende benaderingen, met behulp van neurale netwerken en met het eenvoudigere systeem van logica, de eigenschappen bij vormrepresentatie, invariantie en het K-nearest neighbour algoritme. In een objectherkenningssysteem heb je te maken met twee belangrijke aspecten die elkaar beïnvloeden: de representatie van een object en het zoekproces. De representatie van een object houdt in dat het object beschreven wordt aan de hand van een beperkt aantal parameters. Belangrijke kenmerken van een object worden gefilterd zodat er een beschrijving ontstaat die het object representeert. Van belang is dat de beschrijving rijk genoeg is. De representatie moet voldoende informatie bevatten om verschillende objecten van elkaar te kunnen onderscheiden, oftewel, het onderscheidend vermogen moet voldoende groot zijn. Aan de andere kant is een beperkt aantal parameters gewenst aangezien het minder rekenintensief is en het zoekproces dus efficiënter zal kunnen worden uitgevoerd.
2. VORMREPRESENTATIE Een puntenwolk in een bepaalde kleurenruimte kunnen we opvatten als een 3-dimensionale geometrische vorm. In deze scriptie zullen de begrippen puntenwolk of puntverzameling overigens hetzelfde betekenen als het begrip vorm. Er bestaan verschillende manieren om een vorm te representeren. Deze technieken kunnen grofweg worden ingedeeld in drie categorieën: ∑ ∑ ∑
De featurevector benadering De relationele benadering Vorm door transformatie
Feature-vector Bij de feature-vector benadering worden bepaalde belangrijke kenmerken van de vorm berekend en als een numerieke vector opgeslagen. De kenmerkwaarden waaruit de vector bestaat zouden, voor algemene object/vormherkenning, moeten bestaan uit invarianten zoals bijvoorbeeld momenten of cross ratio’s. Het verschil tussen twee vormen wordt bepaald door de afstand tussen de twee vectoren die de vormen representeren. Als afstandmaat kan bijvoorbeeld de Euclidische afstand worden gebruikt.
Relationele benadering Bij de relationele benadering wordt een beeld opgedeeld in verschillende componenten. De verschillende onderdelen worden beschreven aan de hand van bepaalde eigenschappen. De totale vorm wordt gerepresenteerd door zowel eigenschappen van de onderdelen als de relatie tussen de onderdelen. Deze benadering wordt niet veel gebruikt voor vormgebaseerde objectherkenning, maar wel voor het herkennen van complexe vormen.
Vorm door transformatie Bij “vorm door transformatie” worden vormen gerepresenteerd door te meten hoeveel het ‘kost’ om een vorm te transformeren naar een andere vorm. Een bepaalde standaard vorm wordt zodanig getransformeerd zodat het overeenkomt met de vorm die je wilt representeren. De verzameling transformaties die hiervoor nodig is geeft een maat voor de overeenkomst tussen de objecten. Als voor twee objecten dezelfde verzameling transformaties nodig is, zullen deze objecten op elkaar lijken. De ‘vorm door transformatie’ benadering ondersteunt geen indexering van de modellen. Het nadeel is dat deze benadering over het algemeen rekenintensief is.
3. INVARIANTIE Om een vorm te representeren worden dus een aantal kenmerken of eigenschappen van de vorm geselecteerd. Hierbij is het van belang dat de geselecteerde eigenschappen invariant zijn voor een bepaalde transformatie. In geometrisch opzicht betekent dit dat deze eigenschappen niet veranderen als de vorm bijvoorbeeld een translatie of rotatie ondergaat. Een simpel voorbeeld van een geometrische eigenschap die invariant is voor rotatie en translatie is de oppervlakte van een 2dimensionale vorm. De oppervlakte zal niet veranderen als een vorm geroteerd of getransplanteerd wordt, maar wél als de vorm groter of kleiner wordt. Dat betekent dat de oppervlakte niet invariant voor schaling. Zo zijn er verschillende geometrische eigenschappen die invariant zijn voor een bepaalde transformatie.
De eigenschappen die we selecteren voor het representeren van de vorm moeten dus invariant zijn voor translatie, rotatie en schaling en voor een algemene situatie ook voor shearing. Als dat mogelijk is, zal de vorm, ongeacht de fotometrische transformatie, dezelfde eigenschappen bezitten. Op basis van deze invarianten kunnen objecten worden herkend.
4. NEURALE NETWERKEN Een andere techniek die gebruikt kan worden zijn neurale netwerken. Deze techniek bestaat uit een netwerk met verschillende lagen, een input laag, een of meerdere verborgen lagen en een output laag. Belangrijk is dat de output als een discrete vector gemodelleerd moet kunnen worden. Er zijn maar een eindig aantal acties die gedaan kunnen worden. Op basis van een bepaalde input wordt de output, de actie die gedaan moet worden, bepaald. De output is de actie die ondernomen moet worden. De roerganger aan boord is met deze techniek uitgerust. Zoals eerder gezegd een zeilboot vaart eigenlijk nooit rechtdoor er moet altijd voor de kracht die op de zeilen staat gecompenseerd worden. Welke kant de boot op wil is het best te meten door de druk die op het roer staat te registreren.
Het principe klinkt heel simpel maar de praktijk is lastiger. Bij elke knoop wordt aan de input van die knoop een bepaald gewicht meegegeven, dat geldt voor de input, hidden en output knopen. Op basis van trainingsdata, waarbij bij elke input de gewenste output bekend is, worden deze gewichten aangepast. Het netwerk moet op basis van deze data getraind worden om de taak uit te voeren. In elke knoop wordt door de input te vermenigvuldigen met een vector van gewichten een bepaalde waarde berekent. Door deze waarde de input te laten zijn van een bepaalde functie (bijvoorbeeld de sigmoid functie, wordt de output van deze knoop bepaald. De waarde van de output komt in meer of mindere mate overeen met de gewenste output. Om het verschil tussen in- en output kleiner te maken worden de gewichten waarmee de input vermenigvuldigd wordt aangepast. Dit kan op basis van verschillende algoritmen. Een van de bekendere algoritmen is het backpropagation algoritm. Dit algoritme werkt met het verschil van de werkelijke output van het netwerk en de gewenste output van het netwerk. Deze fout wordt als volgt gedefinieerd: E := ½ * S(d e D)S(k e outputs) (tkd – okd)2 waarbij D de set van trainingsvoorbeelden is; outputs de verzameling van outputknopen; en t en o de gewenste en werkelijke output van deze knoop k, bij trainingsvoorbeeld d. Daarna wordt op basis van deze fout de waarde van de gewichten aangepast. Deze berekening van de fout gebeurt voor de gewichten van iedere knoop in het netwerk zo wordt het netwerk dus constant aangepast en ‘beter’. De roerganger die aangestuurd wordt door een neuraal netwerk, krijgt de volgende vector van input mee:
∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑ ∑
Schijnbare windsnelheid/-richting Bootsnelheid (SOW) Kompas (COW) WaveRider GPS koers (COG) en snelheid (SOG) Huidige roerhoek Stroomverbruik roer Temperatuur rudder drive Boothelling
Voordelen/Nadelen Een nadeel is wanneer we patroonherkenning gaan toepassen met behulp van een neuraal netwerk, dan zal dit afhankelijk van de gekozen input data weinig accuraat zijn bij hevige kleur of lichtverschillen. Wanneer er bijvoorbeeld een rode tint op een foto aanwezig is en deze is genomen in een slecht verlichtte omgeving, dan zal het algoritme veel moeite hebben om hem te vergelijken met een heldere foto. Verder is het algemeen gezien het gebruik van een neuraal netwerk vrij accuraat en is het onder goede omstandigheden de enige manier om op een degelijke manier 2 afbeeldingen te vergelijken zonder telkens zware aanpassingen te moeten gaan doen aan de programmacode.
5. MET BEHULP VAN LOGICA Een andere methode die meer geschikt is om zelf uit te bouwen en mee te experimenteren als programmeur zal de logische aanpak zijn. Deze is immers veel eenvoudiger te implementeren en zal een veel kleiner programma opleveren. Deze maakt zwaar gebruik van edge detection en gebruikt de randen van objecten als leidraad om ze te herkennen.
Praktijk Om deze logica in de praktijk om te zetten moeten we een aantal stappen doorlopen: 1. Scan de afbeelding 9 pixels per keer in een vierkant van 3x3. Dit geeft ons genoeg data om de hellingsgraag en hoek van randen op een degelijke manier te bepalen en ook uit te vissen wat de hellingsgraad is. 2. Zet de verkregen waarden om in booleaans, zo is de achtergrondkleur false of 0 en de kleur van objecten true of 1. 3. Analyseer de booleaans en bepaal op deze manier de vorm van wat er gescand is in je 3x3 vierkant. Als de middelste kolom pixels van je 3x3 matrix allemaal 1 zijn en de rest 0 dan heb je bijvoorbeeld met een rechte verticale lijn te maken. Bepaal eventueel ook de locatie (x en y) van de uiterste pixel voor later gebruik.
4. Analyseer de data van de verworven 3x3 stukjes in zijn geheel, kijk hoeveel rechte hoeken er zijn, of er rechte lijn aanwezig zijn, of ze in verbinding staan met de hoeken en op welke manier.
In Code Het is ook interessant om dit principe eens te bekijken in pseudocode. Deze code is gebaseerd op bovenstaande afbeelding met pascal code. Gegeven is ons vierkant, dit kan bijvoorbeeld ook aanzien worden als een object “sensor” met 9 eigenschappen. Een eigenschap van type boolean voor elke pixel in de sensor. (Sensor.p1, Sensor.p2,...)
Int rechtHoek =0; Vector rechteHoeken() =0; Als (sensor.p1 ==1) EN (sensor.p2 ==1) EN(sensor.p3 ==0) EN(sensor.p4 ==1) EN(sensor.p5 ==1) EN(sensor.p6 ==0) EN(sensor.p7 ==0) EN(sensor.p8 ==0) EN(sensor.p9 == 0) DAN
BEGIN rechteHoek = rechteHoek +1 rechteHoeken(rechteHoek) =x,y EINDE_ALS_DAN /* op dezelfde manier wordt een waarde vertikaleLijn1, vertikaleLijn2 en horizontaleLijn1 en horizontaleLijn2 opgeslagen, 2 omdat een vierhoek, waar we gaan achter zoeken, altijd 2 gespiegelde zijden zal hebben.*/ ALS (rechteHoek ==4) EN (vertikaleLijn1 > 0) EN (vertikaleLijn2 > 0) EN (horizontaleLijn1 > 0) EN (horizontaleLijn2 > 0) DAN BEGIN Bool vierHoek == waar EINDE_ALS_DAN ALS (rechteHoek ==4) EN (vertikaleLijn1 > 0) EN (vertikaleLijn2 > 0) EN (horizontaleLijn1 > 0) EN (horizontaleLijn2 > 0) EN (horizontaleLijn1 == horizontaleLijn2) EN (horizontaleLijn2 == vertikaleLijn1) EN (vertikaleLijn1 == vertikaleLijn2) DAN BEGIN Bool vierKant == waar EINDE_ALS_DAN /* In dit basisvoorbeeld gaan we er van uit dat de coordinaten overbodig zijn en dat als er 2 horizontale lijnen, 2 vertikale lijnen en 4 rechte hoeken zijn dat we een vierhoek hebben en dat als deze zijden gelijke zijn, we een vierkant hebben. Men kan dit simpele stukje code echter bedriegen door vreemde figuren te gaan tekenen.*/
Voordelen/Nadelen Het grootste nadeel is dat alle vormen moeten geprogrammeerd worden en dat dit kan leiden tot zeer ingewikkelde logische structuren. De vele en ingewikkelde logische structuren gecombineerd met de iteratie bij het scannen van de bitmap (afbeelding) en eventueel de trage API/framework methodes om de pixels te bestuderen kunnen leiden tot een zeer hoog CPU gebruik en zijn dus zeer resource intensief. Doordat alles moet geprogrammeerd worden is het onmogelijk om complexe structuren te herkennen. Een voordeel is echter wel, dat indien ze goed geprogrammeerd is, deze methode zeer accuraat is. Men kan zelfs objecten gaan vectoriseren en bewerken.
6. K-NEAREST NEIGHBHOUR ALGORITME Een ander veelgebruikt algoritme binnen de patroonherkenning is het K-nearest neighbor of K-NN algoritme. Dit algoritme kan bepalen welke objecten zich het dichtst bij een bepaald punt bevinden. K-NN is een type van leeralgoritme dat gebaseerd is op instanties van objecten, dit wordt ook wel lazy learning genoemd. Het wordt zo genoemd omdat d locatie ongeveer bepaald wordt en de methode vrij is van enige geavanceerde berekeningen. Een object wordt beoordeeld met de hulp van andere objecten in de buurt. Men moet het zien als iemand die een fluitsignaal geeft in een massa mensen met allemaal hetzelfde gehoor, het aantal mensen dat het fluitsignaal hoort zal een keuze moeten maken uit 2 beslissingen. Er wordt democratisch gestemd en de beslissing met het meeste stemmen wordt aangenomen. Deze beslissing is de klasse van het object. De basis van een KNN algoritme is een kennis over het onderwerp zelf. Eigenlijk alle basisregels staan in een of meerdere kennissystemen. We zullen als onderwerp een zeilschip nemen. Een aantal voorbeelden: IF (vlaag en koers aan de wind) THEN (loef op(loefwaarde)); IF (draai van de wind af) THEN (zet zeilen ruimer(trimwaarde)).Zo zouden er op elk gebied heel veel regels op te stellen zijn om een computersysteem te laten weten wat je er zou moeten gebeuren. We weten de richting waarin we moeten reageren, alleen we kunnen niet kwantificeren hoever we in deze richting moeten gaan. Dat baseren we op gevoel op intuïtie. We weten niet hoeveel we op moeten loeven, niet weten hoeveel ruimer de zeilen moeten staan, hoe hard we moeten remmen. Dat hangt van een groot aantal factoren af.
Bij een kNN komen al deze factoren op verschillende assen te staan, zodat er een n-dimensionale ruimte ontstaat. Daarna worden verschillende voorbeeldsituaties in deze ruimte gemarkeerd zodat een grote puntenwolk ontstaat. Stel er is een nieuwe situatie x := (a1(x), a2(x),…an(x)) waarvan we willen weten wat er dan moet gebeuren. Dan definiëren we de afstand van x tot de rest van de punten als d(xi, xj) º Ö(ån(r=1) (ar(xi) – ar(xj))2), de standaard euclidische afstand. Dan is de dichtstbijzijnde buur de het punt waarvoor deze afstand minimaal is. De k in kNN is het aantal buren wat we meenemen om de klasse van x te bepalen. Als k=1 dan nemen we alleen de dichtstbijzijnde buur in beschouwing, als k=151 de dichtstbijzijnde 151 buren. Het aantal buren zal natuurlijk afhangen van de hoeveelheid data en hoe goed de data zijn. Het kan ook nog zijn dat we van de k dichtstbijzijnde buren een gemiddelde waarde nemen. Op basis van dit principe zijn veel verschillende variaties mogelijk. We kunnen door toevoeging van gewichten het ene attribuut belangrijker maken dan de andere. Op deze manier kunnen we juist die kleine gevoelsmatige dingen aan een computer aanleren.
Praktisch voorbeeld In onderstaande afbeelding bevinden zich 3 honden en 3 katten. Onze bol in het midden is onbepaald, maar dankzij K-nearest neighbour zal hij te weten komen of hij tot de katten of de honden behoort We gaan er van uit dat onze bol zich bevind op positie {50,50}(x,y) De dieren bevinden zich op: Hond 1 = {45,45} Hond 2 = {70,20} Hond 3 = {30,80} Kat1 = {65,55} Kat2 = {55,70} Kat3 = {10,10} We berekenen met Pythagoras* de afstand van alle dieren tot de bol en rangschikken deze: Hond 1 = (50-45)^2 + (50-45)^2 = SQRT(50) = 7,07 Hond 2 = (70-50)^2 + (50-20)^2 = SQRT(1300) = 36,06 Hond 3 = (50-30)^2 + (80-30)^2 = SQRT(1300) = 36,06 Kat 1 = (65-50)^2 + (55-50)^2 = SQRT(250) = 15,81 Kat 2 = (55-50)^2 + (70-50)^2 = SQRT(425) = 20,62 Kat 3 = (50-10)^2 + (50-10)^2 = SQRT(3200) = 56,57 Rangschik op afstand beginnende bij de minste : {H1,, K1, K2, H2, H3, K3}
Onze K waarde is 3, dus de eerste 3 waarden zijn belangrijk: {H1, K1, K2} 2 van de 3 waarden zijn katten dus hoort onze bol bij de katten.
*formule = (MAX(x1,x2)-MIN(x1,x2))^2 + (MAX(y1,y2)-MIN(y1,y2))^2 = SQRT (afstand)
5.
Gezichtsherkenning
1. INLEIDING 1.1 De ontwikkeling Biometrie werd in 14de eeuw al gebruikt door Chinese handelaars voor het nemen van voetafdrukken, handafdrukken. In 19de eeuw vinden de fransen een systeem uit op basis van lengte van hoofd en ledematen. Dit was echter niet nauwkeurig genoeg waarna ze overschakelden naar vingerafdrukken. Aan het eind van de 20ste eeuw duidt biometrie op een identificatiemethode aan de hand van UNIEKE lichaamskenmerken. Zo herken je ook een vriend aan de hand van zijn stem of zelfs manier waarop hij hoest of een trap oploopt… Als je dit soort gegevens in een database gaat opnemen, kan je nog nauwkeuriger identificeren Automatische gezichtsherkenning werd bedacht door Woody Bledsoe, Helen Chan Wolf, Charles Bisson. 1.2 Het verschil tussen Face Recognition en Face detection. A) Face detection: De techniek om automatisch een gezicht kunnen bepalen in een beeld. Bijvoorbeeld bij het scherpstellen van fotocamera, volgen van persoon op webcam, activatie van toegangssysteem bij waarneming van personen, … Facebook heeft dit ook geïmplementeerd en het hoeft zeker niet ingewikkeld te zijn om dit voor elkaar te krijgen, kijk maar naar onderstaande php-code (in groen onze commentaar). Voordeel van php-code is dat deze makkelijk op gratis webhosts kan worden gebruikt.
[email protected]
// De klasse “Face_Detector” aanmaken en alle benodigde variabelen declareren. class Face_Detector { protected $detection_data; protected $canvas; protected $face; private $reduced_canvas; // Bestand “detection.dat” openen (bestand waar vectors in staan, opgemaakt op basis van de “Eigenfaces”). public function __construct($detection_file = 'detection.dat') {
}
if (is_file($detection_file)) { $this->detection_data = unserialize(file_get_contents($detection_file)); } else { // fout geven wanneer “detection.dat” niet bestaat… throw new Exception("Couldn't load detection data"); }
// Foutmelding geven wanneer de afbeelding niet werd gevonden (afbeelding wordt aangeroepen door extern script). public function face_detect($file) { if (!is_file($file)) { throw new Exception("Can not load $file"); } $this->canvas = imagecreatefromjpeg($file); $im_width = imagesx($this->canvas); $im_height = imagesy($this->canvas); // Eventueel afmetingen van bestand aanpassen alvorens te beginnen met de gezichtsdetectie. $ratio = 0; $diff_width = 320 - $im_width; $diff_height = 240 $im_height; // Ratio bepalen door simpele berekening. if ($diff_width > $diff_height) { $ratio = $im_width / 320; } else { $ratio = $im_height / 240; } // Ratio bepalen en evt de afbeelding resamplen. if ($ratio != 0) { $this->reduced_canvas = imagecreatetruecolor($im_width / $ratio, $im_height / $ratio); imagecopyresampled($this->reduced_canvas, $this->canvas, 0, 0, 0, 0, $im_width / $ratio, $im_height / $ratio, $im_width, $im_height); $stats = $this->get_img_stats($this->reduced_canvas); $this->face = $this->do_detect_greedy_big_to_small($stats['ii'], $stats['height']); $this->face['x'] *= $ratio; $this->face['y'] *= $ratio; $this->face['w'] *= $ratio; } else { $stats = $this->get_img_stats($this->canvas); $this->face = $this->do_detect_greedy_big_to_small($stats['ii'], $stats['height']); } return ($this->face['w'] > 0); }
$stats['ii2'],
$stats['width'],
$stats['ii2'],
$stats['width'],
// Functie om rechthoek rond het gezicht te tekenen en daarna een nieuw jpg bestand te creëren. public function toJpeg() { $color = imagecolorallocate($this->canvas, 255, 0, 0); //red imagerectangle($this->canvas, $this->face['x'], $this->face['y'], $this->face['x']+$this->face['w'], $this>face['y']+ $this->face['w'], $color);
}
header('Content-type: image/jpeg'); imagejpeg($this->canvas);
/* Added by codediesel */ public function cropFace() { $canvas = imagecreatetruecolor($this->face['w'], $this->face['w']); imagecopy($canvas, $this->canvas, 0, 0, $this->face['x'], $this->face['x'], $this->face['w'], $this->face['w']); header('Content-type: image/jpeg'); imagejpeg($canvas); } public function toJson() { return "{'x':" . $this->face['x'] . ", 'y':" . $this->face['y'] . ", 'w':" . $this->face['w'] . "}"; } public function getFace() { return $this->face; } protected function get_img_stats($canvas){ $image_width = imagesx($canvas); $image_height = imagesy($canvas); $iis = $this->compute_ii($canvas, $image_width, $image_height); return array( 'width' => $image_width, 'height' => $image_height, 'ii' => $iis['ii'], 'ii2' => $iis['ii2'] ); } // Het eigenlijke algoritme voor de gezichtsdetectie. protected function compute_ii($canvas, $image_width, $image_height ){ $ii_w = $image_width+1; $ii_h = $image_height+1; $ii = array(); $ii2 = array(); for($i=0; $i<$ii_w; $i++ ){ $ii[$i] = 0; $ii2[$i] = 0; } for($i=1; $i<$ii_w; $i++ ){ $ii[$i*$ii_w] = 0; $ii2[$i*$ii_w] = 0; $rowsum = 0; $rowsum2 = 0; for($j=1; $j<$ii_h; $j++ ){ // Gezicht detecteren aan de hand van bepaalde kleuren: rood-, groen-, blauw- en grijswaarden. $rgb = ImageColorAt($canvas, $j, $i); $red = ($rgb >> 16) & 0xFF; $green = ($rgb >> 8) & 0xFF; $blue = $rgb & 0xFF; $grey = ( 0.2989*$red + 0.587*$green + 0.114*$blue )>>0; // this is what matlab uses $rowsum += $grey;
$rowsum2 += $grey*$grey; $ii_above = ($i-1)*$ii_w + $j; $ii_this = $i*$ii_w + $j; $ii[$ii_this] = $ii[$ii_above] + $rowsum; $ii2[$ii_this] = $ii2[$ii_above] + $rowsum2; } } return array('ii'=>$ii, 'ii2' => $ii2); } // Eerst de afbeelding verkleinen om daarna de functie detect_on_sub_image toe te passen. protected function do_detect_greedy_big_to_small( $ii, $ii2, $width, $height ){ $s_w = $width/20.0; $s_h = $height/20.0; $start_scale = $s_h < $s_w ? $s_h : $s_w; $scale_update = 1 / 1.2; for($scale = $start_scale; $scale > 1; $scale *= $scale_update ){ $w = (20*$scale) >> 0; $endx = $width - $w - 1; $endy = $height - $w - 1; $step = max( $scale, 2 ) >> 0; $inv_area = 1 / ($w*$w); for($y = 0; $y < $endy ; $y += $step ){ for($x = 0; $x < $endx ; $x += $step ){ $passed = $this->detect_on_sub_image( $x, $y, $scale, $ii, $ii2, $w, $width+1, $inv_area); if( $passed ) { return array('x'=>$x, 'y'=>$y, 'w'=>$w); } } // end x } // end y } // end scale return null; } // Deze functie roept het algoritme van hierboven op en gebruikt dit om het “vak” van het gezicht op te sporen en de coördinaten ervan te bepalen. protected function detect_on_sub_image( $x, $y, $scale, $ii, $ii2, $w, $iiw, $inv_area){ $mean = ( $ii[($y+$w)*$iiw + $x + $w] + $ii[$y*$iiw+$x] - $ii[($y+$w)*$iiw+$x] - $ii[$y*$iiw+$x+$w] )*$inv_area; $vnorm = ( $ii2[($y+$w)*$iiw + $x + $w] + $ii2[$y*$iiw+$x] - $ii2[($y+$w)*$iiw+$x] - $ii2[$y*$iiw+$x+$w] )*$inv_area - ($mean*$mean); $vnorm = $vnorm > 1 ? sqrt($vnorm) : 1; $passed = true; // Verschillende stages doorlopen om het nauwkeuriger te bepalen. for($i_stage = 0; $i_stage < count($this->detection_data); $i_stage++ ){ $stage = $this->detection_data[$i_stage]; $trees = $stage[0]; $stage_thresh = $stage[1]; $stage_sum = 0; for($i_tree = 0; $i_tree < count($trees); $i_tree++ ){ $tree = $trees[$i_tree];
$current_node = $tree[0]; $tree_sum = 0; while( $current_node != null ){ $vals = $current_node[0]; $node_thresh = $vals[0]; $leftval = $vals[1]; $rightval = $vals[2]; $leftidx = $vals[3]; $rightidx = $vals[4]; $rects = $current_node[1]; $rect_sum = 0; for( $i_rect = 0; $i_rect < count($rects); $i_rect++ ){ $s = $scale; $rect = $rects[$i_rect]; $rx = ($rect[0]*$s+$x)>>0; $ry = ($rect[1]*$s+$y)>>0; $rw = ($rect[2]*$s)>>0; $rh = ($rect[3]*$s)>>0; $wt = $rect[4]; $r_sum = ( $ii[($ry+$rh)*$iiw + $rx + $rw] + $ii[$ry*$iiw+$rx] - $ii[($ry+$rh)*$iiw+$rx] $ii[$ry*$iiw+$rx+$rw] )*$wt; $rect_sum += $r_sum; } $rect_sum *= $inv_area; $current_node = null; if( $rect_sum >= $node_thresh*$vnorm ){ if( $rightidx == -1 ) $tree_sum = $rightval; else $current_node = $tree[$rightidx]; } else { if( $leftidx == -1 ) $tree_sum = $leftval; else $current_node = $tree[$leftidx]; } } $stage_sum += $tree_sum;
} if( $stage_sum < $stage_thresh ){ return false; }
} return true; } }
Bovenstaande code bevat dus een algoritme voor gezichtsdetectie. Met dit stukje code kan je tenslotte een voorbeeldafbeelding aanroepen: face_detect('sample-image3.jpg'); $face_detect->toJpeg(); ?>
B) Face recognition: De techniek om het gezicht van een persoon te kunnen herkennen adhv. een database. ∑
De zintuiglijke herkenning gaan we niet bespreken. Dit ligt te ver buiten ons vakgebied. Indien je hier meer wil over weten, zoek dan vooral naar informatie over face recognition units / person identity nodes.
∑
Biometrische herkenning ‡ Daarover gaat deze paper an sich.
2. METHODES Gezichtsherkenning gebeurt eigenlijk in 2 fases: gezichtsverificatie (of authenticatie) en gezichtsidentificatie (of herkenning). De detectiefase is de eerste fase; het houdt in dat men in een afbeelding het gezicht gaat identificeren en lokaliseren. De herkenningsfase is de 2de stage; het doet aan “feature extraction”, waar belangrijke informatie voor uitsluiting wordt opgeslagen (afwijkingen ten opzichte van de standaard). De volgende stap is de is de “matching” waar er aan de hand van een database wordt bepaald om welke persoon het mogelijk gaat.
De algoritmen voor gezichtsherkenning baseren zich meestal op deze populaire methodes: 2.1 Hollistische methode (bv. Principal Component Analysis): Beeld van het volledig gezicht wordt gebruikt als ruwe input voor de gezichtsherkenning. Deze methode werd bedacht door Kirby en Sirovich, gevolgd door Turk en Pentland.
“Eigenfaces” is een voorbeeld van zo’n methode, waarbij elk gezicht een cijfer krijgt die de gelijkheid bepaald met 1 van de 150 “eigenfaces”. Voorbeeld: Het doel is om een data set X met een dimensie M te transformeren naar een alternative data set Y met een kleinere dimensie L.
We zoeken dus de matrix Y, waar Y de KLT is van matrix X. (KLT staat voor Karhunen-Loève en is een methode om een matrix te transformeren.) Er bestaan uiteraard meer effectieve algoritmen om zo’n datasets te verkleinen, maar dat is voor ons praktisch onmogelijk om deze wiskundig uit te leggen. Klein stukje van zo’n vector: <eigenValMat type_id="opencv-matrix">
1 282 f 0.34181419 0.19757725 0.06377244 0.05054977 0.04179541 0.03427688 0.02712310 0.02265564 0.01491164 0.01424638 0.01335784 0.01192172 0.01028384 9.38471127e-003 7.81029137e-003 7.07055628e-003 6.28382387e-003 5.75089548e-003 5.55924466e-003 5.23460563e-003 4.88551939e-003 4.54483042e-003 4.06458415e-003 3.74942925e-003 3.48540139e-003 3.34350881e-003 3.08938324e-003 2.96708965e-003 2.68809707e-003 2.57129292e-003 2.31426908e-003 2.17649224e-003 2.01089145e-003 1.95215398e-003 1.81012414e-003 1.63213140e-003 1.60404481e-003 1.54402026e-003 1.48148614e-003 1.40520057e-003 ………
Bij PCA moet recht in de camera worden gekeken, dit is dus een 2D-methode. ∑
Bv. Voorgedefinieerde blokken en daarin kleurvariaties zoeken. (bv in blok A linkeroog), verband van kleur tussen oogbol, iris, lens, huid).
∑
Vastleggen van interessante punten op gezichten die tov elkaar op dezelfde plaats staan.
2.2 Lokale op kenmerken gebaseerde methode: Lokale kenmerken worden uit het beeld gehaald, bv. ogen, neus en de mond. De locatie en uiterlijk zijn input voor de herkenningsfase. Een vaak gebruikt algoritme hiervoor is EBGM (Elastic Bunch Grap Matching, wordt ook hieronder uitgelegd…).
2.3 Neurale netwerken: Dit systeem is in staat op bepaalde configuratie van het netwerk te leren en later terug te vinden adhv. een gedeelte van de totale invoer bij een configuratie. Dus daarmee kan je foto uit een groter publiek (bv. alle reizigers van bepaalde luchtmaatschappij) vergelijken met database op basis van enkele zichtbare kenmerken op die moment. + Voordeel: Er is maar een gedeelte aan invoer nodig heeft om al een resultaat te krijgen. (Reizigers gaan immers nooit rechtstreeks in camera’s kijken.) - Nadeel: Hoe meer er moet gecontroleerd worden, hoe meer rekenkracht er nodig is. De vraag die een organisatie zich dan moet stellen; is de prijs/prestatie nog gerechtvaardigd?
‡ Beide systemen hebben voor- en nadelen. Er moet gekeken worden naar de perfecte ratio tussen accuratesse en ongemak. Je kan dus niet zeggen dat het ene beter is dan het andere, dat hangt af van de situatie. ß
Een legerbasis heeft bv. meer nood aan accuratesse dan een andere toepassing. Door gezicht bv. in verplichte beugel te plaatsen is het nauwkeuriger maar op een vliegveld zou dit veel te lang duren.
3. STORENDE FACTOREN BIJ GEZICHTSHERKENNING Op zich is gezichtsherkenning zeer gevoelig voor detail. Kleine zaken kunnen al snel het hele systeem ontregelen. Hoe komt dit? En hoe kunnen we dit verbeteren? ∑
Vermindering van nauwkeurigheid door het feit dat biometrische systemen tijdens ontwikkelingsperiode getraind zijn op niet-representatieve groepen van proefpersonen. ‡ Systemen meteen trainen op een bepaalde doelgroep. Niet kant-en-klaar in gebruik nemen, maar aanpassen op de situatie.
∑
Iemand die echt niet wil herkend worden, kan het ook moeilijker maken voor het systeem. (Fixeren op bepaalde emotie om minder verdacht te worden door het systeem of andere emotie tonen als op de originele referentiefoto.)
∑
Stelling: Een foto voor het systeem houden is bij slechte systemen mogelijk om te frauderen. Wat is hiervoor de oplossing? - Bewegingsdetectie: een persoon knippert onbewust met zijn ogen of beweegt zijn pupillen. - Infraroodcamera: controleren en vergelijken of bepaalde velden in het gezicht een bepaalde temperatuur hebben.
∑
Elk jaar kan er tot 5% van de nauwkeurigheid verloren gaan door veroudering. Stel dat paspoorten elke 4 jaar vernieuwd worden, heb je dan 20% verlies over die 4 jaar?
Algoritmen voor gezichtsherkenning: 4. ALGORITMEN ∑
Principal Component Analysis (PCA): (zie hierboven)
∑
Linear Discriminate Analysis (LDA): Discriminantanalyse. Afmetingen gezicht van persoon X stoppen we in Vector X, afmetingen gezicht persoon Y, stoppen we in vector Y. Door gebruik te maken van discriminantanalyse kunnen we een lineaire combinatie van eigenschappen vinden die 2 of meer gezichten zal karakteriseren of scheiden.
∑
Elastic Bunch Graph Matching (EBGM): optimaliseert tweedimensionale afwijkingen van overeenkomstige pixels tussen onderworpen beelden.
∑
Hidden Markov Model (HMM): is een set van statistische modellen die worden gebruikt om de statistische eigenschappen van een signaal/object te karakteriseren.
∑
Dynamic link matching: is een neurale gemotiveerd model voor gezichtsherkenning. Het maakt gebruik van “wavelet” transformaties voor het coderen van binnenkomende beeldgegevens. De technologie bestaat uit een algoritme dat binnenkomende beelden vergelijkt, waarin verschillende gewichten aan eigenschappen wordt gegeven.
5. APPLICATIES Voorbeeldapplicaties op computer ∑ ∑
Face detection tool ‡ Hiervan staat er php-code in dit hoofdstuk. Face recognition tool ∑
Het voorbeeld dat ik heb maakt gebruik van Open CV Face Detector. ‡ Face detection heeft 90-95% nauwkeurigheid wanneer persoon rechtstreeks in de camera kijkt. Dit daalt echter wanneer het gezicht zijwaarts of in een andere hoek worden bekeken. ‡ Face recognition heeft maar 30-70% nauwkeurigheid. (Nochtans al veel ontwikkeling gehad sinds jaren ’90). Tijdens onze presentatie tonen we dit aan het publiek met het inbrengen van 3 van onze gezichten. We dienen op te letten dat er niet te veel licht rechtstreeks in de webcam zit, zonder dat het te donker is.
Realtime In welke situaties wordt er nog gezichtsherkenning toegepast? Zijn we ons daar eigenlijk wel altijd van bewust? ∑ ∑
∑
∑
Fysische beveiliging (Bijvoorbeeld toegangscontrole) Casino’s ß Methode tegen bedriegen (zitten bepaalde spelers te lang en te vaak bij elkaar?). ß Identificatie om (geregistreerde) valsspelers te weren uit casino. Luchthaven ß In de Australische luchthavens is er een systeem dat “SmartGate” heet. Dit systeem werd ontworpen om verdacht gedrag op te sporen en vergelijkt jou tevens met de digitale foto op jouw paspoort. Een voorbeeld van de mogelijkheid om verdacht of agressief gedrag op te sporen kan worden getoond adhv. de “Face.com API”: http://developers.face.com/tools/#faces/detect Auto’s ß Ooglidcontrole => Valt de chauffeur in slaap?
6.
Robotic Vision
1. INLEIDING Robotic vision is de mogelijkheid van een computer om te kunnen ‘zien’. Een systeem dat gebruik maakt van robotic vision kan de beelden halen van één of meer videocamera’s. De beelden worden verstuurd naar een computer of robot-controller. Robotic vision kan vergeleken worden met stemherkenning qua complexiteit. Twee belangrijke specificaties in elk ‘vision’-systeem zijn: de ‘gevoeligheid’ en de ‘resolutie’. ‘Gevoeligheid’ is de mogelijkheid van een machine om te kunnen zien bij weinig licht of om zwakke impulsen waar te nemen bij onzichtbare golflengtes. Resolutie is de mate waarin een machine een onderscheid kan maken tussen objecten. In het algemeen betekent dit, hoe beter de resolutie, hoe beperkter het gezichtsveld is. Gevoeligheid en resolutie zijn dus van elkaar afhankelijk. Als je alle andere factoren ongewijzigd zou laten en je verhoogt de gevoeligheid, dan zou de resolutie dalen. Omgekeerd geldt dit uiteraard ook, hoe hoger de resolutie, hoe lager de gevoeligheid. Het menselijk oog kan elektromagnetische golven waarnemen tussen 390nm en 770nm. Videocamera’s hebben deze beperking niet en kunnen veel meer golflengtes waarnemen. Deze kunnen zelfs de golven waarnemen van: infrarood, ultraviolet en X-ray. Voorbeelden van toepassingen van Robotic Vision zijn: - Het analyseren van elektronische onderdelen - Herkenning van handtekeningen/handschrift - Herkennen van objecten - Patroonherkenning - Inspectie van materialen - Medische beeldanalyse - Valuta-inspectie
2. WAT IS BUMP MAPPING? Bump mapping wordt gebruikt om een afbeelding meer gedetailleerd te maken. Daarvoor doet bump mapping een beroep op berekeningen om lichtreflectie te berekenen. Op deze manier worden kleine hobbeltjes (bumps) gecreëerd op het oppervlakte om deze textuur te geven. De oppervlakte van het object wordt als het ware niet veranderd. Deze hobbeltjes worden aangebracht door het combineren van een serie grijs getinte pixels met gekleurde pixels op het gekleurde object. Lichtere grijs getinte pixels zorgen voor het gevoel dat er meer reliëf is of meer indrukking, de donkere pixels geven minder dit effect. Een computer moet een 3D grafische kaart hebben die ondersteuning voor bump mapping heeft indien men een applicatie wil draaien die hiervan gebruik maakt. Als de grafische kaart bump mapping niet ondersteunt zal dit effect uiteraard niet te zien zijn. Meestal zorgen programmeurs wel voor een alternatieve versie zodat mensen zonder 3D grafische kaart zodat ook zij kunnen genieten van hun applicatie. Bump mapping zorgt er dus voor dat een vlakke figuur en een 3 dimensionaal object samen worden gesmolten om de textuur in het 3D object te bekomen. Dit werkt ook in de andere richting, computers zullen de donkere en de lichtere stukken van een afbeelding aanzien als groeven en verhogingen. Op deze manier kan mits enige verwerking berekend worden hoe ver een object verwijderd is.
7.
Besluit
Door het schrijven van deze paper met betrekking tot patroonherkenning en gezichtsherkenning hebben we geleerd dat er meerdere technieken zijn om objecten of voorwerpen te herkennen in een vlak. Er zijn verschillende methodes, maar welke methode je ook kiest, computers zijn te beperkt in hun kunnen om een ingewikkelde afbeelding, inclusief haar kleuren en haar vormen, zonder enige verwerking te herkennen. Deze verwerking die noodzakelijk is opdat computers de afbeelding toch zouden kunnen herkennen kan bestaan uit bvb. posterisatie, het desatureren en het aanpassen van lichtheid en contrasten.
8.
Voetnoot
Met speciale dank aan meneer Maerivoet voor de begeleiding en het bijsturen
9.
Woordenlijst
Geometrisch: Meetkundig, betrekking hebbend op de geometrie. Niet alleen over vormen op zich kan worden gezegd dat ze geometrisch zijn; men kan ook de gehele bouwwijze als geometrisch bestempelen. Cognitief: Met betrekking tot het kennen, het waarnemen en het overdenken van de buitenwereld. Discontinuïteit: Een functie is `discontinu` in een punt indien de functie daar niet continu is. Intuïtief betekent dit dat de functie daar niet in één vloeiende lijn getekend kan worden: er is bijvoorbeeld een gat of een sprong. Biometrie: Geautomatiseerd gebruik van fysiologische of gedragseigenschappen om de identiteit van iemand te verifiëren of vast te stellen. Vectoriseren: Het aanbrengen van coördinaatpunten in een afbeelding op plaatsen waar meerdere lijnen samenkomen om zo de vorm van de afbeelding nog te kunnen beïnvloeden achteraf.
10. Bronnen http://alitarhini.wordpress.com/2010/12/05/face-recognition-an-introduction/ http://www.smallscreendesign.com/2011/02/07/about-face-detection-on-android-%E2%80%93part-1/ http://android-er.blogspot.com/2010/05/android-facedetector.html http://stackoverflow.com/questions/6825778/face-recognition-api-for-java-android https://github.com/mhendred/face4j http://www.tutkiun.com/2011/01/face-detector-in-mobile-os.html http://code.google.com/p/jviolajones/ http://faint.sourceforge.net/ http://www.richardnichols.net/2011/01/java-facial-recognition-haar-cascade-with-jjil-guide/ http://en.wikipedia.org/wiki/Geographic_information_system http://nl.wikipedia.org/wiki/RGB-kleursysteem http://en.wikipedia.org/wiki/Posterization http://ronbigelow.com/articles/posterization/posterization.htm http://www.cambridgeincolour.com/tutorials/posterization.htm http://nl.wikipedia.org/wiki/Monochroom http://www.gis.com/ http://www.gis.com/content/what-gis http://en.wikipedia.org/wiki/Computer-aided_design http://people.revoledu.com/kardi/tutorial/KNN/index.html http://nl.wikipedia.org/wiki/Neuraal_netwerk http://clgiles.ist.psu.edu/papers/IEEE.TNN.face.recognition.hybrid.nn.pdf http://en.wikipedia.org/wiki/K-nearest_neighbor_algorithm http://www.lkozma.net/knn2.pdf http://www.woorden-boek.nl/woord/vormherkenning http://www.wiskundeforum.nl/viewtopic.php?f=9&t=1290 http://en.wikipedia.org/wiki/K-nearest_neighbor_algorithm http://en.wikipedia.org/wiki/Edge_detection http://marathon.csee.usf.edu/edge/edge_detection.html http://www.cscjournals.org/csc/manuscript/Journals/IJIP/volume3/Issue1/IJIP-15.pdf http://kompoos.nl/php/image-effects/edge-detection.html http://nl.wikipedia.org/wiki/Biometrische_gezichtsherkenning http://www.shervinemami.co.cc/faceRecognition.html http://nl.wikipedia.org/wiki/QR-code http://qrcode.kaywa.com/ http://en.wikipedia.org/wiki/Pattern_matching http://en.wikipedia.org/wiki/Face_recognition http://face.com/ https://market.android.com/details?id=visidon.AppLockPlus&feature=more_from_developer http://stackoverflow.com/questions/3593420/android-getting-source-code-from-an-apk-file http://electronics.howstuffworks.com/gadgets/high-tech-gadgets/facial-recognition.htm http://www.google.be/url?sa=t&rct=j&q=microsoft%20facial%20recognition&source=web&cd=1&sq i=2&ved=0CBsQFjAA&url=http%3A%2F%2Fdownload.microsoft.com%2Fdownload%2FC%2F8%2F8% 2FC88B493F-0A8B-4040-A935CF8AB63859C7%2FFaceRecognition.Technical.doc&ei=dLi6Tvz_NZHLtAbEs7igBA&usg=AFQjCNG4O43 mVNq6TeG9eg9Ku51SHCKYWg&sig2=yBEOrXbkZCqZuL8twx3-iA http://www.infotech.oulu.fi/Annual/2002/mvis.pdf http://www.slideshare.net/rash637/ppt-on-robot-vision