cocoeval 解析

2023-10-26

1、COCO目标检测比赛中的模型评价指标介绍!_dulingwen的博客-CSDN博客

2、COCO目标检测测评指标 - 简书

1、Params类:

对于COCO格式的数据检测,我们主要分为不同的IoU阈值,不同的面积范围,单张图片的最大检测数量。在这些不同的参数下,会得到不同的AP与AR。
所以在这个类中,我们需要指定这些参数的数值范围,具体可看下面贴出的代码。

  • 标准的即IoU阈值设置为从0.5-0.95 间隔0.05,一共10个阈值
  • AR的阈值为0-1 间隔0.01 ,一共101个阈值
  • 面积范围为 small(0~32) medium(32~96) large(96~10**5) 一共 3个
  • 检测最大数,按照置信度分数排序后选择最大检测数范围内的det结果。

2、COCOeval类:

COCOeval类是COCO api中最复杂的类了,主要包括以下函数

 2.1 __init__(self, cocoGT=None, cocoDt=None, iouType='segm')

创建COCOeval这个类的时候,我们需要传入两个COCO 类别的instance,一个是gt对应的COCO,一个是det对应的COCO,用来初始化det的anno和gt的anno,关于COCO的类别,那么关于COCO类,可以参考:

MSCOCO api详解 —— Keypoints - 知乎

COCO API-COCO模块在det中的应用_张学渣的博客-CSDN博客

__init__ 函数中需要注意:

self.params = Params(iouType=iouType) # parameters

它用了一个外部类,将评估过程中重要的参数隐式的初始化在COCOeval内你敢信?并且这个self.params 在后面的操作里,有多次的反复赋值、修改的操作。因此我们在使用不同格式的keypoints时,这里是也是唯一我们需要重载COCOeval的成员方法。

2.2 _prepare(self):

设置GT中的ignore flag,初始化空evaluation结果之类的一些常规操作,主要是一下操作

  • 载入gts和dts,这两个都是列表,每一个元素包含bbox,img_id,类别等信息。
  • 如果存在ignore_id的话,将对应gt的’ignore’设置为TRUE
  • 构建字典self._gts: [img_id, cat_id]  和  self._dts: [img_id, cat_id],用[img_id,cat_id]作为key,第一个索引代表输入哪张图片,第二个索引代表哪个类别。value即为这个指定图片指定类别对应的所有ann信息,是一个list形式
self._gts = defaultdict(list)       # gt for evaluation
self._dts = defaultdict(list)       # dt for evaluation
for gt in gts:
	self._gts[gt['image_id'], gt['category_id']].append(gt)
for dt in dts:
	self._dts[dt['image_id'], dt['category_id']].append(dt)
self.evalImgs = defaultdict(list)   # per-image per-category evaluation results
self.eval     = {}                  # accumulated evaluation results

2.3 computeIoU(self, imgId, catId):

根据image_id和cat_id计算这张图片里 cat_id 的所有GT、DT的iou矩阵,主要用于bbox和segmentation;

2.4 computeOks(self, imgId, catId):

根据image_id和cat_id计算这张图片里所有GT、DT的Oks矩阵,也就是Sec 1.2.里OKS的计算源码出处。这里OKS矩阵的维度是 

2.5 evaluateImg(self, imgId, catId, aRng, maxDet): 

根据image_id和cat_id,以及evaluate函数计算得到的iou矩阵,计算在给定的area rang和maxDet下不同iouThreshold下成功的匹配/不成功的匹配矩阵。

1、对于gt框,首先在所有框中挑出imgId, catId的gt框和det框,并根据面积范围的限制设置该gt框是否应该ignore,并把满足面积范围的gt框排在前面,还设置了该gt框的iscrowd标签,

2、对于dt框,把score更高的det框也排在前面,

3、最后从self.ious中挑出imgId, catId的ious矩阵,注意这个最后的ious阵也是根据是否满足面积范围排序了(gt根据是否满足面积范围排序了)
4、self.ious是有n*c个key的字典,n代表图片总数,c代表数据的类别数,每个key所对应value是一个二维矩阵,每一列代表某个gt框与所有det框的交并比。这个字典是之前已经计算好的。
 

