跳到主要内容

计算机视觉应用 — 增强、微调、检测、分割与风格迁移

这一章讲三件事: 训练前怎么「造」数据(增强)与怎么「借」数据(微调); 分类之外的两个视觉任务——检测(框出物体在哪)与分割(给每个像素贴标签); 以及一个把训练倒过来的玩法:不更新网络、直接优化图像本身的风格迁移。 在全书链条里,这是第 08、09 章卷积网络的应用层。

1. 数据增强:把「不变性」喂给模型

模型天生不知道「狗往左挪三个像素还是狗」——除非它在训练里真见过。 数据增强(data augmentation)就是对训练图像做随机变换: 左右翻转、随机裁剪(裁出原图 10% 到 100% 面积的一块)、 随机改颜色(亮度、对比度、饱和度、色调四个方向抖动)1。 同一张照片每一轮训练都以新面孔出现,模型被迫学「位置、颜色怎么变,类别不变」。

两条使用纪律。 其一,只增强训练集:预测时要的是确定结果,不加任何随机操作2。 其二,变换不能改变类别本身——左右翻转狗还是狗, 但把「6」上下翻转就不是「6」了,什么变换合法由任务决定。

它不是锦上添花:作者明确说,AlexNet 2012 年的成功离不开数据增强3—— 当时 ImageNet 的数据量喂不饱那个网络,增强等于把数据翻了好几倍。

2. 微调:小数据集的救星

现实中大多数任务的数据都很小:想认椅子,攒的图片比 ImageNet 小两个数量级。 迁移学习(transfer learning)的思路是:把在大数据集上学到的知识搬到小数据集。 其中最常见的做法叫微调(fine-tuning),一共四步4:

1. 在源数据集(如 ImageNet)上预训练一个网络,叫源模型
2. 复制源模型除输出层外的全部结构与参数,得到目标模型
3. 给目标模型换一个新的输出层(输出数 = 目标任务的类别数),随机初始化
4. 在目标数据集上训练:输出层从头学,其余层在源参数基础上小幅调整

为什么有效:前几层学到的是边缘、纹理、部件这种「通用视觉词汇」, 换任务不用重学;只有最后一层「特征到类别」的对应是任务特定的。 所以训练时两类参数待遇不同:设基础学习率为 η, 随机初始化的输出层用 10η 大步学,预训练层只用 η 小幅微调5—— 大步会冲毁已经学好的通用特征。

原书的实验是热狗识别:拿 ImageNet 上预训练好的 ResNet-18, 在小小的热狗数据集上微调,同样的训练轮(epoch,整个数据集完整过一遍叫一轮)数,表现明显好过从零训练6

3. 目标检测的零件:边界框、锚框、IoU、NMS

分类回答「这是什么」;目标检测(object detection)回答「图里有哪些物体、各在哪」—— 输出每个物体的类别和一个边界框(bounding box,框住物体的矩形,用对角坐标表示)。 难点在于物体数量不定、位置不定、大小不定,没法直接回归。

主流解法把「在哪」变成分类问题:先在图上撒一张候选框的网, 再让模型逐个框判断。锚框(anchor box)就是这张网: 以每个像素为中心,按若干尺度与宽高比各生成一个预设框; n 个尺度、m 个宽高比,整图撒下 wh(n+m−1) 个锚框7—— 一张普通照片就是几万个候选,绝大多数框住的是背景。 模型对每个锚框预测两件事:类别(含「背景」这一类)和框的修正量。

判断框与框的重合程度用交并比(IoU,intersection over union): 两个框交集面积除以并集面积,取值 0 到 1,1 是完全重合8。 训练时用它把锚框分配给真实框(IoU 最高的锚框负责预测这个物体); 预测时用它清理重复报告——这就是本章主走查。

主走查:一张图里的一只狗,被报了三次。 模型吐出三个都自称「狗」的框(以下三个置信度与两个 IoU 数值都是为演示编的,不是真实数值):

  • B1,置信度 0.9;B2,置信度 0.8——两者 IoU = 0.7,框的是同一只狗;
  • B3,置信度 0.3——与 B1 的 IoU = 0.1,几乎不重叠。

