mAP(mean Average Precision)
概述
- 预备参数:类别数,IoU阈值,maxDets值(每张测试图像最多保留maxDets个预测框,通常是根据置信度得分排序后取前maxDets个);
- Q: 假如某张测试图像只有3个预测框dt,而此时的maxDets=5,如何处理?A: 只保留这3个dt,对应代码是dt[0:maxDets]
- 根据模型输出的置信度分数,将所有预测框按从高到低排序;
- 根据IoU是否超过阈值,判断每个预测框是 T P I o U TP_{IoU} TPIoU还是 F P I o U FP_{IoU} FPIoU(TP/FP还要结合分类置信度判断);
- 不同置信度阈值对应一个Precision-Recall点,取不同置信度阈值得到 Precision-Recall 曲线;
- PR曲线下面积即为 AP(根据面积积分计算方式不同,分为VOC和COCO风格);
- 所有类别AP平均值即为mAP;如果数据集中包含多个 IoU 阈值,则需要分别计算每个 IoU 阈值下的mAP,然后取平均值,例如 mAP@[0.5:0.95] 。
背景知识
Precision 和 Recall
- Precision(精确率) :预测为正类的样本中,实际为正类的比例。
P r e c i s i o n = T r u e P o s i t i v e s ( T P ) T r u e P o s i t i v e s ( T P ) + F a l s e P o s i t i v e s ( F P ) Precision=\frac{True Positives (TP)}{True Positives (TP)+False Positives (FP)} Precision=TruePositives(TP)+FalsePositives(FP)TruePositives(TP) - Recall(召回率) :实际为正类的样本中,被正确预测为正类的比例。
R e c a l l = T r u e P o s i t i v e s ( T P ) T r u e P o s i t i v e s ( T P ) + F a l s e N e g a t i v e s ( F N ) Recall= \frac{True Positives (TP)}{True Positives (TP)+False Negatives (FN)} Recall=TruePositives(TP)+FalseNegatives(FN)TruePositives(TP)
IoU与匹配规则
- IoU :预测框与真实框的交集面积与并集面积的比值。
I o U = A r e a o f O v e r l a p A r e a o f U n i o n IoU=\frac{Area of Overlap}{Area of Union} IoU=AreaofUnionAreaofOverlap - 如果 IoU 超过某个阈值(通常为 0.5 或其他自定义值),则认为该预测框是 T P I o U TP_{IoU} TPIoU,否则为 F P I o U FP_{IoU} FPIoU。
计算 Precision-Recall 曲线
假设我们有一个简单的例子,包含以下数据:
- 总共有 5 个真实框。
- 模型输出了 5 个预测框,按置信度排序后的结果如下:
取预测框1的置信度为阈值,则TP = 1, FP = 0;Precision=1/1=1.0,Recall=1/5=0.2;
…
取预测框5的置信度为阈值,则TP = 3, FP = 2;Precision=3/5=0.6,Recall=3/5=0.6;
这5个点可以组成PR曲线。
20250520更新
Q:在计算目标检测的mAP的时候,如果当前有100个预测框,而只有5个GT。在分配TP和FP的时候,只要预测框的iou大于阈值,就认为它是TP吗?还是100个预测框按置信度降序排列,按iou分配完5个GT后,剩余的都作为FP?
A:TP和 FP 的分配不是简单地“只要预测框的 IoU 大于阈值就算 TP”,而是需要考虑 置信度排序 和 唯一匹配原则。
- 将所有预测框按照置信度得分从高到低排序
- 从得分最高的预测框开始,依次与GT进行匹配
- 如果当前预测框与某个未被匹配的 GT 框的 IoU ≥ 阈值(通常是 0.5),则这个预测框被标记为 TP,同时该 GT 框被“占用”,不能再被其他预测框匹配
- 如果没有任何未匹配的 GT 框与当前预测框的 IoU ≥ 阈值,那么这个预测框被标记为 FP
- 注意!这里的TP和FP实际对应 T P I o U TP_{IoU} TPIoU和 F P I o U FP_{IoU} FPIoU
计算 AP(曲线下面积)
- 插值处理 :为了消除 Precision 的波动,通常对 Precision 进行插值处理,即对于每个 Recall 值 r,取大于等于 r 的最大 Precision 值。
- 积分计算 :对插值后的 Precision-Recall 曲线进行积分,计算曲线下面积。常用的方法包括:
- 直接数值积分(COCO风格)
- 使用 11 点插值法(如 VOC 2007 的标准),在 Recall = [0, 0.1, 0.2, …, 1.0] 处取 Precision 值并求平均。
Recall
以COCO计算方式为例,如果是单独考虑recall指标,则指每一类下, T P I o U TP_{IoU} TPIoU和GT数量的比值。并没有考虑置信度阈值,而只考虑根据IoU匹配上来决定TP。