7.4. Učitavanje modela

ml.Model čita datoteku modela iz flash memorije, raščlanjuje je, dodjeljuje RAM koji je mreži potreban tijekom zaključivanja i vraća objekt koji nosi sve što ostatak skripte treba znati o učitanoj mreži.

7.4.1. Konstruktor

Konstruktor prima putanju i opcionalni post-procesor:

model = ml.Model("/rom/blazeface_front_128.tflite",
                 postprocess=BlazeFace())

Modeli na /rom/ (datotečni sustav koji boravi u flash memoriji) čitaju se na licu mjesta: težine mreže ostaju u flash memoriji, a učitani model troši samo RAM u veličini tensor arene. Modeli na /sdcard/ kopiraju se u RAM pri učitavanju, pa je ukupni trošak veličina datoteke modela plus tensor arena. Obje putanje rade; kompromis je RAM.

Ako postoji susjedna .txt datoteka s istim osnovnim imenom, njezin se sadržaj automatski učitava u labels. Ključna riječ postprocess= registrira pozivnu funkciju koju predict() izvodi nakon svakog zaključivanja.

7.4.2. Svojstva samo za čitanje

Učitani model izlaže mali skup svojstava samo za čitanje koja opisuju mrežu, a da je nitko ne pokreće.

Datoteka i memorija.

  • len – veličina datoteke modela na disku, u bajtovima.

  • ram – veličina tensor arene koja je mreži potrebna za njezine međuaktivacije tijekom zaključivanja, u bajtovima.

Ulazni tenzori.

  • input_shape – popis n-torki, jedna po ulaznom tenzoru, koje daju oblik koji mreža očekuje. Mreže za strojni vid imaju jedan ulaz oblika (1, H, W, C).

  • input_dtype – popis jednoznakovnih kodova dtype ('b' int8, 'B' uint8, 'h' int16, 'H' uint16, 'f' float32), jedan po ulazu.

  • input_scale i input_zero_pointparametri kvantizacije koji pretvaraju između stvarnih ulaznih vrijednosti na kojima je mreža trenirana i cjelobrojnog prikaza nad kojim kamera radi.

Izlazni tenzori. Zrcalna slika ulaznog skupa: output_shape, output_dtype, output_scale, output_zero_point. Mreže za detekciju proizvode dva ili tri izlazna tenzora (okviri, ocjene pouzdanosti, ponekad vjerojatnosti klasa); mreže za klasifikaciju proizvode jedan.

Dodaci. labels je popis imena klasa učitan iz susjedne .txt datoteke, ili None. postprocess je registrirani post-procesor, ili None.

7.4.3. Pregled BlazeFace modela

Učitavanje isporučenog BlazeFace modela i ispis svakog svojstva daje stvarne brojeve:

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)

Brojevi konkretno identificiraju sučelje mreže: jedan ulazni tenzor (1, 128, 128, 3) tipa int8 i dva int8 izlaza – jedan za koeficijente regresije okvira, jedan za ocjene pouzdanosti po sidru. Parametri kvantizacije opisuju kako se te int8 vrijednosti preslikavaju u stvarne float vrijednosti na kojima je mreža trenirana; post-procesor ih koristi za poništavanje kvantizacije prije dekodiranja okvira.

Svako svojstvo je jedini izvor istine za ono što opisuje. Skripte čitaju input_shape kako bi znale na čemu snimati, čitaju output_scale i output_zero_point kako bi ručno dekodirale tenzore, te čitaju labels za čovjeku čitljiva imena klasa – nikad čvrsto kodirana, nikad pretpostavljena.