非极大值抑制(NMS,non-maximum suppression)按置信度从高到低处理: 先留 B1,把所有与它 IoU 超过阈值(比如 0.5)的同类框全部压掉——B2 出局; 再处理剩下的:B3 与 B1 重合度低,保留9。 同一个物体被多个重叠锚框同时报出是常态,NMS 是这堆重复报告的清道夫。

4. 检测系统:SSD 一次看全图,R-CNN 先看局部

锚框范式下,SSD(single shot multibox detection,单发多框检测)是最干脆的设计: 一个基础网络(如截掉分类头的 VGG)提特征,后面接一串越来越小的特征块; 每个尺度的特征图都独立撒锚框、预测类别与框偏移—— 大特征图(分辨率高)配小锚框抓小物体,小特征图配大锚框抓大物体10。 整件事一次前向完成,「单发」由此得名。

R-CNN 系列走了另一条路:先用传统算法(选择性搜索)提出约 2000 个 区域提议(region proposal,「可能是物体」的候选区域), 再把每个区域缩放到统一大小、逐个过 CNN 提特征、分类11。 2000 次前向太贵,Fast R-CNN 的改进是整图只过一次 CNN, 区域提议映射到特征图上,再用 RoI 池化(region of interest pooling, 把任意大小的感兴趣区域池化成固定大小的特征)批量出特征12。 Faster R-CNN 更进一步:提议本身也交给一个网络(区域提议网络)生成,全线可学习。

5. 语义分割与转置卷积:把分辨率还回来

语义分割(semantic segmentation)把分类做到像素级: 不画框,而是给每个像素贴上类别(狗/猫/背景),边界精细到像素13。 麻烦在于:CNN 一路池化下来,特征图比原图小了几十倍, 输出却要和原图一样大——需要一个逆向操作。

转置卷积(transposed convolution,又叫分数步长卷积)就是这个逆向操作: 普通卷积是「核在输入上滑动、窗口内求和」; 转置卷积反过来,输入的每个元素乘上整个核、把结果散布到更大的输出上累加, 于是输出比输入大14

FCN(fully convolutional network,全卷积网络)用三步完成分割15:

  1. 用 CNN 提特征(如 ResNet-18 截掉最后的全局池化与全连接),特征图缩小 32 倍;
  2. 用 1×1 卷积把通道数变成类别数(Pascal VOC 数据集是 21 类)—— 每个空间位置现在握着 21 个类别分数;
  3. 用步长 32 的转置卷积把这小张分数图放大回原图尺寸,逐像素取 argmax。

6. 风格迁移:被优化的是图像本身

到此为止,训练更新的都是网络参数,输入只是数据。 风格迁移(neural style transfer)把整个方向倒过来: 网络参数冻结(钉死不动、这一轮不再更新),合成图像本身才是被优化的变量—— 初始是一张随机噪声图,每轮反向传播把梯度直接更新到像素上16

损失由三部分组成,全靠一个预训练 CNN 当中间特征提取器17:

  • 内容损失:合成图与内容照片在某中间层的特征平方差——保住「画的是什么」;
  • 风格损失:比较两张图的 Gram 矩阵 (特征图各通道两两求内积,记录的是「哪些纹理倾向一起出现」,与具体内容无关)—— 保住「笔触像不像风格画」;
  • 总变差损失(total variation loss):相邻像素差异的总和,压掉噪点。

迭代几百步,噪声图慢慢变成「用风格画的笔触重画的内容照片」。 这一章的收场值得记住:反向传播不一定用来学参数, 它是一个通用的「对任何可微量求梯度」的机器——被优化的对象由你指定。

7. 作者的判断与证据

书里给了证据的: 增强的具体变换与「只增强训练集」的纪律; 微调四步、10η 规则与热狗实验;锚框生成公式 wh(n+m−1); IoU 与 NMS 的完整算法;SSD 的多尺度结构;R-CNN 三步与 RoI 池化; FCN 三步(含「(320−64+16×2+32)/32=10」的尺寸账);风格迁移三损失与 Gram 矩阵定义。

