perjantai 15. toukokuuta 2020

Tekoäly arvioi kuvien laatua

Everypixel Aesthetics arvioi valokuvien laatua, jotta se voisi löytää esimerkiksi parhaat koirakuvat kuvapankin tuhansien joukosta. Ohjelma ei arvioi kuvan hienoutta sinänsä vaan lähinnä teknistä laatua - eli kuten palvelu itse sanoo:

"...service doesn't measure the coolness or beauty of a person or any object in a photo. It cares only about technical parts like brightness, contrast, noise and so on."

Kokeillaanpa.

Heti aluksi tulee vastaan kuva, jota ohjelma itse pitää oikein laadukkaana:

Töölö HDR 92,3 %
Kokeillaan toisella HDR-kuvalla, mutta nyt tulos onkin jotain ihan muuta:

Öinen kaupunki vain 13,5 %
Entä koira?

Koirakuvan laatu 67 %
Huomaa, että ohjelma tunnistaa koiran rodunkin oikein. Viulistin kuva saa laaduksi 53 %:

Viulisti 52,8 %
Suurkirkko kesäillassa ei tee vaikutusta, mutta ohjelma löytää kuvasta ristin ja tunnistaa sen katedraaliksi:

Iltainen suurkirkko vain 1,4 %
Kesäinen autokuva saa surkean arvion:

Kesäautot vain 0,1 %
Pelkät jalat on kuvana hauska ja tekoäly tunnistaa, että ne kuuluvat naiselle. Ohjelma antaa tylyn arvion: nolla pistettä:

Pelkät jalat 0,0 %.
Sambaaja saa vain vähän paremman arvion:

Samba 5,7 %
Yllättäen tavanomainen rullalautailijan kuva saa huippuarvion:

Rullalautailija 96,5 %
Palataan vielä testikuvana olleeseen koiraan:

Peruskuva vain 0,2 %
Kohinan pitäisi laskea kuvan pisteitä, mutta käykin päinvastoin. Keinotekoisesti lisätty 20 % kohina ei vielä tuota muutosta, mutta 40 % saa jo paremmat pisteet ja 60 % kohina ylittää jo 10 % rajan:

Kohiseva koirakuva 10,5 %
Kun kohinaa yhä vain lisätään, 80 % tasolla kuva saa vielä paremman arvion:

Kohiseva koirakuva 28,8 %
Loppupäätelmä on selvä: Everypixel tunnistaa erinomaisesti kuvassa näkyviä asioita ja hahmoja, mutta kuvien laatumittarina se on surkea. Ilmeisesti kohina saa algoritmin niin sekaisin, että se suorastaan pitää kohinalla sotketuista kuvista. 

Ihmisellä on vielä etulyöntiasema kuvia arvioitaessa. Onneksi.

keskiviikko 13. toukokuuta 2020

Jääkaapin data Googlesta Pythonilla Exceliin

Kirjoitin työläästä muunnoksesta, jonka älyjääkaapin Google Docsiin lähettämä tiedostomuoto tarvitsi ennen kuin Excel tunnisti sen aikamerkinnät oikein. Kommenteissa nimimerkki Zarr antoi hyvän vinkin: Pythonissa on valmiina aikamerkintöjen muuntamiseen sopivat työkalut.

Totta! Siispä töihin.

Ongelma on siinä, että älyjääkaappi lähettää tiedot oven avauksista hassussa formaatissa ja tallentaa ne IFTTT-rajapinnan kautta Google Docsin laskentamalliin näin:

Google Docsin laskentamallin alkua.
Googlen omilla toiminnoilla datan saa haettua omalle levylle Excel-tiedostoon, mutta päivämäärien muokkaus Excelin ymmärtämään muotoon on työlästä.

Niinpä tallensin datan Excelistä tekstitiedostoon:

Data tekstimuodossa 12h kellonaikoina.
Sen jälkeen tein pienen Python-ohjelman. Siitä on lukuisia vuosia, kun olen viimeksi ohjelmoinut mitään, saati opetellut kokonaan uutta kieltä. Python on kuitenkin suosittu ja sillä on helppo tehdä asioita, jotka muilla olisivat erittäin työläitä. Tässä auttavat kirjastot, joita on saatavissa liki jokaiseen tarkoitukseen. Käytin itse openpyxl-nimistä kirjastoa, jonka avulla oma Python-sovellus pystyy lukemaan ja kirjoittamaan Excel-tiedostoja. Se avaa hienoja mahdollisuuksia tiedostomassojen analysointiin tai esimerkiksi lokitiedostojen esiprosessointiin, kuten tässä.

