NEWSIO+ 教育系列01 自己訓練一個 AI02 從照片還原 3D03 深度學習
主線 C · 模組 C4動手做 // 五個實驗台

找到
物體

「找到」要怎麼打分?two-stage 和 one-stage 差在哪一步?DETR 為什麼不需要 NMS?

分類只要回答「這張圖是貓」。偵測(object detection)要回答更多:圖裡有幾個東西、各是什麼、各在哪裡,每一個都用一個框框起來。這個模組先講怎麼替一個框打分數(IoU),再講同一個物體被框了八次怎麼辦(NMS),然後講一整個偵測器怎麼打總分(precision、recall、mAP),最後看三種做法:先找候選再分類的 two-stage、一次看完的 one-stage(YOLO),和乾脆不需要去重複的 DETR。

SEC.01 / INTERSECTION OVER UNION

一個框準不準:重疊面積 ÷ 合起來的面積

模型畫的框不可能和人工標註(ground truth)分毫不差,所以要一個「差多少」的分數。最常用的是 IoU(Intersection over Union,也叫 Jaccard index):兩個框重疊的面積除以兩個框合起來的面積。完全重合是 1,完全沒碰到是 0。偵測比賽通常規定 IoU ≥ 0.5 才算「找到」。下面灰色是標註的框,你用滑鼠或手指拖出自己的框。

PROBE A / 畫一個框,算 IoU動手做 // 在空白處拖曳畫框,在框內拖曳移動
交集(橘色塗滿的部分)—
聯集(兩個框合起來)—
IoU = 交集 ÷ 聯集—
IoU ≥ 0.50 算找到—
GIoU / DIoU(拿來當 loss 用的改良版)—
COCO 的 10 個門檻(0.50、0.55 … 0.95)過了幾個—
試試看。(1)按「完全重合」再按「放大一圈」:中心完全對,只是面積大了 1.5 倍,IoU 就只剩 0.67,掉得比你想的快。(2)把門檻拉到 0.75 或 0.9,同一個框從「找到」變成「沒找到」:門檻越高,對位置越挑剔。(3)按「完全不重疊」:IoU 是 0,不管差 10 像素還是 300 像素都是 0,這就是 IoU 拿來當訓練目標時的毛病;GIoU 和 DIoU 還會繼續變,告訴模型往哪邊移。畫面大小與框的位置都是示意。
IoU 同時罰「多框」和「少框」框太大,聯集變大;框太小,交集變小。兩種錯都會把分數拉低。
「找到」是一個門檻同一個框,門檻 0.5 算對、0.75 算錯。所以看偵測成績一定要問:IoU 門檻是多少。
沒重疊時 IoU 不會說話所有不重疊的框 IoU 都是 0,沒有梯度可以學。GIoU、DIoU、CIoU 就是為了補這個洞。
細看 · 任務家族、IoU 與 Dice、分類加定位、姿態估計、GIoU / DIoU / CIoU

任務家族:講義從「只回答是什麼」排到「每個像素都要回答」。分類:整張圖一個標籤。分類 + 定位:一個物體,加一個框。物體偵測:多個物體,每個一個類別加一個框。語義分割(semantic):每個像素一個類別,但不分「哪一隻」,兩隻狗是同一片「狗」。實例分割(instance):每個物體各自一個遮罩,兩隻狗分得開。全景分割(panoptic):兩者合起來,可數的東西(thing:人、車)要分實例,不可數的區域(stuff:天空、道路)只要類別,每個像素剛好一個標籤。分割在 C5。

IoU 與 Dice:用像素的對錯來寫,IoU = TP / (TP + FP + FN),Dice = 2TP / (2TP + FP + FN)。Dice 分母裡 TP 算兩次,所以對錯誤比較寬容,數值通常 ≥ IoU;它在二分類時等於 F1。講義的建議:一般比賽用 IoU;小目標或極度不平衡(例如前景只佔 0.1%,醫療影像的腫瘤)用 Dice。

分類 + 定位:如果圖裡只有一個物體,最簡單的做法是一個 CNN(通常先在 ImageNet 預訓練)接兩個頭:一個頭輸出類別分數(softmax loss),一個頭直接回歸 4 個數字 (x, y, w, h)(L2 loss),兩個 loss 加起來一起訓練。問題在於每張圖的物體數不一樣:一隻貓要 4 個數字,三隻動物要 12 個,網路的輸出長度卻是固定的。這就是後面所有方法要繞過的根本困難。

