文章目录
- 1 语义分割
- 1.1 介绍
- 1.2 语义分割应用
- 1.3 实例分割
- 2 转置卷积
- 2.1 工作原理
- 2.2 为什么叫“转置”卷积
- 2.3 转置卷积也是一种卷积
- 3 FCN
- 3.1 核心思想
- 3.2 网络架构
- 4 样式迁移
- 4.1 基于 CNN 的样式迁移
- 4.2 工作流程
1 语义分割
1.1 介绍
语义分割(Semantic Segmentation) 是一种像素级别的分类任务。它的目标是为图像中的每一个像素分配一个类别标签。
- 与普通图像分割的区别:
- 普通分割(如聚类)只将相似的像素区域划分为同一组,但可能不知道这些区域代表什么物体。
- 语义分割不仅进行区域划分,还会为每个像素分配一个有意义的语义标签(如“狗”、“猫”、“路面”或“背景”)。
- 与图片分类和目标检测的区别:
特性 | 图片分类 | 目标检测 | 语义分割 |
---|---|---|---|
任务级别 | 图像级别 | 物体级别 | 像素级别 |
输出 | 一个类别标签 | 多个边界框 + 类别标签 | 每个像素的类别标签 |
精度 | 粗略 | 相对精细(边界框) | 非常精细(像素级) |
示例 | 图像中有只狗 → “狗” | 图像中有两只狗 → 两个边界框,均标记为“狗” | 图像中有两只狗 → 标记出所有属于狗的像素,并将其标记为“狗” |

1.2 语义分割应用
由于其像素级的精细度,语义分割在现实中有许多重要应用:
- 图像背景处理:
- 视频会议:通过识别出“人”和“背景”,可以轻松实现背景虚化或背景替换,而不需要绿幕。
- 手机人像模式:通过识别出“人”并将其与背景分离,实现更自然的背景虚化效果。

- 自动驾驶:
- 路面分割:这是自动驾驶最关键的应用之一。系统需要实时识别出哪些像素是“路面”,哪些是“人行道”、“树木”或“建筑物”,以便安全行驶。

- 医学影像分析:
- 识别和分割出病灶区域。
1.3 实例分割
实例分割(Instance Segmentation) 是一个比语义分割更进一步的任务。它不仅要识别每个像素的类别,还要区分同一类别下的不同实例。
- 与语义分割的区别:
- 语义分割:如果图像中有两只狗,它会把所有属于狗的像素都标记为同一个“狗”类别。它不区分这是“狗一”还是“狗二”。
- 实例分割:它会把第一只狗的所有像素标记为“狗1”,把第二只狗的所有像素标记为“狗2”。它能区分出每一个独立的“实例”。
- 关系:实例分割可以看作是目标检测的精细化版本,它不仅通过边界框框出物体,还提供了每个物体的精确像素级轮廓。

2 转置卷积
传统的卷积操作通常会减小特征图(feature map)的高和宽。虽然可以通过填充(padding)来保持高宽不变,但很难有效增大特征图的尺寸。
然而,语义分割的任务要求我们对图像中的每一个像素进行分类。如果我们的模型不断通过卷积来减小图像尺寸,最终的特征图(例如 7x7)将无法对应到原始图像中的每一个像素。
因此,我们需要一种能够增大特征图高和宽的卷积操作,这就是转置卷积。
2.1 工作原理
转置卷积(也称为反卷积或部分反向卷积)与常规卷积的工作方式非常相似,但它是“反向”的。
- 常规卷积:一个大输入区域(例如 2x2)与一个卷积核做点积,生成一个小输出像素。
- 转置卷积:一个小输入像素与卷积核做元素级乘法,生成一个大的输出区域(与卷积核大小相同)。然后,将所有输入像素生成的输出区域叠加(相加),得到最终的输出特征图。
步骤:
- 输入和卷积核:假设有一个 2x2 的输入和一个 2x2 的卷积核。
- 逐像素处理:遍历输入的每一个像素,并与卷积核进行元素级乘法。
- 写入输出矩阵:将相乘后的结果,按照与输入像素对应的位置,写入到输出矩阵中。
- 叠加:将所有输入像素生成的结果矩阵叠加(相加),得到最终的输出。
通过这种操作,一个较小的输入特征图(例如 2x2)可以生成一个较大的输出特征图(例如 3x3 或 4x4),从而实现了高和宽的增大。

