ProTip: Du kan også bruge den samme teknik til at implementere din egen version af Snapchats realtids 3D-ansigtsfiltre! nu hvor vi ved, at øjnene og munden er, roterer vi simpelthen, skalerer og forskyder billedet, så øjnene og munden er centreret så godt som muligt. Vi vil ikke lave nogen fancy 3D-kæde, fordi det ville introducere forvrængninger i billedet. Vi vil kun bruge grundlæggende billedtransformationer som rotation og skala, der bevarer parallelle linjer (kaldet affine transformationer):
Nu, uanset hvordan lyset er vendt, vi er i stand til center øjnene og munden er i nogenlunde samme position i billedet. Dette vil gøre vores næste skridt meget mere præcist.
Hvis du vil prøve dette trin selv ved hjælp af Python og dlib, her er koden til at finde ansigt landemærker, og her er koden til at transformere billedet ved hjælp af disse landemærker.
Trin 3: Kodning ansigter
nu er vi til kødet af problemet — faktisk fortæller ansigter fra hinanden. Det er her tingene bliver virkelig interessante!
den enkleste tilgang til ansigtsgenkendelse er direkte at sammenligne det ukendte ansigt, vi fandt i Trin 2, med alle de billeder, vi har af mennesker, der allerede er tagget. Når vi finder et tidligere mærket ansigt, der ligner vores ukendte ansigt, skal det være den samme person. Virker som en ret god ide, ikke?
der er faktisk et stort problem med denne tilgang. Et sted som Facebook med milliarder af brugere og en billion fotos kan umuligt løbe gennem hvert tidligere tagget ansigt for at sammenligne det med hvert nyligt uploadet billede. Det ville tage alt for lang tid. De skal kunne genkende ansigter i millisekunder, ikke timer.
hvad vi har brug for er en måde at udtrække et par grundlæggende målinger fra hvert ansigt. Derefter kunne vi måle vores ukendte ansigt på samme måde og finde det kendte ansigt med de nærmeste målinger. For eksempel kan vi måle størrelsen på hvert øre, afstanden mellem øjnene, næsens længde osv. Hvis du nogensinde har set et dårligt kriminalitetsprogram som CSI, ved du hvad jeg taler om:
ligesom tv! Så ægte! # science
den mest pålidelige måde at måle et ansigt på
Ok, så hvilke målinger skal vi indsamle fra hvert ansigt for at opbygge vores kendte ansigtsdatabase? Øre størrelse? Næse længde? Øjenfarve? Noget andet?
det viser sig, at de målinger, der synes indlysende for os mennesker (som øjenfarve), ikke rigtig giver mening for en computer, der ser på individuelle billedpunkter i et billede. Forskere har opdaget, at den mest nøjagtige tilgang er at lade computeren finde ud af målingerne for at samle sig selv. Dyb læring gør et bedre stykke arbejde end mennesker med at finde ud af, hvilke dele af et ansigt der er vigtige at måle.
løsningen er at træne et dybt indviklet neuralt netværk (ligesom vi gjorde i Del 3). Men i stedet for at træne netværket til at genkende billedobjekter, som vi gjorde sidste gang, skal vi træne det til at generere 128 målinger for hvert ansigt.
træningsprocessen fungerer ved at se på 3 ansigtsbilleder ad gangen:
indlæs et træningsansigtsbillede af en kendt person
indlæs et andet billede af den samme kendte person
indlæs et billede af en helt anden person
så ser algoritmen på de målinger, den i øjeblikket genererer for hvert af disse tre billeder. Det så tweaks det neurale netværk, der lidt, så at det gør, at de målinger, det genererer til #1 og #2 er lidt tættere på og samtidig sikre, at målinger til #2 og #3 er lidt længere fra hinanden:
Efter at gentage dette trin millioner af gange for millioner af billeder af tusindvis af forskellige mennesker, neurale netværk lærer til pålideligt at generere 128 målinger for hver person. Alle ti forskellige billeder af den samme person skal give omtrent de samme målinger.
Machine learning folk kalder de 128 målinger af hvert ansigt en indlejring. Ideen om at reducere komplicerede rådata som et billede til en liste over computergenererede tal kommer meget op i maskinindlæring (især i sprogoversættelse). Den nøjagtige tilgang til ansigter, vi bruger, blev opfundet i 2015 af forskere hos Google, men der findes mange lignende tilgange.
kodning af vores ansigtsbillede
denne proces med at træne et indviklet neuralt netværk til output ansigtsindlejringer kræver en masse data og computerkraft. Selv med et dyrt NVidia Telsa-videokort tager det cirka 24 timers kontinuerlig træning for at få god nøjagtighed.
men når netværket er blevet trænet, kan det generere målinger for ethvert ansigt, selv dem, det aldrig har set før! Så dette trin skal kun udføres en gang. Heldig for os gjorde de fine folk på openface allerede dette, og de offentliggjorde flere uddannede netværk, som vi direkte kan bruge. Tak Brandon Amos og team!
så alt, hvad vi skal gøre os selv, er at køre vores ansigtsbilleder gennem deres forududdannede netværk for at få de 128 målinger for hvert ansigt. Her er målingerne til vores testbillede:
så hvilke dele af ansigtet måler disse 128 tal nøjagtigt? Det viser sig, at vi ikke har nogen anelse. Det betyder ikke rigtig noget for os. Alt, hvad vi bryr os om, er, at netværket genererer næsten de samme tal, når man ser på to forskellige billeder af den samme person.
Hvis du selv vil prøve dette trin, giver OpenFace et lua-script, der genererer indlejringer af alle billeder i en mappe og skriver dem til en csv-fil. Du styrer det sådan her.
dette sidste trin er faktisk det nemmeste trin i hele processen. Alt, hvad vi skal gøre, er at finde den person i vores database med kendte personer, der har de nærmeste målinger til vores testbillede.
Du kan gøre det ved hjælp af en hvilken som helst grundlæggende maskinindlæringsklassificeringsalgoritme. Ingen fancy dybe læringstricks er nødvendige. Vi bruger en simpel lineær SVM-klassifikator, men mange klassificeringsalgoritmer kunne fungere.
alt, hvad vi skal gøre, er at træne en klassifikator, der kan tage målingerne fra et nyt testbillede og fortæller, hvilken kendt person der er den nærmeste kamp. At køre denne klassifikator tager millisekunder. Resultatet af klassifikatoren er navnet på personen!
så lad os prøve vores system. Først trænede jeg en klassifikator med indlejringerne på omkring 20 billeder hver af vil Ferrell, Chad Smith og Jimmy Falon: