NMS 非極大值抑制演算法的理解

2021-08-29 01:13:06 字數 1909 閱讀 6740

一、概念

在目標檢測中,得到多個候選框及其置信度得分。非極大值抑制演算法(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演算法,而是用於在目標檢測中用於提取分數最高的視窗的。例如在行人檢測中,滑動視窗經提取特徵,經分類器分類識別後...