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