JOVANA
Explore Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

超越準確率:偵測、分割、生成與信心的評估指標

真實的視覺任務不只是分類——學會為框、遮罩、生成影像評分的指標,以及如何判斷模型的信心是否可信。

從標籤到位置:用 IoU 衡量重疊

在上一篇指南裡,我們只問了一個問題:模型有沒有說對類別?這對影像分類來說夠用,因為整張圖只配一個標籤。但大多數真正的視覺任務還在乎「在哪裡」。物件偵測器不只是說「這張照片裡有一隻貓」,它還會在貓身上畫一個框。於是現在有兩種出錯方式:你可能標錯類別(其實是狗,不是貓),也可能標對類別卻把框畫錯位置(你框住了貓的尾巴,卻說那是一隻貓)。要公平地替偵測器打分,我們需要一個數字來衡量預測框和真實框對齊得有多好。

標準工具叫做交並比(Intersection over Union,IoU)。想像把兩張便利貼丟到桌上,讓它們部分重疊。「交集」是兩張便利貼都蓋住桌面的那塊區域——也就是你把它們拿起來對著光、找重複覆蓋處時看到的那一小塊。「聯集」則是兩張便利貼合起來總共蓋住的面積,而那塊共用區域只算一次。IoU 就是共用那塊面積除以總覆蓋面積。如果兩張便利貼剛好完全疊在一起,共用區域就等於總面積,所以 IoU = 1;如果它們只是勉強碰到,共用區域相對總面積非常小,IoU 就接近 0。同樣的想法可以直接套用在預測偵測框和真實框(ground-truth)上。

一個預測框與一個真實框:IoU 是它們的重疊面積除以合併面積。

兩個重疊的矩形,交集區域被塗色,外圍的聯集區域以輪廓標出。

\text{IoU} = \dfrac{\text{area}(P \cap G)}{\text{area}(P \cup G)}

預測框 P 與真實框 G 的交並比。

我們逐個符號來讀。P 是模型預測的框;G 是人類標註的真實框。符號 ∩ 代表「交集」(重疊處),∪ 代表「聯集」(兩個框涵蓋的全部範圍)。分子 area(P ∩ G) 是重疊面積——預測落在真實物件上的部分有多少。分母 area(P ∪ G) 是合併面積——預測加真實,再扣掉重疊以免重複計算。現在來算一個具體數字。假設預測框的角落是 (0,0) 到 (6,4),所以寬 6 高 4,面積 24;真實框從 (2,0) 到 (8,4),同樣是 6 乘 4,面積 24。它們在 x = 2 到 x = 6(寬 4)、y = 0 到 y = 4(高 4)重疊,所以交集是 4 × 4 = 16;聯集是 24 + 24 − 16 = 32。因此 IoU = 16 / 32 = 0.5。由於重疊永遠不可能超過聯集,IoU 一定介於 0 與 1 之間。IoU 為 0.5 看起來像兩個框大約共用一半的覆蓋範圍——顯然是同一個物件,但框畫得鬆;IoU 為 0.9 則看起來像預測框幾乎完美地貼合真實框,只差一條細邊。

IoU 給了我們一個平滑的重疊分數,但要把偵測判為對或錯,我們需要一個是/否的決定。所以我們挑一個門檻——傳統上 IoU > 0.5 就算「命中」。標籤正確且 IoU 高於門檻的偵測就成為真陽性(true positive);重疊太少(或標籤錯)的框是假陽性(false positive);有真實物件卻沒有任何好框去配對,就是假陰性(false negative)。如果這三個詞讓你覺得眼熟,那是應該的:它們正是上一篇混淆矩陣裡的那些格子,只不過現在改由位置而非單純類別來決定。不過門檻是一個旋鈕——把它調到 0.75,你就要求更緊的框,這也是為什麼 IoU 門檻的選擇對接下來的指標——平均交並比以及我們即將打造的偵測器成績單——影響那麼大。

