終于把目標檢測中的 NMS 搞懂了!
大家好,我是小寒
今天給大家分享目標檢測中的一個關(guān)鍵知識點,NMS
目標檢測中的非最大抑制(Non-Maximum Suppression, NMS)是一個關(guān)鍵步驟,用于去除多余的候選框(bounding boxes),從而精簡檢測結(jié)果。它主要用于確保每個目標只被檢測一次,避免多個重疊的候選框表示同一個目標。
目標檢測簡介
目標檢測(Object Detection)是一種計算機視覺技術(shù),其主要任務(wù)是識別圖像或視頻中的目標,并確定每個目標的位置和類別。
與圖像分類不同,目標檢測不僅需要識別圖像中包含的物體,還需要定位這些物體在圖像中的具體位置(通常用邊界框表示)。
圖片
- 在第一幅圖中,我們只是對圖片中的物體進行 “分類”。這是一個分類問題
- 在第二幅圖中,我們只是在圖像中“定位”物體。這是一個定位問題
- 在第三幅圖中,我們對物體進行 “分類和定位”。這是一個目標檢測問題
目標檢測任務(wù)有多種算法,這些算法在過去十年中不斷發(fā)展。
為了進一步提高性能并捕捉不同形狀和大小的物體,算法會預測多個不同大小和長寬比的邊界框。
圖片
但是在所有邊界框中,如何選擇最合適、最準確的邊界框?這就是 NMS 發(fā)揮作用的地方。
什么是非最大抑制?
圖片中的物體可能大小和形狀各異,為了完美捕捉每個物體,目標檢測算法會創(chuàng)建多個邊界框(左圖)。理想情況下,對于圖片中的每個物體,我們都必須有一個邊界框,類似于右圖。
圖片
為了從多個預測的邊界框中選擇最佳邊界框,這些目標檢測算法使用非最大抑制。
該技術(shù)用于“抑制”可能性較小的邊界框并僅保留最佳邊界框。
非最大抑制如何起作用?
非最大抑制的目的是為對象選擇最佳邊界框,并拒絕或 “抑制” 所有其他邊界框。
該算法迭代地選擇最佳邊界框,比較重疊,并刪除冗余框,直到收斂。
NMS 考慮了兩件事
- 客觀性得分由模型給出
- 邊界框的重疊或 IOU
你可以在下圖中看到,除了邊界框之外,模型還會返回客觀性分數(shù)。
該分數(shù)表示模型對目標對象存在于此邊界框中的確定程度。
圖片
你可以看到所有邊界框都有物體,但只有綠色邊界框是檢測物體的最佳邊界框。
現(xiàn)在我們?nèi)绾螖[脫其他邊界框?
非最大抑制將首先選擇客觀性得分最高的邊界框。然后刪除所有其他重疊度高的邊界框。
所以在上面的圖片中,
- 我們將為狗選擇綠色邊界框(因為它的客觀性得分最高,為 98%)
- 并移除狗的黃色和紅色框(因為它們與綠色框重疊較高)
其余的框也采用相同的過程,這個過程不斷迭代,直到不再減少框。
最后,我們將得到以下結(jié)果。
圖片
這就是 NMS 的工作原理。
實現(xiàn)非最大抑制
現(xiàn)在你應(yīng)該對非最大抑制有了很好的理解。讓我們將非最大抑制的過程分解為幾個步驟。
- 選擇客觀性得分最高的框
- 然后,比較此框與其他框的重疊(交集與并集)
- 刪除重疊(交集與并集)大于 50% 的邊界框
- 然后,轉(zhuǎn)到下一個最高的客觀性得分
- 最后重復步驟2-4
圖片
假設(shè)我們一個人和狗的圖像,有六個邊界框,每個邊界框都有客觀性分數(shù)。
圖片
對于此圖像,我們將使用 torchvision 庫中的非最大抑制(NMS 算法)函數(shù) nms() 。
此函數(shù)需要三個參數(shù)-
- Boxes:x1、y1、x2、y2 格式的邊界框坐標
- 分數(shù):每個邊界框的客觀性分數(shù)
- iou_threshold:重疊(或 IOU)的閾值
這里,由于上述坐標采用 x1、y1、寬度、高度格式,我們將按以下方式確定 x2、y2
x2 = x1 + 寬度
y2 = y1 + 高度
import torch
from torchvision.ops import nms
boxes = torch.tensor([[190,380,(190+300),(380+150)],
[300,420,(300+150),(420+210)],
[320,360,(320+200),(360+230)],
[390,50,(390+300),(50+330)],
[490,45,(490+200),(45+500)],
[480,130,(480+150),(130+400)]], dtype=torch.float32)
scores = torch.tensor([[0.90],[0.98],[0.82], [0.87],[0.98],[0.82]], dtype=torch.float32)
nms(boxes = boxes, scores = scores, iou_threshold=0.2)
#tensor([1, 4])
對于我們的示例,這個 python 函數(shù)返回了邊界框 1 和 4。