TIES411 - Kohteiden tunnistus ja pääkomponenttianalyysi.

* Huom. Tämä on testaamatta.*

Aihe

Tämän tutoriaalin tavoite

Tämän tutoriaalin tavoite

Jatketaan piirreavaruuksien kanssa touhuamista. Tällä kertaa pyrimme ratkaisemaan kysymystä “kuuluuko piirrepiste X mihin annetuista joukoista Y_i”. Toisinsanoen, jos meillä on vaikkapa kuvasarjat muttereista ja ruuveista niin aiomme määritellä algoritmeja, jotka kertovat kumpi esineistä on seuraavassa kuvassa. Tätä kutsutaan luokitteluksi.

Käsite on piirreavaruuden kannalta muotoiltuna hyvin laaja. Voimme luokitella kuvapisteet tai niiden pienet ympäristöt “taustaksi” ja “kohteeksi” eli erottaa kuvasta vaikkapa kasvot tai rekisterikilvet. Lisäksi pystymme erottamaan kohteet toisistaan: “kuvassa on Matti” tai “kuvassa on mutteri”.

Peruslähtökohta luokittelutehtävien ratkaisuun koostuu seuraavista vaiheista:

  1. Näytteiden hankinta
  2. Näytejoukon jakaminen koulutus- ja testijoukoiksi
  3. Piirrevektoreiden irroittaminen (Ts. näytteiden kuvaus piirreavaruuteen)
  4. Piirrevektoreiden skaalaaminen/esikäsittely koulutusjoukon pohjalta
  5. Luokitinmenetelmän parametrien kalibrointi
  6. Luokittimen ‘koulutus’
  7. Testaus koulutusjoukolla.

Tässä tutoriaalissa esittelemme olennaiset menetelmät esimerkein ja jätämme lukijan tehtäväksi kokonaisen ketjun muodostamisen.

Alustavat toimenpiteet

Ennen kuin voimme lähteä ratkaisemaan luokittelutehtävää, meidän täytyy hankkia riittävä määrä aineistoa, joka kattaa mahdollisimman laajasti tunnistettavat kohteet, sillä koneoppimisen ongelmiin kuuluu usein se, että niiden yleistyskyky on ihmiseen verrattuna alkeellinen ja esimerkiksi kuvien tapauksessa pelkkä ennenäkemätön valaistusolosuhde voi estää luokittimen toiminnan.

Lisäksi on ehdottoman tärkeää erottaa koulutusaineistosta testiaineisto, sillä tarvitsemme jonkun keinon tarkastaa, että luokittimemme pystyy yleistämään. Esimerkiksi, jos yritämme oppia tunnistamaan kuvasta koiran viiden esimerkkikuvan perusteella on helppo luoda luokitusmenetelmä, joka tunnistaa aina ehdottomasti alkuperäiset viisi esimerkkiä, mutta ei koskaan mitään muuta.

Näytejoukon keräämisen jälkeen kuvaamme kohteet mielestämme asianmukaiseen piirreavaruuteen ja alamme pohtia luokittelua.

Piirrevektoreiden esikäsittely ja pääkomponenttianalyysi

Tämä teksti pohjautuu artikkeliin Eigenfaces for recognition

Kuten aiemmissa tutoriaaleissa olemme huomanneet, piirreavaruutemme koostuvat usein pisteistä, joiden välillä ei ole yleispätevästi määriteltävää metriikkaa. On esimerkiksi varsin tapauskohtaista päättää kuinka kaukana pisteet (1 metri, vaalean vihreä) ja (1.2 metriä, sininen) ovat toisistaan. Kuitenkin, kaikki luokitinmenetelmät toimivat nimeomaan metriikan perusteella, joten meidän on pakko valita jokin metrinen piirreavaruus.

Jos käyttäisimme yksinkertaisia piirteitä, kuten kohteen pituus, leveys ja väri, voisimme luultavasti määritellä tapauskohtaisesti jonkin tehtävään sopivan skaalauksen muuttujien arvoille. Kuitenkin, jos piirreavaruudemme on monimutkainen ja moniulotteinen, emme tähän pysty. Tarkastellaan esimerkkinä perinteistä naiivia kasvojentunnistusongelmaa, jossa pyrimme tunnistamaan onko seuraavan henkilö

Epäilyttävä tyyppi

Epäilyttävä tyyppi

tässä kuvagalleriassa:

Henkilöt

Henkilöt

käyttäen piirrevektorina kuvan kaikkia pikseleitä. Ts. piirrevektorimme koostuu kuvan kuvapisteiden harmaasävyarvoista lueteltuna järjestyksessä vasemmasta yläkulmasta oikeaan alakulmaan.

\(F_{kuva}(I) = \left\{ \left[\begin{array}{c} I(x,y)\end{array}\right] \bigg| (x,y) \in \text{dom}(I) \right\}\),