平均精確率均值(mAP):偵測器的成績單

mAP 是每篇偵測論文都會報告的指標,也是初學者覺得最難抓住的一個——所以讓我們一層一層地把它搭起來,並重複利用你已經擁有的零件。第一層:固定一個 IoU 門檻(比如 0.5)。如此一來,模型吐出的每個偵測就乾淨地分成真陽性或假陽性,正如我們剛才所設定。第二層:偵測器還會替每個框附上一個信心值。如果我們把信心門檻設得很高,就只留下最有把握的框(假陽性少,但會漏掉物件);把門檻降低就接受更多框(抓到更多物件,但也放進了垃圾)。把那個信心門檻從高掃到低,就描繪出一整條精確率與召回率的曲線——精確率-召回率曲線——這就是你在第一篇指南學到的同一組精確率和召回率,只是隨著門檻移動而畫出來。

精確率-召回率曲線上的每個點都來自一個信心門檻;AP 就是曲線下的面積。

一條曲線,橫軸為召回率、縱軸為精確率,整體向右下方傾斜,曲線下方面積被塗色。

\text{AP} = \int_0^1 p(r)\,dr, \qquad \text{mAP} = \frac{1}{C}\sum_{c=1}^{C} \text{AP}_c

平均精確率(AP)是某一類別 PR 曲線下的面積;mAP 則把所有類別的 AP 平均。

第三層,公式本身。在左邊的式子裡,p(r) 是模型在召回率為 r 時達到的精確率,從 0 到 1 的積分 ∫ 就是「當召回率從 0(一個物件都沒找到)跑到 1(所有物件都找到)時,那條精確率-召回率曲線下的面積」。那塊面積就是單一類別的平均精確率(AP)——一個會獎勵你在把召回率推高的同時仍保持精確的數字。在右邊的式子裡,C 是物件類別的數量(貓、狗、車……),符號 Σ 表示「全部加起來」,AP_c 是類別 c 在它自己曲線上算出的 AP。所以 mAP——平均精確率均值——字面上就是各類別 AP 的平均:把 C 個類別的 AP 全加起來再除以 C。一個代表整個偵測器的成績單數字。

# One class, "cat". The test set contains 3 real cats (so recall is out of 3).
# The detector emits 5 boxes, sorted by confidence, highest first.
# Each box is TP if it matches an unused GT cat with IoU > 0.5, else FP.
#
#  rank  conf   TP/FP   cumTP  cumFP   precision = TP/(TP+FP)   recall = TP/3
#   1    0.95    TP       1      0         1/1 = 1.00             1/3 = 0.33
#   2    0.90    FP       1      1         1/2 = 0.50             1/3 = 0.33
#   3    0.80    TP       2      1         2/3 = 0.67             2/3 = 0.67
#   4    0.70    TP       3      1         3/4 = 0.75             3/3 = 1.00
#   5    0.60    FP       3      2         3/5 = 0.60             3/3 = 1.00
#
# Reading top-to-bottom = lowering the confidence threshold one box at a time.
# Each row is one point (recall, precision) on the PR curve.
走過五個依信心排序的偵測:每接受一個框,精確率與召回率就更新一次。

看著這張表動起來。只接受最上面那個框(真陽性):精確率是完美的 1.0,但召回率只有 0.33——三隻貓裡找到一隻。第二個框是假陽性,所以精確率掉到 0.5,召回率原地不動。第三、四個框是真陽性,把召回率推到 1.0,精確率則穩定在 0.75。要算 AP,我們取這條曲線下的面積。常見的規則是採用在每個召回率或更高處仍能達到的最佳精確率:精確率在召回率到 0.33 之前維持 1.0,之後一路是 0.75。所以貓這一類的 AP ≈ (1.0 × 0.33) + (0.75 × 0.67) ≈ 0.33 + 0.50 = 0.83。對狗、車和其他每一類重複,再把這些 AP 平均,就得到 mAP。一個你到處都會遇到的精煉做法:COCO 基準不會只停在 IoU > 0.5。它在從 0.5 到 0.95 的十個 IoU 門檻上各算一次 mAP 再平均——寫作 mAP@[.5:.95]。為什麼?因為一個畫框潦草但勉強及格的偵測器在 0.5 時分數還行,到 0.9 就崩潰,所以在更嚴格的 IoU 門檻上取平均,會獎勵那些框真正緊貼物件的模型。

