Kuten sadoissa muissa organisaatioissa, Kaakkois-Suomen ammattikorkeakoulussa käytetään Microsoftin ohjelmistoja ja palveluita. Teamsien ja powerpointtien lisäksi Data-analytiikka on ottanut käyttöönsä Microsoftin pilvipalvelualusta Azuren, josta löytyy monenlaista palvelua SQL-palvelimesta koneoppimismallien luomiseen.
Yksi palvelutyyppi on nk. kognitiiviset palvelut johon kuvien analysointi eli konenäkö kuuluu. Päätelmien tekeminen suuresta määrästä digitaalisia valokuvia niitä näkemättä tuntui mielenkiintoiselta ajatukselta. Azuren konenäössä on monenlaisia ominaisuuksia: on kasvojentunnistusta, kuvassa olevan tekstin tunnistusta, kuvien kategorisointia jne. Päätin lopulta kokeilla automaattista kuvatekstien ja tagien luomista valokuville jotta syntyisi jonkinlainen käsitys siitä miten se kuvia lajittelee.
Testiaineistoksi valikoitui oppilaitoksemme Xamkin virallinen Instagram-tili ja sieltä 2000 valokuvaa.
Miten se toimii?
Konenäkö on API, eli ohjelmointirajapinta (Application Programming Interface). Yksinkertaisimmillaan sinne syötetään kuva ja kone palauttaa kuvalle pyydetyn datan (esim. tunnistetut kasvot, kuvauksen jne.) Tässä harjoituksessa käytin rajapintaa python-ohjelmointikielen avulla, jolle Microsoft tarjoaa kehitysalustan. Käytännössä Azureen perustetaan resurssi josta saa tarvittavan salasanan. Koodikirjastot tuodaan pythonin import-komennolla ja client autentikoidaan salasanalla, minkä jälkeen rajapintaan voi alkaa heitellä kuvia. Rajapinnasta on kattava ja johdonmukainen dokumentaatio.
Päätin hakea kuvatekstit ja tagit 2000 kuvalle ja liittää saadut tulokset osaksi Instagram-aineiston metadataa. Kahden tuhannen kuvan läpikäynti kestää koneelta jonkin aikaa, joten kerkesin käydä välillä lounaalla ja palata sitten katsomaan mitä tuloksista mahdollisesti voi saada irti.
Ja toden totta, tekoäly oli keksinyt kuville englanninkieliset kuvatekstit ja tagit. Azuressa olisi mahdollista myös kääntää tekstit automaagisesti suomeksi mutta tämä vaatisi lisää API-kutsuja, joten päätin pärjätä kolmannella kotimaisella. Analyysissä käytin pythonin pandas-kirjastoa jossa data on taulukkona (dataframe) ja sen filtteröintiin ja muokkaamiseen on paljon tehokkaita työkaluja.
Polkupyöräkuvien etsiminen – with confidence
Tagien avulla suuresta kuvamassasta voi hakea tiettyjä elementtejä sisältäviä kuvia. Kokeilin hakea 2000 kuvan joukosta ne, joissa on tägi ”polkupyörä” (eli siis bicycle). Tuloksista selvisi, että Bill Gatesin robottisilmälasit ovat nähneet yhteensä 27 kuvaa joissa on polkupyörä.
kuvat['pyörät']=kuvat['tagit'].str.contains('bicycle')
Suodatin polkupyöräkuvat tykkäysten mukaan alenevaan järjestykseen ja katsoin mitä kone on oikein nähnyt. Aluksi kaikki vaikuttaa hyvältä. Esimerkiksi 157 tykkäystä saaneessa, Vappua juhlistavassa kuvassa on selkeästi polkupyörä ja kone antaa ’bicycle’ -tagille confidence scoren 0.9501 mikä on todella kova.
Seuraavassa kuvassa ei kuitenkaan ole polkupyörää. Siinä on polkupyörä-tägi ja mies hymyilemässä jonkinlaisen osittain näkyvän metalliputkihässäkän luona mikä aivan ilmeisesti ei ole polkupyörä. Kuvan bicycle-tag onkin saanut confidence scoren 0.31. Luokittelua varten päätin rajata pisteytyksen 0.9 ja sitä suurempiin lukuihin. Tätä varten pandasilla on helppo luoda uusi taulukko kuvista, joissa on mukana vain tagit joiden luotettavuusarvo ylittää 0.9. Polkupyörien kohdalla tämä toimii mainiosti ja lopulta onnistun etsimään kaikista kuvista vain sellaisia, joissa oikeasti on pyörä. Lisäksi on tuntematon määrä kuvia joissa on pyörä mutta jotka eivät saa polkupyörä-tagia.
Julkiset naamat
Lievänä yllätyksenä tuli, että kuvatekstitoiminto tunnistaa julkkisten naamoja. Azuressa on erikseen kasvojentunnistin, jolla kasvoille voi generoida tunnisteen. Tunnisteen avulla samanlaisia kasvoja voi etsiä kuva-aineistoista. Kuvateksti-toiminto kuitenkin löytää suvereenisti suomalaisia julkkiksia. Koska Xamk on vahvasti mukana Emma-gaalassa, päätin katsoa onko gaalakuviin tallentunut julkisia naamoja. Etsinnässä auttaa myös tässä yhteydessä käytetty hashtag ”xamkgoesemma”. Keinosilmät ovat nähneet mm. 3 Anna Puuta, Reino Nordinin, Juha Tapion, Sanni Kurkisuon ja Erkki Liikasen (joista viimeinen ei ehkä Emma-gaalasta).
Yksi hämmentävä ilmiö ovat julkkisten kaksoisolennot. Kone löysi Xamkin Instagramista useita ulkomaisia julkkiksia, jotka lähemmässä tarkastelussa osoittautuivat tavallisiksi tallaajiksi jotka vain sattuvat näyttämään julkkiksilta.
Scoreissa on eroja
Luottamuspisteytykset jotka kone ilmoittaa kuvateksteille ja tageille poikkeavat ratkaisevasti toisistaan. Kuvateksti joka saa pisteytyksen 0.5 on usein ”oikein” ja jopa hyödyllinen, kun taas jos haluaa luokitella kuvia tagien avulla niin 0.5 tasoa ei välttämättä kannata ottaa mukaan.
Ero käy ilmi myös luottamustasojen jakaumasta. Tarkastelin kuvatekstien ja tagien saamia pisteitä tekemällä niistä box-plotit pandasissa:
kuvat['caption_confidence'].plot(kind='box', vert=False, figsize=(10,5), title = 'caption_confidence')
Konenäön tekemän luokittelun luotettavuuden arvioinnissa koneen ilmoittamat pisteytykset ovat hyvä apuväline. Erityisen mielenkiintoista on etsiä tageja joista kone on omasta mielestään lähes varma, mutta jotka kuitenkin ovat päin honkia.
Seuraavia harjoitteita
Kuvatekstigeneraattorin kyvystä tunnistaa julkisuuden henkilöitä syntyi ajatus syöttää konenäölle julkisuuden henkilöitä. Suunnitelmissa on käyttää kotimaisten digitaalisten viihdeuutisten kuvastoa ja analysoida keitä se tunnistaa ja keitä ei. Jatkuu seuraavassa numerossa.