NMS非极大值抑制「终于解决」

NMS非极大值抑制「终于解决」NMS非极大值抑制

大家好,欢迎来到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

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信