26.1 Dobozkoordináta, IoU és lokalizációs loss

26.1.1 1. Cél, előismeret és induló kérdés

Ez az alfejezet a detektálási feladat első matematikai rétegét építi fel: hogyan adjuk meg egy objektum helyét egy képen, hogyan mérjük két doboz átfedését, és hogyan fogalmazzuk meg a lokalizációt regressziós célként. A 22.1. Adateredet, címke és csoportos split egység rögzítette a GlyphLab annotációs szerződését: a metadata.csv minden képhez xmin, ymin, xmax, ymax oszlopot ad, és a doboz a maszk legkisebb befoglaló téglalapja. A 25.1. Teljes képosztályozó adatfolyam adatfolyama a képosztályozó bemeneti–kimeneti alakjait rögzítette; most ehhez a lokalizációs kimenetet adjuk hozzá. A 14.1. Stride, padding, dilation és outputméret határkezelési leckéje itt is közvetlenül hasznosul: ugyanaz a fél-nyílt tartománygondolat, amely az outputablak érvényességét definiálta, a doboz pixelhalmazát is meghatározza. A CNN-gerincet és operátorát a 14.4. Csoportos és depthwise konvolúció és 16.4. IV. ellenőrző pont: a CNN-operátor teljes megértése egységekből ismerjük; a detektálási fej arra a feature mapra épül. A 22.4. Augmentációs kísérlet és domainváltozás és 23.4. Hibaszeletek és alkalmazási határ módszertani korlátai figyelmeztetnek: a clean és corrupt kiértékelést, valamint a szeletekre bontott hibajelentést a detektálási metrikáknál is meg kell tartani, míg a 25.4. Nyílt halmaz és ismeretlen input nyílt halmaz logikája szerint a lokalizáció önmagában nem dönti el, hogy a dobozban tényleg ismert objektum van-e.

Induló kérdés. Két doboz: B1=[1,4)×[1,4)B_1=[1,4)\times[1,4) és B2=[3,6)×[3,6)B_2=[3,6)\times[3,6). Hány közös pixelük van a fél-nyílt konvenció szerint, és mennyi lenne ugyanez zárt intervallumos számolással? Becslését a 3. szakasz lemmája után ellenőrizheti.

26.1.2 2. Dobozkoordináta, fél-nyílt intervallum, terület és normalizálás

Definíció (tengelypárhuzamos doboz, xyxy). Egy tengelypárhuzamos doboz négy valós koordinátája

B=(xmin,ymin,xmax,ymax)∈ℝ4,B=(x_{\min}, y_{\min}, x_{\max}, y_{\max})\in\mathbb R^4,

ahol xmin<xmaxx_{\min}<x_{\max} és ymin<ymaxy_{\min}<y_{\max}. A doboz mint ponthalmaz a fél-nyílt Descartes-szorzat:

B=[xmin,xmax)×[ymin,ymax).B=[x_{\min},x_{\max})\times[y_{\min},y_{\max}).

A sorrend a könyv egészében xmin, ymin, xmax, ymax; ugyanez a GlyphLab metadata.csv oszlopsorrendje. Diszkrét raszteren a cc oszlopindex a [c,c+1)[c,c+1), az rr sorindex a [r,r+1)[r,r+1) fél-nyílt cellának felel meg. Így a doboz pontosan azokat a pixeleket foglalja magában, amelyekre xmin≤c<xmaxx_{\min}\le c<x_{\max} és ymin≤r<ymaxy_{\min}\le r<y_{\max}.

Definíció (terület). A doboz területe

A(B)=(xmax−xmin)(ymax−ymin).A(B)=(x_{\max}-x_{\min})(y_{\max}-y_{\min}).

A definíció BB pozitivitása miatt pozitív. A fél-nyílt határválasztás a kontinuum területen nem változtat az értéken, a raszteren viszont pontosan a cellák számát adja: az [xmin,xmax)[x_{\min},x_{\max}) intervallum xmax−xminx_{\max}-x_{\min} egész cellát tartalmaz, ha a határok egész indexek.

A GlyphLab maszkjában például ha a foreground pixelek oszlopai 20,…,2320,\dots,23, akkor a doboz vízszintes vetülete [20,24)[20,24), hossza 4 pixel; a 2424 már nem tartozik bele.

