7.15. Pisanje vlastitog

Kada katalog ne pokriva model – istraživačku mrežu čiji je raspored izlaza prilagođen, preinaku postojeće arhitekture, tenzor čije je semantičko tumačenje specifično za aplikaciju – aplikacija pruža vlastiti naknadni procesor. Protokol je jednostavan: poziv koji uzima (model, inputs, outputs) i vraća što god aplikacija očekuje od predict().

Klasa s __call__ uobičajeni je oblik:

class MyPostprocessor:
    def __init__(self, threshold=0.5):
        self.threshold = threshold

    def __call__(self, model, inputs, outputs):
        ...
        return result

Funkcionira i obična funkcija – mehanizam samo provjerava je li objekt pozivljiv.

7.15.1. Povezivanje

Dvije točke povezivanja. Imenovani argument postprocess= u konstruktoru veže poziv za svaki poziv predict() na modelu:

model = ml.Model("/rom/my_model.tflite",
                 postprocess=MyPostprocessor())

Za nadjačavanje veze za jedan poziv – zamjenu dekodera bez ponovnog učitavanja modela – proslijedite callback= izravno funkciji predict:

result = model.predict([img], callback=MyOtherPostprocessor())

Potpis pozivljivog objekta isti je u oba slučaja.

7.15.2. Što pozivljivi objekt prima

  • model – instanca Model, korisna za parametre kvantizacije (output_scale, output_zero_point, output_dtype) i ulazne dimenzije (input_shape).

  • inputs – lista ulaza koje je aplikacija proslijedila u predict(). Prvi element obično je vezana instanca Normalization; njezin atribut roi ono je što NMS očekuje za vraćanje okvira natrag u izvornu sliku.

  • outputs – sirovi izlazni tenzori kao lista objekata ndarray, u svom izvornom dtype. Float izlazi stižu takvi kakvi jesu; cjelobrojni izlazi stižu kvantizirani.

7.15.3. Kvantizirana aritmetika

Svi isporučeni dekoderi posežu za istim pomoćnim funkcijama u ml.utils, a prilagođeni obično želi isti obrazac: quantize() podiže float prag u kvantizirani prostor modela, threshold() filtrira bez dekvantiziranja cijelog tenzora, a dequantize() izvodi se jednom na preživjelima. sigmoid() i logit() dostupni su za mreže čiji su izlazni kanali pred-sigmoid logiti (MediaPipe detektori kanonski su primjer).

Za modele s float izlazima – regresijske glave, modele s ugrađenim završnim slojem dekvantizacije – pomoćne funkcije za kvantizaciju prolaze nepromijenjene, pa isti kod naknadnog procesora radi s bilo kojim dtype bez posebnih iznimaka.

7.15.4. Povratna vrijednost

Što god pozivljivi objekt vrati, to vraća i predict(). Za dekodere koji emitiraju okvire konvencija je proslijediti kandidate kroz NMS i vratiti njegove liste po klasi – oblik poziva koji dokumentira potiskivanje koje nije najveće, a detaljni vodič kroz YOLOv8 gradi u kontekstu. Za sve ostalo vratite što god aplikaciji odgovara: jedan ndarray, niz oznake, torku (class, score, embedding), rječnik.