T-61.2010 Syksy 2012



T-61.2010 Harjoitustyö: #1 "Ominaiskasvot"

Pääkomponenttianalyysin (PCA) käyttäminen kuva-aineistoon.

Sisältö


Työn tekijä:

Opiskelija: Matti Meikäläinen

Opiskelijanumero: 12345A

Sähköpostiosoite: mmeikala@cc.hut.fi

Esitiedot

Tehtävää varten on hyvä lukea luvun 4 aiheet PCA:sta ja dimensionaalisuuden pienentämisestä, lukea "paperilaskarien" PCA-tehtävät toiselta harjoituskierrokselta, käydä läpi toisen tietokonelaskarin PCA-demot, kerrata matriisilaskun perusteet ja ominaisarvojen laskeminen sekä tutustua Matlabin käyttöön.

Tehtäväkuvaus

Tämän tehtävän tarkoituksena on demota luennoilla esitettyjä ominaiskasvoja ja PCA-projektiota.

Työtä varten jokaiselle opiskelijalle on oma Matlab-datatiedosto, josta ladataan joukko harmaasävyvalokuvia, jotka esittävät kasvoja. Jos datasettiä ei löyty, ota yhteyttä Maria Osmalaan, etunimi.sukunimi at aalto.fi.

Tehtävänä on:

Asiaa on käsitelty datamatriisin tiivistämisen ja dekorreloinnin luennolla, luentokalvojen luvussa 4 sekä toisen kierroksen paperi- ja tietokonelaskareissa. Avainsanoja ovat "PCA - Principal Component Analysis" ja "eigenfaces".

Työ tehdään ja dokumentointi palautetetaan yksin oman datasetin pohjalta. Harjoitustyöstä keskusteleminen ryhmissä on sallittua ja suositeltavaa. Koodin kopiointi on kielletty Aallon vilppitapausten toimintaohjeen mukaisesti: Aalto-yliopiston opiskelua koskevat eettiset säännöt ja niiden rikkomusten käsittely.

Dokumentointi

Tästä työstä tulee palauttaa dokumentti ja koodi sähköpostin liitteenä viimeistään 15.1.2013 klo 16:00 mennessä sähköpostiosoitteeseen maria.osmala at aalto.fi. Sähköpostin otsikoksi: "T-61.2010 harjoitustyo #1 OPNRO", jossa OPNRO korvataan omalla opiskelijanumerolla.

Viestissä pitää olla kaksi liitetiedostoa, joista ensimmäisessä liitteessä tulee olla työstä kirjoitettu dokumentti. Siitä pitää käydä ilmi työn tekijä, opiskelijanumero ja sähköpostiosoite, lyhyt selostus työn vaiheista ja tulokset kuvina. Mahdollinen yhteistyö sekä lähteet tulee mainita. Lopussa tulee vastata pohdintaosan (9) kysymyksiin. Tiedoston pitää olla PDF-muodossa ja nimetty muotoon "DT2011_HT1_doc_<opnro>.pdf" eli esimerkiksi "DT2011_HT1_doc_12345A.pdf".

Toisessa liitteessä on käytetty Matlab-koodi yhdessä ajokelpoissa tiedostossa (pääte .m), jonka muoto "DT2011_HT1_m_<opnro>.m", kuten yllä.

Matlabin funktiota datan ja kuvien käsittelyyn

Vinkkejä Matlabin yleiseen käsittelyyn löytyy myös kurssin tietokoneharjoituksista TK2 sekä Internetistä.

Kurssin www-sivulta löytyy myös apufunktioita:

Matriisien käsittelyyn ja analysointiin:

Tässä työssä datamatriisi koostuu harmaasävykuvista. Matlabin Image Processing Toolbox (IPT) sisältää funktiota kuvien käsittelyyn. Ehkä parhaimman kuvan asiasta saa avaamalla Matlab ja etsimällä IPT:n johdannon tai kirjoittamalla "doc images".

Mukana on mm. funktioita:

Kuvatietokanta

Tässä tehtävässä käsitellään eri ihmisten kasvokuvia. Yhdestä ihmisestä voi olla useampi erilainen kuva. Kasvokuva on rajattu varsin tarkasti ja silmien, nenän ja suun sijainti on kaikissa kuvissa suurinpiirtein samassa kohtaa. Kuvat ovat harmaasävykuvia ja samankokoisia. Ehdotetun menetelmän osalta kuvan koko täytyy olla "hyvin pieni".

