非極大值抑制 非極大值抑制NMS的python實現

2021-10-12 07:56:13 字數 2933 閱讀 6792

# 首先資料賦值和計算對應矩形框的面積

# 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演算法,而是用於在目標檢測中用於提取分數最高的視窗的。例如在行人檢測中,滑動視窗經提取特徵,經分類器分類識別後...