Python-ohjelma mahtuu muutamaan riviin.
Valmiiden kirjastojen ansiosta omasta ohjelmasta tulee yksinkertainen: se vain lukee tekstimuotoisen lokitiedoston, poimii riveiltä jääkaapin tuottaman aikaleiman ja palastelee sen uudelleen, sekä kirjoittaa lopputuloksen Excel-tiedostoon. Ohjelman rivejä voisi vielä vähentää tekemällä kaiken yhdessä luupissa.

Dokumentaation mukaan %d lukee päivän numeron silloin, kun alle kymmenen numeroita edeltää nolla (01, 02, 03...) ja että normipäiviin (1, 2, 3...) pitäisi käyttää muotoa %-d. Ilmeisesti dokumentaatio on vanhentunut, sillä %-d ei toiminut ja %d tuotti oikeat numerot kaikilla päivämäärillä.

Muutaman sekunnin ajo ja C:\temp-hakemistoon syntyy tiedosto ajat.xlsx. Onneksi Excel ymmärtää suoraan Pythonin käyttämää formaattia, joten aikaleimaa ei tarvitse muokata merkkijonona ennen kirjoittamista, mutta tarvittaessa sekin olisi helppo koodata.

Data Excelissä sen ymmärtämässä päiväysformaatissa 24h kellonaikoina.
Kouluissa olisi hyvä opettaa kaikille ohjelmoinnin perusteet, sillä se auttaa ymmärtämään koneiden ja tietojärjestelmien toimintaa -- ja varsinkin toimimattomuutta. Pienellä vaivalla apuohjelmista ja omatekoisista pikkuohjelmista saa itselleen tehokkaita työkaluja, kuten tässä.

tiistai 12. toukokuuta 2020

Tekoäly arvioi ministerien ikää kuvan perusteella

Edellisen kirjoituksen aiheena oli Everypixel-palvelu, jossa on monia kiinnostavia ominaisuuksia. Yksi niistä arvioi kuvassa näkyvän ihmisen ikää. Microsoftilla on vastaava palvelu osoitteessa https://www.how-old.net/.

Iän arviointi on yksinkertaista: annetaan tekoälylle valtava joukko ihmisten kasvokuvia ja niihin liittyvä ikätieto. Koneoppiminen muodostaa neuroverkon, joka tunnistaa kasvoista piirteitä ja yhdistää ne ikätietoon. Sitten vain kokeilemaan, millaisia arvioita uudet henkilöt saavat.

Kokeilua varten etsin netistä kuvia, joissa esiintyy hallituksen maailmankuulu naisviisikko. Todelliset iät ovat (syntymävuoden mukaan laskettuna suhteessa vuoteen 2020): Sanna Marin (35), Katri Kulmuni (33), Li Andersson (33), Maria Ohisalo (35) sekä Ann-Maja Henriksson (56).

Ensimmäinen testikuva:
Ensimmäinen testikuva
Tässä kuvassa Andersson 31, Kulmuni 29, Marin 30 ja Ohisalo 36.

Toinen testikuva.
Tässä Andersson 29, Kulmuni 29, Marin 35, Henriksson 44 ja Ohisalo 33.

Kolmas testikuva.
Kolmannessa kuvassa Andersson 32, Kulmuni 30, Marin 31 ja Ohisalo 32.

Neljäs testikuva.
Neljännessä kuvassa Andersson 24, Kulmuni 27, Marin 34, Henriksson 52 ja Ohisalo 33.

Kaikki neljä lehtikuvaa ovat ilmeisesti samasta tilaisuudesta Smolnasta. Siksi viides kuva on kiinnostava, koska siinä ministerit poseeraavat omissa passikuvissaan.

Viides testikuva.
Tässä Andersson 27, Kulmuni 20, Marin 30, Henriksson 49 ja Ohisalo 31.

