如何为 PASCAL VOC Challenge 的检测任务计算 mAP?

数据挖掘 机器学习 神经网络 支持向量机 计算机视觉 物体识别
2021-09-28 21:30:10

如何计算 Pascal VOC 排行榜检测任务的 mAP(平均平均精度)?

那里说-在第11页

平均精度 (AP)。对于 VOC2007 挑战,使用插值平均精度(Salton 和 Mcgill 1986)来评估分类和检测。对于给定的任务和类,精度/召回曲线是根据方法的排序输出计算的。召回率定义为排名高于给定排名的所有正例的比例。精度是所有高于该等级的示例中来自正类的比例。AP 总结了精度/召回曲线的形状,并定义为一组 11 个等间距召回级别 [0,0.1,...,1] 的平均精度: AP = 1/11 ∑ r∈{0,0.1,...,1} pinterp(r)

每个召回级别 r 的精度是通过对相应召回率超过 r: 的方法测量的最大精度进行插值的pinterp(r) = max p(r˜),其中 p(r~) 是在召回率 ~r 处测量的精度

关于mAP


这是否意味着:

  1. 我们计算 Precision 和 Recall
  • A)对于许多不同IoU > {0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1}的我们计算真/假阳性/阴性值

    其中True positive = Number_of_detection with IoU > {0, 0.1,..., 1},如这里所说,然后我们计算:

    Precision = True positive / (True positive + False positive)

    Recall = True positive / (True positive + False negative)


  • B)或者对于我们计算的许多不同的检测算法阈值:

    Precision = True positive / (True positive + False positive)

    Recall = True positive / (True positive + False negative)

    这里True positive = Number_of_detection with IoU > 0.5所说


  • C)或者对于我们计算的许多不同的检测算法阈值:

    Precision = Intersect / Detected_box

    Recall = Intersect / Object

    如图 所示在此处输入图像描述


  1. 然后我们构建 Precision-Recall 曲线,如下所示: 在此处输入图像描述

  1. 然后我们将 AP(平均精度)计算为 11 个值的平均值PrecisionRecall = {0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1}AP = 1/11 ∑ recall∈{0,0.1,...,1} Precision(Recall)

(通常对于每个点,例如 0.3,我们得到 MAX of Precision for Recall <= 0.3,而不是此时 Recall=0.3 的 Precision 值)


  1. 当我们只为所有图像上的 1 个对象类计算 AP 时,我们会得到这个类的AP(平均精度),例如,仅针对air.

