本节摘要:分类只回答"画面里有什么",检测要再答"在哪里、有多少个",分割则细到"每个像素属于谁"。本节讲清检测的框思路与分割的逐像素思路,并用自动驾驶、医疗影像、人脸识别几个案例串起视觉落地的完整闭环。
承接 3.3 这级跳板,本节往"更细的空间粒度"再走两步。它把第3章的卷积能力从"给整图一个标签"扩展成"给位置、给逐像素答案",并用真实案例说明怎么围绕业务搭一整条生产线。
图像分类默认画面里只有一个主角。真实世界不是这样:路边一张图里既有人又有车又有路灯。目标检测把任务升级成"找出所有感兴趣的对象、给每个画一个框并贴上类别"。难点在两点:框放多准确(用 IoU 交并比衡量——预测框和真值框重叠的程度)以及同类对象多实例不重不漏。
早年的检测要么用滑动窗口暴力扫全图(慢得吓人),要么靠区域提议先选出"像对象的地方"再交给 CNN 分类(两阶段,如 R-CNN 一系,精度高但慢)。后来的 YOLO 系把整个流程融成一次前向——把图像切成长宽网格,每个格子直接预测"中心在我的对象 + 框 + 类别",单阶段跑完,快到能用于实时视频。代价是精度略逊两阶段。选型一句话:要精度选两阶段,要实时选 YOLO 这类单阶段。
比检测更细的是分割。语义分割把每个像素贴上"人/车/路"的类别,同一类的多个对象不区分彼此;实例分割更进一步,连"这是人甲还是人乙"都要分清。语义分割的经典谜题是:把图像一路卷积压缩后,空间细节丢了,怎么把逐像素标签还原回去?答案是上采样(反卷积或转置卷积)把特征图谱放大回原尺寸,形成一个"先下采样提特征、再上采样还原"的 U 形结构——也就是 UNet 这个名字的由来。ResNet 的残差思想在这里也派上用场(跳连),好让细节信息在压缩与还原之间不至于全丢。
把检测或分割模型塞进生产,只完成了拼图的一小块。以自动驾驶为例,模型的输出只是"给每个目标的框与类别",真正上线还需要:把多传感器(摄像头、激光雷达、毫米波)的检测结果融合、按帧做目标跟踪(上一帧的车和这一帧的车的对应关系)、再按时间决策避不避让。模型只负责"前方 30 米这团像素是辆卡车",至于要不要刹车,那是下游策略的事。所以工程团队的真实分工,往往是"视觉模型给感知,策略给行动",谁也替代不了谁。
拿医疗影像看另一面:肺结节的检出率再高,也挡不住"假阳性吓人、假阴性漏诊"的代价分配问题——这类场景往往把召回率、特异性放在准确率前面的位置(回顾 2.4 的指标清单),并且必须有人工复核环节兜底。人脸识别则先做"检测框出人脸"再做"特征比对",对姿态、光照、遮挡的鲁棒性要求极高,背后同样是一整套更深的度量学习。
| 任务 | 输出粒度 | 代表思路 | 典型痛点 |
|---|---|---|---|
| 图像分类 | 整图一个标签 | CNN + Softmax | 多对象在画面里难办 |
| 目标检测 | 每个对象的框+类 | 两阶段 / YOLO 单阶段 | 框的精度与实时性 |
| 语义分割 | 每个像素的类别 | UNet 等上下采样 | 细节还原、边界光滑 |
| 实例分割 | 每个对象逐像素 | Mask R-CNN | 同类多实例区分 |
这张表也回应了第3章开篇那句"同一件工具的演化产物":卷积底座没变,变的只是"输出端怎么组织、中间怎么保留空间信息"。
用现成检测 API 的伪型代码感受"图进 → 框/类出"的流程,放在脑子里当思维模板:
# 概念示意:检测其实就是一次前向 + 后处理 boxes, classes, scores = detector.predict(image_1x3xHxW) # boxes: 每个候选框的四角;classes: 每个框的类别;scores: 置信度 # 后处理:过滤掉置信度太低、且与他人重叠过高的框 kept = [] for b, c, s in zip(boxes, classes, scores): if s < 0.5: # 压置信度门槛 continue if any(overlap(b, p_box) > 0.45 for p_box in kept): continue # 非极大值抑制,去掉重叠框 kept.append(b) print("留在画面里的对象数量:", len(kept))
这段"按置信度过滤 + 去重叠"的后处理,其实就是 NMS(非极大值抑制)的直译。检测模型真正能交付的不只是网络权重,还有这一整套可调门槛的业务逻辑。
检测和分类在"输出怎么组织"上有个容易懵的差异——分类的输出层是一张固定长度的类别概率表,而检测的输出个数随画面里对象多少而变化,没法用一张定长表硬编。现代做法是让网络输出"预设好的一批候选框(anchor)每个加一类更细的偏移和置信度",多出的框在 NMS 时被压掉。理解这一点,你就能看懂那些"输出张量形状是 N×训练"的检测模型是怎么回事,也能明白为什么检测网络的损失里既有框坐标又有类别项——它同时要抓"在哪"和"是什么"两类错误。这层"定长编码不定长目标"的思路,本质上和第5章把序列长度不同的文本编码成固定维向量是同一类工程智慧。
回到表里那句"指标与代价评估要贴合业务",这里展开一笔:自动驾驶里,漏检一辆车比误检更致命,所以更看重把召回牢住;安防领域误报率如果太吓人,工作人员会麻木,那时特异性和误报控制反而排前面。同一种模型,换一个业务换一套更看重的数字——这就是第2章 2.4 说的"指标按场景挑"在视觉里的具体化,也是 3.4 让你别只盯着一张准确率表做决策的原因。
也可以这样理解三类任务的关系:分类是"整图一标签",检测是"分类 + 定位框",分割则是把"分类做到像素级"。它们共享同一套卷积主干,差异集中在"输出端怎么组织、中间怎么保住空间细节"——这正是 3.4 开篇那句"同一件工具的演化产物"的含义。心里装着这条关系链,再面对层出不穷的检测、分割变体时,就不会被名词绕晕。