7.4. Modell betöltése

A ml.Model beolvas egy modellfájlt a flash memóriából, elemzi azt, lefoglalja a hálózat által a következtetés során igényelt RAM-ot, és visszaad egy objektumot, amely a betöltött hálózatról minden olyan információt hordoz, amelyre a szkript további részének szüksége van.

7.4.1. A konstruktor

A konstruktor egy elérési utat és egy opcionális utófeldolgozót vesz át:

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

A /rom/ (a flash memóriában rezidens fájlrendszer) helyen lévő modellek helyben kerülnek beolvasásra: a hálózat súlyai a flash memóriában maradnak, és a betöltött modell csak a tensor arena méretének megfelelő RAM-ot foglal. A /sdcard/ helyen lévő modellek betöltéskor a RAM-ba másolódnak, így a teljes költség a modellfájl mérete plusz a tensor arena. Mindkét elérési út működik; a kompromisszum a RAM.

Ha létezik egy azonos alapnevű, párhuzamos .txt fájl, annak tartalma automatikusan betöltődik a labels attribútumba. A postprocess= kulcsszó egy meghívható objektumot regisztrál, amelyet a predict() minden következtetés után lefuttat.

7.4.2. Csak olvasható tulajdonságok

A betöltött modell egy kis halmaz csak olvasható tulajdonságot tesz elérhetővé, amelyek leírják a hálózatot anélkül, hogy bárki futtatná azt.

Fájl és memória.

  • len – a lemezen tárolt modellfájl mérete, bájtban.

  • ram – a tensor arena mérete, amelyre a hálózatnak a következtetés során a köztes aktivációihoz szüksége van, bájtban.

Bemeneti tenzorok.

  • input_shape – egy listányi tuple, bemeneti tenzoronként egy, amely megadja a hálózat által elvárt alakot. A látórendszeri hálózatoknak egy bemenetük van, (1, H, W, C) alakkal.

  • input_dtype – egykarakteres dtype-kódok listája ('b' int8, 'B' uint8, 'h' int16, 'H' uint16, 'f' float32), bemenetenként egy.

  • A input_scale és a input_zero_point – a kvantálási paraméterek, amelyek átváltanak a hálózat tanításakor használt valós értékű bemenet és a kamera által futtatott egész számos reprezentáció között.

Kimeneti tenzorok. A bemeneti halmaz tükörképe: output_shape, output_dtype, output_scale, output_zero_point. Az észlelési hálózatok két vagy három kimeneti tenzort állítanak elő (dobozok, megbízhatósági pontszámok, néha osztályvalószínűségek); az osztályozási hálózatok egyet.

Extrák. A labels a párhuzamos .txt fájlból betöltött osztálynév-lista, vagy None. A postprocess a regisztrált utófeldolgozó, vagy None.

7.4.3. A BlazeFace vizsgálata

A szállított BlazeFace modell betöltése és az egyes tulajdonságok kiírása a tényleges számokat adja:

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)

A számok konkrétan azonosítják a hálózat interfészét: egyetlen (1, 128, 128, 3) int8 bemeneti tenzor és két int8 kimenet – az egyik a doboz-regressziós együtthatókhoz, a másik a horgonyonkénti megbízhatósági pontszámokhoz. A kvantálási paraméterek leírják, hogyan képeződnek le ezek az int8 értékek a valós float-okra, amelyekre a hálózatot tanították; az utófeldolgozó ezeket használja a kvantálás visszafejtéséhez a dobozok dekódolása előtt.

Minden tulajdonság az egyetlen igazságforrás arra nézve, amit leír. A szkriptek a input_shape olvasásával tudják meg, milyen formában rögzítsenek, a output_scale és a output_zero_point olvasásával dekódolják kézzel a tenzorokat, és a labels olvasásával jutnak az ember által olvasható osztálynevekhez – soha nem keményen bekódolva, soha nem feltételezve.