1. 程式人生 > 其它 >目標檢測中的NMS演算法(Non-max suppression)

目標檢測中的NMS演算法(Non-max suppression)

技術標籤:目標檢測深度學習影象識別

非極大值抑制:即找到區域性極大值,而非最大值,並抑制其領域內的其餘值。
在目標檢測中,對於一個物體可能會預測出多個候選框,那麼這時就可以用極大值抑制對一些冗餘的框進行濾除。

 一般來說,每一個預測框的輸出都會帶有該框的位置資訊以及置信度。

NMS演算法流程:

  1. 首先,對所有的框,通過一個置信度閾值將置信度低的框濾除。
  2. 接著,選出置信度最高的框,將其儲存進輸出列表中。
  3. 依次計算該框與其他剩餘的框的IOU值。然後通過一個IOU閾值將和這個置信度最高的框擁有較大IOU的框(即和這個框相近的框)去除。也就是去掉冗餘的框咯。
  4. 繼續對剩餘的框進行2,3操作,直到遍歷完畢。

Example:

Output:
在這裡插入圖片描述
NMS Iteration 1:
在這裡插入圖片描述
NMS Iteration 2:
在這裡插入圖片描述

Code:
注:這裡的NMS是單類別的!多類別則只需要在外加一個for迴圈遍歷每個種類即可。

def py_cpu_nms(dets, thresh): 
"""Pure Python NMS baseline.""" 
    #dets某個類的框,x1、y1、x2、y2、以及置信度score
    #eg:dets為[[x1,y1,x2,y2,score],[x1,y1,y2,score]……]]
    # thresh是IoU的閾值     
x1 = dets[:, 0] y1 = dets[:, 1] x2 = dets[:, 2] y2 = dets[:, 3] scores = dets[:, 4] #每一個檢測框的面積 areas = (x2 - x1 + 1) * (y2 - y1 + 1) #按照score置信度降序排序 order = scores.argsort()[::-1] keep = [] #保留的結果框集合 while order.size > 0: i = order[0] keep.
append(i) #保留該類剩餘box中得分最高的一個 #得到相交區域,左上及右下 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:]]) #計算相交的面積,不重疊時面積為0 w = np.maximum(0.0, xx2 - xx1 + 1) h = np.maximum(0.0, yy2 - yy1 + 1) inter = w * h #計算IoU:重疊面積 /(面積1+面積2-重疊面積) ovr = inter / (areas[i] + areas[order[1:]] - inter) #保留IoU小於閾值的box inds = np.where(ovr <= thresh)[0] order = order[inds + 1] #因為ovr陣列的長度比order陣列少一個,所以這裡要將所有下標後移一位 return keep

參考連結:
[1] 目標檢測:NMS——非極大值抑制
[2] 非極大值抑制(non-maximum suppression)的理解
[3] 影象處理中常用的非極大值抑制是什麼意思?
[4] 目標檢測之NMS非極大值抑制