Tänään luennon aiheena oli luokittelu sekä signaaliprosessorit. Koska kurssi on edennyt suunniteltua nopeammassa aikataulussa, käsiteltiin luokittelua ja hahmontunnistusta prujun tekstiä laajemmin. Aihe tuntui herättävän kysymyksiä ja se on myös oma tutkimuskohteeni, joten siitä oli helppo puhua. Aluksi esiteltiin esimerkki luokitteluongelmasta mukaillen Dudan ja Hartin oppikirjaa, jonka ensimmäisessä kappaleessa tarkastellaan luokitteluongelmaa kuvitteellisessa kalatehtaassa. Kun kalojen muoto on saatu irrotettua taustastaan, voidaan siitä laskea erinäisiä suureita ja päätellä näiden perusteella automaattisesti kalalaji. Esimerkissä laskettiin automaattisesti kalan pituus sekä sen keskimääräinen kirkkaus. Näistä kahdesta suureesta todettiin, ettei kumpikaan yksinään riitä ratkaisemaan ongelmaa: on olemassa myös isoja lohia ja tummempia meriahvenia. Luokittelemalla kaksiulotteisia piirrevektoreita (pituus, kirkkaus) saadaan luokat kuitenkin melko erillisiksi toisistaan. Suosittuja luokittelualgoritmeja ovat ainakin seuraavat (kasvavan monimutkaisuuden järjestyksessä):
- Lineaarinen luokittelija eli LDA eli Fisherin diskriminantti
- Tukivektorikone (support vector machine)
- Hermoverkot
Tämän jälkeen paneuduttiin hermoverkkojen opetukseen, ja tarkasteltiin lyhyesti opetusalgoritmin takana olevia derivointikaavoja. Nämä kaavat löytyvät esim. täältä. Perus- backpropagationin lisäksi on olemassa kehittyneempiä ja nopeampia opetusalgoritmeja, ja esim. Matlabissa niitä on lähes parikymmentä. Olennaisin ero algoritmien välillä on niiden nopeudessa ja muistin tarpeessa.
Luentotauon ajaksi laitettiin verkon opetus pyörimään, ja opetettiin sitä luokittelemaan suomalaisissa rekisterikilvissä olevia kirjaimia ja numeroita (vrt. prujun esimerkki). Opetusaineistona oli n. 7000 kirjainta ja ajo kesti vain 5 minuuttia. Tulosta demottiin skriptillä, jossa hiirellä voitiin näyttää merkin summittainen sijainti isossa kuvassa, ja verkko luokitteli sen johonkin luokkaan. Todettiin, että luokittelun suhteen oli kriittistä mikä kohta tarkalleen verkolle syötettiin. Yleisemminkin käytetty GIGO-periaate pitää siis paikkansa tässäkin yhteydessä.
Demoja ja esimerkkisovelluksia oli esillä muutenkin melko paljon. Matlabilla esiteltiin suuntaviivoja kuva-analyysille, joka löytäisi verkolle esitettävät objektit kuvasta. Menetelmät riippuvat paljon etsittävän kohteen mukaan, mutta joitain yleisimpiä ratkaisuja kuvaillaan wikipedian feature detection -artikkelissa. Lisäksi vilkaistiin kahta kasvojen havaitsemiseen kehitettyä ratkaisua. Perinteisempi näistä etsii kasvokandidaatteja ihonvärin perusteella ja syöttää ne hermoverkolle. Koska kasvojen ala kuvassa voi olla melko suuri, pudotetaan kasvokandidaatin dimensiota esim. 100 x 100 = 10000 komponentista esim. neljäänkymmeneen käyttäen ns. pääkomponenttianalyysiä. Läpimurroksi kuvailtu uudempi vaihtoehto kasvojen havaitsemiseen perustuu yksinkertaisten luokittelijoiden yhdistämiseen, niin että jokainen pyrki löytämään mahdollisimman suuren osan ei-kasvoista. Koska näitä on paljon enemmän kuin kasvoja, tulee toteutuksesta tehokas. Tästä algoritmista löytyy C-kielinen toteutus osana OpenCV-projektia. Toteutus toimii useiden webbikameroiden kanssa "heittämällä". OpenCV on myös muuten lupaava alusta konenäköprojektien toteutukseen Matlabin sijaan. Toinen yleinen vaihtoehto on Java-kielinen ImageJ.
Aivan luennon lopuksi käsiteltiin kappaleen 9 alkua. Huomisella luennolla demotaan FIR-suotimen toteutusta TI:n C6713-prosessorilla. Normaalisti tämä on ollut yhtenä harjoituksena, mutta tänä vuonna harjoitusta ei saatu mahtumaan mukaan.

Ei kommentteja:
Lähetä kommentti