一、概念
在目標檢測中,得到多個候選框及其置信度得分。非極大值抑制演算法(nms)對多個候選框,去除重合率大的冗餘候選框,得到最具代表性的結果,以加快目標檢測的效率。
二、例項
以下圖人臉檢測為例,目標:消除重合率大且多餘的候選框,保留某個區域的乙個最優的候選框。
非極大值抑制演算法(nms)抑制冗餘的框, 抑制的過程是乙個迭代-遍歷-消除的過程。
1)將所有框的得分排序,選中最高分及其對應的框
a) 假設圖中有a:0.75、b:0.98 、c:0.83、d:0.67、e:0.81
b) 將置信度公升序排序為d:0.67、a:0.75、e:0.81、c:0.83、b:0.98
c) 選中得分最高的b:0.98
2)遍歷其餘的框,如果和當前最高分框的重疊面積(iou)大於一定閾值,我們就將框刪除。
a)由b:0.98對其餘a、c、d、e框計算iou,b與a、c的iou>閾值,刪除a、c框。
b)第一輪得到b:0.98、d:0.67、e:0.81
3)從未處理的d、e框中繼續選乙個得分最高的,重複上述過程。
a) 刪除d框,保留e
b) 最後保留b、e框
三、python**
#候選框boxes為5列,分別是[x1 y1 x2 y2 score],score為置信度得分
#threshold: iou閾值
def py_nms(dets, thresh):
#取出候選框左上角和右下角座標以及置信度得分
x1 = dets[:, 0]
y1 = dets[:, 1]
x2 = dets[:, 2]
y2 = dets[:, 3]
scores = dets[:, 4]
#計算每乙個框的面積
areas = (x2 - x1 + 1) * (y2 - y1 + 1)
#按照置信度公升序排列
order = scores.argsort()[::-1]
keep =
#迴圈直至所有框處理完成
while order.size > 0:
i = order[0]
#計算當前置信度最大矩形框與其他矩形框的重疊面積
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:]])
w = np.maximum(0.0, xx2 - xx1 + 1)
h = np.maximum(0.0, yy2 - yy1 + 1)
inter = w * h
#計算iou
ovr = inter / (areas[i] + areas[order[1:]] - inter)
#保留所有重疊面積小於閾值的框
inds = np.where(ovr <= threshold)[0]
order = order[inds + 1]
非極大值抑制(NMS)
非極大值抑制 nms 非極大值抑制顧名思義就是抑制不是極大值的元素,搜尋區域性的極大值。這個區域性代表的是乙個鄰域,鄰域有兩個引數可變,一是鄰域的維數,二是鄰域的大小。這裡不討論通用的nms演算法,而是用於在目標檢測中用於提取分數最高的視窗的。例如在行人檢測中,滑動視窗經提取特徵,經分類器分類識別後...
NMS非極大值抑制
非極大值抑制演算法 non maximum suppression for object detection in python 非極大值抑制演算法 nms 非極大值抑制 矩形框融合 nms 卷積網路改進實現 筆記 人臉檢測視窗選擇辦法 nms convnet 開源 如何用soft nms實現目標檢...
非極大值抑制(NMS)
非極大值抑制 nms 非極大值抑制顧名思義就是抑制不是極大值的元素,搜尋區域性的極大值。這個區域性代表的是乙個鄰域,鄰域有兩個引數可變,一是鄰域的維數,二是鄰域的大小。這裡不討論通用的nms演算法,而是用於在目標檢測中用於提取分數最高的視窗的。例如在行人檢測中,滑動視窗經提取特徵,經分類器分類識別後...