7.15. Skriva en egen¶
När katalogen inte täcker en modell – ett forskningsnätverk vars utdatalayout är skräddarsydd, en justering av en befintlig arkitektur, en tensor vars semantiska tolkning är applikationsspecifik – tillhandahåller applikationen sin egen efterbehandlare. Protokollet är enkelt: en anropbar som tar (model, inputs, outputs) och returnerar vad än applikationen förväntar sig av predict().
En klass med __call__ är den konventionella formen:
class MyPostprocessor:
def __init__(self, threshold=0.5):
self.threshold = threshold
def __call__(self, model, inputs, outputs):
...
return result
En vanlig funktion fungerar också – motorn kontrollerar endast att objektet är anropbart.
7.15.1. Koppla in den¶
Två anslutningspunkter. Nyckelordsargumentet postprocess= på konstruktorn binder den anropbara för varje predict()-anrop på modellen:
model = ml.Model("/rom/my_model.tflite",
postprocess=MyPostprocessor())
För att åsidosätta bindningen för ett enskilt anrop – byta avkodare utan att ladda om modellen – skicka callback= direkt till predict:
result = model.predict([img], callback=MyOtherPostprocessor())
Signaturen för den anropbara är densamma i båda fallen.
7.15.2. Vad den anropbara tar emot¶
model–Model-instansen, användbar för kvantiseringsparametrarna (output_scale,output_zero_point,output_dtype) och indatadimensionerna (input_shape).inputs– listan av indata som applikationen skickade tillpredict(). Det första elementet är vanligtvis den bundnaNormalization-instansen; dessroi-attribut är vadNMSförväntar sig för att mappa om rutor tillbaka in i originalbilden.outputs– de råa utdatatensorerna som en lista avndarray-objekt, i sin ursprungliga dtype. Flyttalsutdata kommer som de är; heltalsutdata kommer kvantiserade.
7.15.3. Kvantiserad aritmetik¶
De medföljande avkodarna sträcker sig alla efter samma hjälpfunktioner i ml.utils, och en anpassad vill vanligtvis ha samma mönster: quantize() lyfter ett flyttalströskelvärde in i modellens kvantiserade rum, threshold() filtrerar utan att avkvantisera hela tensorn, och dequantize() körs en gång på de överlevande. sigmoid() och logit() är tillgängliga för nätverk vars utdatakanaler är logitar före sigmoid (MediaPipe-detektorerna är det kanoniska fallet).
För modeller med flyttalsutdata – regressionshuvuden, modeller med ett slutligt avkvantiseringslager inbakat – passerar kvantiseringshjälparna igenom oförändrade, så samma efterbehandlarkod fungerar mot endera dtype utan specialhantering.
7.15.4. Returvärde¶
Vad än den anropbara returnerar är vad predict() returnerar. För rutavgivande avkodare är konventionen att skicka kandidater genom en NMS och returnera dess listor per klass – den anropsform som icke-maximumundertryckning dokumenterar och som YOLOv8-genomgången bygger i sitt sammanhang. För allt annat, returnera vad än applikationen finner bekvämt: en enda ndarray, en etikettsträng, en tupel av (class, score, embedding), en ordbok.