< eelmine | 3. OSA sisukord | järgmine > |
3.1 Pildid sisendina autor: Ardi Tampuu
Sissejuhatus: pildid arvutis
Enne kui me saame rääkida masinõppe mudelitest, mis võtavad sisendiks pildi ja langetavad selle pildi põhjal mingi otsuse, kirjeldame, millisel kujul arvutid üldse pilte esitavad. Iga digitaliseeritud pilt koosneb teatud arvust punktidest ehk pikslitest. Pildi suurus on määratud kui pildi laius pikslites korda pildi kõrgus pikslites, mida tihtipeale kirjutatakse L x K (vt. ka Joonis 1).
Joonis 1. Piltide suuruse määrab pikslite arv. Vasakul: ruudukujuline pilt suurusega (nii laiuses kui kõrguses) 32 pikslit, mis pärineb CIFAR10 andmestikust. Paremal: sama pilt, mille igat pikslit on mõlemas suunas 10 korda korratud, ehk suurusega 320x320 pikslit. Siin ja edaspidi kasutame tihti CIFAR10 andmestiku pilte, sest seda andmestikku kasutame hiljem ka praktilistes näidetes.
Allikas: CIFAR10 andmestik
Iga piksel on mingit värvi. Piksli värvi kirjeldatakse punase, rohelise ja sinise värvi kombinatsioonina, seguna (ingl RGB - red, green, blue). Iga värvikomponendi väärtus peegeldab selle värvi intensiivsust antud pikslis, võimalikud väärtused on täisarvud 0st kuni 255ni. Värv, mis sisaldab 255 punast, 0 rohelist ja 0 sinist, ehk (255,0,0), vastab eredale ja täiesti puhtale punasele. (0,255,0) vastab puhtale rohelisele, (0,0,255) puhtale sinisele. Värv (0,0,0) vastab täiesti mustale, (255,255,255) puhtale valgele (vt ka Joonis 2). Kõik värvid, mida te arvuti ekraanil näete, on arvutis esitatud selliselt, kolme komponendi kombinatsioonina. Kokku on võimalik nii luua 256*256*256 = 16 777 216 erinevat värvi. Näiteks sellel lehel on võimalik mängida RGB väärtustega ja vaadata, mis värvi need kokku annavad.(mitte-kohustuslik)
Joonis 2. Näide RGB värvidest. Joonisel on kujutatud puhtad punane, roheline ja sinine värv ning nende 50/50 segud (näiteks kollasele vastab RGB kood (255,255,0) ). Ka kõik ülejäänud toonid arvutiekraanil saab punast, rohelist ja sinist omavahel kombineerides.
Allikas
Pildid kui kolmemõõtmelised objektid
Oleme jõudnud teadmiseni, et pildid koosnevad L x K pikslist ja iga piksel on kirjeldatud kolme väärtuse poolt. Seega on pilt arvuti jaoks lihtsalt üks kolmemõõtmeline arvude massiiv, mõõtmetega L x K x 3. Ehk siis, meil on üks L x K maatriks iga värvi kohta. Selle 3D objekti elemendid on, nagu eelpool mainitud, täisarvud vahemikus 0 kuni 255. Võite seda endale ette kujutada risttahukana, mis koosneb L x K x 3 väiksest kuubikust, millest igaüks vastab ühele arvule 0st 255ni. Iga värvi kohta on L x K väärtust, ehk üks kuubikutekiht (vt. Joonis 3).
Joonis 3. Pilt on arvutis salvestatud kui kolmemõõtmeline objekt. Iga piksli kohta on 3 väärtust, mis peegeldavad punase, sinise ja rohelise värvi osakaalu selle piksli värvis. Seega koosneb pilt tegelikult justkui kolmest üksteise otsa asetatud L x K kihist (maatriksist), millest igaüks kirjeldab ühe värvi intensiivsust erinevates pikslites.
Väikene harjutus: mis on pildil?
(Pilt on 4 pikslit lai ja 3 pikslit kõrge. Iga piksli värvi teadasaamiseks on vaja kombineerida kolme tabeli vastavas asukohas asuvad väärtused. Näiteks ülemise vasakpoolse piksli värv on (0,0,255).)
Joonis 4. Mis on pildil? Esimene 3x4 maatriks vastab punastele komponentidele, teine 3x4 maatriks rohelistele komponentidele ja kolmas sinistele komponentidele.
Maatriksite taustavärvid on illustratiivsed.
Vastus on antud siin.
Lõpetuseks võib veel mainida, et mitmed piltide salvestamiseks kasutatavad failitüübid kasutavad kettaruumi kokkuhoidmise eesmärgil algoritme, mis pildi mingil määral kokku pakivad - nad ei talleta mitte iga piksli värve, vaid mingi info, mille põhjal on võimalik pilt piisava täpsusega taas luua (aga mitte 100% täpselt). Selline failitüüp on näiteks JPEG. Failitüüp, mis talletab täpselt iga piksli värviväärtused, on näiteks PNG.
Piltide võrdlemine
Piksel piksli haaval piltide võrdlemine on arvutite jaoks lihtne. Iga programmeerija suudab mõne minutiga kirjutada koodijupi, mis võrdleb kahe pildi pikslite väärtusi ja ütleb, kas need pildid on identsed. Samuti on lihtne mõõta, kui suur on kõikide pikslite värvierinevuste summa, aga kahjuks on see üsna halb mõõdik piltide sisuliseks võrdlemiseks. Vaadakem järgnevaid piltide paare:
Esimene piltide paar:
Teine piltide paar:
Ülaltoodud pildid on inimsilmale (ja inimmõistusele) suhteliselt sarnased, aga mõõtes piksel piksli ja värv värvi haaval erinevusi, saame vastuseks, et need pildid on üsnagi erinevad. Esimese paari puhul on parempoolne pilt heledamaks tehtud - kõikide värvikomponentide väärtused kõigis asukohtades on parempoolsel pildil suuremad. Teise paari puhul on parempoolse pildi loomiseks nihutatud vasakpoolset pilti paari piksli võrra vasakule. Seega on mõlema paari puhul piltide vahel erinevus lausa igas pikslis ja erinevuste kogusumma tuleb suur (vastavalt 800 000 ja 70 000).
Algoritmidel puudub eluline kogemus ja loomulik võime aru saada pildi sisust. See võime sisu mõista tuleb neile mingil viisil sisse kirjutada. Naiivselt pikslite erinevusi võrreldes me sisu mõistmist ei saavuta. Pikslite erinevuste järgi on sama värvi, aga erinevat tüüpi objektid sarnased - näiteks must auto ja must hobune on piksleid võrreldes üksteisele sarnasemad kui must auto ja valge auto. Luua algoritm, mis saaks aru, et sisult on kaks pilti autodest omavahel sarnasemad, on väga keeruline.
[- Joonis 5. Piltide kaugus pikslierinevuste summa järgi sõltub domineerivatest värvidest, mitte sisust.]
Masinnägemise keerukus
Nägime, et pikslite võrdlus suudab tuvastada, kas tegu on täpselt sama pildiga. Tegelikult huvitavad meid aga hoopis teist tüüpi küsimused pildi sisu ja stiili kohta, mida loetlesime selle mooduli alguses.
Neile küsimustele vastamine on inimese jaoks lihtne, sest meie nägemissüsteem on evolutsiooni käigus väga hästi välja arenenud. Algoritmid aga "näevad" pilte arvudena (3D massiivina), ilma et keegi nende eest näiteks värvide ja piirjoonte tajumist ära teeks (nagu meie aju alateadvuslikud osad meie jaoks teevad). Selleks, et saada aimu, kui raske on pilte arvuliste väärtuste põhjal mõista, teeme ühe elulise mõttekatse. Nimelt proovime piksliväärtuste maatriksite (punane, roheline, sinine) põhjal aimata, mis objekt on pildil. Masinnägemise peatükis 3.3 näeme, et tehisnärvivõrgud suudavad sellise sisendi põhjal (CIFAR10 andmestikust) 99% täpsusega arvata, mis on pildil.
Mõttekatse
Kui te näeksite pilti mitte värvidena, vaid pilti esitatuna kolmemõõtmelise massiivina, mis sisaldab arve, siis kas te suudaksite aimata, mis objekt on pildil?
(Objektituvastus: variandid on: kass, koer, konn, lind, hirv, hobune, auto, veoauto, lennuk, ja laev. Õige vastus on antud allpool.)
Tõenäoliselt on vastus ei. kolmemõõtmelisest arvudemassivist pildi sisu aimamine tundub pärast selle ise läbi proovimist pigem võimatu kui imelihtne. Siiski on tänapäevased masinõppe algoritmid võimelised seda näidete põhjal õppima.
Õige vastuse leiate siit
Märgendatud pildipangad
Eelnevast loengust teame, et masinõppe algoritmid õpivad näidete põhjal. Seega, et õpetada masinõppe mudeleid eristama erinevaid klasse (näiteks objekte, isikuid), on vaja palju pilte igast klassist. Näiteks, et masinõppe mudel õpiks tuvastama käsitsi kirjutatud numbreid, on vaja palju pilte erinevate inimeste poolt kirjutatud ühtedest, kahtedest, kolmedest jne. Selline andmestik on tõesti olemas ja selle nimi on MNIST.
Et õpetada algoritme eristama objekte, on loodud palju erineval hulgal erineva suurusega pilte sisaldavaid andmestikke. Neist tuntuim on ImageNet andmestik, mis sisaldab 1.2 miljonit pilti 1000st erinevast objektitüübist.
Et õppida tuvastama nägusid, on olemas näiteks CelebA andmestik.
Siinkohal on oluline meelde jätta - masinõppe eelduseks on andmed. Enne kui on mõtet mingi ülesande kohta küsida: "Kas algoritmid suudaksid seda lahendama õppida?", on alati vaja küsida "Kas mul on olemas andmed, mille põhjal algoritmid saaksid seda õppida?".
Traditsioonilised masinõppe meetodid ei sobi piltidega töötamiseks
Paljud levinud masinõppe algoritmid (näiteks lineaarne mudel, otsustusmets ja tugivektormasinad) eeldavad sisendina tunnuste-vektorit (tähelepanu! vektor, mitte maatriks ega 3D massiiv). See tähendab, et kõik tunnused laotakse üksteise järel ühte pikka ühemõõtmelisse vektorisse. Pildid aga on loomu poolest, nagu eelpool mainitud, kolmemõõtmelised massiivid. Seega, kasutamaks selliseid masinõppe algoritme, mis eeldavad sisendiks vektorit, tuleb pilt (3D massiiv) tasandada vektoriks (ühemõõtmeliseks). Seda saab näiteks teha nii:
- lisa esimese värvi (punase) väärtused igast reast üksteise järel ühte pikka vektorisse - kui sul oli (L, K) mõõtmetega maatriks, siis nüüd on sul pikkusega L*K ühemõõtmeline vektor.
- korda sama rohelise ja sinise väärtustega
- ühenda saadud 3 pikka L*K vektorit veel pikemaks vektoriks, pikkusega 3*K*L
Seda protsessi illustreerib ka järgnev joonis:
Joonis 6. Tasandamise protsess samm sammult. Lõplikus 3*L*K pikkuses (3*32*32 pikkuses) vektoris on paksus kirjas ära märgitud ülemise vasakpoolse piksli kolm värvikomponenti, mis tasandamise tulemusena asuvad vektori erinevates osades, mitte üksteise naabruses.
Selliselt 3D massiivi vektoriks tasandades ei ole sama piksli kohta käivad värvide väärtused enam kõrvuti, samuti pole kõrvuti pildil üksteise all olnud pikslid. Ka mingil teisel viisil pilti tasandades kaovad mingid naabrussuhted ära. Algoritmil, mis sellise sisendi põhjal midagi õppima hakkab, puudub võimalus kasutada infot, mis põhineb naabrussuhetel. Sisendeid ühe pika vektorina käsitleva masinõppe algoritmi jaoks on kõik sisendid täiesti üksteisest sõltumatud tunnused, kuigi tegelikult on piltidel naaberpikslite vahel väga tugevad korrelatsioonid (pildid sisaldavad alasid, mis on sama värvi või mingi regulaarse mustriga).
Põhimõtteliselt, kui me ajaksime andmestikus piltide pikslid mingi teatud reegli põhjal sassi (näiteks nihutame iga rida paremale teatud arvu pikslite võrra), siis saadud pildid oleks neile algoritmidele sama mõistetavad kui algsed, sassi ajamata pildid, sest niikuinii naabrussuhteid ei kasutata.
Joonis 7. Parempoolne pilt on saadud vasakpoolse pildi ridu nihutades. Iga järgnev rida on 3 piksli võrra rohkem paremale nihutatud (nihked on suurusega 0, 3, 6, 9, ...). Paremalt välja nihkunud pikslid sisestatakse vasakule. Kui nihutada sel viisil kõiki andmestiku pilte, siis muutuvad need inimese jaoks raskemini mõistetavaks. Traditsiooniliste masinõppe meetodite jaoks ei muutu piltide äratundmise ülesanne raskemaks, sest nad ei kasuta nii ehk naa naabrussuhetes peituvat infot.
Näitlikustame seda ka praktilise näitega Google CoLabi vihikus, kus treenime kaks otsustusmetsa mudelit (mudel, mis koosneb paljudest otsustuspuudest), näitamaks, et pildi sassi ajamine mudeli täpsust ei alanda. NB! See praktiline näide on Masinnägemise mooduli kohustuslik osa.
Et sellised algoritmid naabrussuhteid ei kasuta, pole nad näiteks objektide tuvastamises kuigi täpsed. Arvamaks, kas pildil on kass või koer, on ülimalt kasulik vaadata looma piirjooni või karva tekstuuri. Mõlemad, nii piirjoon kui tekstuur on oma olemuselt mitmest naaberpikslist koosnevad tunnused, seega on vaja vaadata mitte iga pikslit eraldi, vaid naaberpiksleid koos.
Palju efektiivsemad on algoritmid, mis suudavad sisendiks võtta pildi oma 3D kujul ja ära kasutada infot, mis sisaldub selles, millised väärtused asuvad üksteise kõrval. On teada, et ka meie ajude nägemissüsteem kasutab sellist infot - näiteks tuvastavad teatud neuronid servi (kohti kus valgustugevus või värv järsult muutub).
Üheks selliseks naabrussuhetes peituvat infot kasutavaks algoritmiks on konvolutsioonilised närvivõrgud, millest räägib lähemalt järgmine alapeatükk.
< eelmine | 3. OSA sisukord | järgmine > |