實現NMS演算法

2021-10-09 17:26:10 字數 1722 閱讀 7722

# 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]# print(scores)

#每乙個候選框的面積

areas =

(x2 - x1 )

*(y2 - y1 )

# print(areas)

#order是按照score降序排序的

# print(scores.argsort())

order = scores.argsort()[

::-1

] keep =

while order.size >0:

i = order[0]

# 找到得分最大的框

#計算當前概率最大矩形框與其他矩形框的相交框的座標,會用到numpy的broadcast機制,得到的是向量

xx1 = np.maximum(x1[i]

, x1[order[1:

]]) yy1 = np.maximum(y1[i]

, y1[order[1:

]]) xx2 = np.minimum(x2[i]

, x2[order[1:

]]) yy2 = np.minimum(y2[i]

, y2[order[1:

]])#計算相交框的面積,注意矩形框不相交時w或h算出來會是負數,用0代替

w = np.maximum(

0.0, xx2 - xx1 )

h = np.maximum(

0.0, yy2 - yy1 )

inter = w * h

#計算重疊度iou:重疊面積/(面積1+面積2-重疊面積)

ovr = inter /

(areas[i]

+ areas[order[1:

]]- inter)

# print(ovr)

#找到重疊度不高於閾值的矩形框索引

inds = np.where(ovr <= thresh)[0

] order = order[inds +1]

# 當前inds分數最高,繼續通過iou尋找

print

(order)

return keep

# test

if __name__ ==

"__main__"

: dets = np.array([[

30,20,

230,

200,1]

,[50,

50,260,

220,

0.9],[

210,30,

420,5,

0.8],[

430,

280,

460,

360,

0.7]])

thresh =

0.35

keep_dets = py_nms(dets, thresh)

NMS演算法實現

nms演算法 非極大值抑制 是目標檢測演算法中經典的後處理步驟,其本質是搜尋區域性最大值,抑制非極大值元素。主要利用目標檢測框以及對應的置信度分數,設定一定的閾值來刪除重疊較大的邊界框。其演算法流程如下 根據置信度得分進行排序 選擇置信度最高的目標檢測框新增到輸出列表中,將其從檢測框列表中刪除 計算...

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