NMS演算法實現

2021-10-24 06:10:25 字數 1899 閱讀 1193

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...