7.6. Anatomie predict

Model.predict(inputs, *, callback=None) je místo, kde objekt načteného modelu skutečně koná práci. Mezi vstupem dovnitř a výstupem ven běží postupně tři fáze: předzpracování, odeslání do enginu, dodatečné zpracování. Dvě ze tří přebírají parametry, jež skript přímo řídí; engine uprostřed určuje kamera.

Vodorovný tok pěti propojených rámečků zleva doprava. Nejlevější je „Image input“; šipka vede k „Pre-process“ s podtitulkem „Normalization“; šipka vede k „Engine“ s podtitulkem „TFLM / STAI“; šipka vede k „Post-process“ s podtitulkem „postprocess=“; a poslední šipka vede k „Result“. Tři prostřední fáze nesou pod sebou označení -- „user-controllable“ pod Pre-process, „automatic“ pod Engine a „user-controllable“ pod Post-process.

Tři fáze predict(). Předzpracování a dodatečné zpracování přebírají parametry, jež řídí skript; engine uprostřed je pevně dán kamerou.

7.6.1. Předzpracování

Fáze předzpracování promění každý vstup na hustý tenzor, který síť očekává. Nejběžnějším vstupem je image.Image zachycený v RGB565. Fáze jej ořízne a změní jeho velikost na input_shape sítě, převede z RGB565 na formát kanálů, na němž byla síť trénována (RGB888 pro většinu sítí pro zpracování obrazu), aplikuje měřítko a posun na každý kanál a – pokud síť očekává celočíselný vstup – ve stejném průchodu kvantizuje na input_dtype modelu. Sítě trénované na vstup typu float krok kvantizace přeskočí a přijmou výsledek měřítka a posunu přímo.

Výchozí ml.preprocessing.Normalization čte vstupní dtype modelu a automaticky spustí správnou transformaci. Ručně doladěná Normalization přepíše hodnoty měřítka, průměru a směrodatné odchylky pro modely trénované vůči vlastním statistikám kanálů (běžným případem jsou průměry a směrodatné odchylky odvozené z ImageNet). Prostý volatelný objekt přepíše fázi celou – užitečné, když vstup vůbec není obraz nebo když aplikace už hustý tenzor vyprodukovala sama.

7.6.2. Odeslání do enginu

Fáze enginu spustí síť. To, do kterého enginu odešle, je pevně dáno kamerou: H7 a RT1062 spouštějí TFLM (interpret TensorFlow Lite for Microcontrollers, který odesílá pro ARM optimalizovaná jádra CMSIS-NN, kde existují); AE3 spouští tentýž interpret TFLM se záložním jádrem Cortex-M55 a NPU Ethos-U obsluhuje každý operátor, který offline kompilátor Vela označil pro akcelerátor; N6 spouští STAI, runtime od ST pro účelově navržené NPU čipu N6.

Engine nevybírá skript. Engine dodávaný s kamerou spouští každý model, který kamera načte.

7.6.3. Dodatečné zpracování

Fáze dodatečného zpracování promění surové výstupní tenzory sítě zpět na použitelný výsledek. Výchozím chováním je dekvantovat každý výstupní tenzor na pohyblivou řádovou čárku (nebo jej u sítí s výstupy typu float propustit beze změny) a vrátit je jako seznam objektů ndarray. Většina aplikací registruje post-processor – volatelný objekt, který zná rozvržení výstupu sítě – aby dekódoval tenzory do podoby výsledku, na nějž aplikace reaguje: seznam ohraničujících rámečků, seznam klíčových bodů, seznam tříd.

Skript řídí tuto fázi dvěma způsoby. Klíčové slovo postprocess= v konstruktoru registruje post-processor, který běží při každém volání. Klíčové slovo callback= v predict() přepíše registrovaný post-processor jen pro jedno volání – užitečné pro přepínání mezi několika dekodéry bez opětovného načítání modelu. Obě formy přijímají (model, inputs, outputs) a vracejí, cokoli aplikace očekává.

7.6.4. Co skript řídí

Předzpracování a dodatečné zpracování jsou dvě páky skriptu. Výchozí předzpracovatel zvládne většinu modelů pro zpracování obrazu; správný post-processor pro danou rodinu sítí se vybírá z katalogu pod ml.postprocessing. Engine uprostřed určuje sestavení a běží stejně bez ohledu na to, oč skript žádá.