A 26.2. Egy- és kétlépcsős detektor egységben a detektor nyers kimenetéről beszéltünk: régió- vagy anchor-alapú predikciók, osztálylogitok és dobozkoordináták együttese. Most azt vizsgáljuk, mi történik a modell kimenete és a publikálható detekciós lista között. Három fogalmat választunk szét: a modell confidence score-ját, a Non-Maximum Suppression (NMS) elnevezésű posztprocesszt és a benchmark-összegző Average Precision (AP) metrikát. Az első a modellé, a második a predikciók ritkításának algoritmusa, a harmadik a teljes tesztkészletre vonatkozó értékelési konvenció. A kettő nem mosható össze: egy jól kalibrált score nem teszi feleslegessé az NMS-t, és egyetlen score-küszöbön mért precision nem azonos az AP-vel.
Előismeret: az egy- és kétlépcsős detektorok felelősségi körei (26.2. Egy- és kétlépcsős detektor), a doboz mint
félig nyílt xyxy intervallum és az IoU alapgondolata (26.1. Dobozkoordináta, IoU és lokalizációs loss),
valamint a metrika és a kísérleti napló elválasztása (25.3. Kis adat és feature-alapú baseline).
Visszautalunk a címkezaj problémájára is (22.3.
Zajos és hiányos címke), mert a ground truth (GT) doboz
pontatlansága közvetlenül befolyásolja az AP-t. A 14.3. Paraméterszám, MAC és aktivációmemória
költségmodellje pedig releváns marad: az NMS páronkénti IoU-számítása a
modell kiértékelésén túli költség.
Induló kérdés: ha a modell ugyanarra az objektumra két majdnem egyforma, egyaránt magas score-ú dobozt ad, miért nem lesz ettől kétszer akkora a mért teljesítménye?
Doboz (bounding box). Egy detekciós doboz négy koordinátából áll:
ahol a kép szélessége és magassága ugyanabban a koordinátarendszerben, és , . A koordináták lehetnek pixelértékek vagy -re normalizált értékek, de egy kiértékelési egységen belül egyetlen konvenciót kell használni. A GlyphLab szerződéséhez hasonlóan a dobozt félig nyílt intervallumként értelmezzük: az , tartomány alkotja a dobozt. Területe:
A detekciós kimenetet egy kötegben mátrixként és score-vektorként ábrázoljuk; a nyers detekciók száma. A score tartománya gyakran , de az NMS és az AP definíciójához elegendő, hogy a score-ok rendezhető valós számok legyenek.
Intersection over Union. Két doboz, és IoU-ja:
ahol a metszet szélessége , magassága analóg módon számolódik. Ha , a képlet direkt. Az üres-uniós szélsőesethez külön szabály kell: ha és , akkor ; ha a két elfajuló doboz különbözik, ; ha pontosan az egyik területe nulla, a metszet területe nulla, tehát az IoU is nulla. Gyakorlati detektor-kimenetben a pozitív területű doboz a jellemző eset.
Score threshold. A score threshold egy üzemeltetési szűrő: csak azokat a detekciókat tartjuk meg, amelyekre . Ez a szűrő a modell kimenetének felhasználói értelmezését szolgálja, nem a benchmark-metrika része. Az AP-számítás ezzel szemben a rendezett detekciós listát feldolgozza anélkül, hogy egyetlen -nél elvágná azt; a küszöb szerepét a rendezett sorrend összes lehetséges prefixe veszi át. Ezért az AP a score-rangsor összegzője, míg a score threshold egy adott működési pontot választ.
NMS (Non-Maximum Suppression). Legyen adott , és IoU-küszöb. Az NMS a következő determinisztikus algoritmus:
A bemenetre a kimenet üres. Az NMS nem változtat a dobozokon és a score-okon; csak eldönti, mely predikciókat közöljük. A választása kompromisszum: a magas IoU-küszöb több, egymástól alig eltérő duplikátumot hagyhat meg, az alacsony küszöb pedig valódi, egymáshoz közel álló objektumokat nyomhat el. Az NMS a duplicate detection kezelésének egyik eszköze, de nem az egyetlen forrása a duplikátumoknak: ahogy a matching-definícióban látni fogjuk, az NMS után is lehet két detekció ugyanarra a GT-re.
Illesztés, TP/FP/FN. Legyen ground truth doboz egy adott képen, , és legyen a kiértékelési IoU-küszöb. A detekciókat csökkenő score szerint dolgozzuk fel. A -edik detekció akkor true positive (TP), ha létezik még hozzá nem rendelt GT-doboz, amellyel az IoU legalább ; ekkor a legnagyobb IoU-jú ilyen GT-t választjuk, és foglaltnak jelöljük. Ha egy GT-hez már korábban egy detekciót rendeltünk, a későbbi illeszkedő detekció false positive (FP). Ha nincs elérhető, kellően átfedő GT, a detekció FP. Egy GT, amelyhez egyetlen detekciót sem rendeltünk, false negative (FN). Ez a mohó párosítás a standard kiértékelési alap; a tie eseteket itt a legkisebb GT-index választásával oldjuk fel.
Precision, recall, AP. A feldolgozás -adik lépése után az addigi osztályozás, és
A esethez külön konvenció kell; a jelen egységben feltesszük, hogy a kiértékelt képeken . A PR-görbe a pontokból áll. Az általunk használt all-point interpolált AP a következő:
ahol a feldolgozott detekciók száma, és az azonos recall-értékű pontokat az eredeti sorrendben tartjuk meg; ez utóbbi a jobb oldali maximális interpolációt alkalmazza. A szokásos 11 pontos VOC-konvenció ettől különbözik: ott a recall-tengely pontjaiban vett interpolált precisioneket átlagoljuk. A publikációban mindig jelölni kell, melyik konvenciót használtuk; a numerikus értékek konvenciófüggők. A duplicate detection büntetése itt lép be: a második, ugyanarra a GT-re illeszkedő detekció FP-ként csökkenti a precisiont anélkül, hogy a recallt növelné.
Legyen egy
-es
kép, öt nyers detekció a következő xyxy dobozokkal és
score-okkal:
Területek: , , , , . A rendezés a score, majd a terület, majd az index szabálya szerint: (0.9, terület 100), (0.9, terület 64), (0.85), (0.6), (0.5). Legyen .
Az NMS kimenete , azaz az eredeti indexekkel . Figyeljük meg: az azonos score-ú kiesett, mert a nagyobb területű előbb dolgozódott fel; ez a tie-break szabály következménye. Az NMS tehát nem egyszerűen „a legmagasabb score-ú doboz mindig nyer”, hanem a térbeli elnyomás sorrendjétől függ.
Legyen egy méretű képen három GT-doboz:
Hat detekció, már score szerint rendezve (tegyük fel, hogy NMS után is így maradtak, például -es NMS-IoU-küszöb mellett; a második szándékosan egy megmaradó duplikátum -re):
| Detekció | Score | IoU a GT-kkel, illesztés | |
|---|---|---|---|
| 1 | 0.95 | : → TP | |
| 2 | 0.90 | : , de már foglalt → FP | |
| 3 | 0.85 | : → TP | |
| 4 | 0.80 | legjobb : → FP | |
| 5 | 0.70 | : → TP | |
| 6 | 0.60 | nincs átfedő GT → FP |
A melletti lépésenkénti értékek:
Az all-point képletben a jobb oldali maximumok:
Így
A kettes számú duplikátum rontotta a precisiont: a recall nem nőtt, de az FP eggyel növelte a nevezőt. Ha a 11 pontos VOC-interpolációval számolunk, az interpolált görbe pontjai: -ra ; -ra ; -ra . A ponthoz , a ponthoz , a ponthoz tartozik, így az átlag . A két konvenció közötti különbség ; nem hiba, hanem a definíciók eltérése.
A következő NumPy-implementáció CPU-n fut, float32
dtype-tal, véletlen komponens nélkül, ezért seed-re nincs szükség. A
munkakönyvtár: lab.
# lab/n103_nms_lab.py
import numpy as np
def box_area(boxes: np.ndarray) -> np.ndarray:
boxes = np.asarray(boxes, dtype=np.float32)
return (boxes[..., 2] - boxes[..., 0]) * (boxes[..., 3] - boxes[..., 1])
def compute_iou(a: np.ndarray, b: np.ndarray) -> float:
ix1 = float(max(a[0], b[0]))
iy1 = float(max(a[1], b[1]))
ix2 = float(min(a[2], b[2]))
iy2 = float(min(a[3], b[3]))
iw = max(0.0, ix2 - ix1)
ih = max(0.0, iy2 - iy1)
inter = iw * ih
aa = float((a[2] - a[0]) * (a[3] - a[1]))
ba = float((b[2] - b[0]) * (b[3] - b[1]))
union = aa + ba - inter
if union > 0.0:
return inter / union
if aa == 0.0 and ba == 0.0:
return 1.0 if np.allclose(a, b, atol=0.0) else 0.0
return 0.0
def nms(boxes: np.ndarray, scores: np.ndarray, iou_threshold: float = 0.5) -> np.ndarray:
boxes = np.asarray(boxes, dtype=np.float32)
scores = np.asarray(scores, dtype=np.float32)
B = boxes.shape[0]
areas = box_area(boxes)
order = sorted(range(B), key=lambda i: (-float(scores[i]), -float(areas[i]), i))
keep = []
suppressed = np.zeros(B, dtype=bool)
for i in order:
if suppressed[i]:
continue
keep.append(i)
for j in order:
if suppressed[j] or j == i:
continue
if compute_iou(boxes[i], boxes[j]) >= iou_threshold:
suppressed[j] = True
return np.array(keep, dtype=np.int64)
def match_detections(det_boxes, det_scores, gt_boxes, iou_threshold=0.5):
det_boxes = np.asarray(det_boxes, dtype=np.float32)
det_scores = np.asarray(det_scores, dtype=np.float32)
gt_boxes = np.asarray(gt_boxes, dtype=np.float32)
D = det_boxes.shape[0]
M = gt_boxes.shape[0]
areas = box_area(det_boxes)
order = sorted(range(D), key=lambda i: (-float(det_scores[i]), -float(areas[i]), i))
tp = np.zeros(D, dtype=bool)
assigned = np.zeros(M, dtype=bool)
for i in order:
best_j = -1
best_iou = -1.0
for j in range(M):
if assigned[j]:
continue
iou = compute_iou(det_boxes[i], gt_boxes[j])
if iou >= iou_threshold and iou > best_iou:
best_iou = iou
best_j = j
if best_j >= 0:
tp[i] = True
assigned[best_j] = True
return tp, order
def all_point_ap(tp, order, n_gt):
tp_cum = 0
fp_cum = 0
precisions = []
recalls = []
for idx in order:
if tp[idx]:
tp_cum += 1
else:
fp_cum += 1
precisions.append(tp_cum / (tp_cum + fp_cum))
recalls.append(tp_cum / n_gt)
ap = 0.0
prev = 0.0
for k, r in enumerate(recalls):
if r > prev:
ap += (r - prev) * max(precisions[k:])
prev = r
return ap
def main():
nms_boxes = np.array([
[0, 0, 5, 5],
[0, 0, 10, 10],
[20, 20, 30, 30],
[2, 2, 12, 12],
[1, 1, 9, 9],
], dtype=np.float32)
nms_scores = np.array([0.6, 0.9, 0.5, 0.85, 0.9], dtype=np.float32)
keep = nms(nms_boxes, nms_scores, 0.5)
print("NMS keep (eredeti indexek):", keep.tolist())
print("Ures NMS:", nms(np.empty((0, 4), np.float32), np.empty(0, np.float32)).tolist())
gt = np.array([
[10, 10, 50, 50],
[100, 20, 150, 60],
[30, 80, 80, 120],
], dtype=np.float32)
det_boxes = np.array([
[12, 12, 48, 48],
[11, 10, 49, 52],
[100, 22, 149, 59],
[5, 5, 20, 20],
[29, 81, 79, 119],
[0, 0, 9, 9],
], dtype=np.float32)
det_scores = np.array([0.95, 0.90, 0.85, 0.80, 0.70, 0.60], dtype=np.float32)
tp, order = match_detections(det_boxes, det_scores, gt, 0.5)
ap = all_point_ap(tp, order, gt.shape[0])
print("All-point AP:", ap)
print("TP sorrend szerint:", [int(tp[i]) for i in order])
if __name__ == "__main__":
main()A futtatás parancsa: python n103_nms_lab.py. Az alábbi
munkamenet-output a fenti kézi számításból származó jelölt elvárt
kimenet, mert a kéziratkészítés során kódot nem futtattam:
NMS keep (eredeti indexek): [1, 3, 0, 2]
Ures NMS: []
All-point AP: 0.75555557
TP sorrend szerint: [1, 0, 1, 0, 1, 0]
Ha az ellenőrző futtatás ettől abszolút hibánál jobban eltér, akkor nem a konvenció, hanem a kód hibás; az AP-érték kerekítve .
A fenti match_detections és all_point_ap
szándékosan egyképes, egyosztályos didaktikai példa:
nem kap image_id-t és osztálycímkét. Valódi detektálási
kiértékelésnél egy detekció csak azonos képű és azonos
osztályú GT-hez illeszthető, egy osztály AP-jét pedig az összes kép
detekcióinak globális score-sorrendjéből kell számolni,
nem a képenkénti AP-k átlagaként. A mAP az
osztályonkénti AP-k átlaga.
Három AP-konvenció él egymás mellett, és a számszerű eredmények nem összevethetők:
pycocotools a detekciókat és a GT-ket kép–osztály páronként
illeszti, de az osztály precision–recall görbéjét az összes kép
detekcióiból állítja össze ([D22]).Az NMS szintén konvenciófüggő: osztályonkénti NMS-nél csak azonos osztályú dobozok nyomják el egymást (a detektorok szokásos alapesete), class-agnostic NMS-nél bármely két átfedő doboz; az utóbbi két különböző osztályú, egymást átfedő objektum egyikét eldobhatja. A választott változatot a kiértékelési jegyzőkönyvben rögzíteni kell.
# lab/n103_map.py — többképes, többosztályos AP és mAP (az n103_nms_lab.py függvényeire épül)
import numpy as np
from n103_nms_lab import compute_iou
def class_ap(dets, gts, cls, iou_threshold=0.5):
"""Egy osztály AP-je az összes képen: a detekciók globális score-sorrendben,
illesztés csak azonos image_id-jú és osztályú GT-hez (all-point interpoláció)."""
d = sorted([x for x in dets if x["cls"] == cls], key=lambda x: -x["score"])
g = [x for x in gts if x["cls"] == cls]
used = [False] * len(g)
tp = []
for det in d:
best, best_iou = -1, iou_threshold
for j, gt in enumerate(g):
if used[j] or gt["image_id"] != det["image_id"]:
continue
iou = compute_iou(det["box"], gt["box"])
if iou >= best_iou:
best, best_iou = j, iou
if best >= 0:
used[best] = True
tp.append(best >= 0)
tp = np.array(tp, dtype=float)
prec = np.cumsum(tp) / np.arange(1, len(tp) + 1)
rec = np.cumsum(tp) / len(g)
ap, prev = 0.0, 0.0
for k in range(len(tp)):
ap += (rec[k] - prev) * prec[k:].max() # jobb oldali maximum
prev = rec[k]
return ap
def mean_ap(dets, gts, iou_threshold=0.5):
classes = sorted({g["cls"] for g in gts})
aps = {c: class_ap(dets, gts, c, iou_threshold) for c in classes}
return aps, float(np.mean(list(aps.values())))
def box(x, y, w=10, h=10):
return np.array([x, y, x + w, y + h], dtype=np.float32)
# Két kép, két osztály.
gts = [{"image_id": 0, "cls": 0, "box": box(0, 0)},
{"image_id": 0, "cls": 1, "box": box(30, 30)},
{"image_id": 1, "cls": 0, "box": box(0, 0)},
{"image_id": 1, "cls": 0, "box": box(50, 50)}]
dets = [{"image_id": 0, "cls": 0, "score": 0.9, "box": box(1, 1)}, # TP
{"image_id": 0, "cls": 0, "score": 0.8, "box": box(60, 0)}, # FP
{"image_id": 1, "cls": 0, "score": 0.7, "box": box(0, 1)}, # TP
{"image_id": 1, "cls": 0, "score": 0.6, "box": box(51, 50)}, # TP
{"image_id": 0, "cls": 1, "score": 0.5, "box": box(30, 31)}, # TP
{"image_id": 1, "cls": 1, "score": 0.95, "box": box(0, 0)}] # FP: más osztály
aps, m = mean_ap(dets, gts)
print("osztályonkénti AP:", {c: round(float(a), 4) for c, a in aps.items()}, " mAP:", round(m, 4))
# A 0. osztály képenkénti AP-jeinek átlaga nem a globális osztály-AP.
per_image = [class_ap([d for d in dets if d["image_id"] == i],
[g for g in gts if g["image_id"] == i], 0) for i in (0, 1)]
print("0. osztály képenként:", [round(float(a), 4) for a in per_image],
" átlaguk:", round(float(np.mean(per_image)), 4), " globális:", round(float(aps[0]), 4))A lab-profilban (NumPy 2.3.5) mért kimenet:
osztályonkénti AP: {0: 0.8333, 1: 0.5} mAP: 0.6667
0. osztály képenként: [1.0, 1.0] átlaguk: 1.0 globális: 0.8333
A 0. osztály mindkét képen külön-külön tökéletes AP-t kap (a hibás detekció az első képen a helyes után jön), a globális rangsorban viszont a 0,8 score-ú FP megelőzi a második kép két TP-jét, ezért a globális osztály-AP . A képenkénti AP-k átlaga tehát általában nem a benchmark-AP. Az 1. osztály AP-je : a második képen adott, más osztályú GT-re eső 0,95-ös detekció FP, mert az illesztés osztályon belül történik.
A labor célja annak ellenőrzése, hogy a tiszta Python/Numpy NMS ugyanazt a sorrendet és elnyomást adja, mint a kézi definíció. A laborprotokoll:
nms_boxes és
nms_scores ötöse,
;
külön üres bemenet; a 3.2. példa GT- és detekciós dobozai.cd lab && python n103_nms_lab.py, CPU,
float32, seed nem értelmezett.[1,3,0,2], az üres [], az AP
a float32 kerekítés mellett. Az azonos score-jú
és
közül
törlődik, mert a nagyobb területű
előbb került sorra; ez a területi tie-break szándékolt
következménye.det_scores a modell
kimenete; az nms a posztprocessz, amely nem változtat a
score-on; az all_point_ap a matching után a teljes rangsort
összegzi. A hatodik, alacsony score-ú FP nem rontja az AP-t, mert az
interpoláció a későbbi pontoknál a maximális precisiont használja; a
második, duplikált detekció viszont rontja, mert a recall növelése
nélkül növeli az FP-ket.Ez a labor nem teljes detektor-értékelés, hanem a definíciók numerikus ellenőrzése. A jövőbeli TorchVision-alapú detektálási laborhoz a [D18] hivatkozást külön kell tartalmilag ellenőrizni; jelen egység nem támaszkodik rá implementációs állításban.
F1. (fogalmi, nehézség 1, előfeltétel: 2. szakasz)
Definiálja az IoU-t egy pozitív területű és egy elfajuló dobozra. Miért
van szükség a félig nyílt xyxy konvenció
megkülönböztetésére a területszámításban? Adjon meg egy párt, ahol a
metszet üres, de a két doboz koordinátái átfedni látszanak a zárt
intervallum-értelmezés szerint.
F2. (levezetési/bizonyítási, nehézség 2, előfeltétel: 3.2. szakasz) Igazolja, hogy az all-point AP invariáns a score-vektor minden szigorúan monoton növekvő transzformációjára, ha nincsenek azonos score-ok. Számítsa ki a 11 pontos VOC-AP-t a 3.2. példa adataiból, minden köztes lépéssel.
F3. (implementációs, nehézség 2, előfeltétel: 4.
szakasz) Módosítsa az nms függvényt lineáris
soft-NMS-szé: ha egy kiválasztott
doboz egy még megmaradt
dobozt elnyomna
(),
akkor
;
a dobozt csak akkor dobja el, ha az új score
alá esik. A külső ciklus mindig a pillanatnyi legmagasabb score-ú
megmaradt dobozt vegye. Futtassa a 4. szakasz öt dobozán, és adja meg a
megmaradt sorrendet és a végső score-okat.
F4. (hibakeresési, nehézség 2, előfeltétel: 3.2. szakasz) Egy hallgató a recall nevezőjébe a képhez tartozó detekciók számát írja, azaz és nem . Lokalizálja a hibát, írja le a következményét akkor, ha egy képen GT és detekció van, és mutassa meg a javítás utáni visszaellenőrzést a 3.2. példán.
F5. (kísérleti/transzfer, nehézség 3, előfeltétel: 25.3. Kis adat és feature-alapú baseline, 26.2. Egy- és kétlépcsős detektor) Tervezzen kísérletet arra, hogyan változik az AP, ha az NMS IoU-küszöbét értékekre állítjuk. A rendelkezésre álló adat 20 procedurális kép, képenként 2-5 GT-dobozzal, ugyanazzal a rögzített, NMS előtti detektor-kimenettel. Adjon meg protokollt: megfigyelési egység, split, baseline, változó tényező, metrika, az összehasonlítás típusa és a következtetés érvényességi korlátja.
F1. Pozitív területű és elfajuló esetén , így a metszet területe is nulla, és . A félig nyílt konvenció azért fontos, mert a értelmezésben az egymást csak határon érintő dobozok metszete nulla hosszúságú, tehát nulla területű. Zárt intervallumokkal a határvonalon osztozó dobozoknak látszólag közös területük lenne. Példa: és ; félig nyíltan az nem tartozik -hoz, így a metszet üres, területe . Zárt értelmezésben a együttes egy egyenes szakasz, ami festett pixelrácson értelmezhető másként; a numerikus IoU-konvenció a félig nyílt definíciót rögzíti.
F2. Legyen szigorúan monoton növekvő, és . Mivel nincs tie, , tehát a rendezett sorrend azonos. A matching csak a sorrendtől és a dobozoktól függ, a score-értékektől nem; a TP/FP sorozat azonos. Ezért a pontok azonosak, és . A 11 pontos VOC-számítás a 3.2. szakasz végén: az interpolált görbe pontban ; pontban ; pontban . Az átlag .
F3. A soft-NMS implementációjának vázlata:
def soft_nms(boxes, scores, iou_threshold=0.5, score_drop=0.1):
boxes = np.asarray(boxes, dtype=np.float32)
scores = np.asarray(scores, dtype=np.float64).copy()
B = boxes.shape[0]
areas = box_area(boxes)
suppressed = np.zeros(B, dtype=bool)
keep = []
for _ in range(B):
candidates = [(idx, scores[idx], -float(areas[idx]), idx)
for idx in range(B) if not suppressed[idx]]
if not candidates:
break
i = max(candidates, key=lambda x: (x[1], x[2], x[3]))[0]
keep.append(i)
suppressed[i] = True
for j in range(B):
if suppressed[j]:
continue
iou = compute_iou(boxes[i], boxes[j])
if iou >= iou_threshold:
scores[j] *= (1.0 - iou)
if scores[j] < score_drop:
suppressed[j] = True
return keep, scores[keep]A 4. szakasz öt dobozára: először kerül kiválasztásra. Ekkor ; ; ; . A következő választás a legmagasabb score alapján (0.5) lesz, nem vagy ; nem nyom el senkit. Ezután és holtversenyben 0.45-nél; a területi tie-break miatt előbb, és , tehát nem módosul. Végül és marad; score-ja 0.324, -é 0.45. A sorrend: , végső score-ok: . A lineáris soft-NMS tehát megőrizhet olyan dobozt is, amelyet a kemény NMS eldobott; ez a fő viselkedésbeli különbség.
F4. A hiba a recall definíciójában van: a nevező , a GT-k száma, nem . Ha , a hallgató képlete alulbecsüli a recallt, és hamis „van még találatlan objektum” képet ad akkor is, amikor minden GT-t megtaláltunk. A 3.2. példában a lépésenkénti recallok lennének helyett; az AP hamisan alacsonyabb lenne, mert a görbe sosem éri el az 1-et. A javítás a nevező -re cserélése; a visszaellenőrzés a fenti érték visszaállítása és az AP reprodukálása.
F5. Protokollvázlat. Kérdés: van-e mérhető különbség az AP-ben a három IoU-küszöb között? Hipotézis: nincs előre rögzített nyertes; az alacsonyabb agresszívebben ritkít. Megfigyelési egység: egy kép; a 20 képet 10/10 train/val splitre osztjuk a detektort nem tanítjuk, csak a rögzített predikciókat értékeljük. Változó tényező: . Baseline: NMS nélküli nyers lista, amelynek AP-je az induló referencia. Metrika: all-point AP, . Az összehasonlítás páros, ugyanazon a 10 val-képen, ezért a különbség szignifikanciája a képek közötti szórással értelmezhető; bootstrap esetén a jelenet, nem a doboz legyen a független mintavételi egység. Korlát: a 10 kép nem elegendő általános detektálási benchmarkhoz; az eredmény csak a saját procedurális adatra vonatkozik, és a detektor-modell rögzítése miatt a tanulási bizonytalanságot nem méri.
A leggyakoribb hiba az AP és az egyetlen score-küszöbön mért precision összekeverése. Ellenpélda a 3.2. adatsorból: ha a felhasználó -ot választ, mind a hat detekció bekerül, így a precision . Ha -öt választ, csak az első doboz kerül be, a precision . Ugyanarra a modellre a két működési pont látványosan eltérő precisiont ad, miközben a modell rangsora nem változott. Az AP éppen azért használja a teljes rendezett listát, hogy ne egyetlen küszöbhöz kössük a modell minőségét. A hiba következménye: a „modellünk precisionje ” állítás -ös küszöbnél igaz is lehet, de elhallgatja a két duplikátumot és a kihagyott GT-ket. A javított megfogalmazás: „az adott melletti precision , az all-point AP ”.
Önellenőrzés: az NMS kimenetben a duplikátumok száma monoton csökkenő függvénye, de a megmaradó dobozok indexsorrendje nem feltétlenül score-csökkenő, mert az elnyomás a feldolgozási sorrendtől függ. A PR-pontok értéke nem monoton: a kézi példában ; a -interpoláció éppen ezt simítja. Visszahívás: a 14.3. Paraméterszám, MAC és aktivációmemória szerint a MAC a modell előrehaladásának költsége; az NMS IoU-számítása ettől független posztprocessz-költség, nagy esetén külön mérni kell.
Az NMS a nyers detekciók posztprocessze: score, majd terület és index szerinti determinisztikus sorrendben kiválaszt, és a -nál jobban átfedő, alacsonyabb prioritású dobozokat elnyomja. A score threshold ezzel ellentétben egyetlen működési pontot vág le; az AP a teljes rangsorból indul. A detekciós matching során minden GT-hez legfeljebb egy TP tartozhat; a második illeszkedő detekció FP, ez a duplicate detection büntetése. Az all-point AP a PR-görbe alatti, jobb oldali maximális precisionnel interpolált terület. A kézi példában az AP , a 11 pontos VOC-változat ; a kettő közötti eltérés konvenció, nem hiba.
A 26.4. Detektálási pipeline és hibaelemzés egység a teljes detektálási pipeline-t és a hibaelemzést vizsgálja: az itteni NMS, score threshold és AP ott kapcsolódik össze a választott architektúra, az adatfolyam és a tévesztési esetek rendszeres elemzésével.
Params.setDetParams: iouThrs,
recThrs; evaluateImg,
accumulate). https://github.com/cocodataset/cocoapi/blob/master/PythonAPI/pycocotools/cocoeval.py.