Non Maximum Suppression (NMS)

Photo by Danielle Barnes on Unsplash
Photo by Danielle Barnes on Unsplash
Non maximum suppression 是一個在物件偵測中使用的技術,用來過濾物件偵測演算法產生出的 bounding boxes。如果不使用 NMS 的話,我們將會得到一張有密密麻麻的框框的圖片。

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。

NMS filters out redundant and irrelevant bounding boxes.
NMS filters out redundant and irrelevant bounding boxes.

Intersection Over Union (IoU)

在介紹 NMS 演算法之前,我們先來了解什麼是 intersection over union (IoU)。IoU 是用來衡量兩個 bounding boxes 重疊率的 metric,其公式如下。從式子中,我們可以得知,當兩個 bounding boxes 重疊的區域越大時,其 IoU 會越大,反之,則越小。

Intersection over Union, IoU.
Intersection over Union, IoU.

NMS 演算法

在開始深入演算法之前,我們必須要先了解 NMS 期待的輸入值格式。物件偵測演算法產生出的 bounding boxes 可能會包含六個值。

  • 四個值表示一個 bounding box 的範圍:
    • 可能會是中心點 (x, y)、寬、和高。
    • 也可能會是左上角的點 (x1, y1) 和右下角的點 (x2, y2)。
  • 一個 confidence score 表示該物件在 box 的可能性。越高表示包含該物件的可能性很高,反之則表示可能性很低。
  • 一個 class ID 表示包含的物件的 ID。當物件偵測演算法支援,可以在一個圖片中偵測多個物件時,則它會產生一個 ID 來表示偵測到的物件的 class ID。

現在我們可以來了解 NMS 演算法。

NMS Algorithm, source <a href=
NMS Algorithm, source A Comprehensive Review of YOLO Architectures in Computer Vision: From YOLOv1 to YOLOv8 and YOLO-NAS.

演算法看起有點複雜,但其實不會。演算法大致如下。

  • 行 1:F 將會包含最後 NMS 挑選出來的 bounding boxes。所以,一開始為空。
  • 行 2:先將小於 confidence threshold T 的 bounding boxes 剔除掉。因為太低的 confidence score 的 bounding boxes 非常有可能沒有偵測到物件,也就是不相關的 bounding boxes,所以我們根本不考慮這些 boxes。
  • 行 5-7:從 B 中挑選一個 confidence score 最高的 box b,將 b 加入到 F,並將 bB 中移除。
  • 行 8-13:對每一個在 B 的 box r,計算 br 的 IoU。如果 IoU 大於等於 IoU threshold τ,則將 rB 中移除。因為當 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 原始碼

我們可以利用 confiou 這兩個參數,來調整 YOLOv8 的 confidence score threshold 和 IoU threshold。這兩個值都是介於 0 到 1 的浮點數。將 conf 設定的越高時,過濾掉的 bounding boxes 越多,因為小於等於 conf 的 bounding boxes 都會被過濾掉。然而,iou 則是相反。將 iou 設定的越低時,過濾掉的 bounding boxes 越多,因為大於等於 iou 的 bounding boxes 都會被過濾掉。以上述文章裡訓練好的企鵝寶寶偵測模型為例子,以下是帶有 confiou 參數的 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,會對預測的結果帶來什麼樣的影響。

NMS with different confidence score thresholds.
NMS with different confidence score thresholds.

conf 從預設的 0.25 改為 0.05 以保留更多的 bounding boxes。然後,我們來比較不同的 iou,會對預測的結果帶來什麼樣的影響。

NMS with different IoU thresholds.
NMS with different IoU thresholds.

我們可以發現,其實 YOLOv8 預設的 confiou 是相當適當的。

結語

我們不太需要自己實作 NMS。YOLOv8 已經有實作 NMS,而且我們可以很容易地設定 confident score 和 IoU thresholds。此外,TorchVision 也有提供 NMS 的函式。不過,了解 NMS 讓我們可以更加了解如何調整這些 thresholds。

參考

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

You May Also Like