Hae oma henkilökohtainen kuvatiedosto XXXXXY.mat (Aihe #1) osoitteesta http://www.cis.hut.fi/Opinnot/T-61.2010/Harjoitustyo/Data_HT1_S2012/.

Lisäksi alkuperäisestä tietokannasta on otettu pieni erä ei-kasvokuvia, joita tarvitset myös tehtävän lopussa: NONFACE.zip.

Käytetty kuvatietokanta on MIT:n tarjoama CBCL http://cbcl.mit.edu/cbcl/software-datasets/FaceData2.html

Copyright 2000. Center for Biological and Computational Learning at MIT and MIT. All rights reserved.

Permission to copy and modify this data, software, and its documentation only for internal research use in your organization is hereby granted, provided that this notice is retained thereon and on all copies. This data and software should not be distributed to anyone outside of your organization without explicit written authorization by the author(s) and MIT. It should not be used for commercial purposes without specific permission from the authors and MIT. MIT also requires written authorization by the author(s) to publish results obtained with the data or software and possibly citation of relevant CBCL reference papers.

We make no representation as to the suitability and operability of this data or software for any purpose. It is provided "as is" without express or implied warranty.

Tehtävänannossa käytettävät muuttujat

Seuraavassa tehtävänannossa käytettyjä muuttujia. Ainut muuttuja, jonka saat omasta datatiedostostasi, on K.


Esimerkkiajo

(1) Kasvokuvien lukeminen Matlabiin

Haetaan oma tiedosto XXXXXY.mat (Aihe #1) osoitteesta http://www.cis.hut.fi/Opinnot/T-61.2010/Harjoitustyo/Data_HT1_S2012/ (HUOM! Jos tiedostoa ei ole olemassa, mailaa maria.osmala at aalto fi, kirjoita viestiin opiskelijanumerosi ja pyydä tiedostoa.)

Luetaan tiedosto komennolla load. Näin on saatu luettua n kuvatiedostoa sisään Matlabin kuvamatriisiin K. Kuvat ovat harmaasävyskaalalla, samankokoisia (r riviä ja c saraketta) ja kuvan kohteet asemoitu. Komennolla montage voi piirtää kuvakokoelman kerralla (tai myMontage, katso yllä).

load([opnro '_train.mat']);     % Tähän oma <opnro>, sisältää matriisin K

r        = size(K,1);
c        = size(K,2);
n        = size(K,4);
datatype = class(K);
disp(['Kuvia on ' num2str(n) ' kappaletta']);
disp(['Kunkin kuvan koko on (' num2str(r) ' x ' num2str(c) ') ja tyyppi ' datatype]);

myMontage(K, 'Alkuperäiset kuvat', 1);


Kuvia on 92 kappaletta
Kunkin kuvan koko on (19 x 19) ja tyyppi uint8

(2) Datamatriisin muodostaminen

Muokataan kukin kuva double-tyyppiseksi ja muodostetaan kustakin kuvasta yksi vektori yhdistämällä sarakkeet (luentokalvoissa riveittäin). Muodostetaan kaikkien kuvien vektoreista matriisi X, jonka rivimäärä on d=rc ja sarakemäärä n.

Kuva- ja datamatriisi
X = myK2X(K); % saa käyttää: 

(3) Pääkomponenttianalyysin (PCA) laskeminen

PCA poistaa korrelaatiot vektorialkioiden välillä ja samalla löytää kierron vektoriavaruudessa siten, että uusilla koordinaateilla on maksimaalisen suuret varianssit.

Lasketaan PCA vaiheittain. Lasketaan ensin datavektoreiden keskiarvo (koko d x 1):

Tämän jälkeen vähennetään saatu keskiarvo datamatriisista. Tällöin datavektoreiden keskiarvoksi tulee nolla. Haetaan sitten kovarianssimatriisi (koko d x d) laskemalla X:n ulkotulo:

Lopuksi lasketaan ominaisarvot ja -vektorit matriisista C_x komennolla eig. Ominaisvektorit on hyödyllistä järjestää niitä vastaavien ominaisarvojen suuruusjärjestykseen.

(4) Datasetin ominaiskasvot

Ominaiskasvot ovat nyt C_x:n ominaisvektorit, jotka ovat matriisissa, jonka koko on (d x d). C_x:n ominaisarvot löytyvät matriisin D diagonaalilta (komento diag) ja ovat siis skalaareja. Piirretään ominaiskasvot komennolla montage (myMontage), mitä varten pitää

L = myX2K(C(???), 19, 19, n); % saa käyttää: 

(5) Kasvokuvien kuvaaminen tasolle

Projisoidaan kaikki kuvat käyttäen kahta suurinta ominaisvektoria. Näin voidaan etsiä kuvien lähekkäisyys.

Poimitaan ominaisarvovektoreista ne kaksi, joiden ominaisarvot ovat suurimmat. Sisältäköön W nämä kaksi ominaisvektoria (d x 2), jolloin kuvat projisoidaan 2D-tasolle:

Y on siis (2 x n). Piirretään n pistettä xy-tasoon esimerkiksi komennolla plot(x,y,'x'), kts. "help plot". Tekstiä (numeroita) voi halutessaan lisätä komennolla text.

Matriisimuodossa Y(2 x n) = W'(2 x dim) * XK(dim x n).

(6) Ei-kasvokuvien kuvaaminen tasolle

Lataa ja pura NONFACE.zip, joka sisältää vastaavankokoisia kuvatiedostoja muista kuin kasvokuvista. Voit käyttää halutessasi myös mitä tahansa muita kuvia.

Lue kuvat Matlabiin ja muokkaa niistä kuva- ja/tai datamatriisi. Yksi tapa Matlabissa on käyttää D = dir('*.pgm');, joka tuottaa D-tietueen. for-loopissa voi lukea tiedostot yksitellen L(:,:,1,k) = imread(D(k).name).

Projisoi tämä datamatriisi (keskiarvoistus?) samalle PCA1-PCA2-tasolle kuin ylläolevat kasvot. Kommentoi tuloksia.

(7) Pakkaaminen - kuvien projektio m-ulotteiseen avaruuteen

Etsitään ensin ominaisarvojen kumulatiivinen summa (Aiemmin etsittiin ominaisarvojen suuruusjärjestys.) Tulostetaan kumulatiivinen summa ominaisarvoista. Pois jätettävistä ominaisarvoista saadaan virhe J

Näin ollen seuraavassa kohdassa voidaan valita sopiva määrä ominaisvektoreja mukaan.

jarj.nro | indeksinro | kumul.summa %
    1.0000    1.0000   54.9890
    2.0000    2.0000   65.0714
    3.0000    3.0000   71.6040
    4.0000    4.0000   76.1306
    5.0000    5.0000   79.4855
    6.0000    6.0000   82.1150
    7.0000    7.0000   84.4082
    8.0000    8.0000   85.9933
    9.0000    9.0000   87.2604
   10.0000   10.0000   88.4974
   11.0000   11.0000   89.5934
   12.0000   12.0000   90.5740

Kompressoidaan dataa siten, että otetaan m ensimmäistä (suurimmat ominaisarvot) ominaisvektoria e_i. m:n suuruus olkoon sellainen, että (7A) 85 prosenttia vaihtelusta otetaan mukaan, (7B) se on yhtä suuri eri ihmisten lukumäärän kanssa.

Pakkauksessa kukin alkuperäinen kuva esitetään siis vektorilla p, jonka dimensio on (m x 1). p ilmaisee siis, mikä on kunkin ominaiskuvan osuus oikeasta kuvasta. Koko kuva-aineiston pakkaaminen vie siis matriisin (m x n) ja ominaiskuvat (d x m)

Matriisimuodossa Y(p x n) = W'(p x dim) * XK(dim x n).

(8) Projektiopisteiden palauttaminen kuviksi d-avaruuteen

Palautetaan kaikki n kappaletta vektoreita p (m arvoa) takaisin kuviksi x_hattu (kukin kuva d = r x c pikseliä) .

Matriisimuodossa XHATTU(dim x n) = W(dim x p) * Y(p x n).

Muokataan matriisi kuvamuotoon takaisin (myX2K) ja piirretään.

(9) Pohdinnat

Pohdi seuraavia kohtia dokumentissasi:



T-61.2010 Harjoitustyö: #2 Vapaavalintainen aihe

Oma työ kurssin aihepiiriin liittyen