在测试检测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时跟几张图片没关系), 每一个预测结果 都有置信度, 将所有结果按照置信度从大到小排列:

对于整个数据集:
置信度为0.9时, tp = 1, fp=0;
置信度为0.7时, tp = 1, fp=1;
置信度为0.4时, tp = 2, fp=1
由以上结果, 可以得到下表:

于是, 我们便得到了一系列的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意义下,
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在计算平均精度(AP)时的不同方法。COCO使用np.searchsorted()进行近似插值,而YOLOv5则采用np.interp()进行精确插值并积分计算AP。此外,COCO直接取均值,YOLOv5则通过积分求解。这两种方法导致了计算结果的轻微差异。

85

被折叠的 条评论
为什么被折叠?



