7.2. Mitä ML muutti

image-moduuli sisältää kourallisen vanhoja tunnistusmenetelmiä – find_features() Haar-kaskadipohjaiseen kasvojentunnistukseen, find_eye() kiinteään pupillinetsijään, find_hog() gradienttisuuntayhteenvetoihin, sekä find_keypoints() ja find_lbp() -reitit mielivaltaisille avainpisteille. Ne kaikki toimivat edelleen; ne kaikki on korvattu koneoppimisputkella.

7.2.1. Klassinen jako: käsin suunnitellut yhteenvedot, opitut päätökset

Klassinen konenäköputki oli kaksivaiheinen kokonaisuus. Ensimmäinen vaihe muunsi raa’at pikselit tiiviiksi joukoksi lukuja, jotka oli valittu tiivistämään se, mitä kuvassa oli – ei pikseliarvoja itsessään, vaan lyhyempi kuvaus siitä, mitä kuvioita esiintyi missäkin. Toinen vaihe otti tuon yhteenvedon ja teki päätöksen: kasvot vai ei, tämä objekti vai tuo, sama kohde vai eri.

Jaolla oli merkitystä, koska kahdella vaiheella oli eri tekijät. Ensimmäisen vaiheen kirjoitti ihminen. Joku istui alas ja päätti, että kahden tietyn suorakulmion välinen kirkkausero oli hyvä yhteenveto silmän alueesta, että hallitseva reunan suunta ruudukon kussakin solussa oli hyvä yhteenveto seisovan henkilön ääriviivasta, että kunkin pikselin ympärillä oleva kirkas-tai-tumma -kuvio oli hyvä yhteenveto paikallisesta tekstuurista. Jokainen näistä valinnoista oli käsin kirjoitettu algoritmi – kirjoitettu, virheistä korjattu ja julkaistu. Yllä mainitut vanhat menetelmät olivat kaikki tällaisia yhteenvetoja, joista oli tullut vakiotyökaluja:

  • find_features() tiivistää kuvan ikkunan laskemalla yhteen kirkkauden useiden suorakulmioiden sisällä ja vertaamalla summia. Suorakulmioiden asettelut valittiin, koska ihmiskasvot osoittavat luotettavia kirkas-tummaa-vasten -kontrasteja: kulmakarvat poskia vasten, silmäkuopat otsaa vasten, nenä ympäröivää ihoa vasten.

  • find_hog() tiivistää kuvan kulkemalla pienten solujen ruudukon läpi ja tallentamalla, mikä reunan suunta hallitsee kussakin solussa. Ruudukko valittiin, koska seisovan henkilön ääriviiva tuottaa tunnistettavan reunasuuntien kuvion vaatetuksesta tai valaistuksesta riippumatta.

  • find_lbp() tiivistää kunkin pikselin naapuruston koodaamalla, mitkä sitä ympäröivistä pikseleistä ovat kirkkaampia ja mitkä tummempia. Koodaus valittiin, koska nämä kirkkaampi- / tummempi-kuviot kuvaavat pinnan tekstuurin riippumatta yleisestä valaistuksesta.

  • find_keypoints() löytää kuvasta kulmapisteitä ja kuvaa kunkin kulman ympärillä olevan alueen tavalla, joka pysyy samana, kun kulmaa kierretään. Kulma-ja-kierto -menetelmä valittiin, koska samat kulmat ilmaantuvat uudelleen, kun näkymää katsotaan eri kulmasta.

Kun yhteenveto oli kirjoitettu käsin, sen päälle tuleva pieni oppimisvaihe saattoi yhdistää luvut päätökseksi. Kasvojentunnistusalgoritmi liitti oppimisvaiheen suorakulmioerojen yhteenvetoon ja koulutti sitä luokitelluilla kasvo- ja ei-kasvokuvilla oppimaan, mitkä erojen yhdistelmät viittaavat kasvoihin. Reunasuuntayhteenveto syötettiin oppimisvaiheeseen, joka koulutettiin luokitelluilla henkilö- ja ei-henkilökuvilla. Kulmakuvaajat syötettiin täsmäysvaiheeseen, joka oppi, kuinka paljon painoa kullekin kulmalle annetaan. Jokainen näistä toisista vaiheista on oppimisalgoritmi – nykymittapuun mukaan pieni, mutta oppimisalgoritmi.

Panoksen jako oli se, millä oli merkitystä. Ihminen tuotti yhteenvedon. Kone oppi yhdistelmän. Uuden kohteen lisääminen merkitsi uuden yhteenvedon kirjoittamista.

7.2.2. Mitä neuroverkot muuttivat

Neuroverkko poistaa jaon. Verkon ensimmäiset kerrokset tekevät sen yhteenvetotyön, jonka käsin kirjoitetut algoritmit tekivät aiemmin – tunnistavat reunoja, kulmia, suunnattuja palkkeja, tekstuureja, juuri niitä asioita, joiden tunnistamiseen yllä luetellut vanhat menetelmät oli kukin viritetty – mutta niitä ei ole kirjoitettu käsin. Ne opitaan samasta koulutusaineistosta, josta päätösvaihekin opitaan, yhdellä koulutuskierroksella, joka säätää verkon molempia puolikkaita kerralla. Syvemmät kerrokset tekevät sen yhdistelyn, jonka käsin kirjoitettujen yhteenvetojen päällä ollut pieni oppimisvaihe teki aiemmin, sekin opittuna, samalla kierroksella.

Muutos siinä, kuka suunnittelee mitä, on täydellinen:

  • Ihminen suunnittelee syötteen – otetut kehykset tietyn kokoisina ja muotoisina.

  • Ihminen suunnittelee tulosteen – tulostensorin asettelun (yksi piste luokkaa kohden luokittelussa, laatikoiden luettelo tunnistuksessa, avainpisteiden ruudukko maamerkeissä).

  • Ihminen toimittaa luokitellun koulutusaineiston – riittävästi esimerkkejä kohteesta ja riittävästi esimerkkejä ei-kohteista, jotta koulutusprosessilla on jotain, mistä oppia.

Kaiken syötteen ja tulosteen välillä tuottaa koulutusprosessi. Erillistä yhteenvedon kirjoitusvaihetta ei ole. Varhaiset kerrokset asettuvat reunan- ja tekstuurintunnistimiksi ei siksi, että kukaan kirjoitti ne sellaisiksi, vaan siksi, että reunan ja tekstuurin tunnistus on se, mikä saa verkon ennusteet vastaamaan luokkanimiä. Syvemmät kerrokset asettuvat muodon- ja objektintunnistimiksi samasta syystä. Molemmat puolikkaat koulutetaan yhdessä, mikä mahdollistaa sen, että kunkin kerroksen tuottamat yhteenvedot ovat täsmälleen ne yhteenvedot, joita seuraava kerros tarvitsee – eivät niitä yleisluontoisia, joihin käsin kirjoitetun putken oli pakko tyytyä.

7.2.3. Yhdistäminen image-moduulin kanssa

Neuroverkkoputket ottavat kuvat edelleen samojen sensorin API:en kautta, piirtävät tulokset samojen draw_rectangle() - ja draw_circle() -primitiivien kautta ja rajaavat työn samoilla (x, y, w, h) ROI:lla. Tyypillinen putki ottaa kehyksen, etsii valinnaisesti karkean kohteen klassisella tunnistimella kuten find_blobs() ja välittää sen rajauslaatikon päättelylle ROI:na, suorittaa päättelyn ja merkitsee palautetut tunnistukset takaisin alkuperäiseen kehykseen. Klassiset primitiivit ovat perusta; verkko on uusi vaihe keskellä.