為遮罩評分:平均交並比(mIoU)

分割比偵測再細一層:它不是給一個框,而是替每一個像素都指派一個類別標籤——這個像素是路、那個是天空、那個是車。最直覺的分數會是「正確標註的像素比例」(像素準確率),但這會一頭撞進第一篇指南的不平衡陷阱。想像一張 90% 都是天空的照片。一個偷懶的模型只要把整張圖都塗成天空,就已經有 90% 的像素準確率,卻完全漏掉你真正在乎的那隻鳥、那條電線、那朵雲。解法和我們處理框時是同一個想法——看重疊,而不是看原始數量——只是改套用在像素上。我們替每個類別算 IoU,再取各類別的平均,寫作平均交並比(mIoU)

語意分割:每個像素都依其類別上色。mIoU 衡量預測區域與真實區域重疊得有多好。

一張影像,每個區域(路、天空、車、人)依其類別填上不同的單一顏色。

\text{IoU}_k = \dfrac{TP_k}{TP_k + FP_k + FN_k}, \qquad \text{mIoU} = \frac{1}{K}\sum_{k=1}^{K}\text{IoU}_k

以像素為單位計算每個類別的 IoU,再對 K 個類別取平均。

# A tiny 4x4 image (16 pixels). Two classes: cat (C) and background (.).
#
#   GROUND TRUTH          PREDICTION
#     . . . .               . . . .
#     . C C .               . C C C     <- one extra pixel wrongly called cat (FP)
#     . C C .               . . C .     <- one true cat pixel missed (FN)
#     . . . .               . . . .
#
# For class "cat":
#   TP_cat = truly cat AND predicted cat   = 3 pixels
#   FP_cat = predicted cat but NOT cat     = 1 pixel
#   FN_cat = truly cat but predicted other = 1 pixel
#
#   IoU_cat = 3 / (3 + 1 + 1) = 3/5 = 0.60
在 4×4 像素格上計算單一類別的 IoU:這就是框 IoU 的想法,改以逐像素來數。

拿著格子來讀公式:對某類別 k 而言,TP_k 是真正屬於類別 k 被預測為 k 的像素數(重疊),FP_k 是被預測為 k 但其實是別的東西的像素(過度塗色),FN_k 是真正屬於 k 卻被標成別類的像素(漏掉)。分母 TP_k + FP_k + FN_k 正是「被預測為或真正屬於」類別 k 的像素——也就是像素的聯集,就像 area(P ∪ G) 是框的聯集一樣。在我們的格子裡,貓的 IoU 是 3/(3+1+1) = 0.60。mIoU 接著把這些各類別的 IoU 對所有 K 個類別取平均(這裡 K = 2:貓和背景),除以 K。聯集分母之所以是防作弊裝置,原因在此:如果模型用一個常見類別淹沒整張圖以拉高召回率,它塗錯的每個像素都會落進 FP 並膨脹分母,把那個類別的 IoU 拖回來。具體來說,我們那個偷懶的「全部預測成背景」模型會拿到 12/16 = 0.75 的像素準確率,卻只得到貓 IoU 恰恰為 0,使 mIoU 崩潰。準確率為作弊鼓掌;mIoU 把它揭穿。