Viiden testikuvan keskiarvot ovat Andersson 29, Kulmuni 27, Marin 32, Henriksson (3 kuvaa) 48 ja Ohisalo 33. Tarkimmin ohjelma arvioi Ohisalon iän, sillä keskiarvo 33 on kaksi vuotta todellista ikää nuorempi. Tekoälyn mielestä Ohisalo on siten eniten ikäisensä näköinen. Pahimmin pieleen menee Henriksson, jonka kohdalla 48,3 vuoden keskiarvo on peräti 7,7 vuotta todellista nuorempi. Marinilla ero on kolme vuotta, Anderssonilla 4,4 ja Kulmunilla 6 vuotta.

Eniten hajontaa on Henrikssonin ja Kulmunin kuvissa, vähiten Ohisalon kuvissa. Kulmunin tulosta selittää viimeinen kuva, jonka tekoäly arvioi peräti 13 vuotta todellista ikää nuoremmaksi.

Merkillepantavaa on, että vaikka neljä ensimmäistä kuvaa on otettu samassa tilanteessa, arviot kunkin ministerin iästä vaihtelevat 7, 3, 5, 8 ja 5 vuoden verran. Kuvakulma, valaistus ja ilmeisesti myös kuvatiedoston koko ja laatu vaikuttavat analyysin tulokseen.

Koiran tunnistaminen kuvasta on helppoa, iän arviointi on paljon vaikeampaa. Todennäköisesti tekoälyn ikäarvio olisi tarkempi kuin mihin suurin osa oikeista ihmisistä pystyy.

Osui silmään sopivasti Iltalehden juttu, jossa Tia Andersson valittaa muiden arvioivan hänet kymmenen vuotta todellista, pian 40 vuoden ikää nuoremmaksi. Jokainen voi tehdä oman arvionsa, mutta Microsoft arvioi iäksi 39 (täsmälleen oikein) ja Everypixel 45 vuotta.
Everypixel arvioi iäksi 45 vuotta.
Ehkä puolueeton algoritmi osaa sittenkin arvioida ihmisten ikää paremmin kuin me ihmiset itse?

Lopuksi tuttu varoituksen sana: jos olet huolissasi tietosuojasta, ei kannata lähettää omaa kuvaansa arvioitavaksi. Koskaan ei voi tietää, mihin käyttöön kuvat päätyvät.

Lisäys 13.5.2020: Joku ehti jo kritisoida iän päättelemistä kuvan perusteella. Päivän Hesari antaa esimerkin käyttökohteista: "Vastaavasti yhtiön järjestelmä voisi tunnistaa, kuinka paljon ihmisjoukossa on esimerkiksi yli 70-vuotiaita. Näin saataisiin nopeasti tietoa, että viruksen kannalta riskiryhmään kuuluvia on kerääntynyt johonkin enemmän kuin suositellaan." Käyttökohteita siis löytyy, eri asia on, miten luotettavasti yli 70-vuotiaiden tunnistus toimisi ja miten perusteltua se olisi edes ajatuksen tasolla.

maanantai 11. toukokuuta 2020

Tekoäly tunnistaa kuvia osa 3: Everypixel tunnistaa mainiosti

Microsoft, Google ja Apple tunnistavat kuvia muiden lisätoimintoina. Entä yritys, joka on erikoistunut valokuvien tunnistamiseen (ja jopa kuvan hienouden arviointiin, mutta siitä toisessa kirjoituksessa)?

Everypixel on kehittänyt kuvantunnistusta esimerkiksi kuvapankkien käyttöön. Koneellinen arviointi säästää aikaa ja auttaa ohittamaan huonoimmat kuvat.

Sivulla https://www.everypixel.com/aesthetics on palvelu, johon voi lähettää omia kuvia sen analysoitavaksi. Peruskuva ei tuota palvelulle ongelmia:

Everypixel tunnistaa jopa koiran rodun.
Toisella sivulla nähdään kunkin luokituksen varmuustaso:

Luokitusten varmuustaso: 98 % varmuudella tämä on koira.
Luokitukset ovat lähes kaikki oikeita, tosin koira ei varsinaisesti ole pentu (22 %) eikä istu (23 %). Everypixel tunnistaa koiran jopa pelkästä kirsusta (varmuus 92 %):

