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– instanceModel, 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 dopredict(). Prvním prvkem je obvykle navázaná instanceNormalization; její atributroije to, coNMSočekává pro přemapování rámečků zpět do původního obrazu.outputs– hrubé výstupní tenzory jako seznam objektůndarrayv 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.