Non maximum suppression 是一個在物件偵測中使用的技術,用來過濾物件偵測演算法產生出的 bounding boxes。如果不使用 NMS 的話,我們將會得到一張有密密麻麻的框框的圖片。
Non Maximum Suppression (NMS)
Non maximum suppression (NMS) 是一個在物件偵測中的 post-processing 任務中使用的技術。一般來說,物件偵測演算法會對一個物件會產生出很多個 bounding boxes。然而,對同一個物件,我們只需要一個 bounding box。因此,我們需要使用 NMS 來幫我們過濾重複和不相關的 bounding boxes,只保留一個最佳的 bounding box。
Intersection Over Union (IoU)
在介紹 NMS 演算法之前,我們先來了解什麼是 intersection over union (IoU)。IoU 是用來衡量兩個 bounding boxes 重疊率的 metric,其公式如下。從式子中,我們可以得知,當兩個 bounding boxes 重疊的區域越大時,其 IoU 會越大,反之,則越小。
NMS 演算法
在開始深入演算法之前,我們必須要先了解 NMS 期待的輸入值格式。物件偵測演算法產生出的 bounding boxes 可能會包含六個值。
- 四個值表示一個 bounding box 的範圍:
- 可能會是中心點 (x, y)、寬、和高。
- 也可能會是左上角的點 (x1, y1) 和右下角的點 (x2, y2)。
- 一個 confidence score 表示該物件在 box 的可能性。越高表示包含該物件的可能性很高,反之則表示可能性很低。
- 一個 class ID 表示包含的物件的 ID。當物件偵測演算法支援,可以在一個圖片中偵測多個物件時,則它會產生一個 ID 來表示偵測到的物件的 class ID。
現在我們可以來了解 NMS 演算法。
演算法看起有點複雜,但其實不會。演算法大致如下。
- 行 1:
F
將會包含最後 NMS 挑選出來的 bounding boxes。所以,一開始為空。 - 行 2:先將小於 confidence threshold
T
的 bounding boxes 剔除掉。因為太低的 confidence score 的 bounding boxes 非常有可能沒有偵測到物件,也就是不相關的 bounding boxes,所以我們根本不考慮這些 boxes。 - 行 5-7:從
B
中挑選一個 confidence score 最高的 boxb
,將b
加入到F
,並將b
從B
中移除。 - 行 8-13:對每一個在
B
的 boxr
,計算b
和r
的 IoU。如果 IoU 大於等於 IoU thresholdτ
,則將r
從B
中移除。因為當 IoU 太高時,表示這兩個 boxes 重疊的範圍太大,所以我們只需要其中一個。那當然要選擇 confidence score 高的b
。 - 行 4-14:一直重複這些動作,直到
B
中的 boxes 都被移除。最終,過濾出來的 boxes 則會在F
裡。
YOLOv8 範例
YOLOv8 是一個很熱門的物件偵測模型。如果你不熟悉 YOLOv8 的話,可以先參考以下的文章。
YOLOv8 預設的 confidence score threshold 是 0.25,而預設的 IoU threshold 是 0.45,請參考 YOLOv8 的 NMS 原始碼。
我們可以利用 conf
和 iou
這兩個參數,來調整 YOLOv8 的 confidence score threshold 和 IoU threshold。這兩個值都是介於 0 到 1 的浮點數。將 conf
設定的越高時,過濾掉的 bounding boxes 越多,因為小於等於 conf
的 bounding boxes 都會被過濾掉。然而,iou
則是相反。將 iou
設定的越低時,過濾掉的 bounding boxes 越多,因為大於等於 iou
的 bounding boxes 都會被過濾掉。以上述文章裡訓練好的企鵝寶寶偵測模型為例子,以下是帶有 conf
和 iou
參數的 YOLOv8 指令。
YOLOv8Example % .venv/bin/yolo detect mode=predict model=./runs/train/weights/best.pt source=image.jpg project=runs name=predict show_labels=False conf=0.05 iou=0.5
將 iou
從預設的 0.45 改為 0.7 以保留更多的 bounding boxes。然後,我們來比較不同的 conf
,會對預測的結果帶來什麼樣的影響。
將 conf
從預設的 0.25 改為 0.05 以保留更多的 bounding boxes。然後,我們來比較不同的 iou
,會對預測的結果帶來什麼樣的影響。
我們可以發現,其實 YOLOv8 預設的 conf
和 iou
是相當適當的。
結語
我們不太需要自己實作 NMS。YOLOv8 已經有實作 NMS,而且我們可以很容易地設定 confident score 和 IoU thresholds。此外,TorchVision 也有提供 NMS 的函式。不過,了解 NMS 讓我們可以更加了解如何調整這些 thresholds。
參考
- Non Maximum Suppression: Theory and Implementation in PyTorch, LearnOpenCV.
- Jaun R. Terven and Diana M. Cordova-Esparza, A Comprehensive Review of YOLO Architectures in Computer Vision: From YOLOv1 to YOLOv8 and YOLO-NAS, Machine Learning and Knowledge Extraction.