Kirsu paljastaa koiran.
Silmä riittää jopa rodun tunnistamiseen:

Silmä paljastaa koiran ja jopa noutajan.
Toinen käännettyjen palojen testikuva on ohjelmalle liikaa, mutta toinen samantapainen riitti tunnistukseen. Tässä se epäonnistunut versio:

Mikä tässä on kirjekuorta ja bisnestä?
16 ruudun palapeli ei hämää tunnistusta:

Koira 16 palassa.
36 palasta tunnistetaan vielä koira, mutta 49 palaa on jo tekoälyllekin liikaa:

Eläin ja lemmikki se on, mutta muusta ei ole tietoa.
Silmien ja kirsun peittäminen tuottaa yllättäviä tuloksia:

Nyt menee liian vaikeaksi!
Tekoälyn mielestä kuvassa on kyllä koira, mutta se taitaa olla pelkkä arvaus, sillä muut luokitukset ovat internet (!), länsimainen valkoihoinen ihminen, ihmiskäsi, miehet sekä terveydenhuolto ja lääkitys.

Rodun tunnistus on yllättävän hyvä:

German Shepherd - yes!
Hieman yllättäviä luokituksia ovat kodittomuus ja koditon eläin. Tätä koiraa ei liioin voi sanoa enää pennuksi.

Tunnistus yllättää pomeraanin kohdalla:

Pomeranian - indeed!
Osumatarkkuus ei kuitenkaan ole ihan niin hyvä kuin aluksi vaikuttaa, sillä myös toinen koira tuottaa saman tuloksen:

Tämä ei kylläkään ole pomeraani.
Everypixel osoittaa, että parhaimmillaan tekoälyn tunnistuskyky yllättää -- mutta silti taustalta paistaa tekoälyn matematiikka, eikä virheiltä voida välttyä. 

keskiviikko 6. toukokuuta 2020

Tekoäly tunnistaa kuvia osa 2: Google Photos ja Apple

Google Photos ja Applen Kuvat -palvelu tunnistavat kuvien sisältöä, joten kuvien haku onnistuu vaikka ei olisi nimennyt kuviaan eikä kirjoittanut niihin metatietoja. Kuvantunnistus on tullut palveluihin kuin varkain, eivätkä kaikki ole edes huomanneet koko hienoa ominaisuutta.

Googlen palvelussa on vain hakukenttä, johon haettava termi kirjoitetaan. Olin ladannut Googlen ja Applen palveluihin kasan vanhoja valokuvia ja ihmettelin, kun Google löysi kuvia ällistyttävän tehokkaasti. Vasta sitten huomasin, että haku kohdistuu automaattisesti myös avainsanoihin, tiedostonimiin ja jpeg-tiedostojen sisään kirjoitettuihin otsikoihin, joten testin koirakuvat piti tyhjentää ensin metadatasta ja lähettää sen jälkeen uudelleen.

Google tunnisti ongelmitta kaikki helpot koirakuvat.
Näyttävät koirilta ja ovatkin.
Testisarjan muokatut kuvat tuottivat tällaisen tuloksen:
Nämä kaikki näyttävät koirilta.
Googlen tekoäly tunnisti neliömäiset palapelit, mutta ei käännettyjä paloja, pelkkää kirsua tai silmää eikä kuvaa, missä silmät oli peitetty kirsun lisäksi. Myös kohinalla ja tahallisella epäterävyydellä muokatut koirakuvat tunnistuivat oikein.

Googlen sanavarastossa on myös termi koiranpentu, joka tuotti välillä yllättäviä tuloksia. Koira tulkittiin pennuksi koosta riippumatta, kunhan sen asento oli leikkisä (vrt. viimeinen kuva):

Koiranpentu on oma hakusanansa.
Ilmeisesti kuvantunnistus toimii pilvessä taustalla, koska tunnistus alkoi toimia jopa vuorokausien viiveellä ja edellytti myös selaimen ikkunan sulkemista. Tuloksena oli paljon muitakin havaintoja, mutta niistä ehkä toisessa kirjoituksessa.

