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