拓冰建站拓冰建站
首页 / 资讯中心 / 正文

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

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 NetworkFCN的关键贡献就是把用于分类的卷积网络改造成端到端的密集预测模型输入任意大小的图像输出对应大小的像素级类别预测。它让 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,jW1×1Fi,jb \mathbf{S}_{i,j} \mathbf{W}_{1\times1} \mathbf{F}_{i,j} \mathbf{b}Si,j​W1×1​Fi,j​b其中 (\mathbf{F}{i,j}) 是低分辨率特征图在位置 ((i,j)) 的特征向量(\mathbf{S}{i,j}) 是该位置对所有语义类别的打分。它没有混合相邻位置只是在每个位置上把“特征通道”投影成“类别通道”。图 1Fully Convolutional Network 结构示意。图源Dive into Deep LearningCC BY-SA 4.0。3. 为什么需要转置卷积把粗特征图还原到像素尺度经过主干 CNN 后特征图通常比输入小很多。语义分割的输出必须回到原图尺度因此 FCN 需要上采样。D2L 示例中特征图高宽约为输入的 (1/32)于是使用 stride 为 32 的转置卷积把预测图放大回去。如果输入特征图大小为 (H_{\text{in}} \times W_{\text{in}})转置卷积的一种常见输出尺寸关系可以写成Hout(Hin−1)s−2pk H_{\text{out}} (H_{\text{in}} - 1) s - 2p kHout​(Hin​−1)s−2pk其中 (s) 是 stride(p) 是 padding(k) 是 kernel size。D2L 里采用 (s32, p16, k64)正好把 (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,…,C−1}N×H×W每个像素都有一个类别标签于是损失可以写成所有像素交叉熵的平均L−1NHW∑n1N∑i1H∑j1Wlog⁡pθ(Yn,i,j∣Xn,i,j) \mathcal{L} -\frac{1}{NHW}\sum_{n1}^{N}\sum_{i1}^{H}\sum_{j1}^{W} \log p_{\theta}(Y_{n,i,j}\mid X_n,i,j)L−NHW1​n1∑N​i1∑H​j1∑W​logpθ​(Yn,i,j​∣Xn​,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_channelsnum_class), # feature channel - class channel transposed_conv(stride32) # 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就不会只看到复杂模块而能看到背后的主线语义越来越强分辨率越来越粗分割网络的任务就是把这两者重新接起来。参考来源与许可说明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.htmlJonathan Long, Evan Shelhamer, Trevor Darrell, “Fully Convolutional Networks for Semantic Segmentation”, arXiv:1411.4038submitted 2014-11-14last revised 2015-03-08to appear in CVPR 2015。论文链接https://arxiv.org/abs/1411.4038D2L README License SummaryD2L 开源书正文与图示采用 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 进行来源署名与许可说明原始论文图片未转载。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门