# 首先資料賦值和計算對應矩形框的面積
# arr的資料格式是arr = [[ xmin, ymin, xmax, ymax,scores]....]
x1 = arr[:, 0]
y1 = arr[:, 1]
x2 = arr[:, 2]
y2 = arr[:, 3]
score = arr[:, 4]
# 所有矩形框的面積
areas = (x2 - x1 + 1) * (y2 - y1 + 1)
# 取出分數從大到小排列的索引。.argsort()是從小到大排列,[::-1]是列表頭和尾顛倒一下。
order = score.argsort()[::-1]
# 上面這兩句比如分數score = [0.72 0.8 0.92 0.72 0.81 0.9 ]
# 對應的索引order = [2, 5, 4, 1, 3, 0]記住是取出索引,scores列表沒變。
# 這邊的keep用於存放,nms後剩餘的方框
keep =
# order會剔除遍歷過的方框,和合併過的方框
while order.size > 0:
# 取出第乙個方框進行和其他方框比對,看有沒有可以合併的,就是取最大score的索引
i = order[0]
# 因為我們這邊分數已經按從大到小排列了。
# 所以如果有合併存在,也是保留分數最高的這個,也就是我們現在那個這個
# keep保留的是索引值,不是具體的分數。
# 計算交集的左上角和右下角
# 這裡要注意,比如x1[i]這個方框的左上角x和所有其他的方框的左上角x的
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:]])
# 這邊要注意,如果兩個方框相交,xx2-xx1和yy2-yy1是正的。
# 如果兩個方框不相交,xx2-xx1和yy2-yy1是負的,我們把不相交的w和h設為0.
w = np.maximum(0, xx2-xx1+1)
h = np.maximum(0, yy2-yy1+1)
# 計算重疊面積就是上面說的交集面積。不相交因為w和h都是0,所以不相交面積為0
inter = w * h
# 這個就是iou公式(交並比)。
# 得出來的ious是乙個列表,裡面擁有當前方框和其他所有方框的iou結果。
ious = inter / (areas[i] + areas[order[1:]] - inter)
# 接下來是合併重疊度最大的方框,也就是合併ious中值大於thresh的方框
# 我們合併的操作就是把他們剔除,因為我們合併這些方框只保留下分數最高的。
# 我們經過排序當前我們操作的方框就是分數最高的,所以我們剔除其他和當前重疊度最高的方框
# 這裡np.where(ious<=thresh)[0]是乙個固定寫法。
index = np.where(ious <= thresh)[0]
# 把留下來框在進行nms操作
# 這邊留下的框是去除當前操作的框,和當前操作的框重疊度大於thresh的框
# 每一次都會先去除當前操作框(n個框計算n-1個iou值),所以索引的列表就會向前移動移位,要還原就+1,向後移動一位
非極大值抑制(NMS)
非極大值抑制 nms 非極大值抑制顧名思義就是抑制不是極大值的元素,搜尋區域性的極大值。這個區域性代表的是乙個鄰域,鄰域有兩個引數可變,一是鄰域的維數,二是鄰域的大小。這裡不討論通用的nms演算法,而是用於在目標檢測中用於提取分數最高的視窗的。例如在行人檢測中,滑動視窗經提取特徵,經分類器分類識別後...
NMS非極大值抑制
非極大值抑制演算法 non maximum suppression for object detection in python 非極大值抑制演算法 nms 非極大值抑制 矩形框融合 nms 卷積網路改進實現 筆記 人臉檢測視窗選擇辦法 nms convnet 開源 如何用soft nms實現目標檢...
非極大值抑制(NMS)
非極大值抑制 nms 非極大值抑制顧名思義就是抑制不是極大值的元素,搜尋區域性的極大值。這個區域性代表的是乙個鄰域,鄰域有兩個引數可變,一是鄰域的維數,二是鄰域的大小。這裡不討論通用的nms演算法,而是用於在目標檢測中用於提取分數最高的視窗的。例如在行人檢測中,滑動視窗經提取特徵,經分類器分類識別後...