Egenflader: Genopretning af mennesker fra spøgelser

Figur #1: Casper the Friendly Ghost (kilde: https://vignette.wikia.nocookie.net/christmasspecials/images/e/e8/Casper.jpg/revision/latest?cb=20121014033319)

Få mere ved at få mindre… Let! Denne maskinlæringsmetode vil hjælpe dig med at gemme flere oplysninger i mindre størrelser med kun nogle grundlæggende principper for lineær algebra. Dermed vil vi genvinde menneskelige ansigter fra nogle spøgelsesformede rod.

Du må have fået at vide, at uafhængige vektorer skaber rum på abstrakte måder. Nu skal du forestille dig for alvor. Alle rum er dannet af vektorer, og det samme er tingene inden for disse rum. Nogle af disse vektorer bidrager til nogle af tingene mere end de andre. De andre er måske ubetydelige ved siden af dem, og måske behøver vi ikke at vide noget om dem, fordi vi i bund og grund er ligeglade og ikke ønsker at bære deres problemer med os. Det er netop det, jeg vil vise dig, hvordan man gør med egenflader i dette indlæg.

Figur #2: Ikke dette rum, men også dette rum (kilde: https://img.purch.com/w/660/aHR0cDovL3d3dy5saXZlc2NpZW5jZS5jb20vaW1hZ2VzL2kvMDAwLzA5Ny85NTcvb3JpZ2luYWwvc3BhY2UuanBn)

Vores hovedemne er PCA. Det er en meget anvendt algoritme inden for en række forskellige emner. Ved at bruge den på ansigter bliver det mere mennesketolkbart, så det er en af de mest populære anvendelser. Eigenfaces er en metode, der er nyttig til ansigtsgenkendelse og -detektion ved at bestemme variansen af ansigter i en samling ansigtsbilleder og bruge disse varianser til at indkode og afkode et ansigt på en maskinlæringsmåde uden den fulde information, hvilket reducerer beregnings- og rumkompleksiteten. Selv om den blev anvendt første gang i 1991 af Turk og Pentland og har begrænsninger i forhold til nutidens teknologi, er dens grundprincipper stadig meget nyttige for nye metoder.

Figur #3: LFW (kilde: http://vis-www.cs.umass.edu/lfw/Six_Face_Panels_sm.jpg)

Hvor vi går videre til implementeringen, vil jeg gerne give dig en lille introduktion om de grundlæggende begreber, der er nævnt. Du kan også finde det fulde script og datasæt (en lille del af LFW_cropped) jeg brugte her.

Eigenvektorer og egenværdier

Vi ved alle, hvordan egenvektorer og egenværdier præcist fungerer. Måske ikke helt præcist, men vi har hørt om dem, ligesom, mange gange. Her er en forklaring til det mindretal som mig, der bliver ved med at glemme det.

Lad os have en kvadratisk A-matrix. Næsten alle vektorer ændrer retning, når de ganges med A, som vi forventer. Der er dog visse vektorer x, som har nøjagtig samme retning som Ax. Sååå… Gæt hvad? Det er vores egenvektorer. Særlige… Selv om de har samme retning, kan Ax og x stadig være to forskellige vektorer i kraft af deres størrelser. Her er en velkendt lighed. Ax=λx. Det, der gør disse to lige, er λ, vores egenværdi, som er vores udligningsskalar, egenværdi. Dette vil fortælle os, hvordan vores egenvektor ændrede sig efter multiplikationen

Fra ovenstående kan du se, hvorfor de er nyttige i praksis. For en dybere forståelse og sandsynligvis forståelse gå til MIT’s kapitel om egenværdier og egenvektorer.

Principal Component Analysis (PCA)

Det vigtigste mål med PCA er dimensionalitetsreduktion. Den har mange anvendelser inden for visualisering, feature ekstraktion, datakomprimering osv. Idéen bag den er at projicere de oprindelige data lineært til et mindre dimensionelt underrum, der tilbyder de vigtigste komponenter (egenvektorer) maksimal varians af de projicerede data og/eller minimal forvrængningsfejl fra projektionen. I sidste ende fører begge dele til det samme resultat, nemlig den bedste rekonstruktionsformel. Som en sidebemærkning kaldes dette underrum for principal subspace.

For beregninger af maksimering af varians og minimering af forvrængningsfejl kan du gå til ANU’s forelæsningsnoter om PCA. Også en anden video på youtube kaldet Principal Components Analysis -Georgia Tech-Machine Learning hjalp mig med at forstå begreberne meget bedre.

Implementation

Ok! Alle er klar til implementering. Først vil vi importere de nødvendige biblioteker. Jeg går ud fra, at I alle ved, hvad de er til. Jeg vil fokusere på forklaringsdelen af algoritmer. Hvis I har andre spørgsmål til koden, så efterlad et svar nedenfor.

Så har vi brug for en funktion til at visualisere billederne fra vores datasæt på en flot måde. Her er den.

Lad os lægge den på vores datasæt lfwcrop_grey.zip. Her tager jeg kun de første 1000 af ansigterne på grund af den beregningsmæssige kompleksitet, men det er egentlig ligegyldigt. Hvis du ønsker at gå fuldt ud, så gør det bare. Jeg transformerede også billeder til numpy array (formet 1000, 64, 64, 64) til behandling.

Leave a Reply