FCN:让卷积网络完成像素级语义分割的经典解读
2026/8/25 4:01:51 网站建设 项目流程

FCN:让卷积网络完成像素级语义分割的经典解读

本文是原创中文论文解读,主要参考 Dive into Deep Learning 1.0.3 的 “Fully Convolutional Networks” 章节,以及 Jonathan Long、Evan Shelhamer、Trevor Darrell 的经典论文Fully Convolutional Networks for Semantic Segmentation。文末列出来源、论文与许可说明。本文不做逐段翻译,而是围绕问题背景、结构设计、关键公式/算子和历史影响进行结构化讲解。

1. FCN 要解决的问题:从“识别一张图”到“理解每个像素”

图像分类网络回答的问题是:这张图里有什么。语义分割要回答的问题更细:图中每一个像素属于什么类别。前者输出一个类别分布,后者输出一张与输入图同宽高的类别图。

这听起来只是输出尺寸不同,但模型范式完全不同。传统 CNN 在分类任务里会不断下采样,把空间分辨率压小,再通过全连接层给出全局判断。这样的设计很适合 ImageNet 分类,却天然丢掉了像素级位置。语义分割不能只知道“有狗、有猫、有背景”,还要知道狗的边界在哪里、猫占据哪些像素、背景从哪里开始。

Fully Convolutional Network(FCN)的关键贡献,就是把用于分类的卷积网络改造成端到端的密集预测模型:输入任意大小的图像,输出对应大小的像素级类别预测。它让 CNN 从“图像级识别器”变成“像素级标注器”,这也是后来大量语义分割模型的起点。

2. 核心改造:拿掉全连接层,保留空间结构

FCN 的第一步很朴素:不要让网络最后塌缩成一个向量。D2L 章节用预训练 ResNet-18 做例子,保留前面的卷积特征提取部分,去掉最后的全局平均池化和全连接分类头。

这样做后,网络不再输出一个形如[batch, 1000]的 ImageNet 分类向量,而是输出一个空间特征图。例如输入尺寸为 (320 \times 480) 时,经过 ResNet 主干后可能变成 (10 \times 15) 的高层特征图。空间分辨率被压缩了,但还没有完全消失。

接下来,FCN 用一个 (1 \times 1) 卷积把通道数变成类别数。若 PASCAL VOC 有 21 个类别,那么每个空间位置会得到 21 个通道,对应这个位置属于各类的 logits。

可以把这一层理解为“逐位置分类器”:

Si,j=W1×1Fi,j+b \mathbf{S}_{i,j} = \mathbf{W}_{1\times1} \mathbf{F}_{i,j} + \mathbf{b}Si,j=W1×1Fi,j+b

其中 (\mathbf{F}{i,j}) 是低分辨率特征图在位置 ((i,j)) 的特征向量,(\mathbf{S}{i,j}) 是该位置对所有语义类别的打分。它没有混合相邻位置,只是在每个位置上把“特征通道”投影成“类别通道”。

图 1:Fully Convolutional Network 结构示意。图源:Dive into Deep Learning,CC BY-SA 4.0。

3. 为什么需要转置卷积:把粗特征图还原到像素尺度

经过主干 CNN 后,特征图通常比输入小很多。语义分割的输出必须回到原图尺度,因此 FCN 需要上采样。D2L 示例中,特征图高宽约为输入的 (1/32),于是使用 stride 为 32 的转置卷积把预测图放大回去。

如果输入特征图大小为 (H_{\text{in}} \times W_{\text{in}}),转置卷积的一种常见输出尺寸关系可以写成:

Hout=(Hin−1)s−2p+k H_{\text{out}} = (H_{\text{in}} - 1) s - 2p + kHout=(Hin1)s2p+k

其中 (s) 是 stride,(p) 是 padding,(k) 是 kernel size。D2L 里采用 (s=32, p=16, k=64),正好把 (10 \times 15) 放大到 (320 \times 480)。更一般地,当 kernel size 取 (2s)、padding 取 (s/2) 时,转置卷积可以比较自然地完成 (s) 倍上采样。

这里容易误解的一点是:转置卷积不是普通卷积的严格逆运算。它更像一个可学习的上采样层:先把低分辨率响应铺回高分辨率网格,再通过卷积核学习如何补全空间细节。初始化时常用双线性插值核,让模型一开始就具备平滑放大的行为,随后再通过训练微调。

4. 训练目标:分类损失从“每张图”变成“每个像素”

FCN 的训练目标仍然可以用交叉熵,只是计算对象从图像级标签变成像素级标签。模型输出形状可以抽象为:

Y^∈RN×C×H×W \hat{\mathbf{Y}} \in \mathbb{R}^{N \times C \times H \times W}Y^RN×C×H×W

其中 (N) 是 batch size,(C) 是类别数,(H,W) 是输出高宽。真实标签是:

Y∈{0,…,C−1}N×H×W \mathbf{Y} \in \{0,\ldots,C-1\}^{N \times H \times W}Y{0,,C1}N×H×W

每个像素都有一个类别标签,于是损失可以写成所有像素交叉熵的平均:

L=−1NHW∑n=1N∑i=1H∑j=1Wlog⁡pθ(Yn,i,j∣Xn,i,j) \mathcal{L} = -\frac{1}{NHW}\sum_{n=1}^{N}\sum_{i=1}^{H}\sum_{j=1}^{W} \log p_{\theta}(Y_{n,i,j}\mid X_n,i,j)L=NHW1n=1Ni=1Hj=1Wlogpθ(Yn,i,jXn,i,j)

