第二十三讲 · 检测、分割与姿态估计

Views: --

视觉任务最容易混淆的地方,不是网络名字,而是一个样本究竟要输出什么。同一张街景图像,可以问“这是什么场景”,也可以问“有几辆车、分别在哪里”,还可以要求给每个像素分类。输出对象一变,标签、损失和评价指标都会跟着变。

一、先用输出粒度建立任务地图

任务典型输出是否区分同类实例
图像分类整张图一个类别分布不涉及位置
分类加定位一个类别和一个边界框默认只有一个主要目标
目标检测数量可变的类别、边界框与置信度集合
语义分割每个像素一个语义类别
实例分割每个物体一个像素掩码和类别
全景分割每个像素既有语义类别又有实例归属对可数物体区分实例
姿态估计人体关键点坐标或热力图通常要区分每个人

“分类、检测、分割越来越难”只是粗略印象。更准确的区别是监督信号的结构不同:分类标签是一个离散变量,检测标签是一个无序集合,分割标签是与图像同尺寸的稠密网格。

二、分类加定位:一个骨干、两个输出头

假设一张图只有一个关注目标,模型可以共享一套视觉特征,再分成两个头:

  • 分类头输出 CC 个类别 logits;
  • 定位头输出边界框参数,例如 (x,y,w,h)(x,y,w,h)

总损失可写成

L=Lcls+λLbox.L=L_{\mathrm{cls}}+\lambda L_{\mathrm{box}}.

LclsL_{\mathrm{cls}} 常用交叉熵,LboxL_{\mathrm{box}} 可用平方误差、Smooth L1 或 IoU 类损失。课件以边界框回归的平方误差作入门:

Lbox=yboxy^box22.L_{\mathrm{box}}=\lVert y_{\mathrm{box}}-\hat y_{\mathrm{box}}\rVert_2^2.

这个设计的局限很直接:输出槽位只有一个,图中出现两个人或多辆车时,不知道该把谁放进去。目标检测必须处理“目标数量未知”这一额外问题。

三、目标检测:输出是一个无序集合

一张图的标注可写成

Y={(ci,bi)}i=1K,\mathcal Y =\{(c_i,b_i)\}_{i=1}^{K},

其中 KK 随图像变化,cic_i 是类别,bib_i 是边界框。模型一般先产生有限个候选预测,再解决三个问题:

  1. 哪些候选真的对应物体;
  2. 每个候选是什么类别、框在哪里;
  3. 多个候选若指向同一物体,如何去重或匹配。

预测与真值为什么要匹配

预测框没有天然顺序,真值框也没有。若真值列表中的“person 1”和“person 2”互换位置,图片含义没有变化。因此训练前要确定每个预测由哪个真值监督。

传统检测器常按 IoU 与预设 anchor 或 proposal 分配正负样本;集合预测方法则显式做一对一匹配。匹配错了,分类和回归梯度都会被送给错误的候选。

边界框交并比为

IoU(A,B)=ABAB.\operatorname{IoU}(A,B) =\frac{|A\cap B|}{|A\cup B|}.

它既可参与匹配,也常用于评价预测框与真值框的重合程度。

四、两阶段与一阶段检测器

两阶段:先问“哪里值得看”,再问“是什么”

两阶段方法把问题拆成:

  1. 产生少量可能包含物体的候选区域;
  2. 对候选区域分类并精修边界框。

这种分解让第二阶段集中处理更少、更有希望的位置。典型思路包括 R-CNN 系列及其区域提议网络。这里的“阶段”是功能划分,不等于模型只能做两次神经网络调用。

一阶段:在密集位置直接预测

课件以早期 YOLO 表述为例:把图像划为 S×SS\times S 网格,每个网格预测 BB 个框、框的置信度以及 CC 个类别概率,输出可组织为

S×S×(B×5+C).S\times S\times(B\times5+C).

每个框的 5 个量通常包括 4 个位置参数与 1 个置信度。这个张量说明了一阶段检测的核心:把可变数量目标嵌入固定数量候选槽位,再从中筛出有效预测。

现代 YOLO 版本的输出头、anchor 使用方式和损失设计已经多次变化,不能把这条早期公式机械套到所有版本;它在本课中用于理解“密集预测”的基本思想。

DETR:直接做集合预测

DETR 用固定数量的 object queries 产生一组预测,每个预测要么对应一个物体,要么属于“无物体”。训练时通过二分图匹配,为预测集合和真值集合寻找一对一对应,再计算分类与框损失。

它避开了输出顺序问题,也把传统检测器中的一些手工组件改成端到端集合建模。固定槽位数仍给可检测目标数设置了上限,只是通常把上限选得大于图中实际目标数。

五、语义分割:为每个像素分类

若输入为

XRCin×H×W,X\in\mathbb R^{C_{\mathrm{in}}\times H\times W},

语义分割模型输出

SRCclass×H×W,S\in\mathbb R^{C_{\mathrm{class}}\times H\times W},

每个像素位置都有一组类别 logits。对每个位置做 Softmax 和交叉熵,就得到像素级分类损失。

编码再上采样

卷积骨干常把空间尺寸压到 H/4×W/4H/4\times W/4,得到通道较多的特征图。某位置的通道向量可看成该像素邻域的特征表示。随后:

  1. 1×11\times1 卷积把通道数映射为类别数;
  2. 用插值、转置卷积或其他解码模块恢复空间分辨率;
  3. 对每个像素输出类别。

1×11\times1 卷积没有直接查看更大的空间邻域,它只在每个位置混合通道;空间上下文已经由前面的卷积特征提取完成。

转置卷积常被口语化称为“deconvolution”,但它不是把普通卷积严格求逆,而是一种可学习的上采样线性算子。

分割不止一种

  • 语义分割:所有“人”像素都标成同一类,不区分 person 1 与 person 2。
  • 实例分割:同类的每个物体有独立掩码。
  • 全景分割:把天空、道路等不可数背景与人、车等可数物体统一到一张完整像素标注中。

同一套图像到图像框架还可用于光流、深度估计、表面法向预测和边界检测;区别在于每个像素的目标类型和损失函数。

六、人体姿态估计

人体姿态通常由一组关键点描述,例如肩、肘、腕、髋、膝、踝。两种常见输出方式是:

  • 直接回归每个关键点的 (x,y)(x,y) 坐标;
  • 为每个关键点预测一张热力图,峰值位置就是预测坐标。

热力图保留空间结构,也能表达位置不确定性,训练时通常比直接坐标回归更稳定。

单人与多人

单人姿态估计假设已经裁出一个人的区域。多人场景还要解决“哪些关键点属于同一个人”:

  • 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 的 S×S×(B×5+C)S\times S\times(B\times5+C) 是课件中的早期结构化表达,不代表所有现代实现。
  • 转置卷积是上采样算子,不是普通卷积的精确逆运算。
  • 姿态估计在多人场景中不仅要定位关键点,还要解决关键点的实例归属。
  • 比较方法前先确认任务输出与评价指标一致,不能拿分类准确率代替检测或分割质量。

评论