coco和yolov5 map计算结果不一致的问题

这篇具有很好参考价值的文章主要介绍了coco和yolov5 map计算结果不一致的问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在测试检测benchmark时发现使用coco和yolov5计算出的map结果不一致, yolov5的指标要略高一点, 好奇他们都是如何计算的, 通过阅读源码, 发现了一些端倪, 如有纰漏, 还望指出.

ap概念及计算方式

先说ap(average precision), 翻译过来为平均精度, 顾名思义, 就是精度的平均值. 通常来讲, 一个算法任务在数据集上的测试输出的结果是固定的(TP, FP是固定的), 也就是说, 精度值就一个, 那么何来平均精度一说呢?
事实上, 当正负样本差别较大时, 使用单一指标, 如精度(查准率), 还是召回率(查全率), 都无法评价模型的好坏(想象一下正样本99, 负样本1, 模型将所有目标都预测为正例, 此时tp=99, fp=1, p=0.99, r=1能说明模型很好吗? ), 于是需要一个综合指标来衡量模型好坏, ap就是这个综合指标, 计算方式也很简单, 就是计算平均精度, 问题是, 如何构造多个精度呢?

假设某单一目标检测任务(只有1类)在数据集(假设只有3张图片, 每个图片一个目标)有三个预测结果(每个图片一个, 事实上,计算map时跟几张图片没关系), 每一个预测结果 都有置信度, 将所有结果按照置信度从大到小排列:
coco和yolov5 map计算结果不一致的问题
对于整个数据集:
置信度为0.9时, tp = 1, fp=0;
置信度为0.7时, tp = 1, fp=1;
置信度为0.4时, tp = 2, fp=1
由以上结果, 可以得到下表:
coco和yolov5 map计算结果不一致的问题
于是, 我们便得到了一系列的precision.
但是有几个细节需要我们注意:

  • 问: 我们如何确定检测结果是tp还是fp?
    答: 靠iou, 预测框和gt框iou>iou_th为tp, 否则为fp, ap50就是在iou_th=0.5的条件下计算得到的map.
  • 问: ap和map什么关系?
    答: 通常来讲, ap是某一类的平均精度, map是所有类别的平均精度的平均, 但在coco中, 就没map这个说法, coco中的ap就是map
    coco和yolov5 map计算结果不一致的问题
    值得注意的是, 在coco意义下,
    ap(map)是iou_th从0.5取到0.95共10个iou level计算得到的ap的平均值(由每一类ap得到最终ap, 一共需要取两次均值, 一次是所有的iou level, 一次是所有的class)
    ap50是iou_th取0.5计算得到的map
  • 问: 得到了p和r, 接下来ap如何计算呢? 是不是将p取平均就行了?
    答: 这个问题很关键, coco, yolov5的区别就在这

coco和yolov5的差别

在得到p, r列表后, 可以画出p, r图像(画图只是为了方便理解, 实际计算时, 只要得到p, r列表就行了)
coco和yolov5 map计算结果不一致的问题
通常, 在得到以上图像后, 需要将x轴(即r)分为101份(0~1, 0.01)进行插值来计算最终的ap, coco和yolov5的差别体现在得到p, r 列表后, 如何插值以及如何计算ap上.

  • 先看下coco(pycocotools.cocoeval.COCOeval):
    coco的插值方法:
# cocoeval.py, line 402
inds = np.searchsorted(rc, p.recThrs, side='left')

其中, recThrs就是recall的101个点, 熟悉np.searchsorted()的小伙伴应该发现了, 其实coco在计算时并没有真的进行插值, 只是按照101个recall的位置, 从p列表中取对应位置的p而已, 对应图像是这样:
coco和yolov5 map计算结果不一致的问题

细心的小伙伴会发现np.searchsorted()得到的索引可能超过p的长度, 那超过r最大值的点(右侧红框部分)怎么取呢?答案是直接置为0, 也就是说"插值坐标点"取到r能取到的最大索引后就结束了, 代码对应于这部分:

# cocoeval.py, line 402~408
try:
     for ri, pi in enumerate(inds):
         q[ri] = pr[pi]
         ss[ri] = dtScoresSorted[pi]
except:
    pass

q初始化的时候都是0, 当pi超过pr的索引时会发生错误, 于是超过索引的p都是0.
再来看最终如何计算ap值, coco直接简单粗暴, 取均值:

# cocoeval.py, line 455
mean_s = np.mean(s[s>-1])
  • 再看yolov5
    首先, yolov5是老老实实对p列表进行了101个点的插值, 插值完大概是这样:
    coco和yolov5 map计算结果不一致的问题

对应代码:

# Append sentinel values to beginning and end
mrec = np.concatenate(([0.0], recall, [1.0]))
mpre = np.concatenate(([1.0], precision, [0.0]))

# Compute the precision envelope
mpre = np.flip(np.maximum.accumulate(np.flip(mpre)))

# Integrate area under curve
method = 'interp'  # methods: 'continuous', 'interp'
if method == 'interp':
   x = np.linspace(0, 1, 101)  # 101-point interp (COCO)
   ap = np.trapz(np.interp(x, mrec, mpre), x)  # integrate

