第二十三讲 · 检测、分割与姿态估计
视觉任务最容易混淆的地方,不是网络名字,而是一个样本究竟要输出什么。同一张街景图像,可以问“这是什么场景”,也可以问“有几辆车、分别在哪里”,还可以要求给每个像素分类。输出对象一变,标签、损失和评价指标都会跟着变。
一、先用输出粒度建立任务地图
| 任务 | 典型输出 | 是否区分同类实例 |
|---|---|---|
| 图像分类 | 整张图一个类别分布 | 不涉及位置 |
| 分类加定位 | 一个类别和一个边界框 | 默认只有一个主要目标 |
| 目标检测 | 数量可变的类别、边界框与置信度集合 | 是 |
| 语义分割 | 每个像素一个语义类别 | 否 |
| 实例分割 | 每个物体一个像素掩码和类别 | 是 |
| 全景分割 | 每个像素既有语义类别又有实例归属 | 对可数物体区分实例 |
| 姿态估计 | 人体关键点坐标或热力图 | 通常要区分每个人 |
“分类、检测、分割越来越难”只是粗略印象。更准确的区别是监督信号的结构不同:分类标签是一个离散变量,检测标签是一个无序集合,分割标签是与图像同尺寸的稠密网格。
二、分类加定位:一个骨干、两个输出头
假设一张图只有一个关注目标,模型可以共享一套视觉特征,再分成两个头:
- 分类头输出 个类别 logits;
- 定位头输出边界框参数,例如 。
总损失可写成
常用交叉熵, 可用平方误差、Smooth L1 或 IoU 类损失。课件以边界框回归的平方误差作入门:
这个设计的局限很直接:输出槽位只有一个,图中出现两个人或多辆车时,不知道该把谁放进去。目标检测必须处理“目标数量未知”这一额外问题。
三、目标检测:输出是一个无序集合
一张图的标注可写成
其中 随图像变化, 是类别, 是边界框。模型一般先产生有限个候选预测,再解决三个问题:
- 哪些候选真的对应物体;
- 每个候选是什么类别、框在哪里;
- 多个候选若指向同一物体,如何去重或匹配。
预测与真值为什么要匹配
预测框没有天然顺序,真值框也没有。若真值列表中的“person 1”和“person 2”互换位置,图片含义没有变化。因此训练前要确定每个预测由哪个真值监督。
传统检测器常按 IoU 与预设 anchor 或 proposal 分配正负样本;集合预测方法则显式做一对一匹配。匹配错了,分类和回归梯度都会被送给错误的候选。
边界框交并比为
它既可参与匹配,也常用于评价预测框与真值框的重合程度。
四、两阶段与一阶段检测器
两阶段:先问“哪里值得看”,再问“是什么”
两阶段方法把问题拆成:
- 产生少量可能包含物体的候选区域;
- 对候选区域分类并精修边界框。
这种分解让第二阶段集中处理更少、更有希望的位置。典型思路包括 R-CNN 系列及其区域提议网络。这里的“阶段”是功能划分,不等于模型只能做两次神经网络调用。
一阶段:在密集位置直接预测
课件以早期 YOLO 表述为例:把图像划为 网格,每个网格预测 个框、框的置信度以及 个类别概率,输出可组织为
每个框的 5 个量通常包括 4 个位置参数与 1 个置信度。这个张量说明了一阶段检测的核心:把可变数量目标嵌入固定数量候选槽位,再从中筛出有效预测。
现代 YOLO 版本的输出头、anchor 使用方式和损失设计已经多次变化,不能把这条早期公式机械套到所有版本;它在本课中用于理解“密集预测”的基本思想。
DETR:直接做集合预测
DETR 用固定数量的 object queries 产生一组预测,每个预测要么对应一个物体,要么属于“无物体”。训练时通过二分图匹配,为预测集合和真值集合寻找一对一对应,再计算分类与框损失。
它避开了输出顺序问题,也把传统检测器中的一些手工组件改成端到端集合建模。固定槽位数仍给可检测目标数设置了上限,只是通常把上限选得大于图中实际目标数。
五、语义分割:为每个像素分类
若输入为
语义分割模型输出
每个像素位置都有一组类别 logits。对每个位置做 Softmax 和交叉熵,就得到像素级分类损失。
编码再上采样
卷积骨干常把空间尺寸压到 ,得到通道较多的特征图。某位置的通道向量可看成该像素邻域的特征表示。随后:
- 用 卷积把通道数映射为类别数;
- 用插值、转置卷积或其他解码模块恢复空间分辨率;
- 对每个像素输出类别。
卷积没有直接查看更大的空间邻域,它只在每个位置混合通道;空间上下文已经由前面的卷积特征提取完成。
转置卷积常被口语化称为“deconvolution”,但它不是把普通卷积严格求逆,而是一种可学习的上采样线性算子。
分割不止一种
- 语义分割:所有“人”像素都标成同一类,不区分 person 1 与 person 2。
- 实例分割:同类的每个物体有独立掩码。
- 全景分割:把天空、道路等不可数背景与人、车等可数物体统一到一张完整像素标注中。
同一套图像到图像框架还可用于光流、深度估计、表面法向预测和边界检测;区别在于每个像素的目标类型和损失函数。
六、人体姿态估计
人体姿态通常由一组关键点描述,例如肩、肘、腕、髋、膝、踝。两种常见输出方式是:
- 直接回归每个关键点的 坐标;
- 为每个关键点预测一张热力图,峰值位置就是预测坐标。
热力图保留空间结构,也能表达位置不确定性,训练时通常比直接坐标回归更稳定。
单人与多人
单人姿态估计假设已经裁出一个人的区域。多人场景还要解决“哪些关键点属于同一个人”:
- top-down 方法先检测每个人,再对每个框做单人姿态估计;
- bottom-up 方法先找全图关键点,再把关键点分组成人体实例。
这和目标检测中的匹配问题本质相似:不仅要找对局部,还要恢复实例归属。
七、一个场景如何产生不同标签
假设图中有两个人骑在两匹马上,背景包含草地和树木:
- 分类可能只输出“骑马”;
- 分类加定位只能给一个主要对象及其框;
- 检测输出 2 个 person 框和 2 个 horse 框;
- 语义分割给所有人物像素同一个 person 类;
- 实例分割分别给 person 1、person 2、horse 1、horse 2 掩码;
- 姿态估计还要为两个人分别输出关键点。
先写出理想标签的数据结构,再选模型,通常比先记网络名字更不容易乱。
八、评价时不能只说“准确率”
- 分类常看 top-1 accuracy;
- 定位和检测关注 IoU、precision-recall 与 AP;
- 语义分割常看像素准确率和 mean IoU;
- 姿态估计常看关键点距离阈值下的正确率或 OKS/AP。
这些指标衡量的对象不同。一个检测框类别预测正确但位置完全偏离,不能因为“类别对了”就算检测成功。
九、复习与常见误区
- 分类加定位默认目标数固定为一个,不能直接解决一般多目标检测。
- 检测输出是无序集合,训练中的预测—真值匹配不是可省略细节。
- 语义分割区分类别,不区分同类实例;实例分割才同时回答“是什么”和“是哪一个”。
- YOLO 的 是课件中的早期结构化表达,不代表所有现代实现。
- 转置卷积是上采样算子,不是普通卷积的精确逆运算。
- 姿态估计在多人场景中不仅要定位关键点,还要解决关键点的实例归属。
- 比较方法前先确认任务输出与评价指标一致,不能拿分类准确率代替检测或分割质量。