Applen vastaava toiminto on testaamisen kannalta helpompi, koska iPhonen Kuvat-sovellus erottelee tulokset kriteerin mukaan: sijaintitiedot, tiedostonimet, kuviin itse lisätyt avainsanat sekä tekoälyn antama luokitus (kategorita) erottuvat tuloksista helposti. Kuvat antaa myös listan tunnistamistaan samantyyppisistä kategorioista, mistä voi olla hyötyä haun määrittelyssä.

Yllättäen haku antoi erilaisia tuloksia Mac Air -läppärillä ja iPhone 11 Pro -puhelimella. Windowsin selaimella iCloudin Kuvat antaa selata kuvia, mutta siinä ei ole hakutoimintoa lainkaan. Erillinen Windows iCloud-sovellus saattaisi näin tehdä, sitä en kokeillut.

Macissä hakukenttään kirjoitettu kissa näyttää joukon automaattisen luokittelun kategorioita:

Kissa-aiheisia kategorioita.
Jostain syystä monet kategoriat ovat suomen taivutusmuodoissa ("Kissaeläimen"), mikä kertoo jonkinlaisesta konekäännöksestä.

Kuvassa alkaa varmaan kiinnostaa, mikä on se yksi kissa, joka ei kuulu Kissaeläimen kategoriaan. Se paljastuu vertailemalla hakutuloksia keskenään. Ensin Kissa:
Kissa-haun tulokset.
Ja sitten Kissaeläimen:
Yksi kuva enemmän.
Kahdesta lähes identtisestä kissakuvasta vain toinen on luokiteltu kissaksi, molemmat kissaeläimiksi. Tutkimattomia ovat tekoälyn tiet.

Koira-haku antaa tällaisen tuloksen:
Macin koira-hakusana.
Tuloksia on vähemmän kuin Googlen listassa. Ensimmäinen kuva näyttää koiralta, mutta on itse asiassa vuohi. Palapelikuvia algoritmi ei tunnista lainkaan.

iPhonessa haku antaa erilaisia tuloksia. Teksti "indeksoidaan" näkyi sinnikäästi kuvien alareunassa, joten ilmeisesti hakutoiminto analysoi kuvat paikallisesti eikä pilvessä. Sellainen ratkaisu tuntuu oudolta.

Kissaeläin-haku antaa tällaisia tuloksia:

Kissaeläimet iPhonessa.
Myös koira-haun tulokset ovat erilaiset kuin Mac Air -koneessa.

Koiratulosten alku.
Listan lopusta löytyvät tutut testikuvat, myös 4x4 ruudukko (mutta ei isompia).

Koiratulosten loppu.
Tekoälyhaku toimii niin hyvin, että siitä on aidosti hyötyä. Joskus tulokset suorastaan yllättävät. Kannattaa kokeilla, millaisia tuloksia omasta kuva-arkistosta löytyy!

Seuraavassa kirjoituksessa kokeilussa parempi analysoija.

tiistai 5. toukokuuta 2020

Tekoäly tunnistaa kuvia osa 1: Microsoft Office

Miten ihmeessä tekoäly osaa tunnistaa valokuvien sisältöä? Mistä tekoäly voi tietää, että valokuvassa on koira, kissa, talo tai auto?

Ei se varsinaisesti tiedäkään. Näyttämällä tekoälyn algoritmille miljoonia kuvia ja kertomalla, mitä niissä on, saadaan eri hahmoista luotua matemaattinen malli, johon tekoäly sitten vertaa annettua kuvaa ja tekee valistuneita arvauksia. Parhaimmillaan tulokset ovat hämmästyttäviä, pahimmillaan huvittavia.

Tunnistus perustuu etukäteen määriteltyihin avainsanoihin. Algoritmi ei osaa itse kuvailla, mitä se näkee, vaan se poimii valmiista luokituksista parhaiten vastaavat.

Microsoft Office -pakettiin on kaikessa hiljaisuudessa tullut tekoälyominaisuuksia. Esimerkiksi Powerpoint kirjoittaa kuvaan vaihtoehtokuvauksen, joka sisältää kuvasta tunnistettuja elementtejä. Kadulla vastaan tulleesta koirasta ottamaani kuvaan Powerpoint lisäsi seuraavia määritteitä (tämän blogikirjoituksen kuvissa avainsanat on selvyyden vuoksi upotettu kuvan päälle):
"Koira, sisä, katsominen, eläin"
Koira, katsominen ja eläin menevät aivan oikein, mutta kuva on otettu talvella ulkona. Taustan valkoinen ei ole seinä vaan lunta.