从代码可以看出, 首先在p, r列表左右两侧各查了0,1两个值, 方便后面查值, 之后通过np.interp()插101个点, 最后通过
np.trapz 积分得到最终的ap
, 大概就是这样:
coco和yolov5 map计算结果不一致的问题

结论

coco和yolov5在计算map(coco叫ap)的不同之处有两点:文章来源地址https://www.toymoban.com/news/detail-491124.html

  • coco插值用的是np.searchsorted(), yolov5用的是np.interp();
  • coco用平均得到ap, yolov5积分得到ap;

到了这里,关于coco和yolov5 map计算结果不一致的问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 解决YOLOV5训练时P、R、mAP等值均为0的问题

    最近用YOLOV5训练自己的数据集,出现了训练失败的情况,比如box,obj,cls,labels等均为nan或0,找了很多办法,其实就是cuda与PyTorch版本的问题 我的cuda版本是11.2,PyTorch1.9,可能以前安装的有问题,重新安装官网的cuda11.3版本也是没有解决,可能重置电脑后用11.3的才能跑通,在

    2023年04月08日
    浏览(42)
  • YOLOV5的FPS计算问题

    data换为自己的数据集对应的yaml文件 weights换为训练自己数据集得到的权重 batchsize这里要设置为1 pre-process:图像预处理时间,包括图像保持长宽比缩放和padding填充,通道变换(HWC-CHW)和升维处理等; inference:推理速度,指预处理之后的图像输入模型到模型输出结果的时间;

    2024年02月11日
    浏览(70)
  • yolov5结果解析

    以这种形式给出矩阵的值 g t c l a s s 1 gt_{class1} g t c l a ss 1 ​ g t c l a s s 2 gt_{class2} g t c l a ss 2 ​ g t c l a s s 3 gt_{class3} g t c l a ss 3 ​ background FP p r e d c l a s s 1 pred_{class1} p re d c l a ss 1 ​ p r e d c l a s s 2 pred_{class2} p re d c l a ss 2 ​ p r e d c l a s s 3 pred_{class3} p re d c l a ss 3 ​ bac

    2024年02月04日
    浏览(46)
  • 代码实现如何将yolov5数据格式转换为coco格式

    很多训练算法使用coco格式,而原版的数据集可能采用yolov5的数据格式,故写个简单的教程; yolov5数据集的目录格式:  images存放的图像,例如 1.jpg,2.jpg. labels存放的是对应图片的标注信息,例如 1.txt,2.txt. txt 中信息是这样的: (框高)每一行对应一个bbox框信息,分别是cla

    2024年02月12日
    浏览(41)
  • yolov5训练结果解析

    yolov5训练结果的文件解析 1、weights训练好的模型,一般使用best.pt去进行推理 2、confusion_matrix.png 混淆矩阵以矩阵形式将数据集中的记录按照真实的类别与分类模型预测的类别判断两个标准进行汇总。其中矩阵的行表示真实值,矩阵的列表示预测值。 TP(True Positive): 将正类预

    2024年02月06日
    浏览(67)
  • YOLOv3&YOLOv5输出结果说明

    本文使用的yolov3和yolov5工程文件均为github上ultralytics基于pytorch的v3和v5代码,其训练集输出结果类型基本一致,主要介绍了其输出结果,本文是一篇学习笔记 本文使用的yolov3代码github下载地址:yolov3 模型训练具体步骤可查看此篇博客: yolov3模型训练——使用yolov3训练自己的模

    2023年04月08日
    浏览(56)
  • YOLOv5保存数据增强结果

    前言 本篇不会讲过多的原理,因为网上有很多关于YOLOv5的数据增强的原理,讲的都很详细,但是似乎找不到有关将增强结果保存到文件夹的笔记。 可能也是因为用途比较少,刚好我需要使用一些增强的数据所以琢磨研究了怎么保存其结果(刚开始是尝试调用有关函数进行使

    2024年02月06日
    浏览(42)
  • 【机器学习】yolov5训练结果分析

    yolov5模型训练后的结果会保存到当前目录下的run文件夹下里面的train中 下面对训练结果做出分析 在yolov5的训练结果中,confusion_matrix.png文件是一个混淆矩阵的可视化图像,用于展示模型在不同类别上的分类效果。混淆矩阵是一个n×n的矩阵,其中n为分类数目, 矩阵的每一行代

    2024年02月01日
    浏览(55)
  • YOLOv5训练结果性能分析

    入门小菜鸟,希望像做笔记记录自己学的东西,也希望能帮助到同样入门的人,更希望大佬们帮忙纠错啦~侵权立删。 可参照以下博客一起看(涉及一些概念解析)深度学习之常用模型评估指标(一)—— 分类问题和目标检测_tt丫的博客-CSDN博客_深度网络模型特异度       

    2023年04月09日
    浏览(58)
  • 关于Yolov5在测试时,图像大小被调整的问题

    原数据大小为:1920*1080 detect.py中的imgsz设置为640,按照正常图像宽高的缩放,原数据缩放后应为:640*360 而detect.py的控制台输出却为:640*384,如下所示: 这是为何呢?具体可以从头仔细阅读detect.py的代码,在LoadImages类中有一个letterbox函数,函数具体如下:  代码中的备注给出

    2024年02月13日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包