在得到目標檢測的候選框後,需要對其及進行後處理操作,用來去掉冗餘的候選框,得到最具代表性的候選框結果,從而加快目標檢測的效率,通常採用的方法是非極大值抑制(nms)的方法。
nms的演算法過程。
首先需要對候選框的同乙個類別的概率做排序:a < b < c < d < e < f
1.首先標記出現的最大概率矩形框f。
2.從最大概率矩形框f開始,分別判斷a~e與f的重疊度iou(兩框的交並比)是否大於某個設定的閾值,假設b、d與f的重疊度超過閾值,那麼就扔掉b、d;
3.從剩下的矩形框a、c、e中,選擇概率最大的e,標記為要保留下來的,然後判斷e與a、c的重疊度,扔掉重疊度超過設定閾值的矩形框。
就這樣一直重複下去,直到剩下的矩形框沒有了,標記完所有要保留下來的矩形框。
# python3
import numpy as np
def py_nms(dets, thresh):
"""pure python nms baseline."""
#x1、y1、x2、y2、以及score賦值
x1 = dets[:, 0]
y1 = dets[:, 1]
x2 = dets[:, 2]
y2 = dets[:, 3]
scores = dets[:, 4]
#每乙個候選框的面積
areas = (x2 - x1 + 1) * (y2 - y1 + 1)
#order是按照score降序排序的
order = scores.argsort()[::-1]
keep =
while order.size > 0:
i = order[0]
#計算當前概率最大矩形框與其他矩形框的相交框的座標,會用到numpy的broadcast機制,得到的是向量
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或h算出來會是負數,用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)
#找到重疊度不高於閾值的矩形框索引
inds = np.where(ovr <= thresh)[0]
#將order序列更新,由於前面得到的矩形框索引要比矩形框在原order序列中的索引小1,所以要把這個1加回來
order = order[inds + 1]
return keep
# test
if __name__ == "__main__":
dets = np.array([[30, 20, 230, 200, 1],
[50, 50, 260, 220, 0.9],
[210, 30, 420, 5, 0.8],
[430, 280, 460, 360, 0.7]])
thresh = 0.35
keep_dets = py_nms(dets, thresh)
print(keep_dets)
print(dets[keep_dets])
非極大值抑制(NMS)
非極大值抑制 nms 非極大值抑制顧名思義就是抑制不是極大值的元素,搜尋區域性的極大值。這個區域性代表的是乙個鄰域,鄰域有兩個引數可變,一是鄰域的維數,二是鄰域的大小。這裡不討論通用的nms演算法,而是用於在目標檢測中用於提取分數最高的視窗的。例如在行人檢測中,滑動視窗經提取特徵,經分類器分類識別後...
NMS非極大值抑制
非極大值抑制演算法 non maximum suppression for object detection in python 非極大值抑制演算法 nms 非極大值抑制 矩形框融合 nms 卷積網路改進實現 筆記 人臉檢測視窗選擇辦法 nms convnet 開源 如何用soft nms實現目標檢...
非極大值抑制(NMS)
非極大值抑制 nms 非極大值抑制顧名思義就是抑制不是極大值的元素,搜尋區域性的極大值。這個區域性代表的是乙個鄰域,鄰域有兩個引數可變,一是鄰域的維數,二是鄰域的大小。這裡不討論通用的nms演算法,而是用於在目標檢測中用於提取分數最高的視窗的。例如在行人檢測中,滑動視窗經提取特徵,經分類器分類識別後...