
1. 目标检测评估指标入门从P-R曲线说起第一次接触目标检测时我最困惑的就是怎么知道模型好不好。记得2016年用YOLOv1做车牌检测看着屏幕上跳动的检测框完全不知道该怎么量化评估效果。直到导师扔给我一篇讲P-R曲线的论文才算是摸到了门道。**精确率(Precision)和召回率(Recall)**这对指标本质上是在回答两个关键问题模型认为是目标的检测框中有多少是真的精确率所有真实目标中模型找出了多少召回率举个实际案例假设我们在监控视频中检测行人某帧有10个真实行人模型检测出8个框。经比对其中6个确实框住了行人TP2个框错了FP漏检了4个行人FN这时精确率6/(62)75%召回率6/1060%。这个例子说明模型找目标还算准但漏检严重。P-R曲线的绘制过程就像在玩一个平衡游戏将所有预测框按置信度从高到低排序逐步降低置信度阈值每次计算对应的P/R值在坐标系中描点连线我用PyTorch实现时发现个有趣现象当阈值设为最高时可能只有1-2个最高置信度的预测框被保留。这时精确率往往很高因为都是最确信的预测但召回率极低。随着阈值降低召回率上升精确率则可能波动下降。# 简化版P-R曲线绘制代码 def plot_pr_curve(scores, labels): # scores: 预测置信度数组 # labels: 对应是否匹配到GT的标记(1/0) indices np.argsort(-scores) tp np.cumsum(labels[indices]) fp np.cumsum(1 - labels[indices]) precision tp / (tp fp) recall tp / len(labels) plt.plot(recall, precision)2. AP的演进从VOC到COCO的标准之争第一次计算AP时我踩过一个经典坑直接对原始P-R曲线取平均。后来才知道PASCAL VOC 2007采用的是11点插值法——在0到1之间均匀取11个recall点取各点对应的最大precision求平均。# VOC07风格AP计算 def voc_ap(rec, prec): ap 0. for t in np.arange(0., 1.1, 0.1): if np.sum(rec t) 0: p 0 else: p np.max(prec[rec t]) ap p / 11. return ap但这种方法在2010年后被全点插值法取代。新方法更合理对每个recall值r取所有recallr时的最大precision。这相当于用包络线计算曲线下面积。COCO数据集的评估则更加严格使用IoU阈值从0.5到0.95步长0.05的多尺度评估对大小不同的目标分别计算APAP_small, AP_medium, AP_large引入AR平均召回率指标实测发现同一个模型在VOC和COCO标准下的mAP可能相差20%以上。比如Faster R-CNN在VOC07上能达到70%的mAP但在COCO上可能只有40%左右。3. mAP的计算艺术与实战技巧在计算mAP时最让人头疼的是重复检测的处理。根据标准每个GT框只能匹配一个预测框选择最高IoU且阈值的多余的匹配会被记为FP未匹配的GT框会计入FN这里有个实用技巧使用匈牙利算法进行最优匹配。我在实现时发现简单的贪婪算法按置信度降序匹配效果也不错def match_detections(gts, preds, iou_thresh0.5): # gts: [N,4]的GT框数组 # preds: [M,5]的预测框数组(x1,y1,x2,y2,score) matched set() tp np.zeros(len(preds)) for i, pred in enumerate(preds): ious calculate_iou(pred[:4], gts) best_idx np.argmax(ious) if ious[best_idx] iou_thresh and best_idx not in matched: tp[i] 1 matched.add(best_idx) fp 1 - tp return tp, fp实际项目中我发现这些细节会显著影响结果小目标检测时适当降低IoU阈值比如0.3密集场景中NMS的阈值设置很关键不同类别的AP差异可能很大需要单独分析4. 评估指标与模型优化的闭环理解mAP的计算逻辑后就能针对性优化模型。比如召回率低可以调整RPN的anchor设置或增加正样本数量精确率低可能需要加强分类器或改进后处理小目标AP低尝试多尺度训练或特征金字塔在最近的车牌识别项目中我们通过分析PR曲线发现模型对倾斜车牌召回很差。于是增加了旋转增强数据使mAP提升了8个百分点。常见误区提醒不要只看mAP一个数要分析各类别AP验证集和测试集的指标差距过大可能是过拟合COCO的mAP[.5:.95]比mAP0.5更能反映模型鲁棒性记得某次调参时mAP反而下降了0.3%但实际部署效果却变好了。后来发现是因为新参数减少了FP虽然mAP略降但用户体验提升。这说明指标要结合实际场景来看。