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.

A horizontal flow of five connected boxes from left to right. The leftmost is "Image input"; an arrow leads to "Pre-process" subtitled "Normalization"; an arrow leads to "Engine" subtitled "TFLM / STAI"; an arrow leads to "Post-process" subtitled "postprocess="; and a final arrow leads to "Result". The three middle stages carry a tag underneath -- "user-controllable" beneath Pre-process, "automatic" beneath Engine, and "user-controllable" beneath Post-process.

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ää.