- 填充(Padding):转置卷积的填充是在输出上进行的,这与常规卷积的输入填充不同。
- 步幅(Stride):转置卷积的步幅决定了输入像素在输出上移动的距离,从而成倍地增大输出特征图的尺寸。例如,步幅为 2 会使输出高宽加倍。
2.2 为什么叫“转置”卷积
从数学角度看,常规卷积可以被表示为一个矩阵乘法。
- 常规卷积:
- 可以将卷积核 W 构造为一个矩阵 V。
- 将输入 X 和输出 Y 展开成向量 X′ 和 Y′。
- 卷积操作等价于矩阵乘法:Y′=V×X′。
- 转置卷积:
- 转置卷积则等价于使用矩阵 V 的转置进行乘法:Y′=VT×X′。
因此,一个常规卷积如果能将输入从 (H, W) 变为 (H’, W’),那么使用相同超参数的转置卷积,就可以将输入从 (H’, W’) 变回 (H, W)。这就是“转置卷积”名称的由来,因为它在矩阵乘法层面是常规卷积的转置。

2.3 转置卷积也是一种卷积
转置卷积本质上是一种特殊的卷积操作。它的特殊之处在于,它通过对输入和卷积核进行巧妙的变换,来实现上采样(增大高宽)的目的。
- 常规卷积:通常用于下采样,即减小高和宽。
- 转置卷积:通常用于上采样,即增大高和宽。
在相同超参数(如卷积核大小、步幅和填充)的情况下,转置卷积在形状上是常规卷积的逆变换。如果一个常规卷积将输入从 (H, W) 变为 (H’, W’),那么使用相同超参数的转置卷积,就可以将输入从 (H’, W’) 变回 (H, W)。

我们可以将转置卷积的计算过程,等价地转换为一个常规卷积的计算。为了将转置卷积等价于一个常规卷积,需要对输入和卷积核进行特定的预处理:
- 处理输入:在输入的行和列之间插入 S−1 行或列的零,其中 S 为转置卷积的步幅。
- 处理输入(填充):在输入的上下左右填充 K−P−1 行或列的零,其中 K 为卷积核大小,P 为转置卷积的填充。
- 处理卷积核:将卷积核矩阵进行上下左右翻转。
完成上述转换后,再对预处理后的输入和卷积核进行常规卷积计算(填充为 0,步幅为 1),得到的输出将与原始转置卷积的输出完全一致。

形状的数学关系
假设:
- 常规卷积:输入高或宽为 N,卷积核大小 K,填充 P,步幅 S,输出高或宽为 N′。
- 转置卷积:输入高或宽为 N′,卷积核大小 K,填充 P,步幅 S,输出高或宽为 N。
它们之间的数学关系如下:
- 常规卷积:N′=⌊SN−K+2P⌋+1
- 转置卷积:N=S×(N′−1)+K−2P
如果常规卷积的计算结果能够被整除,即 SN−K+2P 为整数,那么这两个公式互为逆运算,再次证明了它们在形状上的逆变换关系。

