7.12. Efterbehandlare¶
Ett detekteringsnät avger inte rutor. Det avger en eller flera tensorer vars layout beror på den arkitektur modellen tränats mot – en 2D-tensor av kandidatprediktioner för en detektor i YOLO-familjen, ett par av (boxes, scores)-tensorer för en MediaPipe-detektor, en platt lista av nyckelpunktskoordinater för ett posnätverk. Applikationen kan inte läsa någon av dessa direkt; det den vill ha – en lista av rutor, en lista av nyckelpunkter, en uppdelning per klass – måste avkodas ur den råa tensorn.
Den avkodaren är en efterbehandlare. Modulen ml.postprocessing grupperar dem efter ursprungsekosystem.
7.12.1. Darknet¶
ml.postprocessing.darknet avkodar modeller från den ursprungliga YOLO-eran. YOLO v2 introducerade rutnäts- och ankar-idéerna som de flesta senare detektorer ärvde i någon form, så v2-layouten är den renaste utgångspunkten.
YOLO v2 börjar med att dela in indatabilden i ett grovt rutnät – en 13-gånger-13-layout för den kanoniska 416-pixels-indatan, mindre för mindre modeller – och tränar nätverket så att varje rutnätscell ansvarar för att detektera vilket objekt som helst vars centrum faller inuti den. Utdatatensorns rumsliga layout speglar indatans layout: en position i utdatan per cell i bilden.
Vid varje rutnätscell predicerar nätverket inte en ruta ur tomma intet. Det väljer bland flera förvalda referensformer som kallas ankare – fasta (width, height)-par härledda offline genom att klustra rutstorlekarna i träningsmängden så att de täcker de typiska objekt modellen förväntas se. Nätverkets uppgift vid varje cell är att predicera, för varje ankare, en liten förskjutning till rutans centrum inom cellen, en skala på ankarets bredd och höjd, en objektnärvaro-poäng (sannolikheten att något finns där) och en sannolikhetsvektor per klass. Ett 13-gånger-13-rutnät med de förvalda 5 ankarna och 20 klasserna avger därför 13 * 13 * 5 * (4 + 1 + 20) = 21,125 tal per inferens.
YoloV2 avkodar den layouten: den går igenom cellerna, tillämpar varje ankares förskjutningar och skalor för att återvinna absoluta rutkoordinater, kombinerar objektnärvaro med klassannolikhet för en poäng per klass, tröskelfiltrerar och skickar de överlevande till NMS. Klassen tar ett anchors=-konstruktorargument när modellen tränats mot en anpassad ankartabell och faller annars tillbaka till en inbyggd standard. Varianter inställda för specifika klassuppsättningar levereras i samma undermodul.
7.12.2. Ultralytics¶
ml.postprocessing.ultralytics avkodar de nyare YOLO-generationerna. YoloV8 läser en kolumnmajor-utdata där varje kolumn är en ankarprediktion som innehåller rutkoordinater och en poängvektor per klass – objektnärvarokanalen som tidigare YOLO-utdata bar har tagits bort i v8, och klasspoängen står ensamma. YOLOv8-genomgången går igenom avkodningen tensor för tensor. Äldre versioner från Ultralytics-eran levereras i samma undermodul för modeller tränade mot deras layouter.
7.12.3. MediaPipe¶
ml.postprocessing.mediapipe avkodar Googles lättviktiga familj för enheten. BlazeFace är ansiktsdetektorn som behandlas i hello-blazeface: en snabb ankarbaserad detektor som avger rutor och sex landmärkeskoordinater per ansikte, returnerade som (box, score, keypoints)-tupler med landmärkena kopplade till varje ruta i stället för som en separat utdatalista. Modeller för handdetektering, landmärken och pos från samma familj levereras tillsammans med den och följer samma returform med kopplade nyckelpunkter.
7.12.4. Att välja en¶
Rätt efterbehandlare bestäms av den arkitektur modellen tränats mot, inte av vad applikationen vill ha. En YOLOv8-.tflite avkodas endast korrekt genom YoloV8; en BlazeFace-.tflite endast genom BlazeFace. Att välja efterbehandlare är en del av att välja modell. När en modells arkitektur inte representeras av en medföljande efterbehandlare är det enkelt att skriva en egen.
Klassificeringsnät är undantaget. Deras enda utdatatensor är redan vad applikationen vill ha – en lista av poäng per klass – och ingen efterbehandlare behövs. Att ladda modellen utan postprocess= och läsa prediktionsresultatet som en platt ndarray är rätt väg, vilket tensor-I/O behandlade.