有一個區別要分清楚。語意分割只問「這個像素是什麼類別?」——所有貓就只是「貓」,就算三隻貓貼在一起、糊成一團也一樣。實例分割更進一步,把每個獨立物件分開——貓 #1、貓 #2、貓 #3——即使牠們互相重疊。mIoU 是語意分割的主力指標,因為它替類別區域評分,不在乎把個體一一區分。相對地,實例分割的評分方式更像偵測——用 IoU 配對每個實例的遮罩,再以 mAP 式的平均精確率來計分。所以這篇指南裡的指標並不是各自孤立的島嶼:IoU 是共用的原子,偵測、語意分割與實例分割各自用不同方式把它組裝起來。

語意分割對比實例分割:同樣的像素,但實例分割會把每個物件分開——評分方式也更像偵測。

左右並排:左邊所有羊共用一種顏色(語意分割);右邊每隻羊各有自己的顏色(實例分割)。

為沒有標籤的影像評分:用 FID 評估生成

現在來看最難的情況。一個生成模型——GAN 或擴散模型——會產生全新的影像,比方說從未出現在任何資料集裡的人臉或臥室。沒有可比對的標準答案,所以準確率、IoU、mAP 全都失去意義:模型應該畫出哪一張「正確」的臉?我們需要另一把尺,而它要從先講清楚「好」到底是什麼意思開始。我們同時想要兩件事:影像要逼真(每一張看起來都像一張合理的真實照片),也要多樣(模型應該產生許多不同的臉,而不是同一張臉一畫再畫——這種失敗叫做模式崩潰,mode collapse)。能同時抓住這兩點的訣竅,是不再替個別影像打分,而是把整個生成影像的分布拿去和真實影像的分布做比較。

GAN 讓生成器與鑑別器互相對抗;我們仍需要一個指標來說明它輸出的分布離真實資料有多近。

一張示意圖:生成器產生假影像,鑑別器試圖分辨真假。

標準的分布比較指標是 Fréchet Inception 距離(FID)。做法有三步。第一,你不能逐像素比較影像——同一隻狗的兩張照片只要平移一個像素,在原始像素上就「相距很遠」,內容上卻完全相同。所以你把每張真實影像和每張生成影像都通過一個預訓練網路(在 ImageNet 上訓練的 Inception 網路),各自取出一個內部的特徵向量——一串描述高層內容的數字,例如「毛茸茸」「有眼睛」「在戶外」。第二,你把每一團特徵向量的雲——真實的雲和假的雲——各自摘要成一個多維高斯分布(一個有中心和散度的鐘形團塊)。第三,你量測這兩個高斯分布之間的距離。如今領先影像生成的擴散模型,正是用同一套 FID 流程來評分。

擴散模型把隨機雜訊逐步去噪成影像;FID 檢查它的輸出分布是否符合真實資料。

一連串畫面,顯示純雜訊逐步去噪、變成一張清晰的生成影像。

\text{FID} = \lVert \mu_r - \mu_g \rVert^2 + \operatorname{Tr}\!\left(\Sigma_r + \Sigma_g - 2\,(\Sigma_r \Sigma_g)^{1/2}\right)

FID:真實高斯分布 (μ_r, Σ_r) 與生成高斯分布 (μ_g, Σ_g) 之間的距離。越低越好。

你不需要手算矩陣平方根——但你應該能讀懂每一塊代表什麼。μ_r 和 μ_g(希臘字母 mu)是真實集合與生成集合的平均特徵向量:每一團雲的「平均內容」,也就是它的質心。第一項 ‖μ_r − μ_g‖² 是這兩個中心之間距離的平方——它問的是「平均而言,假內容和真內容是不是落在同一個位置?」如果你的生成器做出的臉系統性地太平滑或太亮,兩個中心就會漂開,這一項就變大。Σ_r 和 Σ_g(大寫 sigma)是共變異數:它們描述每一團雲有多分散、特徵之間如何相關——換句話說,這個集合有多多樣,以及哪些特徵會一起變動。跡(trace)那一項 Tr(Σ_r + Σ_g − 2(Σ_r Σ_g)^{1/2}) 比較這些散度:當兩團雲有相同的形狀與多樣性時它接近零,當它們不同時就變大——例如模式崩潰讓假的雲縮小、涵蓋的多樣性遠少於真實的雲時。把這兩項相加,你就得到一個數字,越低代表兩個分布靠得越近、重疊越多——也就是生成影像既更逼真也更多樣。FID 接近 5 表示兩團雲幾乎重合;FID 為 80 則表示它們相距甚遠。

