大家好,欢迎来到IT知识分享网。
NMS的提出背景
NMS主要用于目标检测的候选框筛选(bbox),当两个bbox空间位置非常接近,就以score更高的那个作为基准,看IOU即重合度如何,如果与其重合度超过阈值,就抑制score更小的box,因为没有必要输出两个接近的box,只保留score大的就可以了。总结:NMS就是用来去掉检测任务中对于同一物体的重复检测框。
NMS的过程
1、基于前面的网络(如RPN)能为每个框给出一个score(置信度),score(置信度)越大证明框越接近期待值。
2、将各组box按照score(置信度)降序排列。
3、从score最大值开始,置为当前bbox,保存idex,然后依次遍历后面的bbox,计算与当前bbox的IOU值,分别在局部选出最大框,若大于阈值,可以看成两个框表示同一物体,则看作重复,抑制不输出。
4、 完成一轮遍历后,IOU小于阈值的框被保留下来,继续选择下一个非抑制的bbox作为当前bbox,重复步骤2
5、 返回没有被抑制的index即符合条件的box。
最后会生成一个稀疏矩阵。
NMS前:
NMS后:
图片引自:https://blog.csdn.net/shuzfan/article/details/52711706#commentsedit
二、代码实现
def NMS(dects,threshhold):
"""
detcs:二维数组(n_samples,5)
5列:x1,y1,x2,y2,score
threshhold: IOU阈值
"""
x1=dects[:,0]
y1=dects[:,1]
x2=dects[:,2]
y2=dects[:,3]
score=dects[:,4]
ndects=dects.shape[0]#box的数量
area=(x2-x1+1)*(y2-y1+1)
order=score.argsort()[::-1] #score从大到小排列的indexs,一维数组
keep=[] #保存符合条件的index
suppressed=np.array([0]*ndects) #初始化为0,若大于threshhold,变为1,表示被抑制
for _i in range(ndects):
i=order[_i] #从得分最高的开始遍历
if suppressed[i]==1:
continue
keep.append(i)
for _j in range(i+1,ndects):
j=order[_j]
if suppressed[j]==1: #若已经被抑制,跳过
continue
xx1=np.max(x1[i],x1[j])#求两个box的交集面积interface
yy1=np.max(y1[i],y1j])
xx2=np.min(x2[i],x2[j])
yy2=np.min(y2[i],y2[j])
w=np.max(0,xx2-xx1+1)
h=np.max(0,yy2-yy1+1)
interface=w*h
overlap=interface/(area[i]+area[j]-interface) #计算IOU(交/并)
if overlap>=threshhold:#IOU若大于阈值,则抑制
suppressed[j]=1
return keep
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/24717.html