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