7.4. Načtení modelu¶
ml.Model načte soubor modelu z flash paměti, naparsuje jej, alokuje RAM, kterou síť potřebuje během inference, a vrátí objekt, jenž nese vše, co zbytek skriptu potřebuje o načtené síti vědět.
7.4.1. Konstruktor¶
Konstruktor přijímá cestu a volitelný post-processor:
model = ml.Model("/rom/blazeface_front_128.tflite",
postprocess=BlazeFace())
Modely na /rom/ (souborový systém umístěný ve flash paměti) se čtou přímo na místě: váhy sítě zůstávají ve flash paměti a načtený model spotřebuje pouze tolik RAM, kolik zabere tensor arena. Modely na /sdcard/ se při načtení kopírují do RAM, takže celková cena je velikost souboru modelu plus tensor arena. Obě cesty fungují; rozdíl je v RAM.
Pokud existuje sourozenecký soubor .txt se stejným základním názvem, jeho obsah se automaticky načte do labels. Klíčové slovo postprocess= registruje volatelný objekt, který predict() spustí po každé inferenci.
7.4.2. Vlastnosti pouze pro čtení¶
Načtený model vystavuje malou sadu vlastností pouze pro čtení, jež popisují síť, aniž by ji někdo spouštěl.
Soubor a paměť.
len– velikost souboru modelu na disku v bajtech.ram– velikost tensor areny, kterou síť potřebuje pro své mezivýsledné aktivace během inference, v bajtech.
Vstupní tenzory.
input_shape– seznam n-tic, jedna na každý vstupní tenzor, udávající tvar, který síť očekává. Sítě pro zpracování obrazu mají jeden vstup s tvarem(1, H, W, C).input_dtype– seznam jednoznakových kódů dtype ('b'int8,'B'uint8,'h'int16,'H'uint16,'f'float32), jeden na každý vstup.input_scaleainput_zero_point– kvantizační parametry, které převádějí mezi reálně hodnotovým vstupem, na němž byla síť trénována, a celočíselnou reprezentací, s níž kamera pracuje.
Výstupní tenzory. Zrcadlo vstupní sady: output_shape, output_dtype, output_scale, output_zero_point. Detekční sítě produkují dva nebo tři výstupní tenzory (rámečky, skóre spolehlivosti, někdy pravděpodobnosti tříd); klasifikační sítě produkují jeden.
Doplňky. labels je seznam názvů tříd načtený ze sourozeneckého souboru .txt, nebo None. postprocess je registrovaný post-processor, nebo None.
7.4.3. Prozkoumání BlazeFace¶
Načtení dodávaného modelu BlazeFace a vypsání každé vlastnosti poskytne konkrétní čísla:
import ml
from ml.postprocessing.mediapipe import BlazeFace
model = ml.Model("/rom/blazeface_front_128.tflite",
postprocess=BlazeFace())
print("file size: ", model.len, "bytes")
print("tensor arena: ", model.ram, "bytes")
print("input shape: ", model.input_shape)
print("input dtype: ", model.input_dtype)
print("input scale: ", model.input_scale)
print("input zp: ", model.input_zero_point)
print("output shape: ", model.output_shape)
print("output dtype: ", model.output_dtype)
print("output scale: ", model.output_scale)
print("output zp: ", model.output_zero_point)
Čísla konkrétně identifikují rozhraní sítě: jediný vstupní tenzor int8 o tvaru (1, 128, 128, 3) a dva výstupy int8 – jeden pro koeficienty regrese rámečků, jeden pro skóre spolehlivosti na každou kotvu. Kvantizační parametry popisují, jak se tyto hodnoty int8 mapují na reálné hodnoty float, vůči nimž byla síť trénována; post-processor je používá k odstranění kvantizace před dekódováním rámečků.
Každá vlastnost je jediným zdrojem pravdy o tom, co popisuje. Skripty čtou input_shape, aby věděly, na co snímat, čtou output_scale a output_zero_point k ručnímu dekódování tenzorů a čtou labels pro lidsky čitelné názvy tříd – nikdy napevno zadané, nikdy předpokládané.