Eigenytor: Att återskapa människor från spöken

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

Att få mer genom att få mindre… Enkelt! Den här metoden för maskininlärning hjälper dig att lagra mer information i mindre storlekar med bara några grunder i linjär algebra. På så sätt kommer vi att återskapa mänskliga ansikten från några spökformade röror.

Du måste ha fått veta att oberoende vektorer skapar utrymmen på ett abstrakt sätt. Föreställ dig nu på riktigt. Alla utrymmen bildas av vektorerna och så även sakerna i dessa utrymmen. Vissa av dessa vektorer bidrar till vissa saker mer än andra. De andra kanske är försumbara vid sidan av dem och kanske behöver vi inte känna till dem eftersom vi i princip inte bryr oss och inte vill bära deras problem med oss. Det är precis vad jag kommer att visa hur man gör med egenytor i det här inlägget.

Figur nr 2: inte det här utrymmet men också det här utrymmet (källa: https://img.purch.com/w/660/aHR0cDovL3d3dy5saXZlc2NpZW5jZS5jb20vaW1hZ2VzL2kvMDAwLzA5Ny85NTcvb3JpZ2luYWwvc3BhY2UuanBn)

Vårt huvudämne är PCA. Det är en algoritm som används i stor utsträckning inom en mängd olika ämnen. Att använda den på ansikten gör dem mer människotolkningsbara och är därför en av de mest populära tillämpningarna. Eigenfaces är en metod som är användbar för ansiktsigenkänning och -detektering genom att bestämma variansen av ansikten i en samling ansiktsbilder och använda dessa varianser för att koda och avkoda ett ansikte på ett maskininlärningsmässigt sätt utan full information, vilket minskar beräkningskomplexiteten och utrymmeskomplexiteten. Även om metoden användes för första gången 1991 av Turk och Pentland och har begränsningar jämfört med dagens teknik, är dess grunder fortfarande mycket fördelaktiga för nya metoder.

Figur nr 3: LFW (källa: http://vis-www.cs.umass.edu/lfw/Six_Face_Panels_sm.jpg)

För att gå vidare till genomförandet vill jag ge er en liten introduktion till de grundläggande begrepp som nämns. Du kan också hitta hela skriptet och datasetet (en liten del av LFW_cropped) som jag använde här.

Eigenvektorer och egenvärden

Vi vet alla hur egenvektorer och egenvärden exakt fungerar. Kanske inte exakt men vi har hört talas om dem många gånger. Här är en förklaring för den minoritet som jag som ständigt glömmer det.

Låt oss ha en kvadratisk A-matris. Nästan alla vektorer ändrar riktning när de multipliceras med A som vi förväntar oss. Det finns dock vissa vektorer x som har exakt samma riktning som Ax. Så… gissa vad? Det är våra egenvektorer. Speciella… Även om de har samma riktning kan Ax och x fortfarande vara två olika vektorer med tanke på deras storlek. Här är en välkänd likhet. Ax=λx. Det som gör dessa två lika är λ, vår skalär för utjämning av magnituden, vårt egenvärde. Detta kommer att berätta för oss hur vår egenvektor förändrades efter multiplikationen

Från ovanstående kan du berätta varför de är användbara i praktiken. För en djupare förståelse och förmodligen uppskattning gå till MIT:s kapitel om egenvärden och egenvektorer.

Principal Component Analysis (PCA)

Det huvudsakliga målet med PCA är dimensionalitetsreduktion. Den har många tillämpningar inom visualisering, utvinning av funktioner, datakomprimering osv. Tanken bakom PCA är att linjärt projicera originaldata till ett mindre dimensionellt underutrymme som erbjuder de viktigaste komponenterna (egenvektorer) maximal varians av de projicerade data och/eller minimalt förvrängningsfel från projiceringen. I slutändan leder båda till samma resultat, vilket är den bästa rekonstruktionsformeln. För övrigt kallas detta delområde för principal subspace.

För beräkningar av maximal varians och minimalt förvrängningsfel kan du gå till ANU:s föreläsningsanteckningar om PCA. Även en annan video på youtube som heter Principal Components Analysis -Georgia Tech-Machine Learning hjälpte mig att förstå begreppen mycket bättre.

Implementation

Ok! Alla är redo för genomförandet. Först ska vi importera de nödvändiga biblioteken. Jag antar att ni alla vet vad de är till för. Jag kommer att fokusera på förklaringsdelen av algoritmerna. Om ni har några andra frågor om koden kan ni lämna ett svar nedan.

Därefter behöver vi en funktion för att visualisera bilderna från vår datamängd på ett snyggt sätt. Här är den.

Vi lägger den på vårt dataset lfwcrop_grey.zip. Här tar jag bara de första 1000 av ansiktena på grund av beräkningskomplexiteten men det spelar egentligen ingen roll. Om du vill gå fullt ut så gör det. Jag omvandlade också bilderna till numpy array (formad 1000, 64, 64) för bearbetning.

Leave a Reply