计算机视觉:从分类到定位与分割
本章来源:本文整理自《动手学深度学习》(zh.d2l.ai)第 13 章《计算机视觉》,原书作者 Aston Zhang、李沐、Zachary C. Lipton、Alexander J. Smola。
本章讲什么
前几章讲的是图像分类——判断整张图属于哪个类别。这一章把视觉任务向前推进:从"识别是什么"走向"定位在哪里"(目标检测)、"逐像素理解"(语义分割),以及"给图片换风格"(风格迁移)。同时介绍两个让数据不足也能训练的实用技术:图像增广和微调。
图像增广
深度神经网络成功的前提是大数据集,但标注成本很高。图像增广通过对训练图像做一系列随机变化(翻转、裁剪、颜色扰动等),"凭空"造出大量相似但不同的样本,等效于扩大训练集规模。
更本质的作用是:随机变化可以切断模型对无关属性的依赖,提升泛化能力。比如随机裁剪让目标出现在不同位置,降低模型对位置的敏感性;随机调整亮度、饱和度、对比度、色调,降低模型对颜色的敏感度。它是 AlexNet 成功的关键技术之一。
实践要点:只在训练时做带随机性的增广,预测时必须用确定性的变换(否则同一张图每次预测结果可能不同)。
微调:站在巨人的肩膀上
如果目标数据集太小,从头训练复杂模型很容易过拟合。与其收集海量标注数据(比如 ImageNet 花费数百万美元),不如把大数据集上学到的知识迁移过来。
微调是迁移学习最常见的实现:
- 在源数据集(如 ImageNet)上预训练出源模型;
- 创建目标模型——复制源模型的全部结构与参数,只丢弃与源标签绑定的输出层;
- 换上输出数等于目标类别数、随机初始化的新输出层;
- 在目标数据集上用较小学习率微调复制来的参数,用较大学习率从头训练新输出层。
想给 100 把椅子各拍 1000 张图成本太高,不如借用 ImageNet 上已经学会识别"边缘、纹理、形状、对象组合"等通用特征的模型——这些底层通用特征同样适用于椅子识别。当目标数据集远小于源数据集时,微调能显著提升泛化能力。
目标检测与边界框
图像分类假设图中只有一个主要物体;而真实场景(自动驾驶、机器人、安防)往往一张图有多个感兴趣目标,既要知道"是什么",还要知道"在哪儿"。这就是目标检测。
描述位置最常用的工具是边界框——一个矩形框,用左上角、右下角的坐标,或中心点坐标加宽高两种方式表示,两者可互相转换。它是所有检测模型的起点。
锚框:候选区域的生成
目标检测算法的通用套路:在输入图像上采样大量候选区域,判断每个区域是否含目标,并微调区域边界使其贴合真实框。
锚框就是这样一种候选区域采样方法:以每个像素为中心,生成多个不同缩放比和宽高比的矩形框。
配套的两个关键概念:
- 交并比(IoU):两个框相交面积与相并面积之比,量化"锚框与真实框的相似程度"。
- 非极大值抑制(NMS):大量锚框会产生大量重叠的相似预测框。NMS 按置信度降序,保留最高置信度框、抑制与其重叠过高的框,从而合并属于同一目标的重复预测。
训练时给每个锚框打两种标签:类别(正类/背景/负类)和偏移量(真实框相对锚框的位置尺寸调整量);预测时反过来用预测的偏移量把锚框调整成预测框。
多尺度目标检测
逐像素生成锚框数量爆炸(561×728 的图像每像素 5 个框就是 200 多万个),不现实。解决思路是多尺度:在特征图上生成锚框,而不是在原始图像上。
特征图越小,锚框越少、但每个框感受野越大,适合检测大目标;特征图大则框密而小,适合检测小目标。深层网络天然分层表示图像:浅层特征图保留细节适合小目标,深层特征图感受野宽适合大目标。
SSD:单发多框检测
SSD 把边界框、锚框、多尺度等概念整合成一个简单、快速、广泛使用的完整目标检测模型。
结构上由"基础网络 + 若干多尺度特征块"串联:基础网络(截断的 VGG 或 ResNet)负责抽特征,输出高宽较大的特征图以检测小目标;每个多尺度特征块把特征图高宽减半、扩大感受野,越靠后的块越适合检测大目标。在每个尺度上,用 1×1 卷积式的"预测层"输出所有锚框的类别和边界框偏移量。
SSD 属于"单发"——单次前向即可输出全部预测,无需两阶段,因此快。
R-CNN 系列:两阶段检测
R-CNN 是另一条路线(两阶段法):
- R-CNN:先从图像用"选择性搜索"选出约 2000 个高质量提议区域,把每个区域变形后分别送入预训练 CNN 抽特征,再分类和回归边界框。缺点极明显:上千个区域各做一次前向,计算完全不共享,速度极慢。
- Fast R-CNN:只对整张图做一次 CNN 前向,用新引入的"兴趣区域汇聚层"把形状各异的提议区域统一池化成相同形状,再统一分类回归,大幅省掉重复计算。
- Faster R-CNN:把手工的"选择性搜索"换成可学习的"区域提议网络(RPN)",端到端联合训练,能用更少提议保持精度。
- Mask R-CNN:保留空间信息并追加全卷积网络做像素级分割。
语义分割与全卷积网络
目标检测用方框框出目标,但方框是"粗粒度"的。语义分割要把图像分成属于不同语义类别的区域,对每个像素分类——像素级的理解。
三个易混概念:
- 图像分割:按像素相关性划分区域,无语义、无标签监督(可能把狗按颜色切成"黑嘴黑眼"和"黄身体"两块)。
- 语义分割:像素级语义分类,同一类别不区分个体(黑嘴和黄身体都是"狗")。
- 实例分割:既分语义又区分不同个体(两条狗要分开)。
全卷积网络(FCN) 是实现语义分割的经典架构:先用预训练 CNN 抽特征,再用 1×1 卷积把通道数变成类别数(逐像素分类),最后用转置卷积把特征图放大回输入尺寸,使输出的每个位置与输入像素一一对应。
转置卷积是"逆转下采样、放大空间维度"的卷积变体:与常规卷积"用核把输入元素收缩成更小的输出"相反,它把每个输入元素"广播"成一个核大小的块,重叠处相加,从而产生大于输入的输出。
风格迁移
风格迁移要"把一张图的风格套到另一张图上":输入内容图像(如风景照)和风格图像(如油画),输出保留内容图像主体形状、但带上风格图像的笔触与色彩。
方法很独特:合成图像本身就是唯一需要训练更新的"模型参数"(初始化为内容图像),预训练 CNN 只作特征提取器、参数冻结。损失由三部分组成:
- 内容损失:让合成图与内容图在某"内容层"的特征接近。
- 风格损失:用格拉姆矩阵(各通道特征两两内积构成的矩阵)表达风格层输出的纹理相关性,让合成图与风格图的格拉姆矩阵接近。
- 全变分损失:惩罚相邻像素突变,抑制高频噪点。
摄影滤镜的类比:一个滤镜通常只能改照片某一方面,想达到理想风格要试大量组合;风格迁移用网络自动完成这件事。
小结
- 图像增广用随机变换扩充数据、切断对无关属性的依赖。
- 微调把大数据集上预训练的知识迁移到小数据集,显著提升泛化。
- 目标检测既要"是什么"又要"在哪儿",边界框描述位置。
- 锚框生成候选区域,IoU 度量相似度,NMS 合并重复预测。
- 多尺度在特征图上生成锚框,兼顾大小目标。
- SSD 单发快,R-CNN 系列两阶段准,各有取舍。
- 语义分割逐像素分类,FCN 用 1×1 卷积 + 转置卷积实现。
- 风格迁移把合成图当参数训练,用内容、风格、全变分三种损失。
关键术语
| 术语 | 一句话解释 |
|---|---|
| 图像增广 | 对训练样本做随机变换以扩充数据、提升泛化 |
| 微调 / 迁移学习 | 复用预训练模型参数适应新任务 |
| 目标检测 | 识别图中目标类别并定位 |
| 边界框 | 用矩形描述目标空间位置 |
| 锚框 | 以像素为中心生成的多尺度候选框 |
| 交并比(IoU) | 两框相交面积与相并面积之比 |
| 非极大值抑制(NMS) | 合并属于同一目标的重复预测框 |
| SSD | 单发多框检测,单次前向输出全部预测 |
| R-CNN 系列 | 两阶段检测:提议区域 + 分类回归 |
| 语义分割 | 对每个像素做语义分类 |
| 转置卷积 | 逆转下采样、放大空间维度的卷积变体 |
| 全卷积网络(FCN) | 1×1 卷积换通道 + 转置卷积放大的分割架构 |
| 风格迁移 | 把一张图的风格套到另一张图上 |
| 格拉姆矩阵 | 通道特征相关性矩阵,表达风格 |