第15讲 | YOLO26评估与误差分析:Precision、Recall、mAP与错例
先看懂指标,再定位错例,最后决定怎么改模型
整理说明:本文基于 B 站公开视频《第15讲 YOLO26评估与误差分析:Precision、Recall、mAP与错例》
很多同学卡在这一讲,不是因为 Precision、Recall、mAP 真的难,而是因为它们常被当成孤立数字记。
本篇只解决一个核心问题:模型训完以后,怎么判断它到底哪里好、哪里坏、下一步该改什么?
01 先把痛点说透
评估不是为了“报一个分数”,而是为了把问题拆开。
| 现象 | 常见信号 | 优先看什么 |
|---|---|---|
| 误检多 | Precision 低 | 置信度阈值、背景干扰、负样本 |
| 漏检多 | Recall 低 | 漏标、小目标、阈值太高 |
| 框不准 | mAP50 高但 mAP50-95 低 | 定位质量、IoU、标注质量 |
| 某一类特别差 | per-class AP 很低 | 类别混淆、样本不平衡、标注一致性 |
评估的本质不是“模型行不行”,而是“错误主要来自哪里”。
如果你只盯着一个 mAP,往往只能知道“差”,却不知道“差在什么地方”。
02 核心概念先说准
目标检测评估最先要分清三件事:
| 名称 | 含义 |
|---|---|
| TP | 预测对了,而且框和类别都匹配 |
| FP | 预测出来了,但其实是错的 |
| FN | 真实目标存在,但模型没找出来 |
先看两个最常用指标:
Precision = TP / (TP + FP) Recall = TP / (TP + FN)它们回答的是两个不同的问题:
- Precision:你报出来的框,有多少是真的。
- Recall:真实存在的目标,你找到了多少。
再看 IoU。IoU 是预测框和真值框的重叠程度。对检测来说,类别对了不够,IoU 不达标也不算 TP。
Precision 和 Recall 的直觉
| 指标 | 高了说明什么 | 低了说明什么 |
|---|---|---|
| Precision | 误检少 | 背景容易被当成目标 |
| Recall | 漏检少 | 目标经常被错过 |
mAP 是什么
AP 可以理解成“某一类在不同置信度阈值下的 P-R 曲线面积”。
mAP 就是把各类 AP 再平均一次。
| 指标 | 解释 |
|---|---|
| mAP50 | IoU = 0.50 时的 AP 平均值 |
| mAP50-95 | IoU 从 0.50 到 0.95,每 0.05 取一个阈值后再平均 |
| per-class AP | 每一类单独的 AP |
所以:
- mAP50 看的是“有没有大致找对”
- mAP50-95 看的是“框得准不准”
03 用一个小例子跑通机制
假设一张验证集里有 4 个真实目标,模型给出 5 个预测框:
| 预测框 | 置信度 | IoU | 判定 |
|---|---|---|---|
| A | 0.96 | 0.82 | TP |
| B | 0.91 | 0.76 | TP |
| C | 0.74 | 0.41 | FP |
| D | 0.68 | 0.73 | TP |
| E | 0.33 | - | FP |
当阈值取 0.50
保留 A、B、C、D:
- TP = 3
- FP = 1
- FN = 1
Precision = 3 / (3 + 1) = 0.75 Recall = 3 / (3 + 1) = 0.75当阈值取 0.90
只保留 A、B:
- TP = 2
- FP = 0
- FN = 2
Precision = 2 / (2 + 0) = 1.00 Recall = 2 / (2 + 2) = 0.50这就是为什么阈值一高,Precision 常常上升,Recall 常常下降。
AP 做的事,就是把不同阈值下的这些点串起来,再算面积。
所以你看见 PR 曲线时,别把它当“装饰图”,它就是模型取舍关系的压缩图。
04 配套代码练习
1. 先跑一个纯 Python 的阈值扫表
完整代码见:code_snippets/01_threshold_tradeoff.py
这个小脚本不依赖深度学习框架,先帮你看懂“阈值变化为什么会改 Precision / Recall”。
2. 再跑一次 Ultralytics 验证
完整代码见:code_snippets/02_ultralytics_val.py
fromultralyticsimportYOLO model=YOLO("best.pt")# 换成你自己的权重metrics=model.val(data="custom.yaml",imgsz=640,conf=0.25,iou=0.7,plots=True,)print("Precision:",metrics.box.mp)print("Recall:",metrics.box.mr)print("mAP50:",metrics.box.map50)print("mAP50-95:",metrics.box.map)print("Per-class AP:",metrics.box.maps)你重点看这几个值就够了:
| 字段 | 说明 |
|---|---|
metrics.box.mp | 平均 Precision |
metrics.box.mr | 平均 Recall |
metrics.box.map50 | mAP@0.50 |
metrics.box.map | mAP@0.50:0.95 |
metrics.box.maps | 每个类别的 AP |
如果plots=True,通常会生成 PR 曲线、混淆矩阵和验证可视化图,先看这些,再看数字。
05 常见误区和排查清单
先按症状查
| 现象 | 优先怀疑 |
|---|---|
| Precision 低 | 置信度太低、背景太像目标、负样本不足 |
| Recall 低 | 漏标、小目标多、阈值太高、NMS 太狠 |
| mAP50 高但 mAP50-95 低 | 框能找对,但定位不稳 |
| 某一类 AP 特别差 | 类别不平衡、类间相似、标注不一致 |
| PR 曲线很抖 | 验证集太小或标注噪声大 |
再按顺序查
1. 先查标签是否干净 2. 再查数据集分布是否平衡 3. 再查验证阈值和 NMS 4. 再看 PR 曲线和混淆矩阵 5. 最后抽错例图,定位到底是漏检、误检还是框不准如果你只记一句话:
Precision 看误检,Recall 看漏检,mAP 看整体,错例看下一步怎么改。
06 复盘
这讲最重要的,不是把名词背下来,而是把下面三件事连起来:
- 指标怎么读。
- 错例怎么分。
- 问题该怎么改。
换句话说,评估不是终点,而是下一轮优化的起点。
回复:YOLO评估我会建议你先做三件小事:
- 跑一次
model.val(...) - 截一张 PR 曲线和混淆矩阵
- 随机翻 20 张错例图
这样你就会发现,很多“模型不行”的判断,其实只是“还没把问题拆开”。
写在最后
学术因方向、个人实验和写作能力以及具体创新内容的不同而无法做到一通百通,关注UP:Ai学术叫叫兽
在所有资料中留下联系方式以便在科研之余为家人们答疑解惑,本up主获得过国奖,发表多篇SCI,擅长目标检测领域,拥有多项竞赛经历,拥有软件著作权,核心期刊等经历。
因为经历过所以更懂小白的痛苦!
因为经历过所以更具有指向性的指导!
祝所有科研工作者都能够在自己的领域上更上一层楼!