这个方法传入固定的img_id,cat_id,aRng,maxDet,我们可以得到对应的img在特定类别,特定面积阈值,特定最大检测数下的检测结果。

  1. 对于面积阈值来说,如果ann对应的bbox超过了aRng的范围就设置为ignore
  2. 对于最大检测数,按照置信度排序后取出前最大检测数个即可

把这个检测结果按照K,A,M的顺序堆叠,可以得到self.evalImgs这个list,这个list包含了所有图片在所有IoU阈值,面积阈值,最大检测数下的所有检测结果。

具体过程如下:

  • 将gt和dt,按照imgId和catId取出。
gt = self._gts[imgId,catId]
dt = self._dts[imgId,catId]
  • 将gt中area不在aRng内的_ignore标签设置为1,并将_ignore=0的排在前面。
  • 将dt的score按照从大到小排列。
  • iou矩阵取出来。
gtind = np.argsort([g['_ignore'] for g in gt], kind='mergesort')
gt = [gt[i] for i in gtind]
dtind = np.argsort([-d['score'] for d in dt], kind='mergesort')
dt = [dt[i] for i in dtind[0:maxDet]]
iscrowd = [int(o['iscrowd']) for o in gt]
# load computed ious
ious = self.ious[imgId, catId][:, gtind] if len(self.ious[imgId, catId]) > 0 else self.ious[imgId, catId]
  • 设置一些下标:T : 阈值,G:gt,D:dt
  • 设置一些变量:gtm[T, G]:gt匹配的dt的id。dtm[T, D]:dt匹配的gt的id。
  • gtIg[G]:gt的_ignore标签,dtIg[T, D]:dt匹配的gt的_ignore标签。

进行匹配,在给定的阈值下,各阈值互不影响:

m代表dt匹配的最好的gt的索引下标
对每一个dt,寻找与之最为匹配的gt,

  1. 如果gt已经匹配上了,continue
  2. 如果dt已经匹配了一个没有ignore的gt,并且当前遍历到的gt被ignore(由于之前有排序,这意味着剩下的gt都是ignore的,不必再排序),break
  3. 如果iou小于已匹配值,continue
  4. 如果iou大于已匹配值, 记录下当前 iou 和 m(匹配的id,当前是最匹配的)
  5. 简而言之,将每个dt匹配给和它最接近的gt。
  6. 收尾:将那些匹配上的dt(dtm==1)中在areaRng范围外的det设置为ignore

返回的重要数据包括:

  • 预测框所匹配的真实框id、真实框所匹配的预测框id
  • 判定真实框和预测框是否满足条件的数组
  • 预测框的分数

然后我们就要开始介绍COCOeval的评估三板斧了

2.6 evaluate(self):

这里evaluate主要做了以下几件事:

  1. 一些边界检查,调用_prepare方法, 生成gt与dt的字典列表,根据这两个字典列表,我们可以生成iou计算,iou计算也以[img_id,cat_id]作为key,value是一个M*N维的ndarry iou矩阵,m为dt的个数,n为gt的个数。
  2. 根据我们初始化COCOeval类时提供的iouType判断是keypoints还是bbox/segmentation评估,选择不同的上面提到的IOU计算函数;
  3. 对每一张图片、每一个类别,分别计算它的iou矩阵;
  4. 计算iou矩阵后,利用上面的evaluateImg来计算每一张图片、每一个类别在不同条件下的检测结果;

这里有一个需要理解好的概念,就是det ignore,可以理解为可以忽略的检测,只有一个检测不是需要忽略的检测的时候,它才会被计入precision和recall。那么什么样的det是可以被ignore的呢:

  • 超出area range并且没有对应的ground truth;
  • 和一个可以被ignore的ground truth匹配了;

 上图是coco中对两中比较特别的情况的判断方法。coco是将每一类当成二分类进行匹配的,其他类也算作background。即下面三条:

  • TP(True Positive): loU>0.5的检测框数量(同一Ground Truth只计算一次)
  • FP(False Positive): loU<=0.5的检测框(或者是检测到同一个GT的多余检测框的数量)
  • FN(False Negative):没有检测到的GT的数量

而在mmdet的计算混淆矩阵的方法中,并不是把每一类的gt和det拎出来再匹配,而且也没有去除重复的操作,即左边这种情况下,只要iou超过阈值,一个gt会和这两个det都匹配,导致最终的tp值大于了真实的gt数,如果gt和det类别不相同,也就增加了其他类的fp值。在右边的情况中也是没有去除重复,同样会增加两个tp,若类别不相同,那会增加其他类的fp。

