標籤:

非極大抑制nms

非極大抑制nms

來自專欄 yk目標檢測學習之路

非極大抑制在目標檢測中遵守的規則:

1.無條件保留置信度最高的框;

2.刪除與保留框IOU大於閾值的候選框;

def py_cpu_nms(dets, thresh):

#非極大抑制演算法

"""Pure Python NMS baseline."""

# dets:N*M,N是bbox的個數,M的前4位是對應的(x1,y1,x2,y2),第5位是對應的分數

# thresh:0.3,0.5....

if len(dets)==0:

return dets

else:

x1 = dets[:, 1]

y1 = dets[:, 2]

x2 = dets[:, 3]

y2 = dets[:, 4]

scores = dets[:, 5]

areas = (x2 - x1 + 1) * (y2 - y1 + 1) # 求每個bbox的面積

order = scores.argsort()[::-1] # 對分數進行倒排序

keep = [] # 用來保存最後留下來的bbox

while order.size > 0:

i = order[0] # 無條件保留每次迭代中置信度最高的bbox

#print i

keep.append(dets[i])

# 計算置信度最高的bbox和其他剩下bbox之間的交叉區域

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:]])

# 計算置信度高的bbox和其他剩下bbox之間交叉區域的面積

w = np.maximum(0.0, xx2 - xx1 + 1)

h = np.maximum(0.0, yy2 - yy1 + 1)

inter = w * h

# 求交叉區域的面積佔兩者(置信度高的bbox和其他bbox)面積和的必烈

ovr = inter / (areas[i] + areas[order[1:]] - inter)

# 保留ovr小於thresh的bbox,進入下一次迭代。

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

# 因為ovr中的索引不包括order[0]所以要向後移動一位

order = order[inds + 1]

return keep


推薦閱讀:

如何學好A Level進階數學?
理解離散時不變系統的含義
關於歐拉函數及其一些性質的美妙證明(1)
六年級奧數之趣味數學9

TAG:數學 |