7.1. Mikä on neuroverkko¶
Neuroverkko on algoritmi, jonka käyttäytyminen opitaan esimerkeistä sen sijaan, että se koodattaisiin käsin. Sama verkkoarkkitehtuuri oppii tunnistamaan kasvot, kun sille annetaan miljoona kasvokuvaa. Sama arkkitehtuuri oppii tunnistamaan kädet, kun sille annetaan miljoona kuvaa käsistä. Sama arkkitehtuuri oppii tunnistamaan ne kaikki kerralla, kun sille annetaan luokitettu aineisto, joka kattaa monia objektiluokkia. Vain painot muuttuvat kohteiden välillä, ja painot tuotetaan erillisellä koulutusprosessilla, joka vertaa verkon ennusteita luokiteltuihin esimerkkeihin ja säätää painoja, kunnes ne täsmäävät.
7.1.1. Toimintaperiaate¶
Neuroverkko on kerrosten pino. Jokainen kerros kertoo edellisen kerroksen tulosteen painojen matriisilla, lisää siihen vakiotermivektorin ja soveltaa tulokseen epälineaarista funktiota. Yhden kerroksen tuloste on seuraavan syöte. Otettu kuva tulee pinon yläosaan, virtaa alaspäin kymmenien tai satojen kerrosten läpi ja tulee ulos pinon pohjasta tensorina, jonka arvot kuvaavat sitä, mitä kuvassa oli.
Se, mitä kunkin kerroksen painot tekevät, riippuu siitä, mihin verkko on koulutettu. Konenäköverkon varhaisen kerroksen painomatriisi saattaa aktivoitua lyhyestä vaakareunasta; hieman syvempi saattaa aktivoitua kulmasta; vielä syvempi saattaa aktivoitua pyöreästä silmän muodosta; syvimmät kerrokset saattavat aktivoitua kokonaisista kasvoasetelmista. Mitään tästä ei kirjoitettu käsin. Koulutusprosessi kävi läpi miljoonia luokiteltuja esimerkkejä, nyökkäsi painoja alaspäin tappiofunktiolla, ja reuna-sitten-kulma-sitten-silmä-sitten-kasvot -hierarkia syntyi itsestään datasta.
Pieni luokitteluverkko kerrosten pinona. Syötetensori tulee yläosaan otetun kuvan muodossa ja virtaa alaspäin kerrosten läpi, joista jokainen muuntaa tensorin mittasuhteita. Pohjassa olevassa tulostetensorissa on yksi arvo luokkaa kohden. Tunnistus- ja avainpisteverkot jakavat saman kerrosten pino -muodon; vain tulostetensorin tulkinta muuttuu.¶
Verkon arkkitehtuuri – miten kerrokset on järjestetty, mitkä operaatiot yhdistävät ne – määrittää sen, mitä verkko voi tehdä. Painot ovat se, mitä verkko on oppinut. Kameran osuus tästä on ladata koulutuksen tuottama painotiedosto ja suorittaa sama laskenta, jonka kouluttaja suoritti, mutta otetulle kehykselle koulutusaineiston sijaan.
7.1.2. Mitä sisään syötetään, mitä ulos tulee¶
Verkon molemmat päät ovat tensoreita – moniulotteisia lukutaulukoita, samanlaisia kohteita kuin numpy-luvussa juuri esiteltiin. Konenäköverkon syötetensori on otettu kuva järjestettynä uudelleen verkon odottamaan asetteluun: tyypillisesti (B, H, W, C) 4-monikkomuoto, jossa B on eräulottuvuus (kameralla aina 1, koska yksi kehys käsitellään kerrallaan), H ja W ovat verkon odottama pikselikorkeus ja -leveys, ja C on kanavien määrä (3 RGB-verkolle, 1 harmaasävylle).
Tulostetensori riippuu siitä, mihin verkko on tarkoitettu:
Luokitteluverkko tuottaa 1-ulotteisen tensorin luottamuspisteistä, yhden luokkaa kohden. Suurimman pisteen indeksi on ennustettu luokka. MobileNetistä johdettu henkilöntunnistin, joka toimitetaan useimpien kameroiden mukana, on tätä muotoa: kaksi pistettä, yksi luokalle ”person” ja yksi luokalle ”not person”.
Tunnistusverkko tuottaa 2-ulotteisen tensorin, jonka arvot kuvaavat rajauslaatikkojen luetteloa sekä luokkatodennäköisyyksiä. YOLOv8 on tätä muotoa:
(84, N)tensori, jossa 4 sen 84 rivistä on laatikon regressioarvoja ja muut 80 luokkakohtaisia todennäköisyyksiä, toistettuinaNankkuripaikassa.Avainpisteverkko tuottaa tensorin, jonka arvot ovat nimettyjen maamerkkien pikselisijainteja. MediaPipe-kasvomaamerkkimalli on tätä muotoa: 468 avainpistettä tunnistettua kasvoa kohden.
Segmentointiverkko tuottaa 2-ulotteisen tensorin, jonka arvot ovat pikselikohtaisia luokkanimiä – samat mittasuhteet kuin syötteellä, ja jokaisessa kohdassa luokkaindeksi.
Regressioverkko tuottaa yksittäisen luvun tai lyhyen lukuvektorin – syvyysarvion, kulman, lämpötilan.
Jokaisella muodolla on kameralla oma jälkikäsittelijänsä, joka muuntaa raa’an tulostetensorin takaisin siihen tulosmuotoon, jota muu sovellus käyttää – rajauslaatikoiksi, avainpisteluetteloiksi, luokkanimiksi, numeerisiksi arvioiksi. Jälkikäsittelijä on sovelluspuolen koodia, joka tuntee verkon tulosteen asettelun; verkko itse on vain laskenta, joka tuottaa tensorin.
7.1.3. Miksi tämä toimii kameralla¶
Kaksi laskennallista keinoa tekee tästä käytännöllistä mikro-ohjainluokan osalle. Ensimmäinen on kvantisointi. Koulutus tapahtuu 32-bittisellä liukulukulaskennalla; päättely voidaan suorittaa 8-bittisellä kokonaislukulaskennalla lähes ilman tarkkuuden menetystä useimmille verkoille. Kahdeksanbittiset painot vievät neljäsosan tallennustilasta ja toimivat useita kertoja nopeammin kuin 32-bittiset liukuluvut. Jokainen kameran mukana toimitettu malli on jo kvantisoitu erillisesti.
Toinen on laitteistokiihdytys. Saman laskennan, jonka mikro-ohjaimen suoritin käy läpi yksi käsky kerrallaan, neuroverkkokiihdytin suorittaa satoja operaatioita kerralla. Uudemmissa kameroissa (AE3 ja N6) on omistettu neuroprosessointiyksikkö (NPU) – tensorikiihdytin SoC:lla – joka muuttaa mallin, jonka suorittaminen suorittimella olisi vienyt sekunnin, sellaiseksi, joka toimii kymmenissä millisekunneissa. Päättelymoottorit-luku käsittelee, miltä kameran osuus tästä näyttää.
7.1.4. Mitä luku käsittelee¶
Koulutus ei ole kameran tehtävä. Koulutettu malli saapuu kameralle .tflite -tiedostona; kamera lataa sen, ajaa jokaisen otetun kehyksen sen läpi ja dekoodaa tuloksena syntyvän tensorin tulokseksi, jonka mukaan sovellus voi toimia. Kaikki seuraava käsittelee jokaista näistä vaiheista:
mallin lataaminen ja tarkastelu;
flash-osio, jossa mallitiedostot sijaitsevat;
päättelykutsun neljä vaihetta;
moottorit, jotka todella suorittavat laskennan;
ja jälkikäsittelijät, jotka muuttavat tulostetensorin takaisin laatikoiden, avainpisteiden tai luokkien luetteloksi.
Image-luvun tunnistimet oli kukin rajattu tiettyyn kohteeseen. Ne, joita tämän luvun loppuosa käsittelee, koulutetaan sen sijaan datasta, ja sama moottori ajaa minkä tahansa mallin, jonka skripti lataa. Niiden mukana tullut työnkulun muutos – kohdekohtainen algoritmi korvataan kohdekohtaisella painotiedostolla – on seuraava asia, joka on hyvä nostaa esiin.