參考
思想:1.將每乙個檢測框的得分值排序,得到得分值最大的檢測框,將該檢測框記錄下來
2.然後其他計算所有的檢測框與該框的iou,將iou大於閾值的檢測框去除,iou小於閾值的認為是不同的目標,則保留
3.對剩下的檢測框繼續做上述的處理
import numpy as np
def py_cpu_nms(dets, thresh):
"""pure python nms baseline."""
#x1、y1、x2、y2、以及score賦值,其中x1,y1是所有的**邊框的左上角座標,x2,y2是所有的**邊框的右下角座標。其中dets[:, 4]是所有的**邊框的得分值(該**框包含該類別目標的概率)
x1 = dets[:, 0]
y1 = dets[:, 1]
x2 = dets[:, 2]
y2 = dets[:, 3]
scores = dets[:, 4]
#得到每乙個**框的面積
areas = (x2 - x1 + 1) * (y2 - y1 + 1)
order = scores.argsort()[::-1]#按照scores的值的大小排序後,各個值在scores中的索引,具體下面會給解釋
keep =
while order.size > 0:
i = order[0]#order[0]是得分最高的邊界框在scores中的索引
xx1 = np.maximum(x1[i], x1[order[1:]])#將x1[order[1:]的每個值分別與x1[i]比較後,返回兩者之中較大的值,並構成列表,下面會有解釋
yy1 = np.maximum(y1[i], y1[order[1:]])
xx2 = np.minimum(x2[i], x2[order[1:]])
yy2 = np.minimum(y2[i], y2[order[1:]])
#依次計算每乙個邊界框與得分最高的邊界框的iou,將iou大於閾值的邊界框去掉
w = np.maximum(0.0, xx2 - xx1 + 1)#0表示沒有交集
h = np.maximum(0.0, yy2 - yy1 + 1)
inter = w * h #計算相交的面積,不重疊時面積為0
#計算iou:重疊面積 /(面積1+面積2-重疊面積)
ovr = inter / (areas[i] + areas[order[1:]] - inter)#計算iou,兩者的並集大小為(面積1+面積2-重疊面積)
inds = np.where(ovr <= thresh)[0]#只有iou小於閾值的被保留下來。np.where返回滿足條件的索引
order = order[inds + 1]#iou小於閾值的被保留下來
return keep
對於乙個類別的非極大值抑制的**:
argsort:
import numpy as np
score = [2,3,5,3,1,10,7,2]
order = np.array(score).argsort()
返回為:array([4, 0, 7, 1, 3, 2, 6, 5])
np.maximum(5,[10,4,3,9,8])
返回為:array([10, 5, 5, 9, 8])
np.where:
ovr=[3,4,5,6,1,2,9,7,6]
np.where(np.array(ovr)<5)
out[16]: (array([0, 1, 4, 5]),)
np.array(ovr)[index[0]]
out[22]: array([3, 4, 1, 2])
非極大值抑制
nms non maximum suppression 中文名非極大值抑制,在很多計算機視覺任務中都有廣泛應用,如 邊緣檢測 目標檢測等。這裡主要以人臉檢測中的應用為例,來說明nms,並給出matlab和c 示例程式。人臉檢測的一些概念 1 絕大部分人臉檢測器的核心是分類器,即給定乙個尺寸固定,分類...
非極大值抑制
在進行目標檢測的時候,當多個方框都 到同乙個目標的時候,我們需要去除iou小的方框,原始碼如下 def nms boxes,threshold,method union param boxes n,9 x1,y1,x2,y2,score,offset x1,offset y1,offset x2,o...
非極大值抑制 非極大值抑制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 取出分數從大到小排列的索引...