非極大抑制nms
07-18
非極大抑制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 = [] # 用來保存最後留下來的bboxwhile 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:數學 |