经验判断: 「小数据集就微调」是实践共识,原书也只给了单点实验; NMS 是纯粹的工程启发式(凭经验定死、不从数据里学的规则),没有学习成分; 「大特征图抓小物体」来自直观:小物体在大特征图上占的像素多。

判断(我们的,不是书里的): 锚框+NMS 这套范式和第 08 章的卷积是同一种思路—— 把「我猜数据长什么样」硬编码(写死在设计里、不从数据里学)进结构里换样本效率。 它后来被「更少先验」的做法冲击:2020 年的 DETR 把检测改写成集合预测, 用可学习的匹配取代手工锚框与 NMS(补充,不在书里,来自通用知识)。 方向与第 13 章「注意力吃掉手工特征」一脉相承。 如果错,会错在: 锚框范式在工业界仍大量服役(快、稳、好部署), 「被取代」是研究趋势而非现状清点。

8. 边界与局限

  • 检测只讲了锚框范式与 R-CNN 系列;无锚框(anchor-free)方法原书未展开;
  • 风格迁移逐张优化、不能实时;「再训一个前向网络专干这事」的快速风格迁移原书未讲;
  • 实例分割(区分同一类的不同个体)只在 R-CNN 章提了 mask R-CNN 一句;
  • 两个 Kaggle 实战章(CIFAR-10、狗品种)是完整调参流程,我们未单独展开;
  • 增强的合法变换由任务定,书里没给系统判据。

9. 可带走的

  1. 增强只在训练时加随机;它教模型的是不变性,合法变换由任务决定;
  2. 微调四步:预训练 → 复制非输出层 → 新输出层随机初始化 → 新层 10η、旧层 η;
  3. 检测 = 对预设锚框做分类 + 框修正;IoU 量重合,NMS 按置信度留大杀重;
  4. SSD:多尺度特征图各自撒锚框,大特征图抓小物体,一次前向;
  5. R-CNN:先提议后分类;整图一次前向 + RoI 池化是省钱关键;
  6. 分割:1×1 卷积出类别通道,转置卷积把缩小 32 倍的特征图放大回原图;
  7. 风格迁移:冻结网络、优化图像;内容/风格(Gram)/总变差三种损失。

10. 原文地图

主题原书章原文位置
颜色抖动与翻转Image Augmentationtext/96-image-augmentation.txt:143(搜「brightness, contrast, saturation, and hue」) · text/96-image-augmentation.txt:75(搜「Flipping the image left and right」)
只增强训练集Image Augmentationtext/96-image-augmentation.txt:225(搜「only apply image augmentation to training」)
AlexNet 离不开增强Image Augmentationtext/96-image-augmentation.txt:22(搜「indispensable」)
微调四步Fine-Tuningtext/97-fine-tuning.txt:38(搜「four steps」)
输出层 10ηFine-Tuningtext/97-fine-tuning.txt:231(搜「10\eta」)
热狗实验Fine-Tuningtext/97-fine-tuning.txt:185(搜「ResNet-18」)
锚框数量公式Anchor Boxestext/99-anchor-boxes.txt:63(搜「n+m-1」)
IoU 定义Anchor Boxestext/99-anchor-boxes.txt:246(搜「intersection over union」)
NMS 算法Anchor Boxestext/99-anchor-boxes.txt:696(搜「non-maximum」)
SSD 多尺度Single Shot Multibox Detectiontext/102-single-shot-multibox-detection.txt:24(搜「base network」)
小物体靠大特征图Multiscale Object Detectiontext/100-multiscale-object-detection.txt:33(搜「smaller objects」)
R-CNN 三步Region-based CNNs (R-CNNs)text/103-region-based-cnns-r-cnns.txt:45(搜「selective search」)
RoI 池化Region-based CNNs (R-CNNs)text/103-region-based-cnns-r-cnns.txt:86(搜「region of interest (RoI) pooling」)
语义分割定义Semantic Segmentation and the Datasettext/104-semantic-segmentation-and-the-dataset.txt:8(搜「semantic segmentation」)
转置卷积Transposed Convolutiontext/105-transposed-convolution.txt:27(搜「fractionally-strided」)
FCN 三步Fully Convolutional Networkstext/106-fully-convolutional-networks.txt:125(搜「number of classes (21)」) · text/106-fully-convolutional-networks.txt:129(搜「stride of $32$」)
图像是被优化的变量Neural Style Transfertext/107-neural-style-transfer.txt:49(搜「the only variable」)
三种损失Neural Style Transfertext/107-neural-style-transfer.txt:68(搜「content loss」)
Gram 矩阵Neural Style Transfertext/107-neural-style-transfer.txt:322(搜「Gram matrix」)

