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.

maanantai 4. toukokuuta 2020

Canon-kamerasta webcam videoneuvotteluihin (Webcam Utility -ohjelma)

Canon on tunnetusti hidasliikkeinen ja jähmeä organisaatio. R5-kameraa on odotettu kieli pitkällä jo kuukausia, eikä R-malliin ole vieläkään tullut softapäivityksenä focus stacking -ominaisuutta, joka oli valmiina halvemmassa RP-mallissa.

Mutta joskus Canon yllättää iloisesti: se julkisti juuri ilmaisen EOS Webcam Utility -ohjelman, joka muuttaa kameran webcamiksi esimerkiksi videoneuvotteluja varten. Aiemmin tämä on vaatinut erillistä kaappauskorttia (kuten Elgato 4K, joka on koronaviruksen vuoksi loppuunmyyty koko Euroopassa). Nyt pelkkä softa riittää.

Utility-ohjelma on vasta beta, mutta näytti lyhyessä kokeilussa toimivan moitteettomasti Zoom-videoneuvottelun kanssa. Kameraksi kelpaavat uudet järkkärimallit, kuten 1 DX Mark II ja III, R ja RP, 5Dm4 sekä M6, M50, M200 ja muutama Powershot-malli. Harmi, ettei vanha 5Dm3 ole tuettujen listalla. Täydellinen lista löytyy sivulta https://www.usa.canon.com/internet/portal/us/home/support/self-help-center/eos-webcam-utility/.

Canon ei olisi Canon, ellei tässäkin olisi outoja ratkaisuja. Ohjelma on tarkoitettu vain jenkeille ("This Software is for use in the U.S. and will not be supported outside that area"), mutta yllä oleva linkki näyttää kuitenkin toimivan (kunhan huomaa ensin klikata oman kameran tyyppiä). Ja beta-versio toimii vain Windows 10:llä, mikä on jo aiheuttanut ymmärrettävästi närää Mac-käyttäjien joukossa. Eiköhän molemmat puutteet korjata jatkossa.

EOS Webcam Utility ja Zoom.
Yksi mainio piirre on latauksen koko: vain 1,5 megatavua. Nykyään kaikki softat tai päivitykset tuntuvat olevan kymmenien megatavujen paketteja, joten pieni ja näppärä apuohjelma on enemmän kuin tervetullut.

Käyttöä varten tarvitaan jalusta ja ulkoinen virtalähde, jotta akku ei lopu kesken. Sitten vain kamerasta automaattinen virrankatkaisu pois päältä ja silmätarkennus käyttöön, jotta fokus säilyy puhujan liikkuessa.

Nykyversio siirtää vain kuvan, joten ääntä varten tarvitaan erillinen mikrofoni. Näillä eväillä saa kuitenkin videoneuvotteluihin erinomaisen kuvan- ja äänenlaadun, joka saa osallistujan loistamaan halpojen webcamien ja pätkivien Bluetooth-mikrofonien rinnalla. Tosin kaistaakin kuluu.