Tällöin esimerkiksi jokainen \(100\times 100\)-kokoinen kuva muodostaa 10 000 elementtiä pitkän piirrevektorin ja hyvin hankalan luokittelutehtävän. Metriikka-ajattelun kannalta voisimme toki toivoa, että jos laskemme tälläisten vektoreiden etäisyydet toisistaan niin samankaltaisten ihmisten kuvat olisivat lähellä toisiaan. Valitettavasti vain näin ei ole. Vektorit eivät kuvaa mitään järjellistä ominaisuutta kuvassa.

Seuraavaksi havaitsemme sen, että kasvokuvat ovat pieni osajoukko kaikista mahdollisista kuvista. Näinollen voisi toivoa, että ne virittäisivät oman, yksinkertaisemman aliavaruuden, jossa tunnistustehtävä helpottuisi. Herää kysymys, olisiko mahdollista keksiä sellainen kanta, jossa kuvat olisi helpompi erottaa toisistaan?

Fourier-muunnoksella voisimme tarkastella taajuuskomponentteja, mutta ihmisten erottaminen toisistaan sen perusteella, että toisen kuvassa on enemmän korkeataajuuskomponentteja ei kuullosta kovin lupaavalta. Sen sijaan voimme käyttää erästä 1900-luvun alussa keksittyä menetelmää, eli pääkomponenttianalyysiä, joka pyrkii esittämään datajoukon sellaisessa koordinaatistossa, jossa se on mahdollisimman korreloimaton, tai toisinsanoen, avaruudessa minkä kantavektorit mukailevat dataa mahdollisimman hyvin:

Pääkomponenttianalyysi

Pääkomponenttianalyysi

Pääkomponenttianalyysillä voidaan myös selvittää kuinka paljon datajoukon vaihtelusta selittyy kunkin kantavektorin mukaan, eli jos datamme on kovin moniulotteista, mutta se koostuu hyvin samankaltaisista näytteistä, kuten vaikkapa kasvokuvista, voimme valita tunnistamista varten ne kantavektorit, jotka selittävät eniten datan rakenteesta.

Menetelmän idea selviää yo. kuvasta:

  1. Lasketaan piirrevektoreiden \(V_i\) keskiarvo \(M\)
  2. Lasketaan piirrevektoreiden sijainnit \(M\) keskeisessä koordinaatistossa \(C_i=V_i-M\)
  3. Lasketaan pisteiden \(C_i\) kovarianssimatriisi \(\Sigma\) \(\Sigma=\frac{1}{n} C C^T\). Kovarianssimatriisi kertoo datajoukon pisteiden vaihtelun ja yhteisvaihtelun määrän.
  4. Laske kovarianssimatriisin ominaisvektorit ja ominaisarvot. Ominaisvektorit muodostavat uuden kannan ja ominaisarvot kertovat datan vaihtelun kyseisen vektorin suuntaan. (Idea: Kovarianssimatriisi kuvaa yksikköpallon ellipsiksi datan ympärille ja ominaisarvot antavat ellipsin puoliakselit. Testaa kynällä ja paperilla)

  5. Koska kuvavektorin pituus saattaa olla hyvin suuri, niin huomataan, että sen ominaisvektorit voidaan laskea helpomminkin. Jos \(v_i\) on matriisin \(C^T C\) ominaisvektori, niin \(C^T C v_i = s v_i\). Kertomalla \(C\):llä vasemmalta, saamme \(C C^T (C v_i) = s (C v_i)\) ja näinollen huomaamme, että \(C v_i\) on \(C C^T\):n ominaisvektori. Koska \(C^T C\) matriisissa on vain näytteiden määrän neliön verran alkioita, eikä suinkaan kuvan pikseleiden neliön verran, tämä on huomattavasti kevyempi laskutoimitus.

Jos sovellamme tätä menettelyä kasvogalleriaamme, saamme seuraavat kantavektorit, jotka ovat takaisin kuvaksi muutettuina seuraavan näköiset.

Eigenfaces: Kasvokuvagallerian pääkomponenttien mukaiset kantavektorit kuvina

Eigenfaces: Kasvokuvagallerian pääkomponenttien mukaiset kantavektorit kuvina

Tuttuun tapaan, voimme nyt projisoida kuvasta \(i\) muodostetun piirrevektorin \(V_i\) pääkomponenttien muodostamaan kantaan \(P_n(v_i)=<v_i|e_n>\) (missä \(e_n\) merkitsee \(n\):ttä pääkomponenttia.) Tämä on operaation kustannus on lineaarinen kuvan koon suhteen, eli menetelmä on hyvin nopea sen jälkeen kun pääkomponentit ovat löytyneet.

Lyhyenä haittapuolena kerrottakoon, että luokitustehtävissä olennainen informaatio ei aina ole suinkaan suurimman varianssin selittävänä akselina. (Ks. seuraava tehtävä g).

