nms演算法(非極大值抑制)是目標檢測演算法中經典的後處理步驟,其本質是搜尋區域性最大值,抑制非極大值元素。主要利用目標檢測框以及對應的置信度分數,設定一定的閾值來刪除重疊較大的邊界框。
其演算法流程如下:
根據置信度得分進行排序
選擇置信度最高的目標檢測框新增到輸出列表中,將其從檢測框列表中刪除
計算該檢測框與剩餘候選檢測框的iou
刪除iou大於閾值的檢測框
重複上述4步,直至檢測框列表為空
其演算法實現如下
import numpy as np
defnms
(dets, thresh)
:# x1, y1, x2, y2, score
x1, y1, x2, y2, scores = dets[:,
0], dets[:,
1], dets[:,
2], dets[:,
3], dets[:,
4]areas =
(x2 - x1 +1)
*(y2 - y1 +1)
# 各個方框的面積
order = scores.argsort()[
::-1
]# 按置信度排序後的index, 作為候選集
keep =
# 儲存篩選出來的方框的index
while order.size >0:
i = order[0]
# 當前置信度最大的方框
xx1 = np.maximum(x1[i]
, x1[order[1:
]]) xx2 = np.minimum(x2[i]
, x2[order[1:
]]) yy1 = np.maximum(y1[i]
, y1[order[1:
]]) yy2 = np.minimum(y2[i]
, y2[order[1:
]]) w = np.maximum(
0.0,
(xx2 - xx1 +1)
) h = np.maximum(
0.0,
(yy2 - yy1 +1)
) inter = w * h # 當前置信度最大的框和其他所有框的相交面積
overlap = inter /
(areas[i]
+ areas[order[1:
]]- inter)
inds = np.where(overlap <= thresh)[0
]# 交並比小於thresh的仍然保留在候選集裡, 大的過濾掉
order = order[inds +1]
# inds + 1對應原來order中overlap小於thresh的項
return keep
if __name__ ==
'__main__'
: detections =[[
10,20,
100,
100,
0.9],[
20,10,
110,
100,
0.88],
[20,20
,110
,110
,0.86],
[40,50
,200
,200
,0.95],
[45,52
,198
,202
,0.87]]
detections = np.array(detections)
keeps = nms(detections,
0.5)
print
(detections[keeps]
)
實現NMS演算法
python3 import numpy as np defpy nms dets,thresh pure python nms baseline.x1 y1 x2 y2 以及score賦值 x1 dets 0 y1 dets 1 x2 dets 2 y2 dets 3 scores dets 4 ...
NMS實現方法
想要做nms的優化所以 了解一下nms 原理不說了太簡單直接講 usr bin env python3 coding utf 8 created on mon may 7 21 45 37 2018 author lps import numpy as np boxes np.array 100,1...
C 實現非極大抑制(NMS)演算法
1 將同一類的檢測結果按照得分排序。2 計算得分最高的檢測框與其他檢測框的重疊度 iou 刪除大於設定的重疊度閾值的檢測框。3 對於小於重疊度閾值的檢測框重複1 2的操作,直到遍歷完所有的檢測框 1.2 演算法實現 只有一類 std vector int cpu nms eigen matrix f...