目标检测中NMS和mAP指标中的的IoU阈值和置信度阈值 您所在的位置:网站首页 两个阈值 目标检测中NMS和mAP指标中的的IoU阈值和置信度阈值

目标检测中NMS和mAP指标中的的IoU阈值和置信度阈值

2023-09-19 08:27| 来源: 网络整理| 查看: 265

有时候路走的太远,会忘了为什么要出发。 学习亦如是

在目标检测中,经常看到置信度阈值和IoU阈值这两个关键参数,且NMS计算和mAP计算中都会有这两个,那它们的区别是什么?本文就这个问题做一次总结。

NMS

模型预测会输出很多框,比如同一个目标会有很多框对应,NMS的作用是删除重复框,保留置信度分数最大的框。 在这里插入图片描述 在NMS算法中有一个置信度阈值c和IoU阈值u,简单回顾NMS算法如下:

对于一个预测框集合B(B中包含很多个预测框和它们对应的score)

找出B中score分数最高的M将M从B中删除将删除的M添加进最后的集合D将B中所有的box与M进行IoU计算,删除B中 IoU > u的所有对应box 重复上面的步骤

最后D中的框就是保留下来的,留下的框中,删除掉低于score阈值的框,剩下的就是最终的预测框。

所以,这里的置信度阈值c是过滤掉预测框中置信度分数低于c的box;IoU阈值指的是拿出score分数最高框的其余框与score分数最高框的一个IoU比较。

注意到上面的NMS流程并没有对box的score做排序的过程。其实还有其它实现方式:

先对B中所有的box的score做排序,拿出score最高的box(这里当做M,从大到小排序就是首个box)放在别的list D,然后用B中其余的box分别与M计算IoU,去掉IoU > u 的box重复上面步骤。

一样的,利用置信度阈值c对D中的box在做一次过滤,剩下的就是最后输出的。

对于利用置信度阈值c过滤,可以在没开始NMS前就做过滤,也可以在NMS后做过滤,这个不影响,看代码怎么实现。

Faster RCNN中的nms代码实现如下:

def py_cpu_nms(dets, thresh): #首先数据赋值和计算对应矩形框的面积 #dets的数据格式是dets[[xmin,ymin,xmax,ymax,scores]....] x1 = dets[:,0] y1 = dets[:,1] x2 = dets[:,2] y2 = dets[:,3] areas = (y2-y1+1) * (x2-x1+1) scores = dets[:,4] print('areas ',areas) print('scores ',scores) #这边的keep用于存放,NMS后剩余的方框 keep = [] #取出分数从大到小排列的索引。.argsort()是从小到大排列,[::-1]是列表头和尾颠倒一下。 index = scores.argsort()[::-1] print(index) #上面这两句比如分数[0.72 0.8 0.92 0.72 0.81 0.9 ] # 对应的索引index[ 2 5 4 1 3 0 ]记住是取出索引,scores列表没变。 #index会剔除遍历过的方框,和合并过的方框。 while index.size >0: print(index.size) #取出第一个方框进行和其他方框比对,看有没有可以合并的 i = index[0] # every time the first is the biggst, and add it directly #因为我们这边分数已经按从大到小排列了。 #所以如果有合并存在,也是保留分数最高的这个,也就是我们现在那个这个 #keep保留的是索引值,不是具体的分数。 keep.append(i) print(keep) print('x1',x1[i]) print(x1[index[1:]]) #计算交集的左上角和右下角 #这里要注意,比如x1[i]这个方框的左上角x和所有其他的方框的左上角x的 x11 = np.maximum(x1[i], x1[index[1:]]) # calculate the points of overlap y11 = np.maximum(y1[i], y1[index[1:]]) x22 = np.minimum(x2[i], x2[index[1:]]) y22 = np.minimum(y2[i], y2[index[1:]]) print(x11,y11,x22,y22) #这边要注意,如果两个方框相交,X22-X11和Y22-Y11是正的。 #如果两个方框不相交,X22-X11和Y22-Y11是负的,我们把不相交的W和H设为0. w = np.maximum(0, x22-x11+1) h = np.maximum(0, y22-y11+1) #计算重叠面积就是上面说的交集面积。不相交因为W和H都是0,所以不相交面积为0 overlaps = w*h print('overlaps is',overlaps) #这个就是IOU公式(交并比)。 #得出来的ious是一个列表,里面拥有当前方框和其他所有方框的IOU结果。 ious = overlaps / (areas[i]+areas[index[1:]] - overlaps) print('ious is',ious) #接下来是合并重叠度最大的方框,也就是合并ious中值大于thresh的方框 #我们合并的操作就是把他们剔除,因为我们合并这些方框只保留下分数最高的。 #我们经过排序当前我们操作的方框就是分数最高的,所以我们剔除其他和当前重叠度最高的方框 #这里np.where(ious


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有