在昨天的模型推論中我們成功讓 YOLOv8 在衛星資料集中記錄到了訓練目標物,但從推論圖來看(可以前往 Day 10)會發現一個事情,同一張影像出現兩個重疊的預測框,分數分別為 0.59 、 0.38。
至於為甚麼會出現兩個預測框,我們又該透過甚麼演算法將其過濾為單一的精準標註?
今天我們講 NMS (Non-Maximum Suppression 非極大值抑制)。
YOLO 採用 無錨框 (Anchor-Free) 與網格化 (Grid-based) 預測機制。當一張影像被切分為多個特徵網格時,由於目標物的架構很大,袍邊的物件都會偵測到跑道特徵,所以才同時輸出包含邊界框座標與置信度分數的候選框,如果直接顯示神經網路的原始輸出,畫面將會有上百個多於的預測框,因此推論必須經過以下兩個步驟:
[ 模型原始輸出 ] -> 產生數百個網格候選框
│
▼ (1.剔除低置信度廢框)
[ 置信度門檻 ]
│
▼ (2.抑制高度重疊的重複預測框)
[ NMS 演算法 ]
│
▼
[ 最終結果 ] -> 保留 1 個最精準的目標物框
NMS 的核心目標為:
在局部區域內,只保留置信度最高且定位最準確的框,然後刪除其餘重複預測的冗餘框。
設定置信度門檻 $T_{conf}$(例如 $0.25$),直接拋棄所有 $Score < T_{conf}$ 的候選框。
將剩下的所有候選框依照置信度分數從高到低進行排序,建立候選佇列 $B = [B_1, B_2, ..., B_n]$。
從佇列中取出當前分數最高的框 $B_{max}$(例如分數 $0.59$ 的框),將其加入最終保留清單,並從佇列中移除。
計算 $B_{max}$ 與佇列中剩餘每個候選框 $B_i$(例如分數 $0.38$ 的框)的 IoU(Intersection over Union,交疊率):
若 $\text{IoU} > T_{iou}$(例如門檻設為 $0.45$),代表 $B_i$ 與最高分框嚴重重疊,兩者在預測同一個機場,則直接將 $B_i$ 強制刪除。
重複步驟 3 與 4,直到候選佇列為空。
在處理 Sentinel-2 這種較大範圍、低解析度的影像時,conf 和 iou 兩個參數對於最終的推論有很大的影響。
results = model.predict(
source=test_source,
conf=0.25, # 置信度門檻
iou=0.45 # NMS 重疊抑制門檻
)
誤報率較低
容易漏抓特徵不明顯、雲層遮擋和解析度較低的目標物
召回率高,不容易漏抓。
像昨天的混淆矩陣一樣,把其他可能帶有目標物特徵的物件錯判為目標物。
NMS 抑制力不足,這就是導致昨天推論圖出現兩個預測框的原因,因為兩個個框的 IoU 可能低於當時的門檻,導致第二個預測框跳過 NMS 的刪除。
抑制力過強,如果影像中同時存在距離極近的目標物,較低分的可能會被當成重疊框而被誤刪。
標準的 NMS 採用硬性剔除的方法,只要 $\text{IoU} > T_{iou}$,那個候選框就會被直接刪除。
但是在一些衛星影像中遇到相鄰的目標物,傳統的 NMS 會直接誤刪。
為了解決這個問題,有人提出了 Soft-NMS 的方法,他不會直接刪除,他會根據 IoU 的重疊程度 衰減 (Decay) 該候選框的置信度分數。
這種方法可以有效抑制冗餘的重疊預測,也能確保鄰近的目標物不會被誤刪。
今天我們講了推論時消除重疊框的機制,NMS,也理解了昨天推論成果圖中雙重框出現的原因。
明天我們將優化我們的推論與視覺化模組,嘗試調整 conf 與 iou 門檻,將雙重框完美壓制為單一精準標註框,並將辨識結果匯出,那我們明天見。