Normalizált koordináták. Legyen a kép szélessége WW, magassága HH; a GlyphLabon W=H=24W=H=24. A normalizált doboz

B̂=(x̂min,ŷmin,x̂max,ŷmax)=(xminW,yminH,xmaxW,ymaxH),\hat B=(\hat x_{\min},\hat y_{\min},\hat x_{\max},\hat y_{\max}) =\left(\frac{x_{\min}}{W},\frac{y_{\min}}{H},\frac{x_{\max}}{W},\frac{y_{\max}}{H}\right),

és a hozzá tartozó ponthalmaz [x̂min,x̂max)×[ŷmin,ŷmax)⊆[0,1]2[\hat x_{\min},\hat x_{\max})\times[\hat y_{\min},\hat y_{\max})\subseteq[0,1]^2. A normalizált terület Â(B̂)=Â(B)/(WH)\hat A(\hat B)=\hat A(B)/(WH). A normalizálás a modell bemeneti skálájához igazítja a célokat; a 3. szakaszban bizonyítjuk, hogy közös skálázás alatt az IoU nem változik.

Tensoralak. Egy NN dobozból álló batch reprezentációja B∈ℝN×4B\in\mathbb R^{N\times4}, minden sor egy [xmin,ymin,xmax,ymax] vektor, float32. A gyakorlatban a dobozregressziós cél is float32, akkor is, ha a beolvasott annotáció egész.

26.1.3 3. Metszet és IoU: levezetés

Lemma 3.1 (két fél-nyílt doboz metszete). Legyen B1=[a1,b1)×[c1,d1)B_1=[a_1,b_1)\times[c_1,d_1) és B2=[a2,b2)×[c2,d2)B_2=[a_2,b_2)\times[c_2,d_2), ahol ai<bia_i<b_i és ci<dic_i<d_i (i=1,2i=1,2). Vezessük be az

l=max(a1,a2),r=min(b1,b2),u=max(c1,c2),v=min(d1,d2)l=\max(a_1,a_2),\quad r=\min(b_1,b_2),\quad u=\max(c_1,c_2),\quad v=\min(d_1,d_2)

jelöléseket. Ha l<rl<r és u<vu<v, akkor

B1∩B2=[l,r)×[u,v),B_1\cap B_2=[l,r)\times[u,v),

különben B1∩B2=⌀B_1\cap B_2=\varnothing.

Bizonyítás. Egy p=(px,py)p=(p_x,p_y) pont pontosan akkor eleme B1∩B2B_1\cap B_2-nek, ha mindkét koordinátájára mindkét doboz fél-nyílt feltétele teljesül:

a1≤px<b1,a2≤px<b2,c1≤py<d1,c2≤py<d2.a_1\le p_x<b_1,\quad a_2\le p_x<b_2,\quad c_1\le p_y<d_1,\quad c_2\le p_y<d_2.

Az xx-feltételpár ekvivalens a max(a1,a2)≤px<min(b1,b2)\max(a_1,a_2)\le p_x<\min(b_1,b_2) egyenlőtlenséggel. Ez pontosan akkor ír le nemüres [l,r)[l,r) intervallumot, ha l<rl<r; egyébként nincs olyan pxp_x, amely mindkét dobozban benne van. Ugyanígy az yy-feltétel a [u,v)[u,v) intervallumot adja, ha u<vu<v. A síkbeli metszet a két koordinátavetület Descartes-szorzata, tehát pontosan akkor nemüres, ha mindkét l<rl<r és u<vu<v teljesül, és ekkor B1∩B2=[l,r)×[u,v)B_1\cap B_2=[l,r)\times[u,v). ∎

Következmény 3.2. A Lemma 3.1 feltételei mellett a metszet területe

A(B1∩B2)=max(0,r−l)max(0,v−u),A(B_1\cap B_2)=\max(0,r-l)\max(0,v-u),

ahol a max(0,⋅)\max(0,\cdot) éppen az üres esetet kódolja.

Definíció (IoU, Intersection over Union). Két pozitív területű doboz átfedési aránya