信心可信嗎?談信心校準

在上一篇指南結尾,我們暗示模型的信心數字本身值得仔細檢視。這裡就是兌現的時候。分類器不只說「貓」,它說「貓,信心 90%」。校準(calibration)問的是那個 90% 能不能照字面採信。乾淨的定義是:如果在模型以信心 p 做出的所有預測當中,實際正確的比例恰好是 p,那麼這個模型就是校準良好的。所以,如果你把模型標為「70% 有把握」的每一個預測收集起來,而其中 70% 是對的,那個 0.7 就是誠實的;如果其中只有 50% 是對的,模型聲稱 70% 卻只兌現 50%——它過度自信,它的信心是一個你不能安心據以行動的謊言。

讓這件事變得鮮明的圖是可靠度圖(reliability diagram)。把模型聲稱的信心放在橫軸,把觀察到的準確率放在縱軸。要畫它,先把預測按信心分到不同的箱子裡——所有「50–60% 有把握」的放一起,「60–70%」的放一起,依此類推——然後替每個箱子畫一個點:橫向是這箱平均聲稱的信心,縱向是真實準確率。一個校準完美的模型,會讓每個點都落在 45 度對角線上,也就是聲稱等於觀察。點落在對角線下方表示模型聲稱的信心多過它應得的(過度自信);點浮在上方則表示它信心不足,比它承認的還要常答對。

一個眾所周知、又有點令人不安的發現:現代深度網路通常過度自信。那些贏得基準測試的高準確率大模型,往往脫口而出 99% 的信心,即使它們答錯的頻率遠高於 1%——它們的點落在對角線下方。耐人尋味的是,較舊、較小的網路常常校準得更好;現代網路的規模與訓練方式,似乎把它們的機率推向極端。所以高準確率和良好校準確實是兩種不同的特質:一個模型可以大多數時候都對,卻仍然是個糟糕的裁判,判斷不出自己何時即將出錯。

\text{ECE} = \sum_{b=1}^{B} \frac{n_b}{N} \,\bigl| \operatorname{acc}(b) - \operatorname{conf}(b) \bigr|

預期校準誤差(ECE):以各箱權重平均後,觀察準確率與聲稱信心之間的差距。

可靠度圖是一張圖;預期校準誤差(ECE)把它擠壓成一個數字——點與對角線之間的平均垂直差距。逐個符號來看:我們把預測切成 B 個信心箱,b 是某一箱的索引。n_b 是落在箱 b 的預測數量,N 是預測總數,所以 n_b / N 是該箱預測所占的比例——也就是它的權重,讓擁擠的箱比幾乎空的箱算得更重。acc(b) 是該箱內觀察到的準確率(實際有多少是對的),conf(b) 是該箱模型聲稱的平均信心。絕對值 |acc(b) − conf(b)| 是該箱誠實與聲稱之間的差距,而 Σ 把這些差距按各箱的常見程度加權後相加。一個小例子:假設某一箱裝了你 1,000 個預測中的 100 個,模型在那裡聲稱 0.9 的信心,但只有 70% 是對的。那箱對 ECE 的貢獻是 (100/1000) × |0.70 − 0.90| = 0.1 × 0.20 = 0.02。把所有箱的這種貢獻加起來;ECE = 0 是完美誠實,越大代表越自欺。一個常見又便宜的修正是溫度縮放(temperature scaling):訓練完之後,在把模型的原始輸出分數(logits)轉成機率之前,先除以一個學到的單一數字 T > 1。這會把過度自信的尖峰軟化成較誠實的值,而不改變預測出哪一個類別,所以準確率不變、校準卻變好。

