đ TehtĂ€vĂ€t
TehtÀvÀ: Automaattivaiheet (Pt. 2)
KÀytÀ samaa datasettiÀ kuin viime viikolla. Kouluta k-NN-luokittelumalli, joka ennustaa, onko kyseessÀ automaattiauto.
Huomaa, ettÀ k-NN on etÀisyyksiin perustuva algoritmi. Muistahan siis normalisoida tai standardoida data ennen koulutusta!
Vinkit
k-arvo
Kokeile eri k-arvoja ja dokumentoi, mikÀ k-arvo tuottaa parhaan tuloksen. TÀssÀ auttaa ns. elbow method, jossa piirretÀÀn k-arvojen ja mallin tarkkuuden vÀlinen kÀyrÀ.
HyödynnÀ vanhaa tietoa
Muistathan vertailla mallin suorituskykyÀ aiemmalla viikolla kouluttamaasi Decision Tree tai Random Forest -malliin.
TehtÀvÀ: VÀrikartta
TehtÀvÀ on luoda skripti, joka luo Tikkurilan vÀrikartan kartaisen \(k\) vÀrin kartan. Idea on, ettÀ jos haluaisit maalata huoneen annetun kuvan vÀreillÀ, malli klusteroi vÀrit, joita sinun tulisi kÀyttÀÀ. TÀmÀn viikon aikana sinun tulee tutustua RGB- ja HSV-vÀrimalleihin, jos ne eivÀt ole sinulle entuudestaan tuttuja. Koneoppimisessa on kovin tyypillistÀ, ettÀ sinun tulee tutustua uusiin kÀsitteisiin, ja ymmÀrtÀÀ, miten ne vaikuttavat mallin toimintaan. Jos kÀsite on aivan vieras, voit aloittaa vaikkapa vÀrislidereitÀ sÀÀtÀmÀllÀ esimerkiksi colorizer.org -sivustolla.
Skriptin luomaa vÀrikarttaa voisi myöhemmin kÀyttÀÀ esimerkiksi:
- Huoneen vÀriteeman mÀÀrittelyyn (vrt. Tikkurilan vÀrikartat)
- Web-sivuston graafisessa ohjeistuksessa
- Elokuvan vÀrimÀÀrittelyn ohjenuorana
Esimerkki
Kuva 1: Terry Kearneyn kuva, otsikolla 5 A Day, on tekijÀnoikeusvapaa kuva ja se on ladattavissa Flickr-palvelusta: Terry Kearney: 5 A Day.
Jos kÀyttÀjÀ valitsee yllÀ nÀkyvÀn kuvan (Kuva 1) ja k=4
arvon, syntyy alla nÀkyvÀ liuska (Kuva 2).
Kuva 2: YllÀ nÀkyvÀn Kuvio 1:n vÀrit jaettuna neljÀÀn klusteriin RGB:tÀ kÀyttÀen. TÀstÀ naiivista esimerkistÀ puuttuu vihreÀ kokonaan. Kenties sen kuuluisi mahtua kyytiin?
Tip
Sivutuotteena mallin luokkia voi kÀyttÀÀ siihen, ettÀ luot posterisoidun version valokuvasta. TÀmÀ efekti, posterize, löytyy tyypillisistÀ kuvankÀsittelytyökaluista kuten Photoshop tai GIMP. Voit tutustua GIMP:n dokumentaatiosta Color Tools: 5.9 Posterize.
Kuva 3: Posterisoitu kuva kasattuna takaisin (200,200) muotoon. Jos kÀytÀt RGB-arvoja, lopputulos ei vÀlttÀmÀttÀ edusta sitÀ, kuinka ihminen jakaisi vÀrit. MissÀ on kuvasta esimerkiksi oikean ylÀlaidan vihreÀt hedelmÀt? EhkÀ Hue-arvoa pitÀisi painottaa?
Vinkit
OpenCV
Voit kÀyttÀÀ kuvankÀsittelyyn valitsemaasi valmista kirjastoa kuten PIL
tai opencv
. LisÀÀ kirjasto tutulla uv add opencv-python
komennolla. Alla lyhyt esimerkki OpenCV:n kÀytöstÀ:
import cv2
import matplotlib as plt
img = cv2.imread("to/path/fruit.jpg")
# OpenCV uses RGB channel ordering. Pyplot assumes RGB.
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# Resize image to make calculations faster.
img = cv2.resize(img, (200, 200))
# In dataset, each pixel is an observation
h, w, _ = img.shape
X = img.reshape((h * w, 3))
# Display the image.
plt.imshow(img)
RGB vs. HSV
RGB on yleinen tapa esittÀÀ vÀrit, mutta se ei vÀlttÀmÀttÀ ole paras valinta, kun haluat luokitella vÀrejÀ.
Kenties haluat harkita esimerkiksi HSV:tÀ (Hue, Saturation, Value)? Huomaa, ettÀ pelkkÀ Hue-arvon kÀyttö ei vÀlttÀmÀttÀ johda haluttuun lopputulokseen. Esimerkiksi punainen ja vaaleanpunainen ovat pelkkÀÀ Hue-lukemaa tuijottaen sama vÀri (eli vaaleanpunainen on punaisen sÀvy, engl. tint). Voi kuitenkin olla jÀrkevÀÀ painottaa Hue-arvoa enemmÀn kuin Saturation- ja Value-arvoja. Kuinka tekisit tÀmÀn?
Muutos tapahtuu seuraavanlaisella snippetillÀ:
Huomaa, ettÀ kuva pysyy samana: vain esitystapa muuttuu.
HSV syklisenÀ
Hue on luonteeltaan syklinen ja sen lukema edustaa asteita. TÀmÀ tarkoittaa, ettÀ asteet 0 ja 360 ovat sama vÀri. NÀmÀ skaalan ÀÀripÀÀt ovat sama punaisen sÀvy. Koska k-Means perustuu etÀisyyksiin, tÀmÀ aiheuttaa ongelmia lÀheisyysmittauksessa. Kannattaa lukea lisÀÀ esimerkiksi Medium-artikkelista Axel Kud: Why We Need Encoding Cyclical Features.
Vertaus kelloon
Tilanne on sama kuin jos vuorokaudenajan kuvaisi tunteina: 0 tuntia ja 24 tuntia ovat sama aika, eli keskiyö. TÀstÀ huolimatta ihmisen kokemana aikana ajat [23, 1]
ovat lÀhempÀnÀ toisiaan kuin vaikkapa [8,16]
. Jos ajan ymmÀrtÀÀ lineaarisena arvona, tilanne on toinen: klo 23 ja 01 ovat 22 tunnin pÀÀssÀ toisistaan.
Yksi ratkaisu tÀhÀn on tehdÀ Hue-arvosta kaksi erillistÀ piirrettÀ: sin_hue
ja cos_hue
. TÀmÀ syklinen enkoodaus onnistuu seuraavanlaisesti Pythonissa:
H_max = 180 # may vary
df['sin_hue'] = np.sin(df['hue'] * (2 * np.pi / H_max))
df['cos_hue'] = np.cos(df['hue'] * (2 * np.pi / H_max))
Arvo H_max
on tyypillisesti 360, mutta arvo voi riippua kÀytetystÀ kirjastosta. Esimerkiksi OpenCV kÀyttÀÀ Hue-arvoa, joka on vÀlillÀ 0-179 (jotta se mahtuu 8-bittiseen arvoon).
RGB vs. LAB
Voit tutustua myös LAB- eli CIE L*a*b*
-vÀrimalliin, joka on suunniteltu siten, ettÀ se vastaa jossain mÀÀrin ihmisen vÀrinÀköÀ. Dimensiot a
ja b
kuvastavat skaaloja punainen-vihreÀ
ja sininen-keltainen
. TÀmÀ tarkoittaa, ettÀ LAB-mallissa vÀrit ovat jo valmiiksi kahdessa eri ulottuvuudessa, joten etÀisyysmittaus toimii suoraan. L
arvo on kirkkaus. Voit muuntaa RGB:n LAB:iin OpenCV:n avulla seuraavasti:
Kokeile eri kuvilla
LisÀhaasteena on kokeilla skriptiÀ hieman vÀhemmÀn vÀrikkÀille kuville. VihjeenÀ voit yrittÀÀ luoda filtterin, joka pÀÀstÀÀ vain tietyt ehdot tÀyttÀvÀt pikselit k-Means algoritmille asti. Kenties HSV:n arvot Saturation ja Value auttavat?
Ideaalitilanne on, ettÀ jos syötÀt mustataustaisen kuvan, jossa on 5 selkeÀsti eri vÀristÀ palleroa, musta ei tule valituksi vaan vÀripallerot. Kenties tÀssÀ voisi auttaa jokin maskifiltteri, joka ignooraa todella tummat tai vaaleat pikselit, tai alle 50 % saturaation arvot?