IoU(B1,B2)=A(B1∩B2)A(B1∪B2),\operatorname{IoU}(B_1,B_2)=\frac{A(B_1\cap B_2)}{A(B_1\cup B_2)},

ahol a metszetet a Lemma 3.1 definiálja. Az unió területét a szitaformulával számoljuk:

A(B1∪B2)=A(B1)+A(B2)−A(B1∩B2).A(B_1\cup B_2)=A(B_1)+A(B_2)-A(B_1\cap B_2).

Az üres metszet esetén a számláló 00, a nevező pedig A(B1)+A(B2)>0A(B_1)+A(B_2)>0, tehát IoU=0\operatorname{IoU}=0 jól definiált.

Tulajdonságok. Pozitív területű dobozokra:

  1. IoU(B1,B2)=IoU(B2,B1)\operatorname{IoU}(B_1,B_2)=\operatorname{IoU}(B_2,B_1) (szimmetria).
  2. 0≤IoU≤10\le\operatorname{IoU}\le1.
  3. IoU=1\operatorname{IoU}=1 pontosan akkor, ha B1=B2B_1=B_2 mint ponthalmaz.
  4. Ha mindkét dobozt közös, tengelyenkénti pozitív skálázással transzformáljuk, az IoU változatlan; speciálisan a pixel- és normalizált koordinátás IoU egyenlő.

Az 1. és 2. állítás közvetlenül a metszet szimmetriájából és a nemnegatív területből következik. A 3. állításhoz: ha B1=B2B_1=B_2, akkor a metszet és az unió területe egyenlő. Megfordítva, ha IoU=1\operatorname{IoU}=1, akkor A(B1∩B2)=A(B1∪B2)A(B_1\cap B_2)=A(B_1\cup B_2); mivel a metszet részhalmaza az uniónak, és a terület a fél-nyílt téglalapokon additív, a különbséghalmaz területe nulla. Két pozitív területű tengelypárhuzamos doboz különbsége csak akkor lehet nulla területű, ha a dobozok ponthalmazként egybeesnek. A 4. állítást külön lemmaként igazoljuk.

Lemma 3.3 (skálainvariancia). Legyen T(x,y)=(sxx,syy)T(x,y)=(s_x x,s_y y), ahol sx,sy>0s_x,s_y>0. Pozitív területű dobozokra

IoU(T(B1),T(B2))=IoU(B1,B2).\operatorname{IoU}(T(B_1),T(B_2))=\operatorname{IoU}(B_1,B_2).

Bizonyítás. TT lineáris bijekció, ezért halmazművelettel felcserélhető: T(B1∩B2)=T(B1)∩T(B2)T(B_1\cap B_2)=T(B_1)\cap T(B_2) és T(B1∪B2)=T(B1)∪T(B2)T(B_1\cup B_2)=T(B_1)\cup T(B_2). A terület skálázódását a lineáris leképezés determinánsa adja: minden dobozterület, így a metszet és az unió területe is sxsys_xs_y-nal szorzódik. A hányadosban a pozitív közös tényező kiesik. A normalizált koordináták éppen a sx=1/Ws_x=1/W, sy=1/Hs_y=1/H eset. ∎

Kézi példa. Legyen B1=[2,5)×[1,4)B_1=[2,5)\times[1,4) és B2=[4,7)×[3,6)B_2=[4,7)\times[3,6). Ekkor l=4<r=5l=4<r=5, u=3<v=4u=3<v=4, tehát a metszet [4,5)×[3,4)[4,5)\times[3,4), területe 11. A területek A(B1)=3⋅3=9A(B_1)=3\cdot3=9, A(B2)=3⋅3=9A(B_2)=3\cdot3=9; az unió 9+9−1=179+9-1=17; így IoU=1/17≈0.0588\operatorname{IoU}=1/17\approx0.0588. Az induló kérdésben szereplő [1,4)×[1,4)[1,4)\times[1,4) és [3,6)×[3,6)[3,6)\times[3,6) esetén a metszet [3,4)×[3,4)[3,4)\times[3,4), amely a 3. sor és 3. oszlop egyetlen cellája; a fél-nyílt IoU tehát 1/171/17. A zárt [1,4]2,[3,6]2[1,4]^2,[3,6]^2 számolás a 3. és 4. sort/oszlopot is közösnek venné, ami négy cellát és IoU=4/(9+9−4)=2/7≈0.2857\operatorname{IoU}=4/(9+9-4)=2/7\approx0.2857 adna.