Footnotes

  1. 出处:「Image Augmentation」第 143 段(text/96-image-augmentation.txt:143,搜「brightness, contrast, saturation, and hue」)与第 75 段(text/96-image-augmentation.txt:75,搜「Flipping the image left and right」)。随机裁剪面积 10%-100%、宽高比 0.5-2 见同章随机裁剪一节。

  2. 出处:「Image Augmentation」第 225 段(text/96-image-augmentation.txt:225,搜「only apply image augmentation to training」)。

  3. 出处:「Image Augmentation」第 22 段(text/96-image-augmentation.txt:22,搜「indispensable」)。原文:image augmentation was indispensable for the success of AlexNet。

  4. 出处:「Fine-Tuning」第 38-44 段(text/97-fine-tuning.txt:38,搜「four steps」)。四步的原文是编号列表(41-44 段),椅子数据集的例子在第 44 段。

  5. 出处:「Fine-Tuning」第 229-231 段(text/97-fine-tuning.txt:229,搜「fine-tune」;text/97-fine-tuning.txt:231,搜「10\eta」)。

  6. 出处:「Fine-Tuning」第 185 段(text/97-fine-tuning.txt:185,搜「ResNet-18」)与热狗数据集节。

  7. 出处:「Anchor Boxes」第 63 段(text/99-anchor-boxes.txt:63,搜「n+m-1」)。n 个尺度、m 个宽高比时同一像素生成 n+m−1 个锚框,整图 wh(n+m−1) 个。

  8. 出处:「Anchor Boxes」第 246 段(text/99-anchor-boxes.txt:246,搜「intersection over union」)。IoU 即两个框像素集合的 Jaccard 指数。

  9. 出处:「Anchor Boxes」第 696 段(text/99-anchor-boxes.txt:696,搜「non-maximum」)。NMS 按置信度降序,逐个保留基准框并抑制与其 IoU 超阈值的同类框。

  10. 出处:「Single Shot Multibox Detection」第 21-36 段(text/102-single-shot-multibox-detection.txt:24,搜「base network」);多尺度设计见「Multiscale Object Detection」第 33-39 段(text/100-multiscale-object-detection.txt:33,搜「smaller objects」)。

  11. 出处:「Region-based CNNs (R-CNNs)」第 45-48 段(text/103-region-based-cnns-r-cnns.txt:45,搜「selective search」)。R-CNN 四步:提议→逐区域 CNN 特征→SVM 分类→线性回归修框。

  12. 出处:「Region-based CNNs (R-CNNs)」第 85-86 段(text/103-region-based-cnns-r-cnns.txt:86,搜「region of interest (RoI) pooling」)。

  13. 出处:「Semantic Segmentation and the Dataset」第 8 段(text/104-semantic-segmentation-and-the-dataset.txt:8,搜「semantic segmentation」)与第 20 段(更细粒度)。

  14. 出处:「Transposed Convolution」第 27 段(text/105-transposed-convolution.txt:27,搜「fractionally-strided」)。输入元素与核相乘后散布到更大输出上累加的描述见同章基本运算一节。

  15. 出处:「Fully Convolutional Networks」第 125 段(text/106-fully-convolutional-networks.txt:125,搜「number of classes (21)」)与第 129 段(text/106-fully-convolutional-networks.txt:129,搜「stride of $32$」)。

  16. 出处:「Neural Style Transfer」第 47-49 段(text/107-neural-style-transfer.txt:49,搜「the only variable」)。原文:合成图像是风格迁移过程中唯一需要更新的变量。

  17. 出处:「Neural Style Transfer」第 68-70 段(text/107-neural-style-transfer.txt:68,搜「content loss」)与第 322 段(text/107-neural-style-transfer.txt:322,搜「Gram matrix」)。