目標檢測中的NMS演算法(Non-max suppression)
阿新 • • 發佈:2021-02-15
非極大值抑制:即找到區域性極大值,而非最大值,並抑制其領域內的其餘值。
在目標檢測中,對於一個物體可能會預測出多個候選框,那麼這時就可以用極大值抑制對一些冗餘的框進行濾除。
一般來說,每一個預測框的輸出都會帶有該框的位置資訊以及置信度。
NMS演算法流程:
- 首先,對所有的框,通過一個置信度閾值將置信度低的框濾除。
- 接著,選出置信度最高的框,將其儲存進輸出列表中。
- 依次計算該框與其他剩餘的框的IOU值。然後通過一個IOU閾值將和這個置信度最高的框擁有較大IOU的框(即和這個框相近的框)去除。也就是去掉冗餘的框咯。
- 繼續對剩餘的框進行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非極大值抑制