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