A 27.3. Dice, IoU és aggregálás egységben a szemantikus szegmentálás pixelcímkét adott: minden pixelhez osztályt rendelt, de az azonos osztályú objektumokat nem választotta szét. Itt a kérdés az objektumazonosság külön kezelése: hány különálló példány van, és melyik pixel melyik példányhoz tartozik. Az előismeret a Dice/IoU-metrika, az üres maszk kezelése és az epsilon-stabilizált nevező 27.3. Dice, IoU és aggregálás; a detektálási dobozszerződés, az üres cél és a hibafajták 26.4. Detektálási pipeline és hibaelemzés; továbbá az összesített metrika szeleteket elrejtő hatása 23.4. Hibaszeletek és alkalmazási határ. A 15.4. Független gradiensellenőrzési protokoll alfejezetben bevezetett gradiensellenőrzési szemlélet itt arra figyelmeztet, hogy a maszkküszöb utáni bináris döntés nem sima veszteségfüggvény.
Induló kérdés: egy -es képen 12 előtérpixel hány példányt alkothat? A válasz nem olvasható le a pixelarányból: lehet egyetlen 12 pixeles objektum, de akár 12 különálló 1 pixeles példány is. A példányszám és az előtérpixel-arány tehát különböző célváltozó.
Legyen egy egycsatornás kép, illetve batchelt alakban . A szemantikus annotáció bináris esetben
ahol jelenti a hátteret. Többosztályos esetben , ahol a háttér, a szemantikus osztályok. Ez azonban nem tartalmazza, hogy két azonos osztályú, egymástól különálló folt ugyanahhoz az objektumhoz tartozik-e.
Az instance annotáció
ahol a képen lévő példányok száma. Minden példányhoz tartozik:
A kettő kapcsolata:
Az id-érték pusztán címke, nem ordinális mennyiség: az 1 és 2 felcserélése ugyanazt a példányfelosztást jelenti. A példányfelosztás ezért permutáció erejéig értendő, a szemantikus osztály viszont nem felcserélhető.
A hálózati kimenet egy listaszerű, változó hosszú szerződés: minden detektált példányra osztálylogit, doboz, confidence és maszklogit tartozik. A jelen könyv által használt, előtanított súlytól független predikciós séma:
ahol confidence, xyxy doboz, osztály, maszkvalószínűség. A bináris maszkot a downstream döntés -ös küszöbbel képzi; a veszteség a logiton vagy valószínűségen számol, nem a küszöbölt maszkon.
Kimondjuk a szükséges állítást.
Lemma. Létezik olyan bináris szemantikus maszk , amelyhez legalább két különböző, összefüggő példányfelosztás tartozik, és a két felosztás még az id-permutáció erejéig sem azonos.
Bizonyítás. Tekintsük a következő széles, magas előtérblokkot:
M_sem:
1 1 1
1 1 1
Első példányfelosztás:
A_inst^(1):
1 1 2
1 1 2
Itt az 1. példány az első két oszlop, a 2. példány a harmadik oszlop. Második példányfelosztás:
A_inst^(2):
1 2 2
1 2 2
Itt az 1. példány az első oszlop, a 2. példány a második és harmadik oszlop. Mindkét esetben
tehát ugyanazt a szemantikus maszkot adják. Mindkét id-osztály -szomszédosan összefüggő, mert mindegyik egy-egy tengelyesen összefüggő téglalap. A két felosztás geometriai vágása eltér: az első a második és harmadik oszlop határán vág, a második az első és második oszlop határán. Ez a különbség nem szüntethető meg az id-permutációval, mert a példányok mérete -2 pixel, illetve -4 pixel.
A lemma következménye: a szemantikus maszkból kiinduló pixelosztályozási veszteség önmagában nem definiál egyértelmű instance-célt. Ha a feladat példányokat kér, a tanítóannotációnak példányazonosítót, példánymaszkot vagy példányonkénti dobozt kell tartalmaznia.
A [P15] szerzők által bemutatott Mask R-CNN a Faster R-CNN detektort egészíti ki: a meglévő osztályozó- és dobozregressziós ág mellé párhuzamos maszkágat helyez, amely minden detektált objektumra bináris példánymaszkot jósol. Ez a szervezés jól mutatja, hogy az instance-feladat két részből áll: a detektálási fej megmondja, hol van egy objektum, és mi az osztálya, a maszkág pedig megmondja, mely pixel tartozik hozzá.
A detektálási fej közbülső reprezentációja a ROI, azaz region of interest: egy jelölt doboz, amelyből a hálózat a megfelelő jellemzőtér-régiót kivágja. A kivágás diszkrét rácson történik, ezért fontos a koordináták kvantálásának kezelése. Az [P15] arXiv-absztraktja szerint a módszer egy RoIAlign nevű, kvantálásmentes réteget alkalmaz, amely a térbeli pozíciókat pontosabban őrzi meg; ennek pontos bilineáris mintavételezési képletét és a különböző ROI-méretválasztásokat a teljes cikk megfelelő módszerszakaszának olvasása után lehet idézni.
A jelen szöveg ezért csak a szerződésszintű leírást adja meg. Legyen a bemeneti képbatchenként egy ROI-halmaz . A maszkág minden ROI-ra
maszklogitot vagy normalizált maszkvalószínűséget állít elő, ahol a maszkfej kimeneti felbontása. Az osztályozó ág logitot, a dobozág finomított dobozt ad. A kimeneti példány ezután: osztály, confidence, doboz, küszöbölt és az eredeti képméretre interpolált maszk. A tanító veszteség az osztályozási, doboz- és maszktag összege; a pontos súlyok és a maszk-cross-entropy normalizálása a módszer teljes szövegének ellenőrzését igényli.
A szemantikus Dice/IoU 27.3. Dice, IoU és aggregálás minden pixelt egyenlően mér, függetlenül attól, hogy hány objektumot vont össze vagy szakított szét. Az instance-metrika ezt a hiányt pótolja. Legyen a ground truth példányhalmaz , a predikció , ahol minden -hez confidence tartozik. Minden -re és -re kiszámítjuk a maszk-IoU-t:
ahol a számláló a közös előtérpixelek száma, a nevező a két maszk uniójának pixelszáma, pedig a esetet kizáró numerikus konstans. Az üres predikált maszk nem tekinthető példánynak; ha és , a pár nem képezhet TP-t, mert nincs tényleges példány.
Rögzített IoU-küszöb mellett a predikciókat confidence szerint csökkenő sorrendbe rendezzük, majd greedy, egy-az-egyhez illesztést végzünk: minden predikció a még nem illesztett ground truth példányok közül ahhoz illeszkedik, amellyel a legnagyobb az IoU, ha ez legalább . Az illesztett predikció TP, az illesztetlen predikció FP, az illesztetlen ground truth FN. Az így kapott precision–recall görbe alatti terület az instance average precision, röviden AP. Az AP közvetlenül a példányazonosságot bünteti: egy merge hibánál a predikció csak egy ground truth példányhoz illeszkedhet, a másik FN marad, még akkor is, ha a globális pixel-IoU magas.
Kis levezetés. Legyen a ground truth két diszjunkt pixeles maszk, , a predikció pedig az uniójuk: , pixel, confidence . A globális pixel-IoU
Ezzel szemben és , illetve és között az IoU . Ha és a greedy illesztés a szabályt használja, az egyik -t elviszi, a másik FN lesz; egyképes AP-értékként , , azaz AP . Ha a küszöb , akkor egyetlen ground truth példányhoz sem illeszkedik, ezért . Az instance-metrika tehát akkor is hibát jelez, amikor a pixelátlag tökéletesnek látszik.
A labor célja egy eredeti,
-as
mintán rögzíteni az instance annotáció sémáját, valamint ellenőrizni,
hogy a doboz és az id-maszk konzisztens. Munkakönyvtár:
lab/n108_instance_lab. A kód nem igényel PyTorch-ot vagy
GPU-t; a futási parancs:
cd lab/n108_instance_lab
python instance_contract.py
A szerződés a következő. Bemeneti kép: image alakja
(8, 8), float32,
intenzitás. Target: instance_ids alakja
(8, 8), int64, értéke
háttérre,
példányazonosítóra. bboxes alakja (M, 4),
float32, xyxy sorrend
[xmin, ymin, xmax, ymax], fél-nyílt. labels
alakja (M,), int64. Hálózati kimenet:
boxes, labels, scores,
masks; a maszk (M, H, W) float32,
küszöbölés nélküli valószínűség.
import json
import numpy as np
# Munkakönyvtár: lab/n108_instance_lab
# Futtatás: python instance_contract.py
H, W = 8, 8
image = np.zeros((H, W), dtype=np.float32)
image[1:3, 1:4] = 0.7 # világos előtér, 1. példány
image[5:7, 2:6] = 0.4 # halványabb előtér, 2. példány
instance_ids = np.zeros((H, W), dtype=np.int64)
instance_ids[1:3, 1:4] = 1 # y = 1..2, x = 1..3
instance_ids[5:7, 2:6] = 2 # y = 5..6, x = 2..5
bboxes = np.array([[1.0, 1.0, 4.0, 3.0],
[2.0, 5.0, 6.0, 7.0]], dtype=np.float32)
labels = np.array([1, 1], dtype=np.int64)
# Konzisztencia: minden id összes pixele pontosan a dobozán belül van-e.
for idx, m in enumerate([1, 2]):
ys, xs = np.where(instance_ids == m)
if len(xs) == 0:
raise ValueError(f"{m}. id üres, nincs példány")
xmin, ymin = xs.min(), ys.min()
xmax, ymax = xs.max() + 1, ys.max() + 1
if (xmin, ymin, xmax, ymax) != tuple(int(v) for v in bboxes[idx]):
raise ValueError(f"{m}. id és doboz nem konzisztens")
semantic = (instance_ids > 0).astype(np.uint8)
expected = {
"input_shape": [H, W],
"instance_count": int(instance_ids.max()),
"foreground_pixels": int(semantic.sum()),
"foreground_ratio": float(semantic.mean()),
"bbox_areas": [int((x2 - x1) * (y2 - y1))
for x1, y1, x2, y2 in bboxes.tolist()],
"labels": labels.tolist(),
}
print(json.dumps(expected, indent=2))A kód által kiírandó, számított érték:
foreground_pixels=14,
foreground_ratio=0.21875, instance_count=2, a
dobozterületek
és
.
Mivel ez a labor szintetikus annotáció, nem mérés; a kimenet a fenti
mátrixokból számolható. Ha a hallgató lefuttatja, a numerikus egyezés
int-re pontos.
F1 (fogalmi, nehézség 1). Adjon három, egymástól eltérő tulajdonságot, amelyben a szemantikus és az instance szegmentálás szerződése különbözik. Átadandó: egy-egy rövid mondat és egy legalább -es ellenpélda, ahol ugyanaz a pixelcímke két különböző példányszámot enged meg.
F2 (levezetési, nehézség 2). Adjon -es bináris szemantikus maszkot és hozzá legalább három különböző, összefüggő instance-felosztást. Igazolja mindháromra az egyenlőséget, és mutassa meg, hogy a felosztások nem vihetők egymásba pusztán id-permutációval. Átadandó: három id-mátrix, a permutáció-érv magyarázata.
F3 (implementációs, nehézség 2). Írjon függvényt
instance_to_semantic_and_bboxes(ids) néven, amely egy
(H, W) int64 id-mátrixból előállítja a bináris
szemantikus maszkot (uint8) és példányonként a legszűkebb
xyxy dobozokat (M, 4) float32 tömbben. Kezelje
az üres képet: ekkor a doboz alakja (0, 4) legyen.
Ellenőrizze a labor
-as
mintáján és üres bemeneten. Átadandó: futtatható függvény, hívás, várt
és kapott shape.
F4 (hibakeresési, nehézség 2). Az alábbi hibás függvény „instance AP”-nek nevezi az összes predikció–ground-truth pár IoU-jának átlagát, matching nélkül:
def wrong_instance_ap(preds, gts):
vals = []
for p in preds:
for g in gts:
vals.append(iou(p, g))
return float(np.mean(vals)) if vals else 0.0Mutassa meg a merge-példán (, ), hogy ez elfedi az FN-t. Adja meg a helyes greedy, egy-az-egyhez illesztés lényegét, és írja át a függvényt. Átadandó: a hiba oka, a hibás érték, a javított kód és a küszöb szerepe.
F5 (kísérlettervezési, nehézség 3). A GlyphLab jelenleg osztályozási annotáció, nem instance target. Tervezzen protokollt olyan kétértelmű esetre, ahol két, azonos osztályú, egymással érintkező alakzatot kell külön példányként címkézni. Rögzítse a megfigyelési egységet, az annotációs szabályt, a splitegységet, a metrikát és a baseline-t. Átadandó: egy protokollterv, benne a következtetés érvényességi korlátja, például hogy a szintetikus adat nem klinikai validáció.
F1. A három különbség: (1) a szemantikus kimenet osztálycímke pixelenként, az instance kimenet példányazonosító; (2) a szemantikus kiértékelés pixel-IoU/Dice, az instance kiértékelés példányszintű maszk-IoU matching; (3) a szemantikus cél fix tensor, az instance cél változó példányszámú, ezért listaszerű szerződést igényel. A -as ellenpélda a fenti lemma: az egybefüggő lehet vagy példány.
F2. -es szemantikus előtér:
1 1 0 0
1 1 0 0
0 0 0 0
0 0 0 0
Három felosztás:
A1: A2: A3:
1 1 0 0 1 2 0 0 1 1 0 0
1 1 0 0 1 2 0 0 2 2 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
Az egyetlen példány, két függőleges sáv, két vízszintes sáv. Mindháromnál . -t és -t id-permutáció sem viheti egymásba, mert a példányok mérete – pixel mindkettőben, de geometriai szomszédságuk eltér: előbbiben oszlopok, utóbbiban sorok alkotják a példányokat. Továbbá példányszáma egy, míg a többieké kettő, ami definíció szerint nem permutáció.
F3. A függvény:
import numpy as np
def instance_to_semantic_and_bboxes(ids):
if ids.dtype != np.int64:
raise TypeError("ids legyen int64")
semantic = (ids > 0).astype(np.uint8)
bboxes = np.empty((0, 4), dtype=np.float32)
for m in np.unique(ids[ids > 0]):
ys, xs = np.where(ids == m)
xmin, ymin = xs.min(), ys.min()
xmax, ymax = xs.max() + 1, ys.max() + 1
bboxes = np.vstack([bboxes, [xmin, ymin, xmax, ymax]])
return semantic, bboxesA labor mintáján semantic.sum()==14,
bboxes.shape==(2,4). Üres bemenetre
np.unique(np.array([], dtype=np.int64)) üres, a ciklus nem
fut le, bboxes.shape==(0,4),
semantic.sum()==0. A dobozok egész pixelhatárokból
származnak, ezért egzakt egyezés várható; lebegőpontos tolerancia nem
szükséges.
F4. A hiba oka, hogy a függvény minden predikció–GT párt átlagol, ezért nincs egy-az-egyhez illesztés, és egy predikció több ground truth példányhoz is hozzájárulhat. A merge-példán: , , az IoU-k , a hibás érték , miközben mellett a predikció FP, az igazi AP . A javítás: rendezés confidence szerint, minden predikciót csak a még nem illesztett GT-khez engedünk, a maximális IoU-t választjuk, és csak esetén számolunk TP-t. Ellenőrzés: a merge-példán a javított kód AP-t ad; két különálló, jól illeszkedő predikciónál -et.
F5. Egy lehetséges protokoll: két érintkező, azonos
osztályú négyzetet generálunk
-es
képen, a két példány egyetlen
pixel széles érintkezési sávval. A megfigyelési egység a
scene_id; ugyanaz a scene minden nézete azonos splitbe
kerül. Az annotációs szabály: az érintkezési sávot a generátor oldalán
ismert instance id-kből származtatjuk, nem emberi rajzból. A metrika
instance AP
maszk-IoU-val; a baseline a [P14]-típusú U-Net-szemantikus kimenet
küszöbölése, amely merge esetén alacsony AP-t vár. A split 120/30/30
scene, class-stratified. Érvényességi korlát: a szintetikus geometria
szabályos, ezért az eredmény nem terjeszthető ki természetes, elzárt
objektumokra vagy magas tétű alkalmazásra; a cél a mérőszám
érzékenységének bemutatása.
A példányszám és az előtérpixel-arány nem felcserélhető target. Legyen a -as képen egyszer , egyetlen -as folt: az előtérarány . Máskor hat darab pixeles folt: a példányszám , az előtérarány ugyancsak . Ha a modell a foreground arányt regresszálja, vagy a veszteség csak a szemantikus maszkot bünteti, akkor nem tudja a két annotációt megkülönböztetni. Az instance-feladat tehát külön célfejet és külön metrikát igényel; a pixelarány legfeljebb az előtér mennyiségét írja le, a példányok számát nem.
Ellenőrző kérdések: meg tudja-e adni a és felosztást úgy, hogy minden id-osztály összefüggő legyen? A doboz fél-nyílt értelmezését használja-e a labor? Az üres predikció TP-ként van-e kezelve az instance AP-ben? A 27.3. Dice, IoU és aggregálás alfejezetből visszahívás: a globális Dice/IoU nem példányszintű; az üres-üres esetet explicit szabálynak kell rögzítenie. A 26.4. Detektálási pipeline és hibaelemzés alfejezetből: az üres cél állapot, és a doboztranszformáció a képpel szinkronban történik. A 23.4. Hibaszeletek és alkalmazási határ alfejezetből: az összesített metrika elrejtheti a merge hibát. A 15.4. Független gradiensellenőrzési protokoll alfejezetből: a maszkküszöb nem sima művelet, ezért a veszteséget a logiton számoljuk, a küszöb csak kiértékelési döntés.
A szemantikus szegmentálás minden pixelhez osztálycímkét rendel, az instance szegmentálás ezen túl az azonos osztályú objektumokat is külön példányokra bontja. Megmutattuk, hogy ugyanaz a bináris szemantikus maszk több különböző, összefüggő instance-felosztást enged, ezért az instance-annotáció nem vezethető le a pixelcímkéből. A Mask R-CNN a detektálási fej ROI-it párhuzamos maszkággal egészíti ki. Az instance AP a predikciókat greedy, egy-az-egyhez maszk-IoU-küszöbbel illeszti a ground truth-hoz; a merge hiba magas pixel-IoU mellett is elrejtőzhet. A labor kétobjektumos annotációs mintát és input/output szerződést ad, üres cél kezelésével.
A 28.1. Embedding, távolság és normalizálás egység a metrikus tanulásba lép: az instance-azonosság itt bevezetett gondolata ahhoz kapcsolódik, hogyan lehet példányok közötti távolságot reprezentációból tanulni, ha pixelmaszk nem áll rendelkezésre.