Aina tunnistus ei mene putkeen. Virheet kertovat tekoälyn käyttämästä logiikasta. Esimerkiksi Helsingin Sanomien uutiskuva parin viikon takaa tuottaa yllättävän tuloksen:
"Nainen, pöytä, ruoka, pata"
Kuvassa on ilmeisesti öljysäiliöitä, jotka tekoäly on tulkinnut pöydällä oleviksi padoiksi. Sen vielä ymmärtää, mutta mistä tekoäly on keksinyt, että kuvassa olisi nainen? Ilmeisesti tekoäly on koulutettu kuvilla, joissa nainen laittaa ruokaa. Koneoppimisen tuloksena nainen yhdistetään patoihin ja pöytään, mikä on kuvaava esimerkki tekoälyn vääristymisestä yksipuolisen aineiston perusteella.

Mutta palataan niihin koirakuviin, sillä tämä on kiinnostava aihe, jossa riittää loputtomasti kokeiltavaa. Mistä tekoäly tunnistaa koiran? Muokkasin peruskuvasta erilaisia versioita ja kokeilin Officen tulkintaa niistä.

Pelkät silmät riittävät.
Kuonosta koira tunnetaan.
Puoli päätä riittää.
Samoin pelkkä kirsu.
Jos kuvassa on useita koiria, tekoäly tunnistaa sen vain koirana eikä Office osaa kertoa, että kuvassa on kolme koiraa:

Edelleen koira. 
Lisätään toinen eläin:
"Kissa, eläin, koira, katsominen"
Tunnistus onnistuu, vaikka kuvaan lisätään 80 % kohinaa, joskin nyt koira näyttää istuvan.
"Koira, istuminen, katsominen, ruskea"
Sitten muutama kiinnostava versio.
Koiran eri osat muodostavat yhdessä koiran.
Algoritmin kannalta on sama, näyttääkö koira elävältä vai onko siinä ainoastaan koiran eri osat. Sen mielestä kuva on identtinen lähtökuvan kanssa, vaikka ihminen näkee heti mikä on pielessä.

Kun kuvaa sotketaan ja väännetään lisää, algoritmi alkaa antaa kiinnostavia tuloksia:

"Koira, katsominen, sisä, pistäminen"
Kirsun peittäminen saa algoritmin näkemään pistämistä - onpa outoa. Mutta kun silmätkin peitetään, tekoälyn mielestä kuvassa onkin kissa.

"Kissa, sisä, istuminen, katsominen"
Silmät ja kirsu ovat siis oleellisia koiran tunnistamiselle. Mutta mistä algoritmi tunnistaa katsomisen, jos silmiä ei edes ole?

"Ruoka"
Paloina käännetyssä kuvassa on tekoälyn mielestä ruokaa. Kiinnostava tulkinta.

"Erilainen, ruoka"
Toinen kääntö saa kuvan näyttämään erilaiselta ja ruualta.

"Koira, katsominen, valokuva, eläin"
4x4 ruudukosta tunnistaa yhä koiran. Jostain syystä algoritmi näkee myös valokuvan.

"Sisä, katsominen, valkoinen, lehmä"
Yhä pienemmät palat saavat algoritmin näkemään valkoisen lehmän. Kieltämättä koiran turkki tuo pieninä paloina mieleen lehmän.

"Sisä, katsominen, valokuva, lehmä"
Vielä yksi esimerkki:

"Objekti, sisä, erilainen, mies"
Mistä ihmeestä algoritmi keksii tähän kuvaan miehen??

Muut testiaineiston koirakuvat Officen tekoäly tunnisti ongelmitta, mutta yhteen tuli väärä eläin:
Tämä pikkukoira näyttää tekoälyn mielestä karhulta.
Kuvantunnistusta käytetään myös Googlen ja Applen valokuvapalveluissa. Niistä lisää seuraavassa kirjoituksessa.