这一篇不再讲:
-
什么是目标检测
-
YOLOv8 在检测里处于什么位置
-
分类和检测的区别
这一篇只讲一件事:
当 YOLOv8 跑完一张图后,它到底输出了什么。
这个问题非常关键。
因为后面看预测图、看训练日志、看评估指标、看导出模型,本质上都离不开这一层。
1. 先看最终结果图,到底看到了什么
你平时看到 YOLOv8 的预测结果图,一般会有这些东西:
-
一个框
-
一个类别名
-
一个分数
比如:
person 0.91
car 0.84
dog 0.77
都会以为:
"模型直接就只输出这几个框"
其实不是。
真正的过程更像这样:
第一步:模型先产生很多候选预测
这些预测里,很多是重叠的,很多质量一般,很多甚至是错的。
第二步:再根据分数进行筛选
把明显不靠谱的预测去掉。
第三步:再做去重
把多个重复指向同一个目标的框压掉。
第四步:留下最后那几个你看到的框
这才是最后展示在图片上的结果。
所以你最后看到的图,不是模型"原始输出"的全部,而是:
原始预测 + 筛选 + 去重之后的结果
2. 一条检测结果最少包含哪几部分

图 1 一条检测结果由位置、类别和分数组成
对检测任务来说,一条结果最少可以理解成三部分:
1)位置:box
表示目标在图中的范围。
常见理解方式就是一个矩形框。
2)类别:class
表示这个框里是什么,比如:
-
person
-
car
-
dog
-
bicycle
3)分数:confidence
表示模型对这次预测有多大把握。
所以一条结果可以抽象成:
[位置, 类别, 分数]
比如:
[一个框, person, 0.91]
意思就是:
模型认为这个框里是 person,并且把握大约 0.91。
3. 框 box 到底是什么
"框"本质上是在描述一个矩形区域。
这个矩形区域至少要能回答四个问题:
-
从哪里开始
-
到哪里结束
-
有多宽
-
有多高
所以框通常要用 4 个数来描述。
4. 框的两种常见表示方法
写法一:左上角 + 右下角
通常写成:
x1, y1, x2, y2
含义是:
-
(x1, y1):左上角坐标 -
(x2, y2):右下角坐标
这个写法很好理解,因为你一看就知道框从哪到哪。
写法二:中心点 + 宽高
通常写成:
cx, cy, w, h
含义是:
-
cx:框中心点的横坐标 -
cy:框中心点的纵坐标 -
w:框宽度 -
h:框高度
这个写法在训练和标注里也很常见。
5. 为什么同一个框会有不同写法
因为:
对人来说
x1, y1, x2, y2 更直观,更好理解。
对训练或某些处理流程来说
cx, cy, w, h 有时更方便做归一化、回归和变换。
所以后面会反复看到:
-
有的地方显示角点坐标
-
有的地方显示中心点宽高
-
有的地方还是归一化后的数值
不要慌,它们本质上都在描述同一个东西:
这个矩形框在哪里,有多大。
6. 类别 class 到底是什么
类别很好理解,就是"这个框里是什么"。
但这里有一个很重要的细节:
类别不是整张图的类别,而是"这个框对应目标"的类别。
这和分类任务完全不一样。
分类里通常是一张图一个类别。
检测里是:
-
一个目标一个类别
-
一张图可能有很多目标
-
所以一张图可能对应很多类别结果
比如一张街景图里有:
-
3 个 person
-
2 辆 car
-
1 个 bicycle
那模型最后就会输出多条类别判断,而不是一个总标签。
7. 置信度 confidence 到底是什么
这是初学者最容易理解偏的一个点。
很多人把 confidence 理解成:
"它就是真实概率。"
这不够严谨。
你先把它理解成:
模型对当前这个预测有多大把握。
比如:
person 0.95
你可以先理解成:
"模型很有把握,这个框里是一个 person。"
比如:
dog 0.28
你可以先理解成:
"模型不太有把握,这个框里可能是 dog,但信心不足。"
8. 为什么需要置信度
因为模型通常不会只产生完美结果。
它会同时产生:
-
很靠谱的预测
-
一般靠谱的预测
-
很不靠谱的预测
所以分数的意义就在于:
让我们能决定,哪些结果保留,哪些结果丢掉。
这就引出了后面的一个常见操作:
置信度阈值
比如设一个阈值:
conf = 0.25
意思是:
-
小于 0.25 的预测先不要
-
大于等于 0.25 的预测保留,进入后续步骤
所以后面调参数时看到 conf,本质上就是在控制:
你想让模型"多报一点"还是"严一点再报"
9. conf 阈值调大调小,会发生什么
这是很实用的点。
conf 调小
比如从 0.5 调到 0.25
结果通常是:
-
保留下来的框更多
-
可能更容易把真正目标找出来
-
但误检也可能更多
也就是说:
更宽松。
conf 调大
比如从 0.25 调到 0.6
结果通常是:
-
留下来的框更少
-
误检可能减少
-
但漏检可能增加
也就是说:
更严格。
10. 为什么一只狗附近会出现很多框
这就是检测模型最常见的现象之一。
假设图里有一只狗。
模型可能不是只给出一个预测,而是给出很多相似的预测,比如:
dog 0.91
dog 0.88
dog 0.83
dog 0.79
这些框的位置很接近,几乎都圈在同一个目标附近。
这是正常现象。
因为模型在预测阶段,往往会对同一个目标给出多个候选结果。
如果不做处理,最后图上就会堆很多重复框。
所以必须有一步专门负责:
去掉重复框,尽量只留下最合适的那个。
这一步就是:
NMS
11. NMS 是什么
NMS 的全称是:
Non-Maximum Suppression
中文一般叫:
非极大值抑制
名字看起来很吓人,其实你可以先把它理解成一句非常朴素的话:
同一个目标附近,只保留最好的那个框。
12. NMS 到底在做什么
你可以把它理解成下面这个流程:
第一步:先看分数
把候选框按分数从高到低排序。
比如:
dog 0.91
dog 0.88
dog 0.83
dog 0.52
第二步:先保留分数最高的那个框
比如先保留:
dog 0.91
第三步:看其他框和它是不是太重叠
如果其他框和它重叠太严重,就把那些框去掉。
第四步:继续处理剩下的框
再选当前剩余框里分数最高的,再重复上面的过程。
最后你就会得到一组:
-
分数高
-
重复少
-
更干净的检测结果
13. "重叠太严重"是怎么判断的
这就要用到一个很重要的量:
IoU
IoU 是:
Intersection over Union
中文通常叫:
交并比
14. IoU 是什么意思
IoU 是用来衡量两个框重叠程度的。
它的公式是:
IoU = \\frac{两个框的交集面积}{两个框的并集面积}
你可以这样理解:
-
如果两个框完全没重叠,IoU 接近 0
-
如果两个框重叠很多,IoU 就比较大
-
如果两个框完全重合,IoU 接近 1
所以 NMS 在做判断时,常常会用一个 IoU 阈值,比如:
iou = 0.7
意思大概是:
-
如果两个框重叠太多,超过这个阈值
-
那就认为它们可能是同一个目标的重复预测
-
于是把分数低的那个压掉
15. NMS 为什么非常重要
因为如果没有 NMS,结果图可能会这样:
-
一个人头上套 5 个框
-
一辆车周围叠 8 个框
-
整张图很乱
而做完 NMS 后,结果会更像人能接受的输出:
-
一个目标保留一个主框
-
重复框减少
-
图更干净
-
后续统计也更合理
所以你以后看到:
-
重复框很多
-
框很乱
-
同一个目标被报很多次
就要想到:
是不是阈值设置有问题,或者 NMS 效果不理想。
16. 一张图从输入到最终结果,大致经历了什么
你可以先记住这个流程:
第一步:输入图片
一张图进入模型。
第二步:模型产生很多候选预测
每个候选预测可能包含:
-
框
-
类别分数
-
置信度
第三步:先按置信度筛掉一批低质量预测
太不靠谱的,先丢掉。
第四步:再做 NMS 去重
把同一目标周围的重复框压掉。
第五步:得到最后显示的结果
你在预测图上看到的,通常就是这一步后的结果。
所以整条链路可以简单写成:
原始预测 → 置信度筛选 → NMS 去重 → 最终结果
这句话你最好记住。
后面很多内容都建立在这条链上。
17. 为什么有时会出现"框对了,但类别错了"
这种情况很常见。
比如模型把一个框位置圈得挺准,
但标签写成了:
-
把狼狗认成普通狗
-
把公交车认成卡车
-
把人认成雕像
这说明两件事其实是分开的:
1)框的位置预测
模型在判断"哪里有目标"。
2)类别判断
模型在判断"这个目标是什么"。
所以有时候会出现:
-
定位还行,分类错了
-
分类差不多,框不准
-
两个都不太行
这也说明目标检测不是一个单一判断,而是多个子问题一起完成。
18. 为什么有时"明明图里有目标,却没框出来"
这种情况通常叫:
漏检
可能原因有很多,比如:
1. 置信度太低,被过滤了
目标本来被模型注意到了,但分数不够,提前被筛掉。
2. 目标太小
小目标本来就更难检测。
3. 遮挡严重
目标只露出一部分,模型不好判断。
4. 类别学习不够
训练数据不足,模型没学好这类目标。
所以没框出来,不一定表示模型"完全没看到",
也可能是它看到了,但不够确信,最后没有通过筛选。
19. 为什么有时"框很多,但很多都是错的"
这种情况通常叫:
误检
常见原因有:
1. conf 设得太低
太宽松,很多不太靠谱的结果也放进来了。
2. 背景和目标太像
比如背景纹理复杂,模型误以为那里有目标。
3. 训练数据不够干净
模型学到了不稳定特征。
4. 类间差异太小
有些类别本来就长得很像。
所以后面你调参时,看到"框太多太乱",
第一反应一般是先看:
-
conf -
iou -
数据质量
-
类别区分度
20. 本篇要记住的内容
一条检测结果至少有三部分
box + class + confidence
最终显示结果不是原始输出全部
而是:
原始预测 → 置信度筛选 → NMS 去重 → 最终结果
IoU 是看两个框重叠程度的
它常常用在 NMS 里,帮助判断:
"这两个框是不是同一个目标的重复预测。"
conf 控制保留结果的宽松程度
-
小:框更多,可能误检更多
-
大:框更少,可能漏检更多
NMS 的核心作用
同一个目标附近,只保留最好的那个框。
21. 本篇小结
YOLOv8 跑完一张图后,不是直接神奇地蹦出几个完美框。
它更像是先产生很多候选预测,再经过筛选和去重,最后留下你看到的结果。
-
框:目标在哪里
-
类别:它是什么
-
分数:模型有多大把握
-
NMS:怎么把重复框压掉
-
IoU:怎么判断两个框重叠得多不多