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