7.12. Naknadni procesori¶
Mreža za detekciju ne emitira okvire. Emitira jedan ili više tenzora čiji raspored ovisi o arhitekturi na kojoj je model treniran – 2-D tenzor predviđanja kandidata za detektor iz YOLO obitelji, par tenzora (boxes, scores) za MediaPipe detektor, ravnu listu koordinata ključnih točaka za mrežu za pozu. Aplikacija ne može izravno pročitati ništa od toga; ono što želi – listu okvira, listu ključnih točaka, razlaganje po klasama – mora se dekodirati iz sirovog tenzora.
Taj dekoder je naknadni procesor. Modul ml.postprocessing grupira ih prema ekosustavu izvora.
7.12.1. Darknet¶
ml.postprocessing.darknet dekodira modele iz izvornog YOLO razdoblja. YOLO v2 uveo je ideje rešetke i sidra koje je većina kasnijih detektora u nekom obliku naslijedila, pa je raspored v2 najčišća polazna točka.
YOLO v2 počinje dijeljenjem ulazne slike na grubu rešetku – raspored 13 puta 13 za kanonski ulaz od 416 piksela, manji za manje modele – i trenira mrežu tako da je svaka ćelija rešetke odgovorna za detekciju bilo kojeg objekta čije središte pada unutar nje. Prostorni raspored izlaznog tenzora zrcali raspored ulaza: jedan položaj u izlazu po ćeliji u slici.
U svakoj ćeliji rešetke mreža ne predviđa okvir ni iz čega. Bira između nekoliko unaprijed odabranih referentnih oblika nazvanih sidra – fiksnih parova (width, height) izvedenih izvanmrežno grupiranjem veličina okvira u skupu za treniranje tako da pokrivaju tipične objekte koje se od modela očekuje da vidi. Zadatak mreže u svakoj ćeliji jest predvidjeti, za svako sidro, mali pomak središta okvira unutar ćelije, mjerilo na širini i visini sidra, objectness rezultat (vjerojatnost da je bilo što ondje) i vektor vjerojatnosti po klasama. Rešetka 13 puta 13 sa zadanih 5 sidara i 20 klasa stoga emitira 13 * 13 * 5 * (4 + 1 + 20) = 21,125 brojeva po zaključivanju.
YoloV2 dekodira taj raspored: prolazi kroz ćelije, primjenjuje pomake i mjerila svakog sidra kako bi se obnovile apsolutne koordinate okvira, kombinira objectness s vjerojatnošću klase za rezultat po klasi, primjenjuje prag i preživjele šalje u NMS. Klasa uzima argument konstruktora anchors= kada je model treniran na prilagođenoj tablici sidara, a inače se vraća na ugrađenu zadanu vrijednost. Varijante prilagođene određenim skupovima klasa isporučuju se u istom podmodulu.
7.12.2. Ultralytics¶
ml.postprocessing.ultralytics dekodira novije generacije YOLO-a. YoloV8 čita izlaz po stupcima gdje je svaki stupac jedno predviđanje sidra koje sadrži koordinate okvira i vektor rezultata po klasama – kanal objectness koji su raniji YOLO izlazi nosili izbačen je u v8, a rezultati klasa stoje samostalno. Detaljni vodič kroz YOLOv8 korak po korak prolazi kroz dekodiranje tenzor po tenzor. Starije inačice iz Ultralytics razdoblja isporučuju se u istom podmodulu za modele trenirane na njihovim rasporedima.
7.12.3. MediaPipe¶
ml.postprocessing.mediapipe dekodira Googleovu laganu obitelj za rad na uređaju. BlazeFace je detektor lica obrađen u hello-blazeface: brz detektor zasnovan na sidrima koji po licu emitira okvire i šest koordinata orijentira, vraćenih kao torke (box, score, keypoints) s orijentirima pridruženima svakom okviru, a ne kao zasebnu izlaznu listu. Modeli za detekciju ruku, orijentira i poze iz iste obitelji isporučuju se uz njega i slijede isti oblik povrata s pridruženim ključnim točkama.
7.12.4. Odabir jednog¶
Pravi naknadni procesor određen je arhitekturom na kojoj je model treniran, a ne onim što aplikacija želi. YOLOv8 .tflite ispravno se dekodira samo kroz YoloV8; BlazeFace .tflite samo kroz BlazeFace. Odabir naknadnog procesora dio je odabira modela. Kada arhitektura modela nije zastupljena nekim isporučenim naknadnim procesorom, pisanje vlastitog jednostavno je.
Mreže za klasifikaciju su iznimka. Njihov jedinstveni izlazni tenzor već je ono što aplikacija želi – lista rezultata po klasi – i nije potreban naknadni procesor. Učitavanje modela bez postprocess= i čitanje rezultata predviđanja kao ravnog ndarray pravi je put, kao što je obradio ulaz/izlaz tenzora.