人體姿態估計:同一個「回歸座標」的想法推廣到關節。講義引用 DeepPose(CVPR 2014):把人體表示成 14 個關節點,網路直接回歸 14 組 (x, y),每個點用 L2 loss。

拿 IoU 當 loss:早期框回歸用 L2,但 L2 小不代表 IoU 高。改用 IoU loss = 1 − IoU 之後,不重疊時 loss 恆為 1、沒有梯度。GIoU(CVPR 2019)多減一項 (C − A∪B) / C,C 是包住兩框的最小框,不重疊時也會隨距離變;但一個框被另一個整個包住時,C 就是大框本身,GIoU 退回 IoU。DIoU(AAAI 2020)改減「中心點距離² ÷ C 的對角線²」,直接把中心拉近,講義引用的實驗裡 GIoU 400 次迭代還沒收斂,DIoU 120 次就收斂。CIoU 再加一項長寬比一致性。講義的總結:好的框 loss 要看三件事,重疊面積、中心距離、長寬比。講義筆記也提到把 YOLOv3 的 loss 換成 CIoU,AP 約提升 6%、AP75 約提升 10%。

IoU = |A∩B| / |A∪B| GIoU = IoU − |C − A∪B| / |C| DIoU = IoU − ρ²(b, bgt) / c² (ρ 是兩框中心距離,c 是 C 的對角線長)
SEC.02 / NON-MAXIMUM SUPPRESSION

同一隻狗被框了八次:NMS 留一個

偵測器會在物體附近吐出很多個差不多的框,每個都有一個信心分數。人只要一個。NMS(non-maximum suppression,非極大值抑制)是一個很簡單的規則:分數最高的留下,和它重疊太多(IoU 超過門檻)的全部刪掉,再從剩下的裡面挑最高的,重複到沒有框為止。下面一步一步跑。

PROBE B / 一步一步跑 NMS動手做 // 按「下一步」,拉 IoU 門檻,換成 soft-NMS
進度—
這一步做了什麼—
跑完後:真實物體被找到幾個(IoU ≥ 0.5)—
跑完後:多出來的重複框—
—
三件事值得試。(1)一個物體時跑完:八個框只剩一個。把門檻拉到 0.85,重疊得不夠多的框逃過刪除,留下重複框,precision 變差。(2)換成「兩個靠很近的物體」,門檻拉到 0.35 以下:右邊那個物體最好的框和左邊的框 IoU 約 0.4,被當成重複刪掉,一個真的物體不見了。門檻太低誤刪,太高留重複,沒有一個門檻同時適合所有場景。(3)換成 soft-NMS:不直接刪,只把分數打折,重疊越多折越多(高斯版對每個框都打折,不看 Nt);靠很近的第二個物體分數被壓低,但通常還在分數門檻之上,就活下來了。分數與位置都是示意。
NMS 是規則,不是學出來的它接在網路後面,不參與訓練。網路吐出重複框,NMS 負責收拾。
一個門檻管所有場景人群、車陣、疊在一起的東西,正好是「重疊多但不是重複」的情況,硬門檻最容易出錯。
soft-NMS 把「刪」改成「打折」講義引用的論文標題是「一行程式碼改進物體偵測」:不用重新訓練,平均提升約 1%。
細看 · NMS 演算法、soft-NMS、DIoU-NMS、feature NMS

講義的例子:6 個框,分數 0.95、0.9、0.9、0.8、0.7、0.7。取 0.95 當第一個物體;剩下 5 個裡和它 IoU 大於 0.6(可以另外設)的刪掉,留下 0.9、0.8、0.7;再取 0.9 當第二個物體,重複到沒有框。最後選出 0.95 和 0.9 兩個。

NMS + score threshold:R-CNN 和 YOLO 的最後一步都是「先丟掉分數太低的,再跑 NMS」。上面實驗台的兩個滑桿就是這兩個門檻。

soft-NMS:講義的例子是兩匹馬,紅框 0.95、綠框 0.8,綠框和紅框重疊很多。傳統 NMS 直接把 0.8 變成 0;soft-NMS 問的是:與其刪掉,給它 0.4 是不是比較好?M 是目前分數最高的框,bi 和 M 的 IoU 越大,bi 的分數 si 降得越多。兩種寫法:

線性:si ← si(1 − IoU(M, bi)) 若 IoU ≥ Nt  高斯:si ← si · e−IoU² / σ (線性版在 Nt 有一個突然的跳躍,高斯版是連續的;實驗台的 σ 設 0.5)

講義引用的結果:soft-NMS 在高 IoU 門檻評估時比傳統 NMS 好約 2%,而且同一組參數在不同評估門檻下都好;整體約 1% 的提升,不增加訓練和計算成本。

DIoU-NMS:YOLOv4 用的版本,把 NMS 裡的 IoU 換成 DIoU,多考慮兩框中心的距離。中心離很遠的兩個框,即使重疊多,也比較可能是兩個不同的物體,例如講義裡重疊在一起的機車。為什麼不用 CIoU-NMS?CIoU 的長寬比項需要 ground truth,推論時沒有。

Feature NMS:重疊嚴重、IoU 落在「不確定」區間時,再比較兩個框的特徵向量:特徵很像就是同一個物體,不像就兩個都留。

NMS 的根本問題:它是手工規則,不能端到端訓練,門檻要人調。SEC.04 的 DETR 直接把它拿掉。

SEC.03 / PRECISION, RECALL & mAP

整個偵測器的總分:抓得準,也要抓得齊

每個框都判了「找到/沒找到」之後,要替整個偵測器打總分。兩個問題要分開問。Precision:我說「這裡有東西」的框裡,有幾成是對的?Recall:所有真的物體裡,我抓到幾成?兩個數字由一個信心門檻控制:門檻調高,只交出很有把握的框,precision 高但漏掉很多;門檻調低,什麼都交,recall 高但很多是錯的。把所有門檻都試一遍,畫成一條曲線,曲線下的面積就是 AP。

PROBE C / 拉門檻,看 PR 曲線動手做 // 拉信心門檻,切換模型與內插
門檻以上:對的 TP / 錯的 FP / 漏掉的 FN—
Precision = TP / (TP + FP)—
Recall = TP / (TP + FN),真實物體共 12 個—
F1 = 2PR / (P + R)—
AP(橘色面積,和門檻無關)—
上排是 20 個偵測,依分數由高到低排好,綠色是對的(和某個真實物體 IoU ≥ 0.5,而且那個物體還沒被別人配走),橘色是錯的。門檻往左拉,交出去的框變多,曲線上的點往右下走。注意兩件事。(1)20 個偵測裡只有 10 個對,真實物體有 12 個,所以 recall 最多到 0.83,曲線到不了右邊。(2)換成「排序亂的模型」:對的框數量一樣,只是分數排得亂,AP 就掉很多。AP 量的不是「有沒有找到」,是「把對的排在前面」的能力。這 20 筆資料是示意。
precision 和 recall 拉鋸全部拒絕:沒有錯,但什麼都沒抓到。全部接受:一個都不漏,但錯一大堆。理想是右上角。
AP 把整條曲線壓成一個數字不用先選門檻。比較兩個模型時,不會因為一個門檻選得剛好而佔便宜。
mAP = 每一類的 AP 再平均狗的 AP、人的 AP、車的 AP……平均起來。COCO 還要在 10 個 IoU 門檻上各算一次再平均。
細看 · 定義、講義的迷你例子、mAP@[.5:.95]、怎麼選門檻

TP / FP / FN:TP 是框對了(IoU 達到門檻、類別也對)。FP 是框錯了,包含同一個物體的重複框:一個物體只能配一個框,第二個框就算位置完美也算 FP,所以 SEC.02 的 NMS 會直接影響分數。FN 是真實物體沒有任何框配上。偵測裡沒有 TN:「背景沒有被框」的數量是無限多,不算。

講義的迷你例子:100 筆資料,真的正類 20 筆。門檻 0.9 時預測 10 個、9 個對:precision 9/10 = 0.90,recall 9/20 = 0.45。門檻 0.3 時預測 30 個、18 個對:precision 18/30 = 0.60,recall 18/20 = 0.90。提高 recall 往往會掉 precision,反之亦然。

AP:PR 曲線下的面積。常見的算法先做「內插」:每個 recall 位置的 precision,換成它右邊(recall 更高處)最大的 precision,讓曲線變成單調往下的階梯,再算面積。實驗台的勾選框就是這一步。

