A VII. ellenőrző pont a 28.3. Retrieval-értékelés és adatfelosztás alfejezetben bevezetett retrieval-szerződést a korábbi három CNN-feladatcsalád mellé állítja: az osztályozás, a detektálás és a szegmentálás mellé. A cél annak bizonyítása, hogy a hallgató nem csupán az egyes metrikákat, hanem a cél–target–loss–output–metrika–split–inference szerződés teljes láncát külön tudja választani, és új feladatra önálló protokollt tud készíteni. Előismeret: a 27.4. Instance mask és összetett feladat instance/szemantikus megkülönböztetése, a 24.4. VI. ellenőrző pont: megbízható CNN-training tanítási és checkpoint-szerződése, valamint a 16.4. IV. ellenőrző pont: a CNN-operátor teljes megértése CNN-operátor specifikációja. A retrieval oldalról a 28.3. Retrieval-értékelés és adatfelosztás query/gallery, ranking és Recall@k fogalmaira építünk.
Értékelés. A közös 0–4 rubrikát, a PASS-szabályt és a hibatípusonkénti visszautakat az 1.4. Tanulási diagnózis és kísérleti napló „Tanulási főút és ellenőrző pontok” szakasza adja meg; itt csak az eltérés: a riport a cél–target–loss–output–metrika–split–inference szerződés; a súlypont a D3.
Induló kérdés: egy CNN, amely 92% osztályozási pontosságot ér el, automatikusan alkalmas-e detektálásra vagy hasonlósági keresésre? Becslés: nem. Ugyanaz a gerinc (backbone) különböző fejekkel egészen eltérő kimenetet ad, és a 92% accuracy-t nem lehet egy sorba állítani egy IoU-val vagy Recall@k-val, mert a három szám más célfüggvényből, más targetből és más veszteségből születik.
Jelölje a bemeneti képbatch-et. A gerinc kimenete feature-tensor. Minden feladatcsalád ebből eltérő fejjel készít előrejelzést.
| Feladat | Target | Nyers output | Elsődleges metrika |
|---|---|---|---|
| Osztályozás | logits | accuracy, macro-F1 | |
| Detektálás | változó számú xyxy doboz + osztály | listaelemek | AP @ IoU-küszöb |
| Szegmentálás | pixel-logits | mIoU, Dice | |
| Retrieval | relevancia-reláció | embedding | Recall@k, mAP |
A fenti táblázat csak a három legfontosabb oszlopot mutatja; a loss, a split és az inference szerződés minden feladatnál különbözik, ezért külön definiáljuk.
Osztályozás. A target egyetlen osztályindex képenként, az output aktiváció előtti logits-vektor. A loss a többosztályos cross-entropy mean reductionnal:
A split osztály-stratified és scene-csoportos; a GlyphLab
szerződésben a független egység a scene_id. Az inference
szerződés: a modell a képtensoron kívül semmilyen annotációt nem kap, és
a testkészlet a kiválasztás után egyetlen egyszer kerül
kiértékelésre.
Detektálás. A target változó hosszúságú rendezett lista képenként; egy elem nullától indexelt, fél-nyílt xyxy doboz és osztályindex. A loss általában dobozregresszió (például smooth L1) plusz objectness binary cross-entropy; a pontos súlyozás architektúránként eltér. A split scene-szintű, és egyetlen dobozt sem vág szét. A metrika átlagos precision (AP) egy rögzített IoU-küszöbnél, greedy egy-az-egyhez párosítással, ahogy a 26.3. NMS, confidence és AP alfejezetben definiáltuk. Az inference szerződés magában foglalja a non-maximum suppressiont (NMS), a score-küszöböt és a maximális kimeneti dobozszámot; ezek nélkül a nyers output nem értékelhető.
Szegmentálás. A target minden pixelre osztályindex, tehát az alak egész tensor. A modell pixel-logitsot ad alakban; a loss per-pixel cross-entropy, a térbeli pozíciók átlagával. A metrika mIoU vagy Dice; az üres-unió esetekhez külön szabály kell a 27.3. Dice, IoU és aggregálás szerint. A split scene-csoportos, és a maszkot a képpel geometriailag együtt kell transzformálni; az inference argmax vagy rögzített küszöb.
Retrieval. A target nem egyetlen címke, hanem egy relevancia-reláció: minden query-hez a gallery azon elemei relevánsak, amelyek a megfigyelési egység (például scene_id) szerint ugyanahhoz a csoporthoz tartoznak, de nem azonos a query-vel és nem duplikátum. A modell outputja -dimenziós embedding vektor: . A loss lehet triplet loss, amelyet a [P16] absztraktja így foglal össze: az embedding tér L2-távolságát közvetlenül optimalizáljuk úgy, hogy a pozitív pár távolsága marginnal kisebb legyen a negatív párénál. A gyakorlatban ezt a következő alakban szokás felírni:
ahol a margin. A split nem egyszerűen train/val/test, hanem a query-k és a gallery elemei különböző scene-ekből vagy legalábbis eltérő view-okból származnak; ugyanazon scene két view-ja közül az egyik nem lehet egyszerre query és gallery elem. A metrika a 28.3. Retrieval-értékelés és adatfelosztás definíciójával:
A nevező a query összes releváns gallery elemének száma, nem pedig ; ez a leggyakoribb hibaforrás.
A loss és a metrika különbsége minden feladatnál éles: a loss differenciálható simuló cél, a metrika lehet nem sima és nem differenciálható (például az IoU küszöbölése), ezért a tanítás során a loss-t, a kiértékelés során a metrikát használjuk.
Minden választott feladathoz egy alakellenőrzést és egy kézi numerikus kontrollt adunk. A cél nem a teljes modell kiértékelése, hanem a képletek index- és dimenzióhelyességének bizonyítása.
Legyen , , logits , target . Alakellenőrzés: , a softmax kimenete is , a loss skalár.
A softmax nevezője: , , , összeg . A valószínűségek: , , ; az összeg kerekítési hibával. A cross-entropy: . Ez a kézi kontroll mutatja, hogy a softmax kimenete nem metrika, csak a logitsból képzett valószínűségi vektor.
Legyen a ground truth doboz , a predikció pedig . A fél-nyílt intervallum szerint a terület: , illetve . A metszet:
A metszet szélessége , magassága , területe . Az unió , tehát
Alakellenőrzés: minden doboz négy koordináta, a metszet és az unió pozitív skalár. A fél-nyílt konvenció biztosítja, hogy a szomszédos dobozok területe pontosan a koordinátakülönbségek szorzata.
Legyen -es ground truth maszk és predikció . Flattenelve: , , metszet , unió . Ekkor
Alakellenőrzés: mindkét maszk ; a redukció a térbeli pozíciókra összegzi az egyezést. Az üres mindkét maszk esetén a Dice nevezője nulla, ezért külön szabály szükséges (a 27.3. Dice, IoU és aggregálás szerint például 1-et rendelünk hozzá az üres-üres párhoz).
Legyen egy query , gallery , releváns elemek , tehát a nevező . A távolságok növekvő sorrendben: , , , . A ranking: . Ekkor a top- listák releváns elemszáma: top-1-ben , top-2-ben , top-3-ban , top-4-ben . A Recall@k:
Ez a kontroll közvetlenül mutatja, miért hibás a képlet: top-3-ban az hamisan alacsonyabb értéket adna, mint a helyes , mert a nevező a releváns elemek száma, nem a lista hossza.
A VII. ellenőrző pont laborja egyetlen új, procedurális szintetikus vizuális problémát definiál: DotPair. A feladatválasztás a retrieval, mert ez a 28.3. Retrieval-értékelés és adatfelosztás fogalmait közvetlenül a korábbi CNN-gerincre alkalmazza.
Minden képen
-es
fekete háttéren két fehér,
-es
blokk látható. Egy scene a két blokk rögzített
koordináta-négyese; a scene két view-ja ugyanezt a
geometriát kapja, de a két view-hoz független,
szórású Gauss-zajt adunk hozzá, majd a képet
-re
vágjuk. A relevancia-reláció:
és
akkor releváns pár, ha scene_id megegyezik és
view_id eltér. Nincs osztálycímke; a cél nem a tájolás
felismerése, hanem a zajos párok megtalálása.
A generátor a lab/n112_dotpair/generate_dotpair.py
fájlban készül el, a következő szerződéssel:
Munkakönyvtár: lab/n112_dotpair/
Parancs: python generate_dotpair.py --output data --seed 20261112
Kimenet:
data/images.npy (240, 1, 24, 24) float32, [0, 1]
data/metadata.csv 240 sor: index, scene_id, view_id, split
data/manifest.json verzió, seed, alak, SHA-256
A split: 60 train scene (120 kép), 15 val scene (30 kép), 15 test
scene (30 kép). A query-k a test scene-k view_id=1 képei; a
gallery a test scene-k view_id=2 képei
plusz a val scene-k mindkét view-ja. A releváns gallery
elemek csak a test scene azonos scene_id-hez tartozó view-2 képek, tehát
query-nként pontosan egy releváns elem van; a valos elemek
disztraktorok. Ez a felépítés garantálja, hogy a query és a releváns
gallery elem ugyanazt a geometriát, de eltérő zajrealizációt
tartalmaz.
A baseline a nyers pixelvektor L2-normalizált euklideszi távolsága: minden képet 576 dimenziós vektorként kezelünk, ; a ranking a növekvő sorrendje. A modell egy kis CNN-embedding:
Conv2d(1, 8, 3) -> ReLU -> MaxPool2d(2) ->
Conv2d(8, 16, 3) -> ReLU -> MaxPool2d(2) -> Flatten ->
Linear(16*4*4, 32) -> L2-normalize
A paraméterszám körülbelül 9472. A tanítás triplet loss marginnal , minibatch 32, Adam, seed 20261112, float32, CPU. A pozitív pár az azonos scene másik view-ja, a negatív egy másik scene véletlen view-ja. A modell tanítása a 24.4. VI. ellenőrző pont: megbízható CNN-training receptjét követi: a legjobb checkpoint kiválasztása kizárólag a valos triplet loss alapján történik; a test query/gallery készlet a modellválasztás után egyetlen alkalommal kerül kiértékelésre.
A retrieval_eval.py a következő minimális, ellenőrizhető
magot tartalmazza; a teljes tanítási ciklust a hallgató a korábbi
laborokból adaptálja, de ezt a kiértékelőt változatlanul futtatja.
# lab/n112_dotpair/retrieval_eval.py
import json
import numpy as np
def recall_at_k(distances, gallery_scene_ids, query_scene_id, view_ids, k):
# distances: (M,) csökkenő sorrendben rendezett távolságok a gallery elemeihez
# gallery_scene_ids, view_ids: a gallery rendezett metadata oszlopai
relevant_mask = (gallery_scene_ids == query_scene_id)
n_rel = int(relevant_mask.sum())
order = np.argsort(distances)
top_indices = order[:k]
hits = relevant_mask[top_indices].sum()
return float(hits) / n_rel, n_rel, hits
# Betöltés: images.npy, metadata.csv; query = test/view 1, gallery = test/view 2 + val
# A teljes munkamenet a labor reportban szerepel.
# Ellenőrzés: minden query-hez n_rel == 1, a query view-ja nincs a galleryban.A futtatási parancs:
cd lab/n112_dotpair
python generate_dotpair.py --output data --seed 20261112
python retrieval_eval.py --data_dir data --split test --method baseline --seed 20261112
python retrieval_eval.py --data_dir data --split test --method model --seed 20261112
A kimeneti JSON sémája a következő; a számértékek jelölt szemléltetés, nem a szerző által futtatott mérés, mert a kézirat írásakor a generátor és a tanítás nem futott le:
{
"seed": 20261112,
"baseline_recall_at_1": 0.20,
"baseline_recall_at_2": 0.40,
"model_recall_at_1": 0.50,
"model_recall_at_2": 0.65,
"note": "Jelölt szemléltetés, nem mért futás."
}Az ellenőrzési protokoll négy lépése: (1) a SHA-256 manifest az adat
regenerálhatóságát igazolja; (2) a query-k és gallery-k diszjunkt
view_id-t tartalmaznak; (3) query-nként pontosan egy
releváns gallery elem van; (4) a Recall@k nevezője minden query-re
,
tehát a binarizált átlag megegyezik a releváns elem top-k-ba kerülésének
gyakoriságával. Ha a modell Recall@1 nem haladja meg a baseline-t, akkor
a CNN-embedding nem tanult jobb hasonlóságot, mint a nyers pixel; ez
lehet túl kicsi modell, rossz margin vagy nem megfelelő inicializálás
következménye. A DotPair eredménye semmiképpen nem általánosítható
természetes képi retrieval benchmarkra; csak azt bizonyítja, hogy a
protokoll a megadott feltételek mellett korrekt módon értékel.
F1 – fogalmi, nehézség 1. Definiáld a target, output és metrika hármast mind a négy feladatcsaládra a 28.4. VII. ellenőrző pont: CNN alkalmazási szerződés szerződése szerint. Adj egy olyan példát, amelyben az output nem metrika: egy softmax-vektor miért nem pontosság, és egy logits-sor miért nem osztálycímke? Átadandó eredmény: egy táblázat és két mondat indoklás.
F2 – levezetési, nehézség 1. Adott query , gallery , releváns elemek , távolságok , , . Számítsd ki a Recall@1, Recall@2 és Recall@3 értékét, és indokold a nevező választását. Átadandó eredmény: három szám, a rendezett lista és a nevező igazolása.
F3 – implementációs, nehézség 2. Írj
Python-függvényt iou(box_a, box_b) néven, amely nullától
indexelt, fél-nyílt xyxy dobozokra IoU-t számol. Az input két
(xmin, ymin, xmax, ymax) quadrupla, deklarált típusú
float vagy int; a kimenet float. Ellenőrizd a
3.2-es kontrollal:
és
mellett a kimenet
,
tolerancia
.
Átadandó eredmény: futtatható kód importtal, valamint a kontroll
kimenete.
F4 – hibakeresési, nehézség 2. Egy kolléga a retrieval-kiértékelésben a Recall@k-t így számolja: a top- listában szereplő releváns elemek számát osztja -val. Magyarázd el, miért hibás ez a formula, és mutass konkrét ellenpéldát a 3.4-es kontrollból, ahol a hibás érték eltér a helyestől. Adj javítást és egy visszaellenőrzési lépést. Átadandó eredmény: az ok, az ellenpélda számértékei, a javítás és az ellenőrzés.
F5 – kísérleti/transzfer, nehézség 3. A DotPair labor jelenleg retrievalt értékel. Tervezz protokollt ugyanerre az adathalmazra detektálási feladatra: a modellnek a két blokk középpontját kell becsülnie formában. Add meg a target-konverziót, a baseline-t (például a kép súlypontja mindkét pontra vagy a két legfényesebb régió centroidja), a splitet, a metrikát (átlagos euklideszi koordinátahiba, vagy pont-IoU), valamint egy érvényességi korlátot. Átadandó eredmény: legalább egy lehetséges terv és egy alternatíva indoklással.
F1. A megoldás táblázatosan összefoglalható: osztályozás targetje osztályindex, outputja logits, metrikája accuracy; detektálás targetje dobozlista, outputja detektált dobozok score-ral, metrikája AP; szegmentálás targetje pixelcímke-tensor, outputja pixel-logits, metrikája mIoU/Dice; retrieval targetje relevancia-reláció, outputja embedding, metrikája Recall@k/mAP. Az output nem metrika, mert a softmax-vektor egy valószínűségi előrejelzés, nem egyetlen értékelő szám: akkor is lehet hibás, ha a nem a target osztályra esik. Az accuracy a teljes kiértékelő halmazra aggregál, a logits pedig aktiváció előtti pontszám, amelyből a döntés csak argmax-szal nyerhető.
F2. A releváns elemek halmaza , tehát a nevező . A rendezett lista: . Top-1-ben nem releváns, tehát ; top-2-ben , az egyetlen releváns elem benne van, tehát ; top-3-ban . A nevező a releváns elemek száma, nem a top- hossza; ha -val osztanánk, top-3-ban -ot kapnánk, ami hibás.
F3. A teljes függvény:
import numpy as np
def iou(box_a, box_b):
xmin_a, ymin_a, xmax_a, ymax_a = box_a
xmin_b, ymin_b, xmax_b, ymax_b = box_b
inter_xmin = max(xmin_a, xmin_b)
inter_ymin = max(ymin_a, ymin_b)
inter_xmax = min(xmax_a, xmax_b)
inter_ymax = min(ymax_a, ymax_b)
inter_w = max(0.0, inter_xmax - inter_xmin)
inter_h = max(0.0, inter_ymax - inter_ymin)
inter = inter_w * inter_h
area_a = (xmax_a - xmin_a) * (ymax_a - ymin_a)
area_b = (xmax_b - xmin_b) * (ymax_b - ymin_b)
union = area_a + area_b - inter
if union <= 0.0:
return 0.0
return inter / union
# Kontroll
box_gt = [1, 2, 5, 6]
box_pred = [3, 4, 7, 8]
val = iou(box_gt, box_pred)
assert abs(val - 1/7) < 1e-7, val
print(val) # 0.14285714285714285A fél-nyílt intervallum miatt a szélesség egyszerűen
;
a max(0.0, ...) a diszjunkt dobozokra ad
metszetet.
F4. A hiba oka: a kolléga a
precision-at-k-t számítja, nem a recall-t. A recall
nevezője a query összes releváns gallery elemének száma, mert azt méri,
mekkora hányadát találta meg a modell a releváns elemeknek. A 3.4-es
példában a releváns elemek
,
tehát a nevező
;
a top-3 lista
,
amelyben
releváns elem van. A hibás formula
,
a helyes
.
A javítás: a nevezőt n_rel néven tároljuk, nem
k-ként. A visszaellenőrzés: a 3.4-es kontrollban top-4-re
mindkét releváns elem benne van, tehát a helyes érték
,
míg a hibás
,
ami nyilvánvaló ellentmondás, mert az összes releváns elem megtalálva
elérte a maximális recallt.
F5. Egy lehetséges terv: a DotPair generátor a
koordinátákat a metadata.csv-ben vagy külön
targets.npy fájlban elmenti; a detektálási target tehát
képenként egy
-dimenziós
vektor
float pixelkoordináta. A baseline a kép tömegközéppontja, amely mindkét
pontra ugyanazt a koordinátát adja; ez rögzíti a triviális hiba
nagyságát, amelynek a modellnél alacsonyabbnak kell lennie. A metrika az
átlagos euklideszi koordinátahiba:
,
ahol
a modell négy koordinátája. A split scene-csoportos, ahogy a
retrievalnél; a modell ugyanazt a CNN-gerincet használhatja, de a fej
egyetlen lineáris réteg 4 kimenettel, és a loss Huber vagy MSE. Az
alternatíva pontonkénti IoU: minden predikált ponthoz
-es
dobozt rendelünk, és a ground truth ponthoz ugyancsak, majd a két pont
párosítását greedy módon végezzük; ez érzékenyebb a pontpárok
felcserélésére, ezért a koordinátahiba stabilabb kiindulás. Érvényességi
korlát: a két pont sorrendjének felcserélése a négykoordinátás MSE-t
mesterségesen megnöveli, ezért a kiértékelés előtt a predikált pontokat
a legközelebbi ground truth ponthoz kell párosítani; az eredmény nem
valós detektálási benchmark.
A leggyakoribb tévedés: ugyanaz a CNN-gerinc látszólag „mindent tud”, ezért a hallgató a különböző célok metrikáit azonos skálán hasonlítja össze. Ellenpélda: legyen konstans embedding minden bemenetre. Ha osztályozási fejjel a logits mindig ugyanazt az osztályt adja, az accuracy kiegyensúlyozott három osztályra ; retrievalben pedig minden távolság nulla, a ranking tetszőleges, tehát a Recall@k várhatóan a relevanciaarány, ami egyetlen releváns elem és gallery elem mellett körüli. A accuracy és a recall nem összehasonlítható; az első a címke-találati arány, a második a releváns elemek megtalálásának feltételes aránya.
Önellenőrzéshez három kérdést érdemes feltenni: (1) A veszteség minden célalakkal összhangban van-e, például a pixel-loss az pozíciók átlagát veszi-e? (2) A fél-nyílt xyxy doboz területét nem összekevertük-e a zárt intervallummal, ahol egy extra pixel hozzáadódna? (3) A retrieval nevezője minden query-re a releváns elemek száma, nem pedig ? Ha bármelyikre nemleges a válasz, a kontrollt újra kell végezni.
Visszahívás a korábbi egységekre: a 27.4. Instance mask és összetett feladat alfejezetben láttuk, hogy ugyanaz a szemantikus maszk több instance-felosztást enged, ezért a szegmentálás és detektálás targetje nem ekvivalens. A 24.4. VI. ellenőrző pont: megbízható CNN-training alfejezetben rögzítettük, hogy a checkpoint kiválasztása kizárólag a val_loss alapján történik; itt ugyanez az elv érvényes a triplet lossra. A 16.4. IV. ellenőrző pont: a CNN-operátor teljes megértése operátor-specifikációja pedig biztosította, hogy a gerinc keresztkorrelációt számol, amit a különböző fejek változtatás nélkül használhatnak.
A VII. ellenőrző pont a CNN-alkalmazások szerződését rögzíti. Négy feladatcsaládot különböztetünk meg: az osztályozás célja osztályindex, a detektálásé változó dobozlista, a szegmentálásé pixelcímke-tensor, a retrievalé relevancia-reláció. Mindegyikhez eltérő loss, output, metrika, split és inference szerződés tartozik; ugyanaz a CNN-gerinc önmagában nem teszi a metrikákat összehasonlíthatóvá. Kézi kontrollokkal igazoltuk a softmax-összeget, a fél-nyílt dobozok IoU-ját, a bináris maszk Dice-értékét és a Recall@k nevezőjét. A DotPair labor új szintetikus retrievalt definiál, ahol query-nként egy releváns elem van; a protokoll baseline-t, triplet-loss tanítást és szigorú ellenőrzési lépéseket ad.
A 29.1. Lineáris és nemlineáris autoencoder az autoencoder felé lép: a retrieval-embedding célzott hasonlósági tanulás, míg az autoencoder a rekonstrukciós célból tanul latent reprezentációt. A most bevezetett split-, metrika- és inference-szerződés fogalmai közvetlenül alkalmazhatók lesznek a rekonstrukciós feladatra is.