非極大值抑制

2021-10-10 22:50:59 字數 1831 閱讀 6261

在進行目標檢測的時候,當多個方框都**到同乙個目標的時候,我們需要去除iou小的方框,原始碼如下

def

nms(boxes, threshold, method=

"union"):

""" :param boxes: (n, 9) [x1, y1, x2, y2, score, offset_x1, offset_y1, offset_x2, offset_y2] n表示有n個方框

:param threshold: 閾值 float

:param method: 非極大值抑制 的模式

:return:

"""if boxes.size ==0:

return np.empty((0

,3))

# 提取左上角和右下角座標 (n,)

x1 = boxes[:,

0]y1 = boxes[:,

1]x2 = boxes[:,

2]y2 = boxes[:,

3]# 提取相應的方框得分 (n,)

score = boxes[:,

4]# 求出每乙個方框的面積 (n,)

area =

(x2 - x1 +1)

*(y2 - y1 +1)

# 對得分進行排序, 返回公升序的索引, i[-1] 是最大得分的索引

i = np.argsort(score)

pick = np.zeros_like(score, dtype=np.int16)

counter =

0while i.size >0:

# 得分最大的方框

i = i[-1

]# 儲存最大得分方框的索引

pick[counter]

= i # 得到除了最大得分方框以外的所有方框的索引

counter +=

1 idx = i[0:

-1]# 得到交集左上角座標 (m,)

xx1 = np.maximum(x1[i]

, x1[idx]

) yy1 = np.maximum(y1[i]

, y1[idx]

)# 得到交集右下角座標

xx2 = np.minimum(x2[i]

, x2[idx]

) yy2 = np.minimum(y2[i]

, y2[idx]

)

w = np.maximum(

0.0, xx2 - xx1 +1)

h = np.maximum(

0.0, yy2 - yy1 +1)

inter = w * h

if method is

"min"

: o = inter / np.minimum(area[i]

, area[idx]

)elif method is

"union"

: o = inter /

(area[i]

+ area[idx]

- inter)

# np.where(o <= threshold)得到符合小於閾值,也就是和最大得分的方框相隔比較遠的方框符合標準

# 通過使用bool列表進行對i進行mask操作,保留為true的值,記住i裡面記錄的是索引

i = i[np.where(o <= threshold)

]# 返回找到的符合要求的方框

pick = pick[

0:counter]

return pick

非極大值抑制

nms non maximum suppression 中文名非極大值抑制,在很多計算機視覺任務中都有廣泛應用,如 邊緣檢測 目標檢測等。這裡主要以人臉檢測中的應用為例,來說明nms,並給出matlab和c 示例程式。人臉檢測的一些概念 1 絕大部分人臉檢測器的核心是分類器,即給定乙個尺寸固定,分類...

非極大值抑制

參考 思想 1.將每乙個檢測框的得分值排序,得到得分值最大的檢測框,將該檢測框記錄下來 2.然後其他計算所有的檢測框與該框的iou,將iou大於閾值的檢測框去除,iou小於閾值的認為是不同的目標,則保留 3.對剩下的檢測框繼續做上述的處理 import numpy as np def py cpu ...

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

首先資料賦值和計算對應矩形框的面積 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 取出分數從大到小排列的索引...