[目标检测][PASCAL VOC]mAP

对于目标检测算法而言,mAP(mean average precision)是最常用的评价指标了。关于如何计算mAP,不同的数据集提供了不同的实现方式,其中最常用的就是PASCAL VOC数据集的mAP计算,网上有很多相关的资料,看了很多还是感觉不理解,所以打算好好记录一下

相关实现:zjykzj/vocdev

PASCAL VOC mAP

PASCAL VOC数据集的AP计算经历了两个版本,参考

mAP就是多个AP的平均值

版本一:07

计算得到不同置信度阈值下的PrecisionRecall后,均匀采样11recall值(recall = [0, 0.1, 0.2, ..., 1])对应的精度值,然后求和进行平均

版本二:12

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

绘制出平滑后的PR曲线后,用积分的方式计算平滑曲线下方的面积作为最终的AP值

\[ AP = \int _{0}^{1} p_{smooth}(r)dr \]

TP

Multiple detections of the same object in an image are considered false detections e.g. 5 detections of a single object is counted as 1 correct detection and 4 false detections - it is the responsibility of the participant's system to filter multiple detections from its output.

图像中每个目标仅有一个被认定为True Positive,其余的都是False Positive

Precision/Recall

最关键的是如何有效定义目标检测下的Precision/Recall,其实现公式如下:

\[ Precisoin = \frac {TP}{TP+FP} \ Recall = \frac {TP}{TP+FN} \]

在目标检测中有两个超参数:

  1. 置信度阈值:判断预测边界框是否为positive
  2. IoU:判断预测边界框是否为true/false

假定对于某一类目标而言,存在\(N\)个真值边界框,共检测得到了\(M\)个候选边界框。设置固定的最小IoU=0.5,不同的置信度阈值([0, 1])下的计算如下:

  • 此时\(M\)个候选边界框中有\(K\)个大于等于置信度阈值的候选边界框
  • K个候选边界框中存在\(H\)TP,那么\(FP = K-H\)

此时精度和召回率计算如下:

\[ Precision = \frac {H}{K} \ Recall = \frac {H}{N} \]

上述的计算是通过阅读源码理解的

实现

PASCAL VOC提供的是Matlab实现,不懂,不过幸好网上有人开源了相应的Python实现

主要研究了第一个仓库的源码,使用第二个仓库进行了验证

1
2
3
4
5
6
7
8
9
10
11
12
13
# 实现一
$ python main.py
99.18% = cucumber AP
98.72% = eggplant AP
95.30% = mushroom AP
mAP = 97.73%

# 实现二
$ python pascalvoc.py -gtformat xyrb -detformat xyrb
AP: 99.18% (cucumber)
AP: 98.72% (eggplant)
AP: 95.30% (mushroom)
mAP: 97.73%

不过两个仓库的实现都包含了绘制PR图像的功能,同时还存在一些代码排版的问题,所以自定义了一个仓库,仅实现mAP的计算

相关文档