YOLOv7 mAP@0.5 与 mAP@0.5:0.95 区别:为什么前者和后者能差出 20 个点?
【免费下载链接】yolov7Implementation of paper - YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors项目地址: https://gitcode.com/GitHub_Trending/yo/yolov7
上次同事问我:明明 mAP@0.5 涨了 2 个点,为什么上线后框的位置反而越飘越远?答案多半藏在指标选择里——这就是两个评估口径的差别,即 YOLOv7 mAP@0.5 与 mAP@0.5:0.95 区别。下面用十分钟把这两个数讲透。
先建立直觉:30 秒看懂 IoU 及格线在判什么
先给白话翻译。IoU(交并比)就是预测框和正确答案框的重叠比例,阈值是"及格线":重叠比达到线才算"检到了"。
打个比方:面试打分表只有一题"过没过"。mAP@0.5 就是这一条线——0.5,框和真值重叠到一半就算命中,它主要回答"找没找到"。
mAP@0.5:0.95 则是十道题:0.5、0.55、…、0.95 共十条及格线,框要逐线通过,每一线各算一个 AP 再取平均。AP 就是 PR 曲线下能装下多少面积,mAP 就是各类别 AP 的均值。所以它既问"找没找到",也问"框画得紧不紧"。
代码就在 test.py,你可以看这两行:
iouv = torch.linspace(0.5, 0.95, 10).to(device) # 10 档 IoU 及格线 ap50, ap = ap[:, 0], ap.mean(1) # AP@0.5, AP@0.5:0.95看下面这张马群检测结果:有的框紧贴真值,有的框只是勉强压住马边。0.5 这条线两者都能混过去,0.95 那条线只有紧的框活下来。
整条判定链路,其实就是一条流水线:
跟着我跑一遍:评估命令怎么敲、结果目录看哪几列
在项目根目录直接敲(还没 clone 代码的话:git clone https://gitcode.com/GitHub_Trending/yo/yolov7):
python test.py --weights yolov7.pt --data data/coco.yaml --img 640 --iou 0.65评估完,结果落在runs/test/exp/:confusion_matrix.png、PR_curve.png,还有几张test_batch*_pred.jpg对比图。最值得盯的是终端那行汇总:
print(pf % ('all', seen, nt.sum(), mp, mr, map50, map))其中map50对应 mAP@0.5,map对应 mAP@0.5:0.95;mp、mr是各类平均的精确率与召回率。注意--iou 0.65是 NMS 去重阈值,不是评估用的 IoU 线。加上--verbose还会逐类输出,方便你揪出薄弱类别。
做模型对比或看论文时,常被贴出来的 AP 对比图,用的正是后者的口径:
一张表 + 一句口诀:什么时候该看哪个 mAP
| mAP@0.5 | mAP@0.5:0.95 | |
|---|---|---|
| 及格线 | 一条(0.5) | 十条(0.5→0.95,步长 0.05) |
| 主要考什么 | 找没找到(召回) | 框画得紧不紧(定位) |
| 对定位漂移的敏感度 | 低 | 高 |
| 适合什么场景 | 快速迭代、初筛 | 论文对比、最终选型 |
口诀记一句:初筛看 0.5,选型看 0.95;两数差值拉大,先查定位再庆功。
别急着下结论:mAP@0.5 涨了不等于模型变好了。差值(map50 - map)保持平稳甚至缩小,才说明框真的画得越来越紧。
踩坑实录:mAP 差值过大先查什么 ⚠️
坑一:只盯 mAP@0.5,定位漂移被平均掉
- 现象:训练日志一路向好,上线后框却明显偏大,点击落点偏移。
- 原因:0.5 这条线太宽松,框偏掉近一半也照样算命中,"找到了"的分数把"画得紧"掩盖了。
- 解法:实验日志里同时记
map50 - map;健康模型通常差 10-20 个点,差值越拉越大,就先查定位损失和 cfg/training/yolov7.yaml 里的锚框配置。
坑二:v5_metric 与 v7_metric 口径没对齐
- 现象:自己跑出来的数和 YOLOv5 官方结果对不上,怀疑代码有 bug。
- 原因:utils/metrics.py 里的
compute_ap有两套口径——默认在召回曲线尾部补recall[-1] + 0.01(YOLOv7 默认口径);加--v5-metric则补 1.0,把最大召回当满分。 - 解法:对比数字前别换开关;要和 YOLOv5 官方对比,就显式加上
--v5-metric。
坑三:--iou是 NMS 去重,不是评估阈值
- 现象:把
--iou 0.65改成 0.6,mAP 抖了一下,怀疑模型退化了。 - 原因:它决定推理时 NMS 去重后剩几个框,和评估那十条 IoU 线是两码事。
- 解法:对比两个模型时保持该参数一致;要调就一起调,并记下这组数是在什么配置下跑出来的。
速查清单:训练完直接照做
- mAP@0.5 涨了、差值(
map50 - map)也变大 = 定位在变差,先别上线; - 快速迭代看 mAP@0.5,最终选型与论文对比看后者;
- 和别人对比结果,先问"哪个 AP 口径"(
--v5-metric开没开); - 改 NMS 或置信度阈值前,先把旧数字记下来,否则分不清是模型变了还是评估参数变了。
下一步很简单:下次训练完先跑一遍test.py,把map50和map的差值记进实验日志——超过 20 个点,就先查定位。🎯
【免费下载链接】yolov7Implementation of paper - YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors项目地址: https://gitcode.com/GitHub_Trending/yo/yolov7
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考