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_scale a input_zero_pointkvantizač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é.