Konenäkö ja kuvantunnistus

20.04.2020

Konenäkö ja kuvantunnistus

Konenäkö on nopeasti yleistyvä tekniikka ratkoa liiketoimintaan liittyviä ongelmia uudella tavalla, esimerkiksi sitä voidaan käyttää, mm.:

Alla olevassa jutussa kerrotaan aiheesta hieman tarkemmin.

Mitä on konenäkö?

Konenäöllä (Machine Vision) tarkoitetaan digitaalisen kuvainformaation (video tai still kuva) automaattista havainnointia ja tulkintaa. Konenäöllä voidaan tarkoittaa myös optista tunnisteiden lukua, jota hyödynnetään esim. pullonpalautusautomaateissa. Tässä artikkelissa keskitytään kuitenkin algoritmeillä tehtävään, yksityiskohtaisempaan kuvainformaation tulkintaan, ns. kuvantunnistusmallien avulla (Computer Vision).

Kuvantunnistusmallien tavoitteena on tunnistaa kuvista pikseli-intensiteetin vaihtelua ja spatiaalista assosiaatiota, joka on yhdistettävissä johonkin kuvan ominaisuuteen. Tyypillinen kuvantunnistusesimerkki on antaa algoritmille kuvia koirista ja kissoista ja pyytää sitä luokittelemaan kuvat tunnisteen (kissa tai koira) perusteella.

Kissojen ja koirien erottelu on toki ihan pelkkää leikkiä, mutta konenäköä hyödynnetään enenevässä määrin ihan oikeissa ongelmissa, kuten autonomisten autojen kehittämisessä ja reaaliaikaisessa kielen kääntämisessä puhelimen kameran välityksellä.

Konenäkömallien suorituskykyyn vaikuttaa ennen kaikkea sekä käytettävissä olevan opetusdatan määrä että koneoppismallin rakenne (neuroverkon topologia). Datan kerääminen ja luokittelu on työlästä (kullekin kuvalle pitää olla etukäteen tiedossa mitä ne esittävät tai missä kohtaa niissä on kiinnostavia objekteja) ja mallien optimointi erittäin vaikeaa. Siksi on useimmiten järkevintä käyttää valmiiksi koulutettuja ja optimoituja malleja.

Tällaisia malleja tarjoavat palveluna esim. Google, Microsoft ja Amazon, mutta malleja on paljon tarjolla myös avoimesti. Esiopetetun mallin voi kouluttaa uudelleen omalla datalla; tätä prosessia kutsutaan termillä *transfer learning*.

Esittelemme seuraavaksi miten kuvan tunnistus toimii AI-jackissa (Bilotin open-source tekoälykiihdytin). Käymme läpi myös todellisen bisnesongelman ja siihen ratkaisun, hyödyntämällä automaattista objektien tunnistusta kuvista.

Yksinkertainen kuva-analytiikka

