Eigenfaces: Recovering Humans from Ghosts

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

Having more by having less… Easy! Tämä koneoppimismenetelmä auttaa sinua tallentamaan enemmän tietoa pienempään kokoon vain muutamilla lineaarialgebran perusteilla. Sen avulla saamme ihmiskasvot takaisin joistakin aaveenmuotoisista sotkuista.

Sinulle on varmaan kerrottu, että riippumattomat vektorit luovat tiloja abstrakteilla tavoilla. Kuvittele nyt ihan oikeasti. Kaikki tilat muodostuvat vektoreista ja niin ovat myös näiden tilojen sisällä olevat asiat. Jotkut näistä vektoreista vaikuttavat joihinkin asioihin enemmän kuin toiset. Muut voivat olla niiden ohella mitättömiä, ja ehkä meidän ei tarvitse tietää niistä, koska emme periaatteessa välitä emmekä halua kantaa niiden ongelmia mukanamme. Juuri näin näytän tässä postauksessa tehdä ominaistiloista.

Kuvio 2: ei tätä avaruutta, vaan myös tätä avaruutta (lähde: https://img.purch.com/w/660/aHR0cDovL3d3dy5saXZlc2NpZW5jZS5jb20vaW1hZ2VzL2kvMDAwLzA5Ny85NTcvb3JpZ2luYWwvc3BhY2UuanBn)

Periaatteellinen aiheemme on PCA. Se on laajalti käytetty algoritmi eri aiheissa. Sen käyttäminen kasvoihin tekee niistä paremmin ihmisen tulkittavissa olevia, joten se on yksi suosituimmista sovelluksista. Eigenfaces on menetelmä, joka on käyttökelpoinen kasvojen tunnistamisessa ja havaitsemisessa määrittämällä kasvojen varianssit kasvokuvakokoelmassa ja käyttämällä näitä variansseja kasvojen koodaamiseen ja purkamiseen koneoppimiseen perustuvalla tavalla ilman täyttä informaatiota vähentäen laskennan ja tilan monimutkaisuutta. Vaikka Turk ja Pentland käyttivät sitä ensimmäisen kerran vuonna 1991, ja sillä on rajoituksia nykyiseen tekniikkaan verrattuna, sen perusteet ovat edelleen erittäin hyödyllisiä uusille käytännöille.

Kuvio #3: LFW (lähde: http://vis-www.cs.umass.edu/lfw/Six_Face_Panels_sm.jpg)

Ennen kuin siirrymme toteutukseen, esittelen lyhyesti mainitut peruskäsitteet. Lisäksi löydät koko skriptin ja käyttämäni datasetin (pieni osa LFW_cropped) täältä.

Eigenvektorit ja itseisarvot

Me kaikki tiedämme, miten ominaisvektorit ja itseisarvot tarkalleen ottaen toimivat. Emme ehkä ihan tarkalleen, mutta olemme kuulleet niistä vaikka kuinka monta kertaa. Tässä on selitys kaltaiselleni vähemmistölle, joka jatkuvasti unohtaa.

Oletetaan neliönmuotoinen A-matriisi. Lähes kaikki vektorit muuttavat suuntaa, kun ne kerrotaan A:lla, kuten odotamme. On kuitenkin tiettyjä vektoreita x, joilla on täsmälleen sama suunta kuin Axilla. Joten… Arvaa mitä? Ne ovat ominaisvektorimme. Erikoisia… Vaikka ne ovat samansuuntaisia, Ax ja x voivat silti olla suuruusluokaltaan kaksi eri vektoria. Tässä on tuttu yhtäläisyys. Ax=λx. Se, mikä tekee noista kahdesta yhtäläisen, on λ, meidän suuruuden tasoittava skalaarimme, itseisarvomme. Tämä kertoo meille, miten omavektorimme muuttui kertolaskun jälkeen

Yllä olevasta voi päätellä, miksi ne ovat käytännössä hyödyllisiä. Syvällisempää ymmärrystä ja luultavasti arvostusta varten mene MIT:n Eigenvalues and Eigenvectors -lukuun.

Principal Component Analysis (PCA)

PCA:n päätavoite on dimensioiden vähentäminen. Sillä on monia sovelluksia visualisoinnissa, ominaisuuksien louhinnassa, tietojen pakkaamisessa jne. Sen ideana on projisoida alkuperäinen data lineaarisesti alempiulotteiseen aliavaruuteen, joka tarjoaa pääkomponenttien (ominaisvektoreiden) maksimaalisen varianssin projisoidulle datalle ja/tai minimaalisen vääristymisvirheen projisoinnista. Lopulta molemmat johtavat samaan tulokseen, joka on paras rekonstruktiokaava. Sivuhuomautuksena tätä aliavaruutta kutsutaan pääasialliseksi aliavaruudeksi.

Laskelmia varianssin maksimoimisesta ja vääristymävirheen minimoimisesta löydät ANU:n luentomonisteesta PCA:sta. Myös toinen video youtubessa nimeltään Principal Components Analysis -Georgia Tech-Machine Learning auttoi minua ymmärtämään käsitteet paljon paremmin.

Toteutus

Ok! Kaikki valmiina toteutukseen. Ensin tuodaan tarvittavat kirjastot. Oletan teidän kaikkien tietävän, mitä varten ne ovat. Keskityn algoritmien selitysosaan. Jos teillä on muuta kysyttävää koodista, jättäkää vastaus alle.

Sitten tarvitsemme funktion, joka visualisoi datakokonaisuutemme kuvat hyvännäköisesti. Tässä se on.

Pannaan se datasettiimme lfwcrop_grey.zip. Tässä otan vain ensimmäiset 1000 kasvoa laskennallisen monimutkaisuuden vuoksi, mutta sillä ei oikeastaan ole väliä. Jos haluat mennä täysillä, niin siitä vaan. Muunnin kuvat myös numpy-matriisiksi (muoto 1000, 64, 64) käsittelyä varten.

Leave a Reply