mAP@[.5:.95]:PASCAL VOC 傳統上報 IoU 0.5 的 mAP(寫成 AP50)。COCO 主要指標是 IoU 從 0.50 到 0.95、每 0.05 一個門檻,10 個門檻各算一次 mAP 再平均,對框的精準度更挑剔。講義引用 YOLOv4 在 COCO 上 43.5% AP(65.7% AP50):同一個模型,門檻不同,數字差了 20 多點。

F1 與 Fβ:precision 和 recall 的調和平均。想要平衡兩者,就在驗證集上掃門檻,選 F1 最大的那個。醫療篩檢、瑕疵檢測寧願多抓(高 recall),自動通知使用者寧願少誤報(高 precision)。在測試集上選門檻會洩漏。

為什麼不用 accuracy:類別極度不平衡時 accuracy 幾乎沒意義;PR 曲線在不平衡時也比 ROC 曲線誠實,因為 ROC 對負類數量不敏感。

SEC.04 / TWO-STAGE, ONE-STAGE, SET PREDICTION

差在第一步:先挑候選,還是一次看完

偵測的難處是「框的數量每張圖不同」。two-stage 的做法是分兩步:第一步先挑出約兩千個「可能有東西」的候選區域(region proposal),第二步才對每個候選做分類和框的微調(R-CNN 系列)。one-stage 拿掉第一步:把圖切成格子,每一格直接輸出固定數量的框和分數,整張圖只跑一次網路(YOLO、SSD、RetinaNet)。兩者都會吐出重複框,都需要 NMS。DETR 則改了問題本身:直接輸出一組框,訓練時強制一個物體只配一個輸出。

PROBE D / YOLO 的格子與 focal loss動手做 // 拉 S,點一格
選到的格子—
這格負責的物體(中心落在這格裡的)
—
這格的 B = 2 個框 (x, y, w, h, confidence)—
類別機率 Pr(class | object)
—
輸出張量 S × S × (5B + C),C = 4 類—
被擠掉的物體(和別人搶同一格)—
容易的樣本 pt = 0.9:CE → focal loss—
困難的樣本 pt = 0.2:CE → focal loss—
背景框佔總 loss 的比例—
上半:格子。每個物體只由「中心點落在裡面的那一格」負責,橘點是中心。S = 3 或 4 時,左上兩隻鳥的中心落在同一格,一格只能預測一組類別,所以有一隻被擠掉;S 拉到 5 以上才分得開。這就是講義說 YOLO v1 抓不好成群小東西的原因(9 個聖誕老人只抓到 5 個)。confidence 是預測框和真實框的 IoU,在這裡真的用 IoU 算;框的誤差是示意。下半:focal loss。γ = 0 就是 cross-entropy(虛線)。γ 拉大,pt 接近 1 的容易樣本 loss 被壓到幾乎 0,困難樣本的 loss 只少一點。一萬個容易的背景框,在 cross-entropy 下佔了總 loss 的九成以上;γ = 2 時降到兩成以下。困難樣本固定為 10 個 pt = 0.3 的物體,數字為示意。
PROBE E / DETR 的一對一配對動手做 // 拉 λ,切換成 anchor 式
配對成本 = −p(正確類別) + λ · (1 − GIoU)
配對結果—
被教成「沒有物體 ∅」的 query—
推論時需要 NMS 嗎—
DETR 有固定數量的 query(論文裡是 100 個,這裡 6 個),每個 query 輸出一個類別(包含「沒有物體 ∅」)和一個框。訓練時,在所有「一個真實物體配一個 query」的方法裡,挑總成本最低的一種(Hungarian matching;這裡物體少,直接把 30 種配法全算一遍)。配上的 query 學那個物體,其他全部學「沒有物體」,連那個框得很好的重複框也一樣。所以模型自己學會不吐重複框,推論時不用 NMS。λ 拉到 0,只看類別機率:貓會配給分數最高但框比較歪的 Q2。打開 anchor 式,同一隻貓有兩個正樣本,推論時就得靠 NMS 去重複。框與機率為示意。
two-stage:先縮小範圍proposal 先把幾萬個可能位置縮到一兩千個,第二步只認真看這些。準,但慢、流程複雜。
one-stage:每一格都是候選一次網路就輸出全部框,很快;代價是幾萬個候選裡絕大多數是背景,訓練被容易的背景淹沒。focal loss 解的就是這個。
DETR:把重複寫進 lossNMS 和 anchor 都是人手設計的規則。DETR 用一對一配對讓網路自己學會「一個物體一個框」。
細看 · Sliding window、R-CNN 三代、YOLO v1 到 v4、class imbalance 與 focal loss、DETR

