目标检测和图像分类到底有什么区别
目标检测和图像分类到底有什么区别
拿一张街道照片给模型看,照片里有汽车、行人,还有路边的自行车。
如果模型回答“这是一张街景照片”,它做的可能是图像分类;如果模型把汽车、行人和自行车分别框出来,并在框旁边写上类别,它做的就是目标检测。
看起来只差了几个框,实际做项目时,数据怎么标、模型怎么训练、效果怎么评估,都会跟着变。
区别在于,你想让模型交出什么结果
图像分类把整张图片作为一个判断对象,输出图片所属的类别。
比如判断一张产品照片是“合格”还是“不合格”,或者把照片分成“室内”“街道”“自然风景”。在常见的单标签分类任务中,模型会为各个类别给出分数,再选出得分最高的类别作为预测结果。
目标检测的输出则是一组目标。每个目标通常包含类别、置信度和边界框位置。一张图片可能没有符合条件的目标,也可能有十几个。常见检测框架的输出接口,就是围绕这些信息组织的。
假设照片里有两只猫和一只狗,两种任务的结果可以写成:
图像分类:
猫
目标检测:
猫,0.96,边界框 [30, 40, 180, 220]
猫,0.91,边界框 [210, 60, 350, 230]
狗,0.94,边界框 [380, 90, 590, 360]
这里的坐标只是示意,采用的是左上角和右下角坐标。不同工具也可能使用中心点、宽度和高度,不能拿到四个数字就默认它们的含义一样。
还有一个容易混淆的地方:分类并不只能输出一个类别。
多标签分类可以同时判断图片里有“猫”和“狗”,但一般不会告诉你有几只猫、每只猫在哪里。检测则需要把不同的目标实例区分开。
所以,“能不能识别多个类别”并不是两者最关键的分界。关键在于,结果是针对整张图片,还是针对图片中的一个个具体目标。
多出来的几个框,需要有人教模型怎么画
两类任务的差别,在准备训练数据时就很明显。
做猫狗分类,一种常见的数据组织方式是:
dataset/
├── cat/
│ ├── 001.jpg
│ └── 002.jpg
└── dog/
├── 003.jpg
└── 004.jpg
图片放在哪个目录,就表示它对应哪个类别。这个例子默认每张图片都有明确的单一标签。
做目标检测,仅仅告诉模型“这张图里有猫”还不够。在常见的全监督训练方式下,需要标出每个目标的位置,并给每个框指定类别。TorchVision 的检测训练接口就要求提供目标框,以及与每个框对应的类别标签。
这会带来不少很具体的问题:
- 被遮挡了一半的目标,要不要标?
- 远处只有几个像素的小目标,要不要标?
- 框应该覆盖可见部分,还是推测完整范围?
- 一张图里有二十个目标,是否都按同一套规则标完了?
这些事情很琐碎,却会直接影响训练。
比如同样大小的远处行人,有些图片标了,有些图片没标。在许多常规检测训练流程中,未标注的行人区域可能被当作背景参与训练。模型一边被要求识别人,一边又因为识别出人受到惩罚,效果自然容易受影响。
因此,检测项目的成本往往不只是模型计算量。标注、检查漏标、统一边界规则,都需要时间。
模型内部,也不是简单加一个画框功能
分类模型通常先提取图像特征,再把这些特征汇总,用于判断整张图片属于哪一类。
目标检测也需要提取特征,但还要保留并利用空间信息:目标出现在什么位置,占多大范围,不同位置的目标分别是什么。
以工业质检为例,一张高分辨率的产品照片里,划痕可能只占很小一块。把整张图缩得很小后,划痕本身可能已经看不清了。此时,不管分类还是检测,都会遇到困难;而检测还需要进一步给出足够准确的位置。
这也是检测模型经常利用不同尺度特征的原因。近处的大目标和远处的小目标,在图像中占据的像素数量差别很大,只依赖单一尺度的信息不一定合适。
不过,也不能因此得出“分类简单,检测一定更慢”的结论。一个大规模分类模型,完全可能比一个轻量检测模型更耗资源。实际速度还取决于输入分辨率、模型规模、推理硬件和部署方式。
任务决定需要解决的问题,具体模型决定为此付出多少计算成本。
分类看错类别,检测还可能找错位置
分类任务最直观的指标是准确率:一批图片里,有多少张分对了。
但准确率也有盲区。假设一千张质检图片中,九百九十张都合格,模型全部预测为“合格”,准确率仍然有 99%。这个结果看起来很好,却没有找出任何不合格产品。因此,还需要结合各类别的精确率、召回率和混淆矩阵来看。
目标检测的评估更复杂一些,因为它有几种不同的错误:
| 情况 | 出了什么问题 |
|---|---|
| 把猫框成了狗 | 类别错误 |
| 类别正确,但框偏得很远 | 定位错误 |
| 图片里有目标,却没有检出 | 漏检 |
| 把背景当成了目标 | 误检 |
| 同一个目标被重复框了几次 | 重复检测 |
判断框是否准确,常用 IoU,也就是预测框与真实框的交并比:
IoU = 两个框的交集面积 ÷ 两个框的并集面积
两个框完全重合时,IoU 为 1;没有交集时,IoU 为 0。
检测评估需要按规定匹配预测框和真实目标。类别正确、重叠程度达到要求,才有机会被计为正确检测;同一个真实目标通常也不能被多个预测框重复算作正确。
常见的 mAP 指标,就是在这类匹配规则基础上,对精确率与召回率表现进行汇总。看结果时还要确认评估口径:使用 IoU 0.5 的指标,与在多个 IoU 阈值上取平均的指标,不能直接当成同一个数字比较。
这也解释了为什么“分类准确率 95%”和“检测 mAP 80%”无法直接比较。它们衡量的并不是同一件事。
该用哪个,先看业务到底需要什么
假设要做一个水果识别系统。
如果用户每次把一个水果放在固定背景上拍照,只需要知道它是苹果还是橙子,分类通常就能满足需求。
如果用户拍的是整个果盘,需要标出每一个苹果和橙子的位置,就应该考虑检测。
如果还要测量水果在图片中占据的精确面积,矩形框可能又不够了,这时需要进一步考虑分割,让模型判断哪些像素属于水果。
类似地,产品质检也不能只看“质检”两个字就决定模型类型:
| 实际需求 | 可以优先考虑的任务 |
|---|---|
| 判断整件产品是否合格 | 图像分类 |
| 找出划痕、破损分别出现在哪里 | 目标检测 |
| 描出缺陷轮廓,计算缺陷像素面积 | 图像分割 |
| 先找到零件,再判断每个零件的型号 | 检测与分类组合 |
检测和分类也经常配合使用。
例如先检测货架上的商品,把每件商品裁剪出来,再交给分类模型区分具体型号。检测负责找到商品,分类负责细分。这样拆分有时更容易准备数据,也方便分别改进两个环节。
但它也有代价:前面的检测一旦漏掉商品,后面的分类就没有机会处理;如果裁剪框切掉了包装上的关键信息,分类也可能出错。
会画框,不代表业务已经做完了
目标检测能给出每一帧里的目标,但不自动解决跨帧身份问题。
比如监控画面中,同一个人连续出现一百帧,如果把每帧检测到的人数直接相加,就会把这个人重复计算。统计进店人数,通常还需要结合跟踪、过线规则和去重逻辑。
分类也有类似的边界。模型可以判断图片属于哪个已知类别,却不意味着它一定能识别“不属于任何已知类别”的情况。一个只训练过苹果和橙子的分类器,看到杯子时,也可能给出一个看起来很肯定的结果。
真正开始做项目时,不妨先把期望输出写出来:只要一个类别,还是需要一组带位置的目标?需要统计当前画面中的数量,还是一天内出现过的不同对象?需要矩形范围,还是精确轮廓?
这些问题回答清楚了,分类、检测以及后续处理各自该承担什么工作,也就清楚了。
- 点赞
- 收藏
- 关注作者
评论(0)