2.6 accumulate(self, p = None):

先看懂这篇文章,否者这个函数很难理解:cocoapi如何计算map_「已注销」的博客-CSDN博客_coco map计算

cocoEval.evaluate() 只是每幅图的det和gt做了匹配,并将结果存在了self.evalImgs中。计算tp等指标需要cocoEval.accumulate()。

上面我们通过evaluate得到了每一个图片、每一个类别在 iouThreshold、area range、maxDet下的结果,那么在这一步我们需要将它们在整个数据集上汇总结果了。
最终返回的是所有图片在不同IoU阈值、不同AR、不同类别、不同面积阈值、不同最大检测数下的Ap与AR,以numpy数组的返回,即precision(T,R,K,A,M) recall(T,K,A,M)。

有一个地方需要注意:

在算平均精度的一般情况下,如果总共有100个样本,我们数量1开始计算精度和召回率以计算平均精度AP,通常的规律是:随着样本数量的增加,精度慢慢下降,召回率慢慢提高。这个循环解决的是上述规律出现反常的情况。如:检测前50个样本的精度为0.6,检测前51个样本的精度为0.7,则将检测前50个样本的精度置为0.7,这样得出来的数组是个单调递减数组

为什么要这样?
参考:AP,mAP计算详解(代码全解) - 知乎
它的图像描述的很明白,主要还是方便平均精度的计算

作者在这里把我们前面提到的参数Params作为一个函数的输入,似乎本意是希望能够更方便的在更多维度上统计结果,但是偏偏前面的evaluate又是在默认的参数上进行的,确实有一种还未完全实现功能。

2.7 summarize(self):

针对上述accumulate获得的precision、recall矩阵,在不同的维度上进行统计,然后再呈现结果。
函数内部会根据传入的具体的IoU阈值,面积阈值,最大检测数的值返回上述precision和recall中对应维的检测结果,我们就也可以自定义形式返回我们想要的各种参数下的AP与AR啦。
这里没有什么特别的需要注意的。我们常看到的mAP也就是出自于此。

1、COCO API-深入解析cocoeval在det中的应用_张学渣的博客-CSDN博客

2、MSCOCO api详解 —— Keypoints - 知乎

3、COCOAPI 评价指标解析及功能改进 - 知乎

4、COCOAPI评价指标解析及改进_SHY_VWind的博客-CSDN博客_coco api 指标计算

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

cocoeval 解析 的相关文章