Sliding window:把偵測當分類,拿各種大小的窗口滑過整張圖,每個窗口問 CNN「是狗、是貓、還是背景」。問題是位置和尺度的組合太多,每一個都要跑一次 CNN,算不完。

Region proposals:先用便宜的方法找「看起來像一團東西」的區域。Selective search 先把圖切成很多小區塊,再依顏色、紋理、大小、是否被包住等多種相似度逐層合併(hierarchical grouping),合併過程中每一層的區塊都是候選;在 CPU 上幾秒鐘就能給出約 1000 個候選。講義解釋為什麼要多種策略:兩隻貓要靠顏色分,變色龍要靠紋理分,車輪要靠「被車身包住」才算同一個物體。

Bounding box regression:候選框通常有點歪,用回歸預測一組修正量,把框推到更準的位置。可以用在「修正候選框」,也可以直接拿來做整個偵測(YOLO)。

R-CNN(CVPR 2014):selective search 給約 2000 個候選 → 每個縮放(warp)成 227×227 → 各自送進微調過的 AlexNet 抽特徵 → SVM 分類 + 框回歸。問題:(1)推論慢,一張圖要跑 2000 次 CNN;(2)訓練目標是拼湊的:CNN 用 softmax、SVM 用 hinge loss、框回歸用 least squares,三個分開訓練,CNN 的特徵不會因為 SVM 而更新;(3)訓練要 84 小時、佔大量硬碟。

Fast R-CNN:整張圖只跑一次 CNN,得到 conv5 特徵圖,再把每個候選框投影到特徵圖上,用 RoI pooling 切成固定格數(例如 2×2)各取最大值,變成同樣大小,餵給全連接層同時輸出類別(log loss)和框(smooth L1),一起訓練。RoI pooling 是 SPP(spatial pyramid pooling)只用一層金字塔的特例。剩下的瓶頸:候選框還是由網路外的 selective search 產生,變成最慢的一步。

Faster R-CNN(NIPS 2015):讓 CNN 自己提候選。RPN(region proposal network)在共用的特徵圖上滑一個 3×3 窗口,每個位置放 k = 9 個 anchor(3 種大小 × 3 種長寬比的預設框),對每個 anchor 輸出「是不是物體」2 個分數和 4 個修正量。整個網路同時訓練 4 個 loss:RPN 分類、RPN 框、最後的類別、最後的框(原論文用 4 步交替訓練)。anchor 有不同大小,就同時處理了多尺度。

YOLO v1(CVPR 2016):把偵測當成一個回歸問題。圖縮到 448×448,切成 S×S 格,每格預測 B 個框(各 5 個數:x, y, w, h, confidence)和 C 個條件類別機率,輸出 S×S×(5B + C);PASCAL VOC 的 S = 7、B = 2、C = 20,就是 7×7×30。confidence 的目標值是 Pr(Object) × IoU;推論時類別機率乘上 confidence 得到每個框每一類的分數,再做 score threshold 和 NMS。訓練 loss 是 sum-squared error,但有三個調整:只在格子裡真的有物體時才罰類別;只罰「負責」的那個框(和真實框 IoU 最高的);有物體的座標誤差乘 λcoord = 5,沒物體的 confidence 誤差乘 λnoobj = 0.5,不然大量空格子的梯度會壓過一切;寬高取平方根,讓小框的誤差更有份量。速度 45 fps,精簡版 150 fps。講義引用的錯誤分析:YOLO 把背景誤判成物體的比例 4.75%,Fast R-CNN 是 13.6%(一次看整張圖,有全局資訊);但定位錯誤佔 19.0%,Fast R-CNN 只有 8.6%。

YOLO v2:改預測相對於 anchor 的偏移量,中心點用 sigmoid 限制在本格之內,訓練更穩定,mAP 提升約 5%;格子從 7×7 改成 13×13,每格 5 個 anchor(大小用 k-means 從資料集統計出來),每個 anchor 各自有類別。講義的數字:加 anchor 後 mAP 從 69.5 小降到 69.2,recall 卻從 81% 升到 88%;整體比 v1 進步 15.2%。