从实现角度看,它与普通分类很像,只是 logits 多了两个空间维度。模型不再只对整张图做一次判断,而是对每个位置做判断,再把所有位置的误差一起反向传播。

5. 跳跃连接:深层语义和浅层细节必须合流

原始 FCN 论文里非常重要的一点,是把不同深度的特征融合起来。深层特征语义强,但空间粗;浅层特征分辨率高,但语义弱。只靠最后一层上采样,分割边界往往会比较粗糙;只靠浅层特征,又容易缺少类别判别能力。

FCN 的做法是引入 skip connection:把较浅层的预测或特征与深层上采样结果融合,形成 FCN-32s、FCN-16s、FCN-8s 等不同版本。数字可以粗略理解为最终预测图相对输入下采样的步幅。步幅越小,越能保留空间细节。

这个思想后来被反复继承。U-Net 用编码器-解码器和跨层拼接做医学图像分割;DeepLab 系列用空洞卷积和条件随机场/解码头改善边界;SegNet、FPN、Mask R-CNN 等模型也都在用不同方式处理“语义抽象”和“空间定位”的张力。

FCN 的历史意义正在这里:它把语义分割从手工特征、超像素、候选区域流程中拉回到统一的全卷积端到端训练框架里。

6. 从代码视角压缩 FCN 流程

如果把 D2L 的实现思路压缩成伪代码,主流程大致是:

backbone = pretrained_resnet18_without_avgpool_and_fc model = [ backbone, # image -> low-res feature map conv_1x1(out_channels=num_class), # feature channel -> class channel transposed_conv(stride=32) # low-res logits -> input-size logits ] initialize(transposed_conv, bilinear_upsampling_kernel) for images, pixel_labels in dataset: logits = model(images) loss = pixelwise_cross_entropy(logits, pixel_labels) update(model, loss)

这段流程有三个工程直觉。

第一,预训练分类网络并没有被丢掉,而是作为特征提取器迁移到分割任务。FCN 论文把 AlexNet、VGG、GoogLeNet 等分类网络改造成全卷积形式,说明分类预训练可以服务密集预测。

第二,(1 \times 1) 卷积是“类别头”,它把每个空间位置的特征向量转成类别 logits。这个操作成本低,却让分类网络自然适配像素级输出。

第三,转置卷积是“还原头”,它把低分辨率类别响应恢复到输入尺度。上采样核可以从双线性插值开始,再通过训练学习更适合数据的恢复方式。

7. FCN 的局限:它打开了门,但没有解决所有细节

FCN 很经典,但不完美。

首先,简单的 32 倍上采样会让边界偏粗。因为深层特征图已经损失了很多局部位置信息,上采样无法凭空恢复所有细节。

其次,像素级预测需要处理类别不均衡、边界模糊、标注噪声等问题。普通交叉熵能跑通基线,但在真实分割任务里,Dice loss、IoU loss、focal loss、边界损失等后续目标函数经常更合适。

第三,FCN 的感受野和多尺度建模能力还比较直接。复杂场景中,同一类别可能尺度差异巨大,模型既要看局部纹理,也要看全局上下文。后续 PSPNet、DeepLab、HRNet 等模型,很多都在补这个短板。

但这些局限不削弱 FCN 的价值。经典工作往往不是最后答案,而是把问题重新表述成一个更强的基本框架。FCN 让语义分割变成“全卷积密集预测”,这个框架一直延续到今天。

8. 今天为什么还值得读 FCN

今天的分割模型已经远比 FCN 复杂:有 transformer-based segmenter,有 SAM 这样的 promptable segmentation,也有大量多模态分割模型。但 FCN 仍然值得读,原因很简单:它给出了现代分割网络的最小骨架。

只要一个模型要做语义分割,它通常都绕不开几个问题:

  • 如何从图像中提取高层语义特征;
  • 如何把通道维度变成类别维度;
  • 如何把低分辨率特征恢复到像素尺度;
  • 如何融合深层语义和浅层定位信息;
  • 如何定义像素级训练目标。

FCN 对这些问题都给出了干净的第一版答案。理解它之后,再看 U-Net、DeepLab、FPN 或 Mask2Former,就不会只看到复杂模块,而能看到背后的主线:语义越来越强,分辨率越来越粗;分割网络的任务,就是把这两者重新接起来。

参考来源与许可说明

  1. Aston Zhang, Zachary C. Lipton, Mu Li, Alexander J. Smola, “Fully Convolutional Networks”, Dive into Deep Learning 1.0.3. 原文链接:https://d2l.ai/chapter_computer-vision/fcn.html
  2. Jonathan Long, Evan Shelhamer, Trevor Darrell, “Fully Convolutional Networks for Semantic Segmentation”, arXiv:1411.4038,submitted 2014-11-14,last revised 2015-03-08,to appear in CVPR 2015。论文链接:https://arxiv.org/abs/1411.4038
  3. D2L README License Summary:D2L 开源书正文与图示采用 Creative Commons Attribution-ShareAlike 4.0 International License;示例/参考代码采用 modified MIT license。许可说明:https://github.com/d2l-ai/d2l-en

本文为原创中文论文解读,不是对 D2L 章节或原论文的逐段翻译。文中复用的 FCN 结构示意图来自 D2L 页面,已按 CC BY-SA 4.0 进行来源署名与许可说明;原始论文图片未转载。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询