A 26.1. Dobozkoordináta, IoU és lokalizációs loss egység rögzítette a doboz reprezentációját: xyxy, félig nyílt intervallum, IoU, normalizált koordináta és dobozregressziós cél. Ott azonban csak az értékeléshez és a finomításhoz szükséges geometriai nyelvet építettük fel. Most a detektort mint egész rendszert vizsgáljuk, és elválasztjuk egymástól a három különböző felelősséget: a régiójavaslatot (region proposal), az objektumosságot (objectness) és az osztálydöntést.
A 25.2. Multilabel és hierarchikus cél multilabel egységben a szigmoid és a BCE szétválasztotta a független döntéseket; a 22.2. Címkemegőrző transzformációk megmutatta, hogy a geometriai transzformáció és a doboz szinkronizálása a feladattól függ; a 14.2. Több bemeneti és kimeneti csatorna pedig a kernel bank és a csatornakeverés alakjait adta meg, amit a detektor fejében ismét használni fogunk.
Induló kérdés. Egy -es képen egy -es cellarácsra épülő egylépcsős detektornak négy dobozslotja van, minden cella maga egy -es horgonydoboz. A kép közepén egyetlen -es célként megadott doboz áll. Hány pozitív mintát ad a matching, ha a pozitív küszöb ? A választ a kézi példában számoljuk ki; előzetes becslésként gondoljuk meg, hány cellával lehet a cél középpontja átfedésben.
Definíció (régiójavaslat). Legyen képbatch. Egy régiójavaslat-generáló minden képhez egy jelölt dobozhalmazt ad:
ahol minden xyxy koordináta a 26.1. Dobozkoordináta, IoU és lokalizációs loss konvenció szerint. A javaslat önmagában nem hordoz osztálydöntést; csak azt állítja, hogy a jelölt területen érdemes részletes elemzést végezni. A kétlépcsős detektorban a második fokozat kizárólag ezen a jelöltön dolgozik.
Definíció (javaslati recall). Ha a ground truth dobozok halmaza, , akkor a IoU-küszöbhöz tartozó javaslati recall:
Az indikátor azt vizsgálja, hogy minden valódi objektumhoz van-e legalább egy elég jól illeszkedő javaslat. Az esetben a mennyiség definiálatlan; üres képen nincs mit felidézni.
Definíció (objectness, objektumosság). Az objectness egy skalár kimenet, amely azt a kérdést válaszolja meg, hogy az adott slot felelős-e egy objektumért, függetlenül annak osztályától. Formálisan egy logithoz tartozó Bernoulli-döntés: annak a becsült valószínűsége, hogy a slot előtér. Ez különbözik a 25.2. Multilabel és hierarchikus cél többcímkés osztályfejétől: ott minden címke külön jelenlétet dönt el, itt a háttér–előtér döntés megelőzi az osztályozást. A fejezet didaktikai detektora a háttér és a három tárgyosztály közötti döntést objectness-logittal és előtérre értelmezett hármas osztályozóval faktorizálja. Alternatív architektúra közös, háttérosztályt is tartalmazó softmaxot alkalmazhat; a két parametrizáció nem azonos gradiensű tanítási szerződés, noha megfelelő kapacitással ugyanazt a négyosztályos prediktív eloszlást is leírhatják.
Definíció (anchor, horgonydoboz; slot). Az egylépcsős detektor sűrűn helyez el predikciós slottokat. Minden slot egy horgonydobozhoz tartozik, ahol ; a jelöli a doboz középpontjának képpont-koordinátáját. A hálózat nem közvetlenül a végleges dobozt, hanem a horgonyhoz viszonyított eltolást prediktálja, majd a dekódolás:
A célkódolás ennek inverze: , , , , feltéve, hogy a horgony és a cél doboz nem degenerált. Az exponenciális forma garantálja a pozitív szélességet és magasságot; ez a 26.1. Dobozkoordináta, IoU és lokalizációs loss normalizált koordinátagondolat továbbfejlesztése, és nem az egyetlen lehetséges szerződés — a választott fejnek és a targetnek ugyanazt a kódolást kell használnia.
Intuíció a két családhoz. A kétlépcsős detektor először kevés, jó jelöltet keres, majd mindegyiket drága fejjel osztályozza és finomítja. Az egylépcsős detektor minden sloton egyszerre dönt, és a slotok sűrű rácsát implicit javaslathalmazként kezeli. Az elsőnél a javaslat minősége, a másodiknál a pozitív–negatív egyensúly válik központi tervezési kérdéssé.
Kétlépcsős út: R-CNN és Faster R-CNN. A korai R-CNN vonal először külső javaslatokat vágott ki, és minden régiót külön osztályozott. A [P12] absztraktja szerint a Faster R-CNN ezt a javaslatgenerálást tanulhatóvá teszi: a Region Proposal Network (RPN) a detektáló hálózattal közös, teljes képre számolt konvolúciós jellemzőtérképre épül, és maga is végponttól végpontig tanított, teljesen konvolúciós hálózat. Ezzel a javaslatgenerálás megszűnik külső, nem tanulható előfeldolgozás lenni. A rendszer felelősségtérképe:
| Fokozat | Felelősség | Kimeneti alak |
|---|---|---|
| Backbone | közös sűrű jellemzőtérkép | |
| RPN | javaslat + objectness | és logit |
| Detektáló fej | osztály + finomítás | és |
Itt a javaslatok száma. A második fokozat csak az RPN által kiadott régión dolgozik; az osztályozási teljesítmény ezért függ az első fokozat recalljától, a javaslatok közös jellemzőtérképe pedig a 14.2. Több bemeneti és kimeneti csatorna alfejezetben megismert csatornakeverés újrafelhasználása.
Egylépcsős út: YOLO és SSD család. A [P13] preprint absztraktja a detektálást egyetlen hálózati kiértékelésként fogalmazza meg: a rendszer közvetlenül, egyetlen előremenetben ad dobozokat és osztályvalószínűségeket. Az SSD-szerű család ugyanezt a sűrű default-box gondolatot különböző léptékű jellemzőtérképekre teríti ki; a jelen fejezet forráskatalógusa azonban nem tartalmazza az SSD eredeti cikkét, ezért annak részletes képletét nem tárgyalom (a részletes küszöb- és slotkonvenciók alkalmazásspecifikusak).
Az egylépcsős felosztásban a slot cellánkénti felelőssége:
ahol a matchingből származó pozitív címke: a cella akkor felelős egy objektumért, ha valamelyik slotja az. Az objectness fej minden slotra külön logitot ad, az osztályfej a felelős cella osztályát adja; a dobozfej csak a pozitív slotokon kap regressziós célt.
A levezetési kötelezettség a választott detektor céljának és mintapárosításának pontos felírása. Ehhez előbb a matching szabályt rögzítjük.
Definíció (matching szabály). Legyen a célok, a slotok horgonydobozai. Minden slothoz keressük a legjobban illeszkedő célt, és minden célhoz a legjobban illeszkedő slotot:
Adott küszöbök mellett a pozitív halmaz
A negatív halmaz
a maradék figyelmen kívül hagyott, és nem járul a célhoz. A tag minden ground truth dobozhoz rendel legalább egy pozitív jelöltet akkor is, ha egyetlen slot sem éri el a küszöböt. Ha több cél ugyanazt a slotot választaná, külön ütközésfeloldás (például egy-egy megfeleltetés) kell: egyetlen slot ugyanis nem tanítható egyszerre két különböző dobozra. A fejezet kis példája egy cellán belül legfeljebb egy felelős objektumot és ütközésmentes párosítást feltételez; ennél sűrűbb jelenethez slotonkénti osztályfej vagy általánosabb matching szükséges. Ha , akkor és . Ez a szabály a könyv saját, didaktikai célú leírása; a konkrét küszöbértékek architektúránként és cikkenként eltérnek (a küszöbértékeket külön protokollban kell rögzíteni).
Definíció (saját, didaktikai egylépcsős cél). Legyen a cellarács, cellánként slot, osztály. A predikció cellánkénti osztálylogit , slotonkénti dobozparaméter és objectness logit . A target oldalán a matching, az objectness-veszteség érvényességi maszkja, a felelős cella osztálya, a cél dobozparaméter, és . A teljes cél:
ahol
A BCE logit-formája a 25.2. Multilabel és hierarchikus cél alfejezetben levezetett stabil alak; a softmax előtti logit itt is megmarad, mert a 7.2. Softmax és többosztályos cross-entropy szerint a könyvtári cross-entropy logitot vár. Az osztály- és doboztag a felelős cellák átlaga, az objectness-tag az összes slot számával normalizált, de csak érvényes (pozitív vagy negatív) slotokat tartalmazó veszteség. A figyelmen kívül hagyott slotokra , ezért nem keletkezik gradiens. A különböző nevezőket és az érvényességi maszkot minden implementációban explicit módon kell kezelni. Ha , akkor konvencióval élünk, és a cél csak a negatív objectness tagból áll; üres batch esetén a teljes cél definiálatlan.
Állítás (a cél gradiense). A fenti cél komponensenkénti gradiense:
a negatív slotokra pedig miatt a doboztag gradiense nulla; az osztálytag gradiense a 7.2. Softmax és többosztályos cross-entropy alfejezetből a felelős cellákra, és nulla máshol.
Bizonyítás. A BCE-re , így deriváltja ; az érvényességi maszk és a konstans kiemelhető. Az -re deriváltja az változó szerint , és a szumma csak a pozitív slotokat tartalmazza, ezért a szorzó kívülről is megjelenik.
A gradiens alakja egy heurisztikus tervezési motivációt tesz láthatóvá: ha , a negatív objectness tagok dominálhatják a lépést, ezért a gyakorlatban -súlyozással vagy negatív mintavételezéssel egyensúlyoznak. Ez heurisztika, nem bizonyított optimalitási garancia: a gradiens képlete algebrai tény, de hogy a súlyozás minden adatnál jobb modellhez vezet-e, azt csak kísérlettel lehet eldönteni.
Legyen , , tehát a négy cella -es. Egyetlen slot cellánként (), a slot horgonya maga a cella. Egyetlen ground truth doboz:
A jobb alsó cella horgonya ; a többi celláé rendre , , . A GT területe , a jobb alsó horgony területe szintén . A metszet:
az unió , tehát
A másik három horgony átfedése nem nulla: a bal felső cellánál , a bal alsó és jobb felső cellánál pedig egyaránt . Mindhárom érték a negatív küszöb alatti. A , választással:
tehát a matching szerint pontosan egy pozitív slot van, a jobb alsó cella. Ebben a kézi példában — a korábban bemutatott, horgonyközépponthoz viszonyított és logaritmikus szélességet használó -kódolástól eltérően — a középpontot a cella bal felső sarkához, a méretet a teljes kép méretéhez normalizáljuk. A dekódolás , , , . Ezt a kódolást a hozzá tartozó fejjel és targettel együtt kell használni; a két konvenció nem keverhető össze. A cél dobozparaméter ezzel a cella-normalizált kódolással: a GT középpontja , a cella bal felső sarka , a cellaméret , így
A célvektorok: , a többi slotra ; ; a dobozcél a pozitív sloton .
Most legyen a predikció a pozitív sloton
a három negatív sloton pedig . A választással számoljuk a három tagot. A doboztag:
Az objectness BCE a pozitív sloton:
a negatív sloton:
Mivel az objektumosság nevezője :
Az osztálytag: komponensei az -hatványokból , így
A teljes cél:
Az induló kérdésre tehát a válasz: egy pozitív minta keletkezik, mert a GT középpontja a jobb alsó cellában van, és annak horgonya a küszöb felett illeszkedik; a szomszédos cellák IoU-ja nulla.
A minimális ellenőrző kód ezt a célösszeget reprodukálja:
# n102_target_demo.py
# Munkakönyvtár: lab/. Nem futtatott ellenőrző példa; a várt 0.8553 a fenti
# kézi számításból származik, a futtatást a tanuló végzi el.
import numpy as np
def softplus(z):
return np.log1p(np.exp(-np.abs(z))) + np.maximum(z, 0.0)
def bce_logit(z, m):
return softplus(z) - m * z
def ce_logit(z, y):
z = z - np.max(z)
return -z[y] + np.log(np.exp(z).sum())
m = np.zeros((2, 2, 1), dtype=np.float64)
m[1, 1, 0] = 1.0
g = m.max(axis=2)
N_pos = int(g.sum())
t_hat = np.zeros((2, 2, 1, 4))
t_hat[1, 1, 0] = [0.3, 0.3, 0.6, 0.4]
t_gt = np.zeros((2, 2, 1, 4))
t_gt[1, 1, 0] = [1/3, 1/3, 0.5, 0.5]
o_hat = np.full((2, 2, 1), -0.5)
o_hat[1, 1, 0] = 1.2
z_hat = np.zeros((2, 2, 3))
z_hat[1, 1] = [0.2, 1.8, 0.7]
y_cls = np.zeros((2, 2), dtype=np.int64)
y_cls[1, 1] = 1
L_box = (1.0 / N_pos) * np.sum(g[..., None] * m[..., None] * (0.25 * (t_hat - t_gt)**2))
v = np.ones_like(m) # a kézi példában nincs figyelmen kívül hagyott slot
L_obj = (1.0 / (2 * 2 * 1)) * np.sum(v * bce_logit(o_hat, m))
Z = z_hat.reshape(-1, 3)
Y = y_cls.reshape(-1)
G = g.reshape(-1).astype(bool)
L_cls = np.mean([ce_logit(z, y) for z, y, ok in zip(Z, Y, G) if ok])
L = L_cls + L_box + L_obj
print(f"L = {L:.4f}") # várt: 0.8553 (kézi számításból)
assert abs(L - 0.855313) < 5e-4A labor átadandó eredménye kettős. Először rögzítjük, hogy ugyanaz a -es GlyphLab-kép milyen alakokon halad át a két családban; a táblázat szemléltetett számokat ad, nem mért futást.
| Elem | Felelősség | Kimeneti alak (N=1) |
|---|---|---|
| Backbone | sűrű jellemzőtérkép | |
| Kétlépcsős RPN | javaslat és objectness | , logit |
| Kétlépcsős detektáló fej | osztály és finomítás | , |
| Egylépcsős grid fej | doboz, objectness, osztály |
Másodszor egyetlen kis dobozfejet építünk. A fej egy -es konvolúció: a 14.2. Több bemeneti és kimeneti csatorna kernel bankja itt tisztán csatornát kever, térbeli kiterjedés nélkül. A kimenet csatornasorrendje: az első csatorna a dobozparaméter, a következő az objectness logit, az utolsó az osztálylogit. A kód a [D18] irányába mutató teljes TorchVision-finetuning előtti lokális kontroll; a TorchVision-bővítés külön labor, és külső előtanított súlyt a főúton nem használunk.
# n102_lab_box_head.py
# Munkakönyvtár: lab/. CPU, float32, rögzített seed.
# A könyvgeneráló ezt nem futtatja; a tanuló a lab/ mappában futtatja.
import torch
torch.manual_seed(0)
C, B, K, S = 8, 1, 3, 2
head = torch.nn.Conv2d(C, B * 4 + B + K, kernel_size=1, bias=True)
head = head.to(dtype=torch.float32, device="cpu")
x = torch.randn(1, C, S, S, dtype=torch.float32, device="cpu")
p = head(x)
assert p.shape == (1, 8, 2, 2), p.shape
box = p[:, :4] # B slot, 4 dobozparaméter
obj_logit = p[:, 4:5] # objectness logit
cls_logit = p[:, 5:] # K osztálylogit, softmax nélkül
obj = torch.sigmoid(obj_logit)
print("p shape:", tuple(p.shape))
print("obj logit min/max:", float(obj_logit.min()), float(obj_logit.max()))
print("obj sigmoid min/max:", float(obj.min()), float(obj.max()))
# Ellenőrzés: az osztálylogitok összege nem 1 (logit, nem valószínűség),
# az objectness a sigmoid után [0,1]-ben van.Futtatási parancs a lab/ munkakönyvtárból:
python n102_lab_box_head.pyElvárt tulajdonság: a kimeneti alak , az objectness sigmoid után a intervallumba esik, az osztálycsatornák pedig nyers logitok maradnak. Az értelmezés: ez a fej még nem detektor, hanem a detektor predikciós szerződésének legkisebb ellenőrizhető darabja; a célfüggvény és a matching nélkül nem tanulható.
F1. (fogalmi, nehézség 2) Magyarázza el, miben tér el az objectness és az előtérre kondicionált osztályozó egyetlen, „háttér” osztályt is tartalmazó softmax-fejtől, és adjon olyan konkrét esetet, ahol a két tanítási cél eltérő gradienshez vezet. Használja a 25.2. Multilabel és hierarchikus cél BCE/softmax megkülönböztetést.
F2. (levezetési, nehézség 2) Legyen , , két ground truth doboz, , és négy slot. Az első GT-hez tartozó IoU-listája , a másodikhoz . Adja meg a halmazokat a matching szabály alapján, és nevezze meg, melyik slot kerül be a teljes lefedés miatt a pozitív halmazba.
F3. (implementációs, nehézség 2) Valósítsa meg NumPyban a háromtagú célfüggvényt úgy, hogy a BCE stabil softplus-formát használjon, és esetén a elágazást alkalmazzon. Bemenet: a fenti kézi példa target- és predikciótensorai; elvárt kimenet , tolerancia .
F4. (hibakeresési, nehézség 2) Az alábbi matching-kód hibás:
pos = {s for s in slots
if iou[s, best_gt[s]] >= tau_pos}A teljes lefedés hiányzik. Magyarázza el a hiba okát, következményét, és adja meg a javítást, majd olyan ellenőrző tesztet, amelyben minden slot IoU-ja alatt van, és a javítás után mégis van pozitív minta.
F5. (kísérleti/transzfer, nehézség 3) Tervezzen
GlyphLab-alapú egyszerű lokalizációs kísérletet: a meglévő osztályozó
CNN utolsó rétege elé egy dobozfejet kell illeszteni, a cél a
metadata.csv dobozoszlopaiból kódolt normalizált
koordináta. Írja le a protokollt: megfigyelési egység, split, baseline,
metrika, a tesztelés egyszeri korlátja. Nem kell futtatni; a terv
érvényességi határát is adja meg.
F1. Az objectness és az előtér-osztályozó faktorizált modell: külön Bernoulli-veszteség tanítja az objektum jelenlétét, és csak a pozitív helyeken használjuk az osztályozási cross-entropyt. A négyosztályos (háttér + három tárgyosztály) softmax ehelyett közös normalizálást alkalmaz, ezért a logitok gradiensei kölcsönösen összefüggnek. Konkrétan pozitív slotnál, nulla objectness-logit mellett a pozitív BCE deriváltja . Ha ehelyett négy nulla logitból induló softmaxot használunk, a valódi tárgyosztály logitjának deriváltja . A különbség nem jelenti azt, hogy egyik módszer általánosan helyesebb lenne: az architektúra, a címkézés és a veszteség közösen határozza meg a tanítási szerződést.
F2. A slotonkénti legnagyobb IoU értéke rendre , , és . A küszöb alapján az 1. slot pozitív, a 2. és 4. negatív, a 3. figyelmen kívül hagyandó lenne. Az első GT legjobb slotja az 1., a második GT-é a 2.; a kötelező lefedés tehát a 2. slotot átteszi a pozitív halmazba. Az eredmény , , . Az slot objectness-veszteségének érvényességi maszkja nulla; nem szabad automatikusan negatívnak tekinteni.
F3. Az 5. szakasz NumPy-megoldásában
,
és az eredmény három tagja pontosabban
,
és
;
összegük
,
tehát a kért tolerancián belül van. Az üres pozitívhalmaz elágazásának
ellenőrzésére az m és g címkéket állítsuk
nullára, a háttérként figyelembe vett slotok v maszkját
egyre: ekkor a megoldásban L_cls = L_box = 0.0, és csak az
érvényes slotokra átlagolt softplus(o_hat) marad. Ha egyes
slotok figyelmen kívül hagyandók, azok v értéke nulla.
F4. A hibás kód csak a pozitív IoU-küszöböt
vizsgálja, így egy nehezen illeszkedő GT dobozhoz egyetlen pozitív slot
sem kerülhet. A javítás előtt minden célhoz válasszuk ki a legjobb
IoU-jú slotot, majd képezzük a két feltétel unióját:
pos = threshold_pos | forced_pos. Például egyetlen GT és a
iou = np.array([[0.1], [0.2], [0.3]]) tömb esetén,
mellett a küszöbös rész üres, de forced_pos = {2} (nullától
indexelve), így a javított pozitív halmaz nem üres. Több GT esetén
ellenőrizni kell, hogy a kényszerített kiválasztások nem ugyanazt a
slotot igénylik-e; ütközéskor egyedi hozzárendelési szabály
szükséges.
F5. A kísérlet alapegysége a scene_id:
két nézet ugyanabból a jelenetből nem kerülhet eltérő splitbe. A bemenet
kizárólag a kép; a metadata.csv dobozadatait célként
használjuk. A splitet a tanítás előtt rögzítjük, a dobozokat a megadott
félig nyílt xyxy konvenció szerint dekódoljuk, a választott fej és
célkódolás egyezését alak- és geometriai próbákkal ellenőrizzük.
Baseline lehet a train alapján becsült, osztályonkénti medián doboz. A
modellválasztás train/val adaton történik, a rögzített modell
test-IoU-ját egyszer mérjük; a jelenetekhez kötődő függőséget
csoportszintű bizonytalanságbecslésben is megőrizzük. Az eredmény a
GlyphLab mesterséges alakzatain érvényes, természetes képi lokalizációra
nem általánosítható automatikusan.