YOLO v3:檢測頭分成三個尺度,13×13、26×26、52×52(32、16、8 倍下採樣),每個位置 3 個 anchor × (4 + 1 + 80 類)。下採樣多的感受野大,負責大物體;下採樣少的負責小物體。backbone 換成用 residual 結構(3×3 與 1×1 卷積加 shortcut)疊深的 Darknet-53。

YOLO v4:架構和 v3 相同,各部分換成近年有效的技巧。Mosaic:四張圖隨機縮放、裁切、拼成一張,增加小目標(COCO 裡小目標佔 41.4%,卻只出現在 52.3% 的圖裡),也讓單張 GPU 不需要大 batch。CSP(cross stage partial)backbone CSPDarknet53、DropBlock 正則化、Mish activation、SPP + PAN neck。框 loss 用 CIoU,NMS 用 DIoU-NMS。COCO 43.5% AP、65.7% AP50,Tesla V100 上約 65 FPS。

Class imbalance:講義問「簡單的 one-stage 能不能和 two-stage 一樣準?」RetinaNet(2017)的假設是:輸的原因不是位置或特徵,而是類別不平衡。one-stage 每張圖要評估 104 到 105 個候選(SSD),幾乎都是容易分的背景;每個背景的 loss 很小,但數量太多,總和與梯度被它們主導。two-stage 靠兩道關卡擋掉:proposal 先把候選縮到 1 到 2 千個;分類時再固定前景與背景 1:3 的比例取樣,或做 online hard example mining(OHEM)。

CE(pt) = −log pt  FL(pt) = −(1 − pt)γ log pt (γ = 0 時就是 CE;balanced 版本再乘一個類別權重 α)

Focal loss:直接依「多容易」把 loss 打折,讓訓練偏向有意義的困難樣本。講義筆記引用的實驗:focal loss 比類別加權、OHEM、OHEM + 1:3 取樣都好,COCO AP 提升約 3 點;實作上把前景機率初始化成 0.01,避免一開始大量背景被判成前景讓 loss 爆掉。

one-stage vs two-stage 總結:two-stage 準、慢、流程複雜、各元件難一起最佳化;one-stage 快、簡單、端到端,早期輸在定位和不平衡,focal loss 與 v2 到 v4 的改進後差距已大幅縮小。兩者都還是 anchor + NMS 的框架。

DETR:把偵測重新定義成集合預測(set prediction)。CNN backbone 抽特徵 → Transformer encoder-decoder → 固定數量的 query 各輸出一個類別(含「沒有物體」)加一個框。訓練時用二分圖匹配(bipartite matching,以 Hungarian 演算法求解)把預測和真實標註一對一配對,再算 loss。好處:不用設計 anchor 規則,也不用 NMS,因為「一個物體只對應一個 query」已經寫進訓練目標。代價:收斂慢、要更多 epoch,初期小物體表現較弱。後續:Deformable DETR 讓每個 query 只看少數取樣點,加快收斂、改善小物體;FCOS 走 anchor-free 的逐像素回歸,用 centerness 分支壓低品質差的框;GLIP、Grounding DINO 用文字描述取代固定類別表(open-vocabulary detection)。講義的結論:架構之間的競爭往往不是誰準確率高,而是誰用更少的人工設計假設達到同樣效果。

SEC.05 / MISCONCEPTIONS

常見誤解

這個模組最常被講錯的幾句話。

mAP 很高,代表每個物體都找到了。mAP 是各類別 PR 曲線面積的平均,量的是「排序」好不好。recall 到不了 1、某一類很差、小物體全漏,都可能被其他類別平均掉。還要看 IoU 門檻是 0.5 還是 0.5 到 0.95。
one-stage 一定比 two-stage 不準。早期是這樣,原因主要是類別不平衡,不是架構先天不行。focal loss 之後的 RetinaNet,和 YOLO v4 這類改進,在速度與準確率的取捨上已經很有競爭力。
NMS 的 IoU 門檻越高越好,比較不會誤刪。門檻高會留下重複框,FP 變多、precision 下降;門檻低會把靠很近的真物體刪掉。沒有一個門檻適合所有場景,所以才有 soft-NMS、DIoU-NMS。
偵測一定要 anchor。anchor 是 Faster R-CNN 到 YOLO v2 以後的設計選擇,不是必要條件。YOLO v1 沒有 anchor;FCOS 逐像素回歸;DETR 用 set prediction,同時拿掉 anchor 和 NMS。