26.1.4 4. Dobozregresszió és lokalizációs loss

A detektálási fej feladata nem a négy xyxy koordináta közvetlen kiadása, hanem egy regressziós delta előrejelzése egy rögzített hivatkozási dobozhoz, az úgynevezett anchorhoz vagy proposalhoz képest. A célokat középpontos paraméterezésben adjuk meg: az xyxy dobozból

x=xmin+xmax2,y=ymin+ymax2,w=xmax−xmin,h=ymax−ymin,x=\frac{x_{\min}+x_{\max}}{2},\quad y=\frac{y_{\min}+y_{\max}}{2},\quad w=x_{\max}-x_{\min},\quad h=y_{\max}-y_{\min},

és a visszafelé konverzió xmin=x−w/2x_{\min}=x-w/2, ymin=y−h/2y_{\min}=y-h/2, xmax=x+w/2x_{\max}=x+w/2, ymax=y+h/2y_{\max}=y+h/2. Legyen az anchor (xa,ya,wa,ha)(x_a,y_a,w_a,h_a), a ground truth pedig (x*,y*,w*,h*)(x^*,y^*,w^*,h^*). A céldelta komponensei:

tx*=x*−xawa,ty*=y*−yaha,tw*=lnw*wa,th*=lnh*ha.t_x^*=\frac{x^*-x_a}{w_a},\qquad t_y^*=\frac{y^*-y_a}{h_a},\qquad t_w^*=\ln\frac{w^*}{w_a},\qquad t_h^*=\ln\frac{h^*}{h_a}.

A hálózat t=(tx,ty,tw,th)t=(t_x,t_y,t_w,t_h) kimenete ugyanezen a skálán él, és a dekódolás

x=txwa+xa,y=tyha+ya,w=waetw,h=haeth.x=t_xw_a+x_a,\qquad y=t_yh_a+y_a,\qquad w=w_ae^{t_w},\qquad h=h_ae^{t_h}.

Az exponenciális miatt a dekódolt w,hw,h mindig pozitív, tehát a dekódolás mindig érvényes xmin<xmaxx_{\min}<x_{\max}, ymin<ymaxy_{\min}<y_{\max} dobozt ad. A tx,tyt_x,t_y nincs korlátozva: a középpont elhagyhatja a képet; ennek kezelése a detektor utófeldolgozásához tartozik (26.2. Egy- és kétlépcsős detektor).

Két érv szól a normalizálás mellett. Egyrészt a wa,haw_a,h_a-val osztott középponteltolás mértékegységet vált: a tx=tx*=0.1t_x=t_x^*=0.1 azt jelenti, hogy a célközéppont az anchor szélességének tizedével jobbra van, függetlenül a pixelmérettől. Másrészt a szélesség logaritmusa a relatív hibát szimmetrizálja: a kétszeres túllövés és a feleakkora alullövés egyaránt |ln(2/1)|=|ln(1/2)|=ln2|\ln(2/1)|=|\ln(1/2)|=\ln2 delta-hibát ad. Ez a választás a [P12] nyomán elterjedt családba tartozik; a hivatkozott cikk teljes módszerszakaszának újraolvasása a kézirat jelen állapotában még nem történt meg, ezért a pontos megegyezést a fejezetvégi ellenőrzési listán jelöljük.

Lokalizációs loss. A predikált tt és a cél t*t^* közötti komponensenkénti veszteség a smooth L1 függvény, β>0\beta>0 küszöbbel:

