在進行目標檢測的時候,當多個方框都**到同乙個目標的時候,我們需要去除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 取出分數從大到小排列的索引...