YOLOv8 的输出到底是什么:框、类别、置信度、NMS 一次讲清(五)

这一篇不再讲:

  • 什么是目标检测

  • 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:怎么判断两个框重叠得多不多

相关推荐
weixin_5500831520 小时前
从零实现基于YOLO的工地安全帽检测系统python复现github项目流程
yolo
mahtengdbb11 天前
GDSAFusion全局-局部双尺度自适应融合改进YOLOv26多尺度特征表达能力
人工智能·深度学习·yolo
AIoT科技物语1 天前
免费开源!50+算法,Java基于YOLO框架的视频AI识别算法平台,适配低空无人机巡检、摄像头安防场景
java·人工智能·算法·yolo·开源
前网易架构师-高司机1 天前
带标注的山体滑坡识别数据集,识别率95.4%,1848张图,支持yolo,coco json,voc xml格式,文末有模型训练代码
yolo·数据集·模型·滑坡·山体
极智视界1 天前
无人机场景 - 目标检测数据集 - 空中救援目标检测数据集下载「包含VOC、COCO、YOLO三种格式」
yolo·目标检测·数据集·voc·coco·无人机场景·空中救援
爱思考的观赏鱼1 天前
YOLO 系列:2026最新遥感检测:YOLOv11-OBB 旋转框训练、参数调优与踩坑全解析
人工智能·yolo·目标检测·机器学习·计算机视觉·目标跟踪
rabbit_pro1 天前
Mac OS/M1 Pro 搭建Yolo V5环境
人工智能·yolo
羊羊小栈1 天前
基于「YOLO目标检测 + 多模态AI分析」的增材制造粉末床熔合缺陷智能检测分析预警系统
人工智能·yolo·目标检测·计算机视觉·毕业设计·制造
QQ676580082 天前
基于yolo26算法的玉米卷叶心识别 智慧农业玉米病虫害农药丢撒识别 玉米卷心识别 玉米叶心图像识别 农作物识别第10410期
yolo·玉米卷叶心·玉米病虫害农药丢撒·玉米卷心识别·玉米叶心·农作物识别