NMS代码


前言

一、NMS是什么?

NMS:非最大值意味着输出概率最大的分类结果,但是抑制很接近,但不是最大的其他的预测结果。

二、具体步骤

1.第一步:将候选框按照置信度进行排序

第二步,选择置信度最高的框,并于其他框计算iou,

第三步:去除iou大于阈值的框

第四步:重复2,3,直到候选框为空

def nms(bboxes,scores,threshold=0.5):
//x1是所有框的x1坐标
    x1=bboxes[:,0]
    x2=bboxes[:,1]
    y1=bboxes[:,2]
    y2=bboxes[:,3]

//求出所有矩形框的值
    areas=(x2-x1)*(y2-y1)

//将得分从高到底排列,输出索引值
    order=scores.argsort()[::-1]
    print(order)

//keep存储保留的矩形框的索引值
    keep=[]

//order.size>=0当有矩形框就执行下面程序
    while order.size>=0:
        i=order[0]
        //将排序后的第一个矩形框索引值存入keep
        keep.append(i)

        //order.size只有一个值则无需执行下面,直接返回
        if order.size==1:
            break
        
//求出余下的矩形框和第一个矩形框的xx1,xx2,yy1,yy2
        xx1=np.maximum(x1[order[0]],x1[order[1:]])
        xx2=np.minimum(x2[order[0]],x1[order[1:]])
        yy1=np.maximum(y1[order[0]],y1[order[1:]])
        yy2=np.minimum(y2[order[0]],y2[order[1:]])
//余下矩形框不一定和第一个矩形框相交,可能会出现负值,所以设置当出现负值的时候,最大值为0
        w=np.maximum(0.0, (xx2-xx1))
        h=np.maximum(0.0,yy2-yy1))

//求出相交的面积
        inter=w*h

//求出iou的面积
        iou=inter/(areas[order[0]]+areas[order[1:]]-inter)

//计算iou小于threshol的矩形框则留下,并将其索引值存放在ids
        ids=np.where(iou<threshold)[0]
//因为ids是从order[1:]开始的,所以+1
        order=order[ids+1]

    return keep

猜你喜欢

转载自blog.csdn.net/yayalejianyue/article/details/128183109
NMS