所以 AP 是一个积分(曲线下面积

但是当我们为所有图像上的所有对象类计算 AP 时,我们会得到所有图像数据集的mAP(平均精度)


问题:

  1. 是否正确,如果不是,那么如何计算 Pascal VOC Challenge 的 mAP?
  2. 第 1 段中的 3 个公式(A、B 或 C)中的哪一个对于计算 Precision 和 Recall 是正确的?

简短的回答:

  • mAP = AVG(每个对象类的 AP)
  • AP = AVG(11 次召回中每一次的精确度 {precision = 0, 0.1, ..., 1})
  • PR 曲线 = 精度和召回率(对于预测边界框中的每个阈值)
  • 精度 = TP / (TP + FP)
  • 召回率 = TP / (TP + FN)
  • TP = IoU>0.5 的检测次数
  • FP = IoU<=0.5 或多次检测到的检测次数
  • FN = 未检测到或检测到 IoU<=0.5 的对象数
2个回答

要回答您的问题:

  1. 是的,您的方法是正确的
  2. 在 A、B、C 中,正确答案是 B。

解释如下:为了在对象检测的上下文中计算平均精度 (mAP),您必须计算每个类的平均精度 (AP),然后计算所有类的平均值。这里的关键是计算每个类的 AP,一般来说,为了计算 Precision (P) 和 Recall (R),您必须定义什么是:True Positives (TP)、False Positives (FP)、True Negative (TN) 和 False负(FN)。在 Pascal VOC Challenge 的目标检测设置中:

  • TP:是联合交集 (IoU) 与基本事实 (GT) 的交集 (BB) 大于 0.5 的边界框 (BB)
  • FP:两种情况 (a) BB 与 GT 的 IoU 低于 0.5 (b) BB 与已检测到 GT 的 IoU。
  • TN:不存在真负片,图像预计至少包含一个物体
  • FN:该方法未能产生 BB 的那些基本事实

现在每个预测的 BB 都有给定类的置信度值。因此,评分方法按置信度降序对预测进行排序,并计算每个可能的排名 k = 1 的 P = TP / (TP + FP) 和 R = TP / (TP + FN),直至预测的数量。所以现在每个等级都有一个 (P, R),那些 P 和 R 是“原始”精确召回曲线。要计算 R 的每个值的插值 PR 曲线,请选择具有相应 R' >= R 的最大 P。

根据voc devkit doc有两种不同的方式来采样 PR 曲线点。对于 2010 年之前的 VOC Challenge,我们选择任意 R' >= R 获得的最大 P,其中 R 属于 0、0.1、...、1(11 个点)。然后,AP 是每个召回阈值的平均精度。对于 2010 年及之后的 VOC 挑战赛,我们仍然为任何 R' >= R 选择最大 P,而 R 属于所有唯一的召回值(包括 0 和 1)。AP就是PR曲线下的面积大小。请注意,如果您没有 P 值且 Recall 高于某些阈值,则 Precision 值为 0。

例如,考虑给定类“Aeroplane”的方法的以下输出:

BB  | confidence | GT
----------------------
BB1 |  0.9       | 1
----------------------
BB2 |  0.9       | 1
----------------------
BB3 |  0.7       | 0
----------------------
BB4 |  0.7       | 0
----------------------
BB5 |  0.7       | 1
----------------------
BB6 |  0.7       | 0
----------------------
BB7 |  0.7       | 0
----------------------
BB8 |  0.7       | 1
----------------------
BB9 |  0.7       | 1
----------------------

此外,它没有在两幅图像中检测到边界框,所以我们有 FN = 2。上表是方法 GT = 1 的预测的置信度排序排序,表示是 TP 和 GT = 0 FP。所以 TP=5(BB1、BB2、BB5、BB8 和 BB9),FP=5。对于 rank=3 的情况,精度下降,因为 BB1 已经被检测到,所以即使对象确实存在,它也算作 FP。.

rank=1  precision=1.00 and recall=0.14
----------
rank=2  precision=1.00 and recall=0.29
----------
rank=3  precision=0.66 and recall=0.29
----------
rank=4  precision=0.50 and recall=0.29
----------
rank=5  precision=0.40 and recall=0.29
----------
rank=6  precision=0.50 and recall=0.43
----------
rank=7  precision=0.43 and recall=0.43
----------
rank=8  precision=0.38 and recall=0.43
----------
rank=9  precision=0.44 and recall=0.57
----------
rank=10 precision=0.50 and recall=0.71
----------

给定前面的结果:如果我们使用voc2010之前的方式,插值后的Precision值为1,1,1,0.5,0.5,0.5,0.5,0.5,0,0,0。那么AP = 5.5 / 11 = 0.5为“飞机”类。否则,如果我们使用自 voc2010 以来的方式,对于 0、0.14、0.29、0.43、0.57、0.71、1 的七个唯一召回,插值精度值为 1、1、1、0.5、0.5、0.5、0。然后 AP = (0.14-0)*1 + (0.29-0.14)*1 + (0.43-0.29)*0.5 + (0.57-0.43)*0.5 + (0.71-0.57)*0.5 + (1-0.71)*0 = 0.5 “飞机”类。

对每个班级重复一次,然后你就有了(mAP)。

更多信息可在以下链接1、2找到您还应该查看论文:PASCAL Visual Object Classes Challenge: A Retrospective以获得更详细的解释。

在我的Github上有一个很好的详细解释和易于使用的代码
当然,它会帮助你们。