7.12. Utófeldolgozók

Egy észlelő hálózat nem dobozokat bocsát ki. Egy vagy több tenzort bocsát ki, amelyek elrendezése attól az architektúrától függ, amelyhez a modellt betanították – egy YOLO-családú detektornál a jelölt predikciók 2-D tenzora, egy MediaPipe detektornál egy (boxes, scores) tenzorpár, egy testtartás-hálózatnál a kulcspont-koordináták lapos listája. Az alkalmazás egyiket sem tudja közvetlenül kiolvasni; amire szüksége van – egy doboz-lista, egy kulcspont-lista, egy osztályonkénti bontás – azt a nyers tenzorból ki kell dekódolni.

Ez a dekódoló az utófeldolgozó. Az ml.postprocessing modul forrás-ökoszisztéma szerint csoportosítja őket.

7.12.1. Darknet

Az ml.postprocessing.darknet az eredeti YOLO-korszak modelljeit dekódolja. A YOLO v2 vezette be a rács és a horgony ötleteket, amelyeket a legtöbb későbbi detektor valamilyen formában örökölt, így a v2 elrendezés a legtisztább kiindulópont.

A YOLO v2 azzal kezdi, hogy a bemeneti képet egy durva rácsra osztja – a kanonikus 416 képpontos bemenethez egy 13x13-as elrendezés, kisebb modelleknél kisebb –, és úgy tanítja a hálózatot, hogy minden rácscella felelős legyen bármely olyan tárgy észleléséért, amelynek középpontja belé esik. A kimeneti tenzor térbeli elrendezése tükrözi a bemenet elrendezését: a kimenetben celланként egy pozíció a képben.

Minden rácscellánál a hálózat nem a semmiből jósol egy dobozt. Több előre kiválasztott referenciaformából választ, amelyeket horgonyoknak (anchor) hívnak – rögzített (width, height) párok, amelyeket offline módon, a betanító halmaz dobozméreteinek klaszterezésével származtatnak úgy, hogy lefedjék azokat a tipikus tárgyakat, amelyek látását a modelltől várjuk. A hálózat feladata minden cellánál az, hogy minden horgonyra megjósolja a doboz középpontjának kis eltolását a cellán belül, a horgony szélességének és magasságának egy skáláját, egy objektivitás (objectness) pontszámot (annak valószínűsége, hogy egyáltalán van ott valami) és egy osztályonkénti valószínűségi vektort. Egy 13x13-as rács az alapértelmezett 5 horgonnyal és 20 osztállyal ezért 13 * 13 * 5 * (4 + 1 + 20) = 21,125 számot bocsát ki következtetésenként.

A YoloV2 ezt az elrendezést dekódolja: bejárja a cellákat, az egyes horgonyok eltolásait és skáláit alkalmazza az abszolút doboz-koordináták visszanyeréséhez, az objektivitást egy osztályonkénti pontszámmá kombinálja az osztály-valószínűséggel, küszöböl, és a túlélőket az NMS-be tolja. Az osztály egy anchors= konstruktorargumentumot vesz át, ha a modellt egy egyéni horgonytáblával szemben tanították, egyébként egy beépített alapértelmezésre esik vissza. Az adott osztálykészletekre hangolt változatok ugyanabban az almodulban szállítva érkeznek.

7.12.2. Ultralytics

Az ml.postprocessing.ultralytics az újabb YOLO-generációkat dekódolja. A YoloV8 egy oszlopfolytonos kimenetet olvas, ahol minden oszlop egy horgony-predikció, amely doboz-koordinátákat és egy osztályonkénti pontszámvektort tartalmaz – az objektivitás-csatornát, amelyet a korábbi YOLO-kimenetek hordoztak, a v8-ban elhagyták, és az osztály-pontszámok önállóan állnak. A YOLOv8 áttekintés tenzorról tenzorra lépve végigjárja a dekódolást. A régebbi, Ultralytics-korszakbeli verziók ugyanabban az almodulban szállítva érkeznek az elrendezésükhöz tanított modellekhez.

7.12.3. MediaPipe

Az ml.postprocessing.mediapipe a Google könnyűsúlyú, eszközön futó családját dekódolja. A BlazeFace az a arcdetektor, amelyet a hello-blazeface tárgyal: egy gyors, horgony-alapú detektor, amely arconként dobozokat és hat tereppont-koordinátát bocsát ki, amelyeket (box, score, keypoints) rendezett hármasokként ad vissza, a tereppontokat az egyes dobozokhoz csatolva, nem pedig külön kimeneti listaként. A kéz-észlelő, tereppont- és testtartás-modellek ugyanebből a családból mellette szállítva érkeznek, és ugyanazt a csatolt kulcspontos visszatérési alakzatot követik.

7.12.4. Egy kiválasztása

A megfelelő utófeldolgozót az az architektúra határozza meg, amelyhez a modellt betanították, nem pedig az, amit az alkalmazás szeretne. Egy YOLOv8 .tflite csak a YoloV8 osztályon keresztül dekódolódik helyesen; egy BlazeFace .tflite csak a BlazeFace osztályon keresztül. Az utófeldolgozó kiválasztása a modell kiválasztásának része. Amikor egy modell architektúráját nem képviseli egy szállított utófeldolgozó, a saját megírása egyszerű.

Az osztályozó hálózatok a kivétel. Az egyetlen kimeneti tenzoruk már az, amit az alkalmazás szeretne – osztályonkénti pontszámok listája –, és nincs szükség utófeldolgozóra. A modell betöltése postprocess= nélkül és a predikciós eredmény lapos ndarray-ként olvasása a helyes út, ahogy azt a tensor I/O tárgyalta.