3 FCN
FCN (Fully Convolutional Network) 是用深度学习解决语义分割问题的奠基性工作。虽然现在有更复杂的模型,但 FCN 的核心思想仍然是理解现代语义分割模型的基础。
3.1 核心思想
FCN 的核心思想非常简单,但极具开创性:用转置卷积层替换传统 CNN 末尾的全连接层,从而实现对每个像素的预测。
传统 CNN 的局限性:
- 传统的 CNN(如用于图像分类的 AlexNet 或 ResNet)通常以全连接层结束。
- 在进入全连接层之前,会使用全局平均池化层将特征图压缩成一个 1x1 的向量。
- 这种设计虽然适合图像分类(因为只需一个标签),但会丢失重要的空间信息,无法进行像素级别的预测。
FCN 的解决方案:
- FCN 去掉了传统 CNN 架构中最后的全连接层和全局池化层。
- 它的整个网络都由卷积层组成,因此得名“全卷积”。
- 它通过在网络末尾添加转置卷积层,将经过多层下采样(减小尺寸)的特征图还原到与原始输入图像相同的尺寸。
3.2 网络架构
一个典型的 FCN 模型包含以下几个关键部分:
- 基础 CNN 网络:
- 使用一个预训练的 CNN 模型作为基础(例如,在 ImageNet 上训练好的 ResNet)。
- 这个部分用于提取图像的深层特征。
- FCN 会去掉这个基础网络最后的全连接层和全局池化层。
- 1x1 卷积层:
- 紧接着 CNN 输出的特征图,添加一个 1x1 的卷积层。
- 作用:主要用于降低通道数,从而减少后续转置卷积层的计算量。它不会改变特征图的高和宽。
- 转置卷积层:
- 这是 FCN 最关键的部分。
- 作用:通过转置卷积,将小尺寸的特征图放大到与原始输入图像相同的尺寸。
- 通道数:转置卷积层的输出通道数等于我们想要预测的类别数(K)。
- 输出:最终输出一个 H x W x K 的张量,其中 H 和 W 是原始图像的高和宽,K 是类别数。对于每一个像素点,通道上的值代表了它属于各个类别的预测分数。

4 样式迁移
样式迁移是一种将一张图像的内容与另一张图像的样式相结合的技术,从而生成一张新的合成图像。
- 内容图像(Content Image):提供图像中的主体内容、物体和布局。
- 样式图像(Style Image):提供图像的风格、纹理、色彩和笔触。
- 合成图像(Synthesized Image):结合了两者的图像,既保留了内容图像的结构,又呈现出样式图像的风格。
简而言之,样式迁移可以看作是一种高级的、可自定义的“滤镜”,它比传统的固定滤镜更具灵活性。

4.1 基于 CNN 的样式迁移
这是样式迁移领域的奠基性工作。该方法的核心思想是利用卷积神经网络(CNN) 的不同层级来分别提取图像的内容特征和样式特征。
该模型的目标是训练一张合成图像(而不是训练网络权重)。训练的目标是让这张合成图像在两个方面与原始图像相似:
- 内容相似:合成图像在内容上要与内容图像非常接近。
- 样式相似:合成图像在样式上要与样式图像非常接近。
为了实现这两个目标,模型需要定义两个关键的损失函数:内容损失和样式损失。
4.2 工作流程

- 输入:
- 内容图像:你想要保留内容的图像。
- 样式图像:你想要应用的风格图像。
- 合成图像:一张待优化的图像,通常从随机噪声或内容图像初始化。
- CNN 特征提取:
- 将三张图像(内容图像、样式图像、合成图像)分别输入同一个预训练好的 CNN 模型中(例如 VGG 或 ResNet)。
- CNN 的每一层都会输出一个特征图,这些特征图代表了图像在不同抽象层次上的特征。
- 损失函数:
- 内容损失:在 CNN 的高层(更具语义信息)上,计算合成图像的特征图与内容图像的特征图之间的差异。目标是让这个差异最小化,以确保合成图像保留原始内容。
- 样式损失:在 CNN 的低层和中层(更具纹理和色彩信息)上,计算合成图像的特征图与样式图像的特征图之间的差异。这个差异通常通过计算特征图的协方差矩阵(也称为 Gram 矩阵)来衡量,因为它能捕捉不同通道之间的相关性,从而代表样式信息。
- 训练:
- 模型通过反向传播来优化合成图像的像素值,而不是优化网络权重。
- 训练过程不断调整合成图像,以同时最小化内容损失和样式损失。