SL1(z;β)={z22β,|z|<β,|z|−β2,|z|≥β.SL_1(z;\beta)=\begin{cases} \frac{z^2}{2\beta}, & |z|<\beta,\\[2mm] |z|-\frac{\beta}{2}, & |z|\ge\beta. \end{cases}

A β=1\beta=1 választással a kis hibákra kvadratikus, nagy hibákra lineáris a büntetés; a gradiens |z|<β|z|<\beta esetén z/βz/\beta, azon kívül sign(z)\operatorname{sign}(z). Ez robusztusabb az L2-nél, mert egy durva kiugró dobozhiba nem dominálja a batch gradienst, ugyanakkor a |z||z| nemdifferenciálhatóságát is kisimítja a nullában. A lokalizációs loss egy pozitív objektumokból álló 𝒫\mathcal P halmaz felett

Lloc=1|𝒫|∑i∈𝒫∑j∈{x,y,w,h}SL1(tij−tij*;β),L_{\mathrm{loc}}=\frac{1}{|\mathcal P|}\sum_{i\in\mathcal P} \sum_{j\in\{x,y,w,h\}}SL_1(t_{ij}-t_{ij}^*;\beta),

és Lloc=0L_{\mathrm{loc}}=0, ha 𝒫\mathcal P üres. A cél csak akkor értelmes, ha az ii-edik javaslathoz tényleges objektum tartozik; háttérjavaslatra nincs definiált dobozregressziós cél. Az osztály- és objektumossági loss ettől külön tag, amelyet a detektorarchitektúrák tárgyalásakor (26.2. Egy- és kétlépcsős detektor) adunk hozzá.

Smooth L1 béta = 1 - Képletből számolt szemléltetés, nem mérés.

Kézi cél- és loss-példa. Anchor (xa,ya,wa,ha)=(3.5,2.5,3,3)(x_a,y_a,w_a,h_a)=(3.5,2.5,3,3), ground truth (x*,y*,w*,h*)=(5.5,4.5,3,3)(x^*,y^*,w^*,h^*)=(5.5,4.5,3,3). A cél tx*=(5.5−3.5)/3=0.6667t_x^*=(5.5-3.5)/3=0.6667, ty*=(4.5−2.5)/3=0.6667t_y^*=(4.5-2.5)/3=0.6667, tw*=th*=0t_w^*=t_h^*=0. Ha a hálózat t=(0.5,0.6,−0.1,0.2)t=(0.5,0.6,-0.1,0.2)-t ad, akkor β=1\beta=1-gyel

Lloc=12(0.16672+0.06672+0.12+0.22)=12(0.02778+0.00444+0.01+0.04)≈0.0411.L_{\mathrm{loc}}=\frac12(0.1667^2+0.0667^2+0.1^2+0.2^2) =\frac12(0.02778+0.00444+0.01+0.04)\approx0.0411.

A dekódolt predikció (x,y)=(3.5+0.5⋅3,2.5+0.6⋅3)=(5.0,4.3)(x,y)=(3.5+0.5\cdot3,2.5+0.6\cdot3)=(5.0,4.3), ami a célhoz képest (−0.5,−0.2)(-0.5,-0.2) középponthibát ad; a méretek 3e−0.1≈2.713e^{-0.1}\approx2.71 és 3e0.2≈3.663e^{0.2}\approx3.66.

26.1.5 5. Labor: GlyphLab dobozok és kézi IoU-ellenőrzés

A labor a lab munkakönyvtárból futtatandó, ahol a data/images.npy, data/masks.npy, data/metadata.csv és data/manifest.json fájlok a kezdőlabor szerződésének megfelelően vannak jelen. Az adatgenerálás seedje 20261020; a dobozszámítás maga determinisztikus, ezért új seedet nem állítunk be. A mask uint8, a doboz float32, a számítás CPU-n történik.

# lab/n101_lab.py
import csv
import numpy as np

masks = np.load("data/masks.npy")   # (360,1,24,24) uint8
print(f"masks shape: {masks.shape}, dtype: {masks.dtype}")

def mask_to_box(mask: np.ndarray) -> np.ndarray:
    """A foreground pixelek legkisebb fél-nyílt xyxy befoglaló doboza."""
    ys, xs = np.nonzero(mask[0])
    if len(xs) == 0:
        raise ValueError("üres maszk")
    return np.array([xs.min(), ys.min(), xs.max() + 1, ys.max() + 1],
                    dtype=np.float32)

def box_iou(a: np.ndarray, b: np.ndarray) -> float:
    """Két [xmin,ymin,xmax,ymax] fél-nyílt doboz IoU-ja."""
    ix0, iy0 = max(a[0], b[0]), max(a[1], b[1])
    ix1, iy1 = min(a[2], b[2]), min(a[3], b[3])
    inter = max(0.0, ix1 - ix0) * max(0.0, iy1 - iy0)
    area = lambda z: (z[2] - z[0]) * (z[3] - z[1])
    union = area(a) + area(b) - inter
    return float(inter / union) if union > 0 else 0.0

with open("data/metadata.csv", newline="", encoding="utf-8") as f:
    meta = list(csv.DictReader(f))

max_err = 0.0
for row in meta:
    idx = int(row["index"])
    computed = mask_to_box(masks[idx])
    ref = np.array([float(row[k]) for k in ("xmin", "ymin", "xmax", "ymax")],
                   dtype=np.float32)
    err = float(np.max(np.abs(computed - ref)))
    max_err = max(max_err, err)
print(f"metadata doboz max abs hiba: {max_err:.6f}")
assert max_err == 0.0

a = np.array([10.0, 5.0, 20.0, 15.0], dtype=np.float32)   # [10,20)x[5,15)
b = np.array([15.0, 10.0, 25.0, 20.0], dtype=np.float32)  # [15,25)x[10,20)
iou_ab = box_iou(a, b)
print(f"kézi IoU: {iou_ab:.6f} (elvárt: {1/7:.6f})")
assert abs(iou_ab - 1/7) < 1e-6

c = np.array([0.0, 0.0, 10.0, 10.0], dtype=np.float32)
d = np.array([10.0, 0.0, 20.0, 10.0], dtype=np.float32)
print(f"érintkező IoU: {box_iou(c, d):.6f} (elvárt: 0.0)")
assert box_iou(c, d) == 0.0

Futtatási parancs: python n101_lab.py. A c és d dobozok érintkeznek, mert az első vízszintes vetülete [0,10)[0,10), a másodiké [10,20)[10,20); a közös határ nincs benne a fél-nyílt intervallumokban, ezért az IoU nulla. A kód itt nincs futtatva; a fenti kimeneti sorok a maszk- és metadata-definícióból számított várt értékek, nem mért futási jegyzőkönyv.

26.1.6 6. Feladatok

F1 (fogalmi, nehézség 1). Magyarázza el, miért nem közömbös, hogy a dobozokat fél-nyílt vagy zárt intervallumként reprezentáljuk, amikor az IoU-t diszkrét pixelrácson számoljuk. Adjon konkrét dobozpárt, amelyre a két konvenció eltérő IoU-t ad.

F2 (levezetési, nehézség 2). Legyen B1=[0,6)×[0,4)B_1=[0,6)\times[0,4) és B2=[3,8)×[2,7)B_2=[3,8)\times[2,7). A Lemma 3.1 segítségével adja meg a metszetet, a területeket, az uniót és az IoU-t. Igazolja a 3.3 Lemma állítását ezen a konkrét páron úgy, hogy mindkét dobozt s=24s=24-szeresére skálázza.

F3 (implementációs, nehézség 2). Írjon NumPy-függvényt box_iou_batch(A, B) néven, amely A∈ℝN×4A\in\mathbb R^{N\times4} és B∈ℝM×4B\in\mathbb R^{M\times4} bemenetből az N×MN\times M IoU-mátrixot adja. Vektorizált megoldást adjon; ellenőrizze az A={(0,0,10,10),(20,20,30,30)}A=\{(0,0,10,10),(20,20,30,30)\}, B={(5,5,15,15),(21,21,31,31),(0,0,10,10)}B=\{(5,5,15,15),(21,21,31,31),(0,0,10,10)\} esetre az elvárt mátrixot 10−610^{-6} tűréssel.

F4 (hibakeresési, nehézség 1). Az alábbi függvény egyetlen pixelre szóló maszkból rossz dobozt ad:

def mask_to_box_bug(mask):
    ys, xs = np.nonzero(mask[0])
    return np.array([xs.min(), ys.min(), xs.max(), ys.max()], dtype=np.float32)

Lokalizálja a hibát, mutassa meg következményét egy [12,13)×[12,13)[12,13)\times[12,13) egycellás maszkon, és adja meg a javítást.

F5 (kísérleti/transzfer, nehézség 3). Tervezzen kis kísérletet a GlyphLab adaton a smooth L1 β\beta küszöbének kiválasztására egy rögzített anchorú, egyobjektumos dobozregressziós fejhez. Adja meg a kérdést, a baseline-t, a splitet, a metrikát, a választási szabályt, az erőforrásigényt és a következtetés érvényességi határát. Az eredményt előre ne rögzítse.

26.1.7 7. Megoldások és indoklás

F1. A fél-nyílt [a,b)[a,b) intervallum a raszteren pontosan a b−ab-a darab egész cellát fedi, a zárt [a,b][a,b] pedig b−a+1b-a+1 darabot, ha egész határokkal dolgozunk. Az IoU ezért függ a konvenciótól, ahogy a 3. szakasz példája mutatja: B1=[1,3)×[1,3)B_1=[1,3)\times[1,3) négy cellát, B2=[3,5)×[3,5)B_2=[3,5)\times[3,5) szintén négy cellát fed, és fél-nyílt konvencióban diszjunktak, tehát IoU=0\operatorname{IoU}=0. Zárt konvencióban mindkettő kilenc cellát fedne, a közös 3. sor és oszlop egy cellát adna, így IoU=1/(9+9−1)=1/17\operatorname{IoU}=1/(9+9-1)=1/17. Ugyanaz a képpár tehát más metrikát ad; a keverés off-by-one eltérést okoz.

F2. A metszet: l=max(0,3)=3l=\max(0,3)=3, r=min(6,8)=6r=\min(6,8)=6, u=max(0,2)=2u=\max(0,2)=2, v=min(4,7)=4v=\min(4,7)=4; l<rl<r és u<vu<v, tehát a metszet [3,6)×[2,4)[3,6)\times[2,4), területe 3⋅2=63\cdot2=6. A területek A(B1)=6⋅4=24A(B_1)=6\cdot4=24, A(B2)=5⋅5=25A(B_2)=5\cdot5=25; az unió 24+25−6=4324+25-6=43; az IoU 6/43≈0.13956/43\approx0.1395. A 2424-szeres skálázás után a metszet [72,144)×[48,96)[72,144)\times[48,96), területe 72⋅48=6⋅24272\cdot48=6\cdot24^2; az unió 43⋅24243\cdot24^2; a hányados (6⋅242)/(43⋅242)=6/43(6\cdot24^2)/(43\cdot24^2)=6/43, tehát változatlan.

F3. A vektorizált megoldás shape-logikája: A[:, None, :] alakja (N,1,4)(N,1,4), B[None, :, :] alakja (1,M,4)(1,M,4), így a kivonásaik (N,M,4)(N,M,4)-re broadcastolódnak.

import numpy as np

def box_iou_batch(A, B):
    lt = np.maximum(A[:, None, :2], B[None, :, :2])
    rb = np.minimum(A[:, None, 2:], B[None, :, 2:])
    inter = np.prod(np.maximum(rb - lt, 0.0), axis=-1)
    area = lambda X: (X[:, 2] - X[:, 0]) * (X[:, 3] - X[:, 1])
    union = area(A)[:, None] + area(B)[None, :] - inter
    return inter / union

A = np.array([[0,0,10,10],[20,20,30,30]], dtype=np.float32)
B = np.array([[5,5,15,15],[21,21,31,31],[0,0,10,10]], dtype=np.float32)
print(box_iou_batch(A, B))

Az elvárt mátrix: az első sorban a [0,10)[0,10)-es doboz a [5,15)[5,15)-tel 25/175=1/725/175=1/7, a [21,31)[21,31)-gyel 00, önmagával 11; a második sorban a [20,30)[20,30)-as doboz rendre 00, 81/(100+100−81)=81/119≈0.680781/(100+100-81)=81/119\approx0.6807, 00.

F4. A hiba az xmax=xs.max() és ymax=ys.max() hiányzó +1+1. Egyetlen, a 12. oszlopban és 12. sorban álló maszkra a hibás függvény [12,12,12,12]-t ad, amelynek xmax-xmin=0 és ymax-ymin=0, tehát területe nulla; a doboz üres, és az IoU számlálója is nulla lesz, még akkor is, ha két ugyanilyen egycellás maszk dobozát hasonlítjuk össze. A javítás xs.max()+1 és ys.max()+1; ezzel a doboz [12,13)x[12,13), területe 11, és önmagával vett IoU-ja 11.

F5. Megoldásminta. Kérdés: a β∈{0.5,1,2}\beta\in\{0.5,1,2\} küszöb hogyan hat a GlyphLab dobozregressziós fej val- és test-IoU-jára? Adat és split: a rögzített GlyphLab train/val/test split; a maszkból minden képhez egy ground truth doboz. Modell és cél: a 25.1. Teljes képosztályozó adatfolyam alfejezetben ismertetett kis CNN-gerinc után egy 4 dimenziós fej; az anchor legyen a train dobozok átlagos középpontos doboza, az objektumosság oldható meg a maszkból, így minden kép pozitív. Változó tényező: csak β\beta; minden más hiperparaméter rögzített. Baseline: a train ground truth dobozok konstans átlaga, képenkénti IoU-ban mérve. Metrika: képenkénti IoU átlaga; a tesztet egyszer, a val szerinti legjobb checkpointkal értékeljük. Ismétlés: három training seed; a jelentéshez a seedek közötti szórást is közöljük. Erőforrás: kis CPU, float32, a kísérlet néhány perc futásidő nagyságrendű lehet ezen a méreten. Érvényességi határ: a GlyphLab procedurális adat, nem természetes képi benchmark; a β\beta sorrendje nem vihető át általános detektálási adatra, és a konstans-anchor konstrukció nem méri a detektor proposal-minőségét.

26.1.8 8. Tipikus tévedés, önellenőrzés és visszahívás

Tipikus tévedés. A pixelinclusive és fél-nyílt koordináták keverése off-by-one hibát ad. Az érintkező [10,20)×[10,20)[10,20)\times[10,20) és [20,30)×[10,20)[20,30)\times[10,20) dobozok fél-nyílt konvencióban diszjunktak; ha valaki a metszetet [20,20)[20,20) helyett egy közös oszlopként kezeli, hamis pozitív átfedést mér. A labor c/d esete pontosan ezt a helyzetet ellenőrzi.

Önellenőrzés. (1) A box_iou függvény üres metszetre 0-t ad, nem pedig negatív területet? (2) A normalizált és pixelkoordinátás IoU ugyanazt az értéket adja a 3.3 Lemma alapján? (3) A mask_to_box üres maszkra kivételt dob, nem néma nulla dobozt? (4) A céldelta dekódolása visszaadja a ground truth dobozt a t=t*t=t^* esetben?

Visszahívás. A 14.1. Stride, padding, dilation és outputméret outputméret-levezetésében az érvényes ablakot ugyanilyen fél-nyílt indexfeltétellel definiáltuk: az ablak minden mintavételi pontjának a megengedett tartományba kell esnie, és a szélső határ már nem tartozik a halmazhoz. Ez a szemlélet itt a dobozok pixelhalmazára költözött át.

26.1.9 Rövid összefoglaló

A tengelypárhuzamos doboz [xmin,xmax)×[ymin,ymax)[x_{\min},x_{\max})\times[y_{\min},y_{\max}) fél-nyílt pozitív területű halmaz, xyxy sorrendben. Két doboz metszete a koordinátánkénti max\max–min\min vetület, ha l<rl<r és u<vu<v, különben üres; területe max(0,r−l)max(0,v−u)\max(0,r-l)\max(0,v-u). Az IoU a metszet és az unió területének hányadosa, üres metszetre nulla, és közös pozitív skálázásra invariáns. A dobozregresszió normalizált, log-skálázott deltákat tanul anchorhoz képest, smooth L1 veszteséggel, csak pozitív objektumokra. A labor a GlyphLab maskból rekonstruálja a metadata dobozait, és érintkező dobozokkal teszteli a fél-nyílt konvenciót.

26.1.10 Következő alkalmazás és források

A 26.2. Egy- és kétlépcsős detektor egység ezekre a fogalmakra építi az egy- és kétlépcsős detektorokat: a proposal, az objektumossági pontszám és az osztálylogit a dobozregressziós deltával együtt alkotja a detektálási veszteséget.