?非極大值抑制:即找到區域極大值,而非最大值,并抑制其領域內的其余值,
在目標檢測中,對于一個物體可能會預測出多個候選框,那么這時就可以用極大值抑制對一些冗余的框進行濾除,
?一般來說,每一個預測框的輸出都會帶有該框的位置資訊以及置信度,
?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非極大值抑制
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/259849.html
標籤:AI
上一篇:網路結構——BatchNorm
下一篇:前端面試的資料結構與演算法
