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

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

NMS

模型预测会输出很多框,比如同一个目标会有很多框对应,NMS的作用是删除重复框,保留置信度分数最大的框。

在NMS算法中有一个置信度阈值cIoU阈值u,简单回顾NMS算法如下:

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

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

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

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

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

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

一样的,利用置信度阈值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,所以不相交面积为0overlaps = w*hprint('overlaps is',overlaps)#这个就是IOU公式(交并比)。#得出来的ious是一个列表,里面拥有当前方框和其他所有方框的IOU结果。ious = overlaps / (areas[i]+areas[index[1:]] - overlaps)print('ious is',ious)#接下来是合并重叠度最大的方框,也就是合并ious中值大于thresh的方框#我们合并的操作就是把他们剔除,因为我们合并这些方框只保留下分数最高的。#我们经过排序当前我们操作的方框就是分数最高的,所以我们剔除其他和当前重叠度最高的方框#这里np.where(ious<=thresh)[0]是一个固定写法。idx = np.where(ious<=thresh)[0]print(idx)#把留下来框在进行NMS操作#这边留下的框是去除当前操作的框,和当前操作的框重叠度大于thresh的框#每一次都会先去除当前操作框,所以索引的列表就会向前移动移位,要还原就+1,向后移动一位index = index[idx+1]   # because index start from 1print(index)return keep

mAP

mAP就是平均的平均精度,首先计算每一个类别的AP(平均精度),然后所有类别的AP相加除以类别数目m,就得到mAP。

对于PASCAL VOC数据集,固定IoU阈值(0.5),移动置信度阈值
对于每一个类别的AP计算,简要过程如下:
设定一个置信度阈值c和IoU阈值u。对于经过NMS的最终预测结果,我们对结果按照它们的score分数做降序排列,然后以置信度阈值c为标准,将score>c的预测框定义为正样本,然后对这些正样本进行计算Precision和Recall,这样就得到一个pr曲线上的点(横坐标是reall,纵坐标是Precision)。
固定住IoU阈值u不动,改变置信度阈值c,那么就会计算得到其它不同的pr点。
将所有点连接起来,就得到pr曲线了,求pr曲线下的面积就是该类别的AP。

对于COCO数据集,是固定住置信度阈值,移动IoU阈值

https://blog.csdn.net/u010712012/article/details/85108738
https://blog.csdn.net/qq_16540387/article/details/81912289?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.nonecase

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

  1. CVPR 2022 | 未知目标检测模块STUD:学习视频中的未知目标

    前言 构建能够检测分布外(OOD)目标的可靠目标检测器是至关重要的,但尚未得到充分探索.关键挑战之一是,模型缺乏来自未知数据的监督信号,从而对OOD对象产生过于自信的预测. 文章提出了一种基于时空未知 ...

  2. 基于yolov3的行人目标检测算法在图像和视频中识别检测

    资源下载地址:https://download.csdn.net/download/sheziqiong/85772186 资源下载地址:https://download.csdn.net/downl ...

  3. 目标检测算法评价指标之mAP

    随着计算机技术的发展和计算机视觉原理的广泛应用,利用计算机图像处理技术对目标进行实时跟踪研究越来越热门,对目标进行动态实时跟踪定位在智能化交通系统.智能监控系统.军事目标检测及医学导航手术中手术器械定 ...

  4. Java Map中如何获取Map集合中所有value呢?

    转自: Java Map中如何获取Map集合中所有value呢? 下文笔者讲述使用Map.values()方法获取集合中"所有值"的方法分享,如下所示: 实现思路:借助Map的va ...

  5. 目标检测:NMS和计算mAP时的置信度阈值和IoU阈值

    在目标检测问题中,好几处地方使用了阈值这个限制指标,主要有:1. NMS操作之前用到的置信度阈值a:2. NMS进行时用到的IoU阈值b:3.计算某类别AP时,统计TP,FP个数前,用到置信度阈值c: ...

  6. 【点云3D目标检测】跑通CIA-SSD过程中的一些报错集锦

    前言 本文主要是介绍了在跑通CIA-SSD系列算法过程中遇到的一些bug,下面是对CIASSD算法的一个简单的介绍. CIA-SSD其基本思想是校准单步目标检测中分类和定位两个任务,提出Confide ...

  7. ICCV2019 全部论文分类汇总(含目标检测 / 图像分割等,1008 更新中)

    作为计算机视觉领域三大顶会之一,ICCV2019目前已公布了所有接收论文ID(会议接收论文1077篇,总提交4303篇,25%的接收率),相关报道:1077篇!ICCV2019接收结果公布,你中了吗? ...

  8. 将扩散模型用于目标检测任务,从随机框中直接检测!

    本文 机器之心 授权  编辑:杜伟.陈萍 扩散模型不但在生成任务上非常成功,这次在目标检测任务上,更是超越了成熟的目标检测器. 扩散模型( Diffusion Model )作为深度生成模型中的新 S ...

  9. 【目标检测】什么是mAP?如计算模型的mAP?(mAP的相关概念以及求法)

    文章目录 什么是mAP 相关概念 如何得到PR曲线 如何计算AP以及mAP 详细步骤分析 什么是mAP mAP(mean Average Precision 平均精度),是一个经常被用来衡量目标检测模 ...

最新文章

  1. 一个关于native sql的程序
  2. 安装LAMP环境(PHP5.4)
  3. 数据库oracle 别名不能更新,数据库oracle改成mysql后Hibernate不能使用别名问题
  4. Python字符串函数总结
  5. linux 进程崩溃log,Linux系统日志及日志分析
  6. MobileNetV2: Inverted Residuals and Linear Bottlenecks
  7. python inspect —— 查看类的继承体系
  8. 定义m是第一个数,之后的每个数都是前一个的平方根,一共有n个数,计算总和。
  9. cad项目数据库服务器,cad项目数据库服务器
  10. vue 3.0(通用) 表格导出成Excel文件或HTML转word文档
  11. 微信导航——引入百度地图api
  12. Linux 文件同步工具——rsync
  13. android模拟器mac版本下载,TapTap安卓模拟器for Mac-TapTap模拟器Mac版下载 V1.8.3-PC6苹果网...
  14. 电商网站建设步骤_电商网站建设的注意事项_OctShop
  15. Amazon SageMaker助力德比软件提高酒店房态查询准确率
  16. struts2文件上传和下载
  17. C++可视化和图表库
  18. 王佩丰 Excel 基础24讲 | 学习笔记(全)
  19. Slf4j之MDC机制
  20. s60v5用java qq_s60v5 qq-QQ版本下载-kukud.net手机qq下载站

热门文章

  1. Windows Docker阿里云镜像加速器
  2. IT项目管理实践经验2
  3. JQ QQ表情插件
  4. 收费邮箱品牌大全,一个足够!
  5. 手把手教Apereo CAS5.2.3 注册后自动登录
  6. 查看centos自带jdk版本并卸载
  7. 济南python工资一般多少-济南在线学Python
  8. java 银行叫号系统
  9. ESP32 CAM CameraWebServer示例测试
  10. Fluent常用模型介绍-流体模拟仿真ansys