7.6. predict-metodin anatomia

Model.predict(inputs, *, callback=None) on paikka, jossa ladattu malliolio tekee varsinaisen työnsä. Sisään menevien syötteiden ja ulos tulevan tuloksen välissä suoritetaan kolme vaihetta järjestyksessä: esikäsittely, moottorin lähetys, jälkikäsittely. Kaksi kolmesta ottaa parametreja, joita skripti hallitsee suoraan; keskellä olevan moottorin päättää kamera.

Vaakasuora virtaus viidestä toisiinsa yhdistetystä laatikosta vasemmalta oikealle. Vasemmanpuoleisin on "Image input"; nuoli johtaa laatikkoon "Pre-process", jonka alaotsikko on "Normalization"; nuoli johtaa laatikkoon "Engine", jonka alaotsikko on "TFLM / STAI"; nuoli johtaa laatikkoon "Post-process", jonka alaotsikko on "postprocess="; ja viimeinen nuoli johtaa laatikkoon "Result". Kolmella keskimmäisellä vaiheella on merkintä alapuolella -- "user-controllable" Pre-process-laatikon alla, "automatic" Engine-laatikon alla ja "user-controllable" Post-process-laatikon alla.

Metodin predict() kolme vaihetta. Esikäsittely ja jälkikäsittely ottavat parametreja, joita skripti hallitsee; keskellä olevan moottorin kamera kiinnittää.

7.6.1. Esikäsittely

Esikäsittelyvaihe muuntaa kunkin syötteen tiheäksi tensoriksi, jota verkko odottaa. Yleisin syöte on image.Image, joka on kaapattu RGB565-muodossa. Vaihe rajaa ja skaalaa sen verkon ominaisuuteen input_shape, muuntaa RGB565-muodosta siihen kanavamuotoon, jolle verkko on koulutettu (RGB888 useimmille konenäköverkoille), soveltaa kanavakohtaisen skaalauksen ja siirtymän, ja – kun verkko odottaa kokonaislukusyötettä – kvantisoi mallin ominaisuuteen input_dtype samalla läpiajolla. Liukulukusyötteelle koulutetut verkot ohittavat kvantisointivaiheen ja saavat skaalaus- ja siirtymätuloksen suoraan.

Oletus ml.preprocessing.Normalization lukee mallin syötteen dtype-tyypin ja suorittaa oikean muunnoksen automaattisesti. Käsin viritetty Normalization ohittaa skaalaus-, keskiarvo- ja keskihajonta-arvot malleille, jotka on koulutettu mukautettuja kanavatilastoja vastaan (ImageNetistä johdetut keskiarvot ja keskihajonnat ovat yleinen tapaus). Tavallinen kutsuttava olio ohittaa vaiheen kokonaan – hyödyllistä, kun syöte ei ole lainkaan kuva tai kun sovellus on jo itse tuottanut tiheän tensorin.

7.6.2. Moottorin lähetys

Moottorivaihe suorittaa verkon. Mihin moottoriin se lähettää, on kameran kiinnittämä: H7 ja RT1062 ajavat TFLM:ää (TensorFlow Lite for Microcontrollers -tulkki, joka lähettää ARM-optimoituja CMSIS-NN-ytimiä siellä, missä niitä on); AE3 ajaa samaa TFLM-tulkkia Cortex-M55-varajärjestelmällään ja Ethos-U NPU käsittelee minkä tahansa operaattorin, jonka offline-Vela-kääntäjä on merkinnyt kiihdyttimelle; N6 ajaa STAI:ta, ST:n ajonaikaista ympäristöä N6:n erityisesti rakennetulle NPU:lle.

Skripti ei valitse moottoria. Kameran mukana toimitettava moottori ajaa jokaisen mallin, jonka kamera lataa.

7.6.3. Jälkikäsittely

Jälkikäsittelyvaihe muuntaa verkon raa’at tulostensorit takaisin käyttökelpoiseksi tulokseksi. Oletustoiminta on kvantisoinnin purkaminen kustakin tulostensorista liukuluvuksi (tai sen läpäisy muuttumattomana liukulukutuloksia tuottaville verkoille) ja niiden palauttaminen listana ndarray -olioita. Useimmat sovellukset rekisteröivät jälkikäsittelijän – kutsuttavan olion, joka tuntee verkon tulosteasettelun – purkaakseen tensorit siihen tulosmuotoon, jonka pohjalta sovellus toimii: lista rajauslaatikoita, lista avainpisteitä, lista luokkia.

Skripti hallitsee tätä vaihetta kahdella tavalla. Avainsana postprocess= konstruktorissa rekisteröi jälkikäsittelijän, joka suoritetaan jokaisella kutsulla. Avainsana callback= metodissa predict() ohittaa rekisteröidyn jälkikäsittelijän vain yhden kutsun ajaksi – hyödyllistä vaihdettaessa useiden purkajien välillä ilman mallin uudelleenlatausta. Kumpikin muoto saa argumentit (model, inputs, outputs) ja palauttaa sen, mitä sovellus odottaa.

7.6.4. Mitä skripti hallitsee

Esikäsittely ja jälkikäsittely ovat skriptin kaksi ohjauskahvaa. Oletusesikäsittelijä hoitaa useimmat konenäkömallit; oikea jälkikäsittelijä tietylle verkkoperheelle valitaan luettelosta moduulin ml.postprocessing alta. Keskellä olevan moottorin päättää build, ja se toimii samalla tavoin riippumatta siitä, mitä skripti pyytää.