7.15. Napsání vlastního

Když katalog model nepokrývá – výzkumná síť s vlastním rozložením výstupu, úprava existující architektury, tenzor, jehož sémantická interpretace je specifická pro danou aplikaci – aplikace poskytne vlastní post-procesor. Protokol je jednoduchý: volatelný objekt, který přijímá (model, inputs, outputs) a vrací cokoli, co aplikace očekává od predict().

Konvenční podobou je třída s __call__

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

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

Funguje i prostá funkce – engine pouze kontroluje, že je objekt volatelný.

7.15.1. Zapojení

Dva body připojení. Argument postprocess= v konstruktoru naváže volatelný objekt pro každé volání predict() na modelu:

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

Chcete-li navázání přepsat pro jediné volání – vyměnit dekodéry bez opětovného načtení modelu – předejte callback= přímo do predict:

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

Signatura volatelného objektu je v obou případech stejná.

7.15.2. Co volatelný objekt obdrží

  • model – instance Model, užitečná pro kvantizační parametry (output_scale, output_zero_point, output_dtype) a vstupní rozměry (input_shape).

  • inputs – seznam vstupů, které aplikace předala do predict(). Prvním prvkem je obvykle navázaná instance Normalization; její atribut roi je to, co NMS očekává pro přemapování rámečků zpět do původního obrazu.

  • outputs – hrubé výstupní tenzory jako seznam objektů ndarray v jejich nativním dtype. Plovoucí výstupy přicházejí tak, jak jsou; celočíselné výstupy přicházejí kvantizované.

7.15.3. Kvantizovaná aritmetika

Všechny dodávané dekodéry sahají po stejných pomocnících v ml.utils a vlastní dekodér obvykle chce stejný vzor: quantize() zvedne plovoucí práh do kvantizovaného prostoru modelu, threshold() filtruje bez dekvantizace celého tenzoru a dequantize() se spustí jednou na přeživších. sigmoid() a logit() jsou k dispozici pro sítě, jejichž výstupní kanály jsou logity před sigmoidou (kanonickým případem jsou detektory MediaPipe).

U modelů s plovoucími výstupy – regresní hlavy, modely s vestavěnou závěrečnou dekvantizační vrstvou – procházejí kvantizační pomocníci beze změny, takže stejný kód post-procesoru funguje s oběma dtype bez zvláštního ošetřování.

7.15.4. Návratová hodnota

Cokoli volatelný objekt vrátí, to vrátí predict(). U dekodérů vypouštějících rámečky je konvencí protlačit kandidáty přes NMS a vrátit jeho seznamy podle tříd – tvar volání, který dokumentuje potlačení nemaximálních hodnot a který sestavuje v kontextu průchod YOLOv8. U čehokoli jiného vraťte cokoli, co aplikaci vyhovuje: jediný ndarray, řetězec štítku, n-tici (class, score, embedding), slovník.