Kuvantunnistusmalleja on jo pitkään opetettu ihmisten ottamilla kuvilla, joita säilötään esim. Google Photos-palvelussa tai Facebookissa. Nettiin ladatuissa kuvissa on useasti mukana käyttäjien antamia tunnisteita eli hästägejä (#), mutta kuvia voidaan myös “tägittää” manuaalisesti mallien koulutusta varten. Kun opetusdatassa on paljon kuvia, joissa on erinäinen määrä tunnisteita, oppii malli assosioimaan kuvan ominaisuuksia tiettyihin tunnisteisiin. Tällaista mallia voidaan sitten käyttää esim. uusien kuvien automaattiseen luokitteluun.

Esimerkki

Miten kuvan analysointi onnistuu Bilotin AI-jackissa?

Ensin ladataan ohjaustiedosto, johon on kirjattu tarvittavat parametrit (pitäen sisällään esimerkiksi Azure palveluiden kirjautumistiedot ja käytetyt kuvatiedostot/kuvien osoitteet):

Katsotaan ensin yksittäistä esimerkkikuvaa. Kuva haetaan suoraan verkosta ja näyttää tältä:

Kuvassa on selvästi ihmisiä kaupungilla, sateessa. Mitähän mieltä konenäkö tästä on?

Sen selvittämiseksi luodaan ensin kuvan analysointi- instanssi (Python class). Tätä instanssia metodeita käyttämällä pystymme hakemaan kuvasta sekä tunnisteita (tags) että sanallisia luonnehdintoja (descriptions). Seuraava koodi luo ensin kuvan analysointi-instanssin (AnalyzeVision) ja sen jälkeen hakee esimerkkikuvallemme tunnisteita (analyze.get_image_tags()) ja lopuksi selitteitä (analyze.get_descriptions()):

Tässä koodissa kutsuihin ei anneta mitään syötteitä (input), vaan kaikki hoidetaan analysointi-instanssin sisällä, ohjaustiedoston määrityksiin perustuen. Pellin alla AnalyzeVision() hyödyntää Azuren cognitive toolkitin Computer Vision API-rajapintaa kuvien analysointiin.

Alla listataan ne tunnisteet, joihin konenäkömallilla oli suurin luottamus:

TunnisteLuottamus
outdoor1.000
umbrella0.999
rain0.995
street0.992
ground0.990
person0.986
walking0.976

Selvästikin malli on käryllä siitä mitä kuvassa tapahtuu, eli se osaa tunnistaa kuvasta relevantteja aiheita, kuten sade, sateenvarjo ja ihmiset. Mutta osaako se muodostaa järkevän selitteen kuvalle? Otetaanpa selvää.

Seuraava Python-koodin pätkä tulostaa mallin muodostamista selitteistä “parhaan” (eli sen johon mallilla on suurin luottamus):

Jos jätetään huomiotta se ilmeinen virhe, että virke alkaa pienellä kirjaimella, on tässä sanottu oleellisin asia ko. kuvasta; ihmisiä kävelemässä kadulla sateisena päivänä. Ihan kohtalaisen hyvä suoritus tekoälyalgoritmilta, jolla ei ole minkäänlaista kontekstuaalista ymmärrystä.

Ihan kiva juttu…

Ihan kiva juttu, mutta mitä käytännön hyötyä tällaisesta kuva-analytiikasta oikein voisi olla? Ilmeinen käyttökohde on kuvien dynaaminen lajittelu esimerkiksi puhelimen Galleria-sovelluksessa. Jos kuva ajetaan vaikka heti ottamisen jälkeen kuvantunnistusmallin läpi — joka muuten voi istua ihan lokaalisti sillä samaisella laitteella, voidaan esim. analysoidut tunnisteet lisätä automaattisesti kuvan metadataan. Tämä taas mahdollistaa kuvien hakemisen ja ryhmittelyn tägien perusteella myöhemmin.

Tarkka kuvantunnistus, varsinkin jos malli on opetettu relevantilla datalla, mahdollistaa myös monien sensorien korvaamisen kameralla. Samasta kuvasta voidaan tulkita useampia asioita, kuten esimerkiksi kelikameroista valon määrä, säätila, liikenteen määrä jne. Voidaan tunnistaa tarvitaanko siivousta, jäteastioiden tyhjennystä tai muuta kiinteistön huolintaa. Esimerkkejä voi keksiä loputtomiin, rajana on lähinnä mielikuvitus.

Jotta tällaisiin sovelluksiin päästäisiin, tarvitaan ensin valmiiksi luokiteltua opetusdataa eli käytännössä manuaalisesti tulkittuja kuvia. Tällaista kuvamateriaalia ei kuitenkaan välttämättä tarvita kovinkaan paljon. Hyödyntämällä transfer learning konseptia, voidaan saada suurilla datamassoilla valmiiksi opetettu malli muokattua omaan tarkoitukseen sopivaksi suhteellisen pienelläkin datamäärällä. Tätä konseptia hyödyntää esim. Azuren Custom Vision palvelu, jota on myös mahdollista käyttää AI-coren kautta.

Kuvan laadullista analysointia vieläkin hyödyllisempää voi kuitenkin olla määrällinen tulkinta. Tämä on mahdollista objektintunnistuksen avulla, jota käsittelemme seuraavaksi.

Objektien tunnistaminen

Taustaa

Visuaalinen objektien tunnistus perustuu siihen, että eri objekteilla, kuten ihminen tai auto, on ominaisia piirteitä. Näiden piirteiden perusteella koneoppimismalli voidaan kouluttaa erottamaan eri objektit sekä toisistaan että taustasta. Objektin tunnistamisen yksi alalaji on kasvojen tunnistus, jota käytetään yleisesti esimerkiksi älypuhelinten lukituksen poistamiseen.

Objektien tunnistaminen on myös varsin keskeisessä roolissa kehitettäessä autonomisia ajoneuvoja ja sen avulla voidaan seurata esimerkiksi liikennemääriä ja täyttöasteita yleensä.

Fruits as a Service

Katsotaanpa sitten ihan konkreettista esimerkkiä. Bilotin toimistolle tulee säännöllisesti kerran viikossa laatikollinen hedelmiä (FaaS-palveluko tämä nyt sitten on?). Laatikon sisältö on hieman vaihteleva, mutta tyypillisesti siellä on banaanejaomenoitapäärynöitä ja appelsiinejä.

On myös tyypillistä, että banaanit on syöty viimeistään toimitusta seuraavana päivänä. Lisäksi laatikoita toimitetaan riippumatta toimiston käyttöasteesta, jolloin esim. kesälomien aikaan hedelmät tuppaavat pilaantumaan. Vaikka tämä hedelmäpalvelu onkin varsin hyvä, on siinä selvästikin vielä kehitettävää sekä asiakastyytyväisyyden (tarjonta ei ole tasaista) ja hävikin minimoinnin suhteen.

Entäpä jos toimistolla tarjolla olevista hedelmistä otettaisiin tasaisin väliajoin kuva, josta konenäön avulla arvioitaisiin eri hedelmien menekki? Tällä tavoin palvelun tarjoaja voisi saada automatisoidusti tiedon: (1) koska asiakkaat tarvitsevat täydennystä ja (2) mahdollisesti myös mitä hedelmiä asiakkaalle pitäisi toimittaa. Näin vältettäisiin sekä hävikkiä että parannettaisiin asiakastyytyväisyyttä.

Hedelmien laskeminen

Onko valokuvasta ylipäätään mahdollista tunnistaa hedelmiä ja jopa arvioida niiden määrää luotettavasti? Aloitetaan helpolla esimerkillä. Koitetaan laskea konenäön avulla omenat tästä kuvasta:

Pikaisesti laskettuna kuvassa on 41 omenaa, mutta osasta näkyy niin pieni osa, ettei koneellinen tunnistus välttämättä ole mahdollista.

Alla oleva Python-koodi hyödyntää avointa cvlib kirjastoa. Tarvitsee vain antaa numeroiksi käännetty kuva kyseisen kirjaston detect_common_objects funktiolle.

Lopputuloksena saadaan seuraava kuva, johon on laatikoilla rajattu tunnistetut objektit; kaikkien tägi on “apple”:

Kuvasta tunnistetaan kaikkiaan 37 omenaa; aika hyvin. Katsotaanpa seuraavaksi miten tämä lähestymistapa toimii hieman realistisemman datan kanssa.

Tekninen toteutus

Katsotaanpa sitten miten oikeat, kahvipöydällä tarjolla olevista hedelmistä otetut, kuvat saadaan tulkittua. Tässä on viisi “simuloitua” kuvaa, jotka esittävät hedelmien menekkiä työviikon aikana (yksinkertaisuuden vuoksi mukana on vain omenoita, banaaneja ja appelsiineja):

Aloitetaan lataamalla AI-jackin konenäkö-moduulista open_vision -osa:

Sen jälkeen luodaan kuvan analysointi-instanssi ja ladataan käytettävät kuvat, tässä tapauksessa lokaalilta levyltä (lähde voi olla käytännössä mikä tahansa):

Kuvien lataamisen jälkeen, niistä koitetaan tunnistaa objekteja ja käyttäjän on mahdollista säätää algoritmin toleransseja:

Tunnistusprosessi on nyt valmis ja voimme laskea kunkin objektin lukumäärän kussakin kuvassa (tässä kaikista mahdollisista objekteista valitaan vain kiinnostuksen kohteena olevat omenat, banaanit ja appelsiinit):

Ja lopuksi visualisointi lukumääräarvioista (päivämäärät on parsittu automaattisesti kuvien tiedostonimistä):

Kuten kuvista voitiin selvästi nähdä, banaanien määrä vähenee ja keskiviikkoon mennessä kaikki on syötä (banaanien tarkkaa lukumäärää on hyvin vaikea arvioida, koska käytännössä konenäkö pystyy tunnistamaan vain erilliset tertut tai yksittäiset banaanit). Tässä vaiheessa konsultteja alkaa jo harmittaa kahvitauolla.

Torstaihin tultaessa appelsiinitkin ovat melkein loppuneet ja perjantaina nekin on syöty. Viikonloppua vasten hedelmätäydennys olisi tosin turhaa, joten tämä lienee hyväksyttävissä. Omenoiden kohdalla tunnistamista vaikeuttaa aluksi se, että hedelmiä on päällekkäin (eikä lukumääräkään ole oikeasti konsistentti kuvien välillä).

Tässä vielä esimerkki tunnistetuista objekteista ensimmäisessä kuvassa:

Yhteenveto

Olkoonkin että tässä valittu esimerkki on keinotekoinen, sillä saadaan demonstroitua miten hyvin esiopetetutkin mallit voivat selviytyä todellisista kuvantunnistusongelmista. On siis mahdollista rakentaa toimiva konenäköratkaisuja, joilla on todellista bisnesarvoa, hyvin helposti ja kevyesti. Suurin työ on tässäkin tapauksessa integroida koneoppimismalli muuhun digitaaliseen infraan.

Teollisuudessa tuotantolinjoilla konenäköä voidaan hyödyntää esim. tarkistamaan että pakkaukset/tuotteet ovat ehjiä, oikean kokoisia, värisiä jne. Voidaan myös tarkkailla linjan volyymia, laskea pakattujen tuotteiden määriä ja tarkistaa että pakkauksissa on sinne kuuluvia tuotteita.

Valmiiden mallien hyödyntäminen on hyvin kustannustehokasta. On kuitenkin muistettava, että erityisesti tarkkuutta vaativissa tapauksissa voi olla parempi kouluttaa malli ns. from scratch, käyttäen vain relevanttia opetusdataa. Esimerkiksi Azure Custom Vision -dokumentaatiossa ei suositella ratkaisun käyttämistä laadunvalvontaan.

Share
Contact Person

Bloggaaja

Lasse Ruokolainen