1. 视觉识别任务概述
视觉识别是计算机视觉领域的核心任务,旨在让计算机理解图像内容。根据输出粒度的不同,视觉识别任务可以分为四大类:图像分类、语义分割、目标检测和实例分割。这四类任务对图像的理解程度逐层加深,从「整张图是什么」到「每个像素属于什么」,再到「每个目标在哪里、是什么」,最终到「每个目标的像素级轮廓」。下面通过一个包含猫、狗、草、树、天空的示例图像来说明四类任务的差异。
| 任务类型 | 输出内容 | 空间位置 | 典型输出示例 |
|---|---|---|---|
| 图像分类 | 整张图像的类别标签 | 不考虑空间位置 | 猫 |
| 语义分割 | 每个像素的类别标签 | 像素级,但不区分实例 | 草、猫、树、天空 |
| 目标检测 | 多个目标的边界框和类别 | 目标级边界框 | 狗、狗、猫 |
| 实例分割 | 每个目标的像素级掩码和类别 | 像素级,且区分实例 | 狗、狗、猫 |
从表中可以看出,图像分类只回答「图像里有什么」,语义分割回答「每个像素是什么」,目标检测回答「目标在哪里、是什么」,而实例分割则进一步回答「每个目标的具体轮廓是什么」。四者之间是逐步细化的关系。
2. 语义分割
2.1 任务定义
语义分割的任务是给图像中的每个像素分配一个类别标签。它只考虑像素的类别,不区分同一类别中的不同实例。例如,图像中有两只狗,语义分割会把两只狗的像素都标记为「狗」,但不会区分「狗1」和「狗2」。语义分割的典型应用场景包括自动驾驶中的道路、车辆、行人区域划分,以及医学影像中的器官或病灶区域提取。
2.2 语义分割思路一:滑动窗口
最早的语义分割思路是滑动窗口法。具体做法是:从完整图像中提取一个区域(窗口),利用 CNN 对该区域中心点的像素进行分类,然后滑动窗口,逐像素重复这一过程。例如,对于一个包含牛和草的图像,滑动窗口会依次提取包含牛的区域和包含草的区域,分别用 CNN 判断中心像素是「牛」还是「草」。
这种方法的优点是思路简单、易于实现,但存在一个致命问题:效率太低。因为相邻窗口之间存在大量重叠区域,这些重叠区域的特征会被反复计算,造成巨大的计算浪费。例如,一个窗口向右滑动一个像素,新窗口与原窗口有 99% 的重叠,这些重叠部分的卷积特征全部需要重新计算。
2.3 语义分割思路二:全卷积网络
为了解决滑动窗口效率低的问题,研究者提出了全卷积网络(Fully Convolutional Network,FCN)的思路。核心思想是:让整个网络只包含卷积层,一次性输出所有像素的类别预测,而不是逐像素滑动窗口。
具体来说,输入是 3×H×W 的图像(3 个通道,高 H,宽 W),经过一系列卷积层后,得到 D×H×W 的特征图,再经过若干卷积层得到 C×H×W 的分数图(C 为类别数),最后对每个像素取 argmax,得到 H×W 的预测结果。
然而,这种保持原始分辨率的做法有一个问题:处理过程中一直保持原始分辨率,对显存的需求非常庞大。例如,一张 512×512 的图像,若特征图通道数为 512,仅一层特征图就需要 512×512×512×4 字节约 512MB 显存,多层叠加后显存开销难以承受。
为此,FCN 的改进方案是在网络中嵌入下采样与上采样过程:先用池化或步长卷积进行下采样,降低分辨率以节省计算量,再用上采样操作恢复分辨率。具体流程为:输入 3×H×W,经过下采样得到高分辨率特征 D1×H/2×W/2、中分辨率特征 D2×H/4×W/4、低分辨率特征 D3×H/4×W/4,最后通过上采样恢复到 H×W 的预测结果。
下采样通常使用池化(Pooling)或步长卷积(strided convolution),上采样则使用反池化(Unpooling)或转置卷积(transpose convolution)。
2.4 上采样方法一:反池化
反池化(Unpooling)是上采样的一种简单方法,主要有两种形式:最近邻反池化和「钉子床」反池化。
最近邻反池化(Nearest Neighbor):将输入中的每个值直接复制到输出中对应的 2×2 区域。例如,【输入 2×2 矩阵 [[1,2],[3,4]],通过上采用,输出 4×4 矩阵】
具体过程为:每个值在 2×2 块内重复 4 次,得到 [[1,1,2,2],[1,1,2,2],[3,3,4,4],[3,3,4,4]]。这种方法简单但会产生块状效应,边界不够平滑。
反池化(Bed of Nails):将输入中的每个值放到输出对应 2×2 区域的左上角,其余位置补零。例如,输入 [[1,2],[3,4]],输出为 [[1,0,2,0],[0,0,0,0],[3,0,4,0],[0,0,0,0]]。这种方法保留了位置信息,但输出中大量为零,信息密度低。
最大反池化(Max Unpooling):这是更精细的反池化方法。在最大池化时,除了记录池化结果,还要记住每个最大值在原图中的位置。上采样时,将池化结果放回原来的位置,其余位置补零。例如,输入 4×4 矩阵,经过 2×2 最大池化得到 2×2 结果,同时记录每个最大值的位置;上采样时,把池化结果放回对应位置,其余补零。这种方法能较好地保留边缘信息,但需要额外的位置记录开销。
2.5 上采样方法二:转置卷积(可学习的上采样)
转置卷积(Transpose Convolution)是一种可学习的上采样方法
为了理解转置卷积,先回顾普通卷积。以 3×3 卷积、步长 1、零填充 1 为例:输入 4×4,输出仍为 4×4。卷积核在输入上滑动,每个输出位置是卷积核与输入对应区域的点积。而转置卷积可以理解为「输入给出卷积核的权重,卷积核按输入值加权后放到输出位置」。具体来说,输入 2×2,使用 3×3 转置卷积、步长 2、填充 1,输出为 4×4。输入中的每个值作为权重,与卷积核相乘后放到输出的对应位置;当多个输入值的贡献在输出中重叠时,重叠区域的值需要求和。
转置卷积与普通卷积的关系可以用矩阵乘法来理解。普通卷积可以写成矩阵乘法:将卷积操作表示为矩阵 C 与输入向量 x 相乘,得到输出 y = Cx。转置卷积则是乘以同一个矩阵的转置:y = C^T x。当步长为 1 时,转置卷积等价于一个普通卷积(只是填充规则不同);当步长大于 1 时,转置卷积不再是普通卷积,而是真正意义上的上采样操作。
下面通过一个一维例子说明转置卷积的计算过程。设输入为 [a, b],卷积核为 [x, y, z],步长 2,填充 1。普通卷积的矩阵形式为:输出中的每个位置是卷积核与输入对应窗口的点积。转置卷积则反过来:输入 a 和 b 分别作为权重,把卷积核 [x, y, z] 放到输出对应位置,重叠处求和。例如,输出第一个位置为 ax,第二个位置为 ay,第三个位置为 az + bx,第四个位置为 by,第五个位置为 bz。如果需要输出恰好是输入的 2 倍长度,还需要从输出中裁剪一个像素。
转置卷积的优点是参数可学习,网络可以自动学习最优的上采样核,因此被广泛应用于 FCN 等语义分割网络中。
2.6 全卷积神经网络小结
综合以上内容,全卷积神经网络(FCN)的完整流程为:输入 3×H×W 图像,经过下采样(池化或步长卷积)得到多分辨率特征图,再经过上采样(反池化或转置卷积)恢复到原始分辨率,最后输出 H×W 的像素级预测。FCN 的代表性工作包括 Long 等人的「Fully Convolutional Networks for Semantic Segmentation」(CVPR 2015)和 Noh 等人的「Learning Deconvolution Network for Semantic Segmentation」(ICCV 2015)。
3. 目标检测
3.1 任务定义与单目标检测
目标检测的任务是在图像中找出所有目标,并给出每个目标的类别和边界框。与语义分割不同,目标检测不关心像素级轮廓,只关心目标的位置(边界框)和类别。
先看最简单的单目标情况:图像中只有一个目标——猫,需要同时完成分类和定位。做法是将定位任务建模为回归问题:CNN 提取特征后,接两个分支:一个全连接层输出 1000 类分类分数(用 Softmax 损失),另一个全连接层输出 4 个边界框坐标 (x, y, w, h)(用 L2 损失)【以x,y为某个端点,常用中心的,w,h为宽度和高度的目标检测框】。总损失为多任务损失:分类损失加定位损失。
例如,输入一张猫的图片,CNN 输出 4096 维特征向量,分类分支输出「猫:0.9,狗:0.05,车:0.01……」的分数,定位分支输出边界框坐标 (x, y, w, h)。训练时,分类分支与真实标签「猫」计算 Softmax 损失,定位分支与真实边界框 (x', y', w', h') 计算 L2 损失,两者相加作为总损失。
3.2 多目标检测的困境
实际场景中图像往往包含多个目标,例如一张图里有两只狗、一只猫、两只鸭子。每个目标都需要输出 (x, y, w, h) 四个实数,那么一张图需要输出多少个实数?答案是:不确定。因为每张图像中目标的数量不同,期望输出的维度也不一样。这是多目标检测的核心困境:输出维度不固定,无法直接用固定维度的全连接层输出。
解决思路是:利用 CNN 对图像中的区域进行多分类,以确定当前区域是背景还是哪个类别的目标。具体做法是:对图像中所有可能的位置、尺寸、长宽比的区域逐一用 CNN 分类。例如,先判断某个区域「狗?不是;猫?不是;背景?是」,再判断另一个区域「狗?是;猫?不是;背景?不是」,如此反复。但这样做的问题是:CNN 需要对图像中所有可能的区域进行分类,计算量巨大,几乎不可行。
3.3 区域建议:Selective Search
为了减少需要分类的区域数量,研究者提出了区域建议(Region Proposal)方法。其目标是找出所有潜在可能包含目标的区域,并且运行速度要相对较快。代表性方法包括:
- Selective Search:在 CPU 上仅需几秒即可产生约 2000 个候选区域。
- Objectness 度量:Alexe 等人的「Measuring the objectness of image windows」(TPAMI 2012)。
- Selective Search for Object Recognition:Uijlings 等人的工作(IJCV 2013)。
- BING:Cheng 等人的「Binarized normed gradients for objectness estimation at 300fps」(CVPR 2014)。
- Edge Boxes:Zitnick 和 Dollar 的「Locating object proposals from edges」(ECCV 2014)。
区域建议方法大幅减少了需要分类的区域数量,为目标检测提供了可行的基础。