随机推荐

  • 汽车电子_EMC测试_RE试验整改

    测试设备DUT状态 DUT带壳 未安装导电泡棉 辐射抗扰度试验 辐射抗扰度试验 270MHz频段出现画面卡死 试验暂停未继续 BCI试验 CBCI出现故障 RE试验 30 200M H方向 Frequency MHz MaxPeak dB
  • Maven高级:多环境配置与应用

    Maven高级 Maven高级 分模块开发 Maven高级 依赖管理 Maven高级 聚合和继承 Maven高级 根据需求完成生成 开发 测试环境 并在各个环境间切换运行 一 多环境配置与应用 这一节中 我们会讲两个内容 分别是多环境开发和
  • vue3 antd 表格点击和点击背景色

    页面
  • win7在64位系统下编译openssl

    以前在笔记本上配置过openssl 0 9 8g版本 今天在公司的台式机上配置死活没配置成功 机器的系统是win7 64位 编译openssl 1 0 1e出现各种莫名的错误 最后无意中编译了1 0 0 a版本编译成功了 如果出现ml找不到
  • Selenium-Server-Standalone搭建

    一 概述 先说说背景吧 Selenium是一个优秀的自动化测试框架 可以模拟浏览器的各种操作来代替人工操作 不同的浏览器有 不同的driver来驱动 之前项目中使用的firefoxDriver chromeDriver有一个缺点 就是浏览器
  • VSCode配置MSVC+VSCode使用easyx库,2021.5.13日配置~~

    VSCode配置MSVC VSCode使用easyx库 2021 5 13日配置 想必很多人和我一样 想用vscode编程c easyx库不支持MinGW 一般人都是直接使用vs2019安装easyx库用来GUI编程 那么爱折腾的VSCod
  • 使用PHP简单操作Memcached

    记得一定要先启动Memcached哦 root localhost usr bin memcached d l 127 0 0 1 p 11211 m 150 u root 使用ps命令查看一下运行状态 root localhost ps
  • 结构体内存对齐详解

    目录 一 结构体的对齐规则 二 修改默认对齐数 三 位段 四 枚举 五 联合 共用体 一 结构体的对齐规则 1 第一个成员在与结构体变量偏移量为0的地址处 2 其他成员变量要对齐到某个数字 对齐数 的整数倍的地址处 对齐数 编译器默认的一个
  • Ubuntu16.04 64位下安装VMware Tools过程

    因为在虚拟机下安装Ubuntu16 04 64位时无法进入全屏模式 采用另外一种方法解决了 但是还是想安装一下VMware Tools 防止以后出现相关问题 好啦 下面进入正题 1 在虚拟机下会看到安装 VMware Tools 单击安装
  • C# 各种符号用法

    参考 C 的7种用法 c 软泡芙的博客 CSDN博客 C 问号操作符详解 知乎 的7种用法 可空类型修饰符 int i num null 表示可空的整型 DateTime time dateTime null 表示可空的时间 三元 运算符
  • join(long millis)意思?join()作用

    join 作用 class JoinThread implements Runnable public void run for int i 0 i lt 100 i System out println Thread currentThr
  • FT2232作为JTAG烧录器的使用步骤详解

    FT2232作为JTAG烧录器的使用步骤详解 FT2232作为JTAG烧录器的使用步骤详解 配置OpenOCD环境 已经配置好的可以跳过 步骤 1 安装 FT2232HL 芯片的驱动 安装文件为 CDM21228 Setup exe 步骤
  • unity AR3D物体识别

    上篇讲到了各种AR插件的一些对比 因为上个项目需求用到3D物体追踪 所以使用了EasyAR和Vuforia两种进行了测试对比 因为如果需要AR识别 都需要有识别点 大致都是基于物体材质纹理来进行识别 1 先讲一下EasyAR的3D物体识别
  • 【百问网】物联网项目学习总结

    初步实现项目 项目程序流程图 TCP连接流程 模式1 站点模式 写代码去实现了这个TCP的连接流程 我们的思路就是 首先直接操作ESP8266 进行功能验证 ST Link Debugger 点击Settings 勾选Reset and R
  • 远程访问数据库出错的解决办法

    案例 在aws服务器中的项目访问在华为云中的测试服务器的数据库 报错 Access denied for user root ec2 XXX XXX XXX XXX cn north 1 compute amazonaws com cn u
  • Linux指令系统文件复制到U盘

    Linux指令系统文件复制到U盘 文章目录 Linux指令系统文件复制到U盘 1 建立U盘挂载点 2 查看U盘所在分区 3 查看U盘类型 4 挂载U盘 5 复制文件 6 移除U盘 1 建立U盘挂载点 在挂载点处建立文件夹 mkdir 路径
  • 【Java面试题汇总】设计模式篇(2023版)

    导航 黑马Java笔记 踩坑汇总 JavaSE JavaWeb SSM SpringBoot 瑞吉外卖 SpringCloud 黑马旅游 谷粒商城 学成在线 设计模式 牛客面试题 目录 谈谈你对设计模式的理解 谈谈你对单例模式的理解 手写一
  • [17]AWK记录、字段、模式、跨平台移植及正则表达式

    一 记录与字段 1 记录分隔符 默认行输入和输出的分隔符都是回车 保存在RS和ORS内部变量中 变量 0 awk每次一行取得整条记录 0随之改变 同时内部变量NF 字段的总数 也随之变化 变量NR 每条记录的行号 处理完一行将会加1 所以全
  • InnoDB undo log解析(二)

    在 上一篇中已经介绍了InnoDB undo log的组织结构 并通过一个示例并结合InnoSQL来分析insert undo log记录格式 本篇中介绍update undo log的记录格式 update undo log有以下三种类型
  • cocoeval 解析

    1 COCO目标检测比赛中的模型评价指标介绍 dulingwen的博客 CSDN博客 2 COCO目标检测测评指标 简书 1 Params类 对于COCO格式的数据检测 我们主要分为不同的IoU阈值 不同的面积范围 单张图片的最大检测数量