mAP 相关问题、文章有很多,但都是讲的很模糊,甚至还有错误,真是看不下去 (ノ`Д) ノ

这边我推荐 StackExchange 上的一个问题及其答案:
Ps: 这个答案我两天前编辑过,结合例子讲解了 VOC10 以前和以后两种 mAP 计算方法

[How to calculate mAP for detection task for the PASCAL VOC Challenge?(https://link.zhihu.com/?target=https%3A//datascience.stackexchange.com/questions/25119/how-to-calculate-map-for-detection-task-for-the-pascal-voc-challenge)

为了方便浏览,在这也提供答案的中文概要:

mAP 定义及相关概念

  • mAP: mean Average Precision, 即各类别 AP 的平均值
  • AP: PR 曲线下面积,后文会详细讲解
  • PR 曲线: Precision-Recall 曲线
  • Precision: TP / (TP + FP)
  • Recall: TP / (TP + FN)
  • TP: IoU>0.5 的检测框数量(同一 Ground Truth 只计算一次)
  • FP: IoU<=0.5 的检测框,或者是检测到同一个 GT 的多余检测框的数量
  • FN: 没有检测到的 GT 的数量

mAP 的具体计算

由前面定义,我们可以知道,要计算 mAP 必须先绘出各类别 PR 曲线,计算出 AP。而如何采样 PR 曲线,VOC 采用过两种不同方法。参见:The PASCAL Visual Object Classes Challenge 2012 (VOC2012) Development Kit

在 VOC2010 以前,只需要选取当 Recall >= 0, 0.1, 0.2, …, 1 共 11 个点时的 Precision 最大值,然后 AP 就是这 11 个 Precision 的平均值。

在 VOC2010 及以后,需要针对每一个不同的 Recall 值(包括 0 和 1),选取其大于等于这些 Recall 值时的 Precision 最大值,然后计算 PR 曲线下面积作为 AP 值。

mAP 计算示例

假设,对于Aeroplane类别,我们网络有以下输出 (BB 表示 BoundingBox 序号,IoU>0.5 时 GT=1):

  1. BB | confidence | GT
  2. ----------------------
  3. BB1 | 0.9 | 1
  4. ----------------------
  5. BB2 | 0.9 | 1
  6. ----------------------
  7. BB1 | 0.8 | 1
  8. ----------------------
  9. BB3 | 0.7 | 0
  10. ----------------------
  11. BB4 | 0.7 | 0
  12. ----------------------
  13. BB5 | 0.7 | 1
  14. ----------------------
  15. BB6 | 0.7 | 0
  16. ----------------------
  17. BB7 | 0.7 | 0
  18. ----------------------
  19. BB8 | 0.7 | 1
  20. ----------------------
  21. BB9 | 0.7 | 1
  22. ----------------------

因此,我们有 TP=5 (BB1, BB2, BB5, BB8, BB9), FP=5 (重复检测到的 BB1 也算 FP)。除了表里检测到的 5 个 GT 以外,我们还有 2 个 GT 没被检测到,因此: FN = 2. 这时我们就可以按照 Confidence 的顺序给出各处的 PR 值,如下:

  1. rank=1 precision=1.00 and recall=0.14
  2. ----------
  3. rank=2 precision=1.00 and recall=0.29
  4. ----------
  5. rank=3 precision=0.66 and recall=0.29
  6. ----------
  7. rank=4 precision=0.50 and recall=0.29
  8. ----------
  9. rank=5 precision=0.40 and recall=0.29
  10. ----------
  11. rank=6 precision=0.50 and recall=0.43
  12. ----------
  13. rank=7 precision=0.43 and recall=0.43
  14. ----------
  15. rank=8 precision=0.38 and recall=0.43
  16. ----------
  17. rank=9 precision=0.44 and recall=0.57
  18. ----------
  19. rank=10 precision=0.50 and recall=0.71
  20. ----------

对于上述 PR 值,如果我们采用:

  1. VOC2010 之前的方法,我们选取 Recall >= 0, 0.1, …, 1 的 11 处 Percision 的最大值:1, 1, 1, 0.5, 0.5, 0.5, 0.5, 0.5, 0, 0, 0。此时Aeroplane类别的 AP = 5.5 / 11 = 0.5
  2. VOC2010 及以后的方法,对于 Recall >= 0, 0.14, 0.29, 0.43, 0.57, 0.71, 1,我们选取此时 Percision 的最大值:1, 1, 1, 0.5, 0.5, 0.5, 0。此时Aeroplane类别的 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 就是对每一个类别都计算出 AP 然后再计算 AP 平均值就好了

更多信息

建议参考 GluonCV 库里面的 voc_detection.py 实现了两种 mAP 计算方式,思路清晰:

https://github.com/dmlc/gluon-cv/blob/master/gluoncv/utils/metrics/voc_detection.pygithub.com
https://www.zhihu.com/question/53405779
https://www.zhihu.com/question/53405779