当我们说 YOLO 是"目标检测模型"时,它到底在解决什么任务?
这一篇的重点不是模型结构,也不是代码,而是先把任务边界讲清楚。
一、同样是处理图片,不同任务问的问题完全不同
假设现在有一张街景图,里面有:
-
行人
-
自行车
-
汽车
-
路边建筑
那么不同任务会这样提问:
1. 图像分类
它更像是在问:
这张图主要是什么?
比如模型最后可能给出一个结果:
-
street
-
traffic
-
outdoor
它给的是整张图的一个整体标签。
2. 目标检测
它问的不再是"整张图主要是什么",而是:
图里有哪些目标?它们分别在哪里?
比如它可能输出:
-
person:在左边这个框里
-
bicycle:在中间这个框里
-
car:在右边这个框里
也就是说,检测的输出不只是类别,还包括位置。
3. 图像分割
它比检测还进一步,问的是:
哪些像素属于哪个目标?
检测只是用矩形框大致圈出来。
分割则希望更精细地分出目标区域,比如把"人"的轮廓、"车"的车身、"树"的树冠精确分开。
所以你可以先记住一句很重要的话:
分类看整张图,检测看多个目标,分割看目标区域。
二、图像分类在做什么:给整张图一个总答案
分类是最容易理解的视觉任务之一。
它的基本形式就是:
-
输入:一张图
-
输出:一个类别,或者若干类别的概率
比如:
-
输入一张猫的照片,输出
cat -
输入一张苹果图片,输出
apple -
输入一张路面场景图,输出
street
可以把分类理解成:
给整张图打一个总标签。
1. 分类的优点
它的任务定义简单,标签制作也相对容易。一张图通常只需要一个类别标签。
2. 分类的局限
它不擅长回答下面这些问题:
-
图里有几只猫?
-
每只猫分别在哪里?
-
图里同时出现了猫和狗怎么办?
因为分类的输出通常只是整张图的整体判断。它默认不关心每个具体目标的位置。
所以如果任务是"识别这张图是不是猫",分类很好用。
但如果任务是"把图里的所有猫都找出来并标位置",分类就不够了。
三、目标检测在做什么:不仅要知道是什么,还要知道在哪里
目标检测比分类多了一层要求:
模型不仅要识别目标类别,还要给出目标的位置。
所以检测任务的输出,通常至少包含三类信息:
1. 位置(box)
目标在图中的范围,一般用一个矩形框来表示。
2. 类别(class)
这个框里是什么,比如:
-
person
-
dog
-
car
-
bicycle
3. 置信度(score / confidence)
模型对自己这次判断有多有把握。
比如一条检测结果可以理解成:
-
类别:person
-
位置:左边这个框
-
分数:0.96
这表示:
模型认为左边这个框里是一个人,而且把握比较高。
四、为什么 YOLO 的结果图上会有很多框
因为检测任务本来就允许一张图里有多个答案。
如果一张图里有:
-
3 个人
-
1 辆车
-
1 只狗
那么正确输出本来就不应该是一个单独标签。它应该是多条检测结果。
也就是说:
-
每个目标对应一条结果
-
每条结果包含位置、类别、置信度
所以你看到很多框,不是异常现象,而是检测任务本身决定的。
这一点和分类任务非常不同:
-
分类更像单选题:给整张图一个答案
-
检测更像综合题:把图里所有目标都找出来,并标出位置
五、为什么目标检测比分类更难
1. 目标个数不固定
分类通常只给整张图一个答案。
检测必须面对一个更复杂的问题:
这张图里到底有几个目标?
而且这个数量不是固定的:
-
有的图里只有 1 个目标
-
有的图里可能有十几个
-
有的图里目标还会互相遮挡
这就比分类复杂得多。
2. 位置也要预测
分类只回答"是什么"。
检测还要回答"在哪里"。
一旦加上位置,标签就不再只是一个类别名。
它还要包含框坐标。
这意味着模型不只是在做识别,它还在做一种"位置回归"。
3. 目标大小差异大
现实场景里,目标大小往往差很多:
-
近处的车很大
-
远处的车很小
-
一个人可能占画面很大一块
-
也可能只占几十个像素
所以检测模型必须同时兼顾:
-
大目标
-
小目标
-
密集目标
-
遮挡目标
六、分割又比检测多做了什么
如果说检测是在回答:
"目标是什么,大概在哪。"
那么分割是在回答:
"目标是什么,而且它精确覆盖了哪些像素。"
1. 检测的框是矩形
矩形框的优点是:
-
表达简单
-
标注方便
-
训练和推理效率高
但它也有局限:
-
框只能粗略圈住目标
-
它不等于目标真实轮廓
比如一棵树、一只趴着的猫、一个弯曲物体,
用矩形框只能大致圈住,不能精确贴合轮廓。
2. 分割更细
分割希望模型输出一个 mask(掩膜),告诉你:
-
哪些像素属于目标
-
哪些像素不属于目标
所以同样是"车":
-
检测:告诉你车在这个框里
-
分割:告诉你车身具体覆盖了哪些区域
因此,分割比检测更细,但一般也更复杂。
七、YOLO 的经典定位:高效做目标检测
把分类、检测、分割的边界理顺之后,就能更准确地理解 YOLO 的定位。
YOLO 最经典、最核心的能力,就是高效完成目标检测。
也就是说,它最典型的输出形式是:
-
多个目标框
-
每个框对应一个类别
-
每个框对应一个分数
所以后面看到 YOLOv8 结果图时,最先要读懂的不是"结构有多复杂",而是:
-
这些框代表什么
-
这些标签代表什么
-
这些分数代表什么
因为这正是检测任务的输出本体。
八、目标检测的数据标注为什么比分类更麻烦
这一点也是很多人真正开始做项目时才会体会到的。
1. 分类的标签比较简单
一张图对应一个类别,通常就够了。
例如:
-
cat -
dog -
car
2. 检测的标签更复杂
因为一张图里可能有多个目标,
所以它的标签不再是一个单独类别,而更像是一组列表。
每个目标通常都要记录:
-
类别
-
位置
位置一般用下面两种方式之一表示:
写法 1:左上角 + 右下角
x1, y1, x2, y2
写法 2:中心点 + 宽高
cx, cy, w, h
不管写法怎么变,本质都一样:
都在描述这个矩形框在哪里、有多大。
3. 为什么这会更难
因为你不只是告诉模型"图里有猫",
你还要告诉它:
-
哪一块区域是猫
-
哪一块区域是狗
-
它们分别在哪里
所以目标检测的数据准备比分类费力得多。
九、把三种任务放在一起对比
分类
-
输入:一张图
-
输出:一个类别或若干类别概率
-
关键问题:这张图主要是什么
检测
-
输入:一张图
-
输出:多个目标框 + 类别 + 分数
-
关键问题:图里有什么、在哪里
分割
-
输入:一张图
-
输出:目标区域掩膜 + 类别
-
关键问题:哪些像素属于哪个目标
十、容易混淆的点
1. 分类、检测、分割都在处理图像,但不是一回事
它们不是按"图像输入"来区分的,而是按"输出目标"来区分的。
2. 检测标签不只是类别
检测任务里,位置本身就是标签的一部分。所以框不是装饰,而是监督信息。
3. 分割不是"高级版框"
它不是把框画得更仔细,而是从矩形框升级到像素级区域表达。
十一、本篇小结
-
分类:给整张图一个总标签
-
检测:给多个目标的类别和位置
-
分割:给目标的精细区域
因此,YOLOv8 之所以重要,不是因为它只是"会看图",而是因为它属于目标检测这条路线,解决的是:
图里有哪些目标,它们分别在哪里