為什麼要這麼執著於模型對自己是否誠實?因為在任何會據預測行動的系統裡,信心就是控制風險的方向盤。一輛自駕車若真的不確定前方的形體是不是行人,它必須知道自己不確定,才能煞車或把控制權交還給人類;一句過度自信的「99% 是空路」正是會害死人的謊言。一個醫療模型標示「可能是良性」時,最好是真的這麼有把握。校準是通往可信賴 AI 的橋樑,而它直接引出下一篇指南的問題:當輸入是模型從未見過的東西——分布外(out-of-distribution)——時,一個校準良好的模型應該降低它的信心,而不是自信地胡謅。我們會在這個模型校準的基礎上,建立那種分布外偵測。

指標是如何被操弄的

最後,我們把成熟度從「該用哪個指標?」提升到「我到底能不能信任這個數字?」。主導的觀念是古德哈特定律(Goodhart's law)當一個量度變成目標,它就不再是個好量度。一旦像準確率、mAP或 FID 這樣的數字變成大家爭相最佳化、互相較量的對象,人們就會開始追逐那個數字,而不是它本該追蹤的底層品質——於是那個數字悄悄地不再代表你以為的意思。

視覺領域充滿具體例子。對基準過擬合:如果大家年復一年都在同一個固定測試集上報告,模型會慢慢屈就於那一個集合的怪癖,排行榜往上爬,真實世界的能力卻沒提升。在測試集上調參:如果你偷看測試結果、微調模型、再重來,測試集就偷偷變成了訓練資料,你報告的分數是虛構的。挑選對自己有利的 IoU 門檻:只在寬鬆的 0.5 門檻報告 mAP,潦草畫框的偵測器看起來很厲害——悄悄省略 [.5:.95] 平均,就掩蓋了它的框其實糊成一團。操弄 FID:用任何讓你好看的樣本數來報告,因為 FID 會隨樣本變多而變好;或是生成數千張影像、只挑最漂亮的幾張展示。每一招在技術上都報告了一個「真實」的指標,卻講了一個誤導的故事。

過擬合的縮影:模型可以背下一個基準、貼出漂亮的數字,卻沒學到任何能類推的東西。

一條曲線完美穿過訓練點,卻在點與點之間劇烈擺動,錯失了真正的底層趨勢。

  1. 保留一個真正的測試集:開發過程中絕不偷看,最終數字只在它上面跑一次。
  2. 報告信賴區間或誤差棒,而不是單一小數——一個落在雜訊範圍內、0.2 個百分點的 mAP 勝出根本不算勝出。
  3. 同時呈現會彼此矛盾的多個指標(例如 mAP@[.5:.95] 連同 [email protected],或 mIoU 連同像素準確率),讓單一個好看的數字無法掩蓋缺陷。
  4. 固定並公開你的流程:確切的 IoU 門檻、FID 樣本數、資料集的切分方式——讓別人能重現並公平比較。
  5. 報告失敗案例,而不只是成功:展示模型在哪裡崩壞,因為基準與現實之間的落差就住在那裡。

這就是通往本軌道其餘部分的橋樑。這篇指南裡的每個指標都假設測試資料長得像訓練資料——同樣的相機、同樣的光照、同樣的世界。一個模型可以在它的基準上把準確率、mAP、mIoU、FID 甚至校準全都拿到滿分,卻在輸入一改變的瞬間就分崩離析:被對手挪動幾個像素、訓練集從未包含的暴風雪、資料採樣不足的某個族群的臉。強勁的指標告訴你模型在你給它的那份測試上很好——對於世界改變時會發生什麼,它們什麼也沒說。那種脆弱性正是接下來三篇指南要逐一拆解的,依序是:對抗樣本、分布偏移與分布外偵測,最後是公平性、可解釋性與信任。