Tehtävä

  1. Laske muutamalle kasvokuvalle niiden etäisyys toisistaan käyttäen suoraa kuvausta piirreavaruuteen.
  2. Millaiset asiat kuvissa näyttäisivät vaikuttavan eniten?
  3. Laske muutamalle kasvokuvalle etäisyys pääkomponenttien määräämässä piirreavaruudessa. Millaiset asiat vaikuttavat nyt?
  4. Entäpä jos käytät vain “voimakkaimpia” pääkomponentteja.
  5. Pystytkö löytämään esimerkkikasvot annetusta kuvakokoelmasta pelkästään vertaamalla kasvojen etäisyyksiä keskenään? (Ks. Kurssisivun repo/ilman_graphicstoolsia.)
  6. Spekuloi mitä tapahtuisi jos kuvissa olisi erilainen valaistus? Voisiko sen korjata?
  7. Entäpä jos ihmisillä on kovin erilaisia ilmeitä? Mitä silloin tapahtuisi? (Ts. miksi passikuvassa ei saa hymyillä.)

Yksinkertaisin luokitin: K-lähintä naapuria

Edellisessä tehtävässä tunnistimme kasvot valitsemalla tunnettujen kasvojen joukosta ne kasvot, jotka olivat piirreavaruudessa lähimpänä etsimäämme. Tämä naiivi strategia on kuitenkin äärimmäisen tehokas luokittelumenetelmä jo sinänsä. Ongelma sen kanssa on lähinnä se, että epäselvissä tapauksissa tulos on arpapeliä. Jos oletamme, että aineistomme olisi kerätty fiksusti ja samasta kohteesta tai henkilöstä olisi useampia eri ilmein varustettuja kasvokuvia voimme laajentaa tunnistusmenetelmäämme hieman vakaampaan suuntaan: Valitaan tunnistettavalle pisteelle K-kappaletta lähimpiä pisteitä piirreavaruudesta ja päätellään kohteen luokka (tai henkilön nimi) vaikkapa sen mukaan, minkä luokan tai henkilön edustajia lähimpien pisteiden joukossa on eniten.

KNN-luokituksen idea

KNN-luokituksen idea

Lisäksi voimme käyttää lähimpiä naapureita arviona sille, kuinka luotettavasti kohde on tunnistettu. Jos lähimmässä naapurustossa ei ole selvää enemmistöä, tunnistustulos on tietysti epävarma.

Koska tässä menetelmässä on jo yksi parametri, se täytyy asettaa myöskin tehtävän mukaiseksi. Jos piirrepisteet ovat selkeästi erillään, pieni K-arvo lienee hyvä valinta ja jos datajoukossa on paljon päällekäisyyttä ja epävarmuutta niin suuri K voisi olla parempi. Kuitenkin, tämä on hyvä testata käyttäen koulutusjoukkoa.

Tehtävä

  1. Etsi parempi luokitin. Selvitä itsellesi yleisellä tasolla, mitä ovat neuroverkot, tukivektorikoneet ja päätöspuut. Sitten mene ja käy tiedonlouhinta tai vastaava kurssi.

K-kertainen ristiinvalidointi

Ristiinvalidointi on menetelmä, jolla luokittimen parametrien ja valittujen piirteiden toimivuutta luokitustehtävässä voi kartoittaa käyttämällä pelkkää koulutusjoukkoa. Tässä tapauksessa koulutusjoukko jaetaan \(N\):hon erilliseen osajoukkoon ja jokaista joukkoa käytetään vuorotellen testiaineistona. Toisinsanoen,

  1. Jaa aineisto \(N\):hon erilliseen osajoukkoon \(S_i\)
  2. Kaikille \(0 < j \leg N\)
    1. Kouluta luokitin käyttäen kaikkia osajoukkoja paitsi joukkoa \(S_j\)
    2. Testaa luokitinta osajoukkoon \(S_j\) ja talleta tulokset
  3. Jokainen näyte on nyt luokitettu kertaalleen joten voit laskea luokitustarkkuuden. Muista varoa tapauksia, joissa luokilla on suuria kokoeroja.

Tämä menettely antaa siis arvioin luokittimen yleistyskyvystä ja sitä voidaan käyttää testatessa eri parametreja (kuten yo. \(K\)-arvon löytämiseksi) tai valitessa sopivia piirteitä. (Ts. Kumpi olisi parempi, skaalaus vai PCA?).

Tehtävä

  1. Jos luokassa A on 10 esimerkkiä ja luokassa B 1000, niin kuinka miten tarkka olisi sellainen luokitin, joka luokittelee kaikki näytteet luokkaan B?
  2. Miten tästä pulmasta selviäisi?

Tehtävä

  1. Hae netissä jokin sopiva kuvajoukko. Esimerkiksi tälläinen silhuettitietokanta.
  2. Jaa kuvat kategorioittain koulutus ja testijoukkoihin.
  3. Arvioi millaiset piirteet soveltuisivat kuvien erottelemiseksi toisistaan.
  4. Kouluta luokitin käyttäen ristiinvalidointia (Voit yksinkertaisuuden vuoksi yrittää erotella vain kahta luokkaa toisistaan. Esimerkiksi yo. datajoukon sateliitit vs. ravut tai lintu vs. supermies).
  5. Kokeile soveltaa PCA:ta piirteisiisi.
  6. Kokeile myös meanshiftiä ja k-meansia. Millaisia klustereita datasta löytyy? Entäpä jos käytät vain muutamaa suurinta pääkomponenttia?
  7. Visualisoi!