FCN (2015):用于语义分割的卷积网络,语义分割开山作,所有学校第一课

FCN (2015):用于语义分割的卷积网络,语义分割开山作,所有学校第一课

导出时间:2025/11/23 20:30:40

1、研究背景与动机

计算机视觉的发展趋势

在深度学习爆发之前,计算机视觉常常依赖“人工设计特征”(比如 SIFT、HOG)。这些方法在某些任务上有效,但遇到复杂场景时往往力不从心。
后来,卷积神经网络(CNN)的出现带来了突破:
  • 图像分类(例如识别“这是一只猫还是一只狗”)已经被 CNN 大幅提升。
  • 目标检测(找到图像中的物体位置)也因为 CNN 有了跨越式发展。
但是,这些都还是粗粒度任务:分类只回答“是什么”,检测回答“在哪里”,而没有给出像素级别的“边界”。

语义分割的挑战

所谓语义分割,就是要给每个像素打上类别标签。 比如:一张街景图像,天空的每个像素都标记为“sky”,汽车区域的每个像素都标记为“car”,路面标记为“road”。
这就好比:
  • 分类任务像是医生说“你得了感冒”;
  • 检测任务像是医生指出“感冒影响了你的喉咙”;
  • 分割任务则要求医生精确画出“喉咙炎症的每一处范围”。
困难在于:
  1. 全局语义 vs. 局部细节的矛盾
    • 高层特征知道“这里有一只狗”,但它往往失去精细的边缘信息。
    • 低层特征知道“这条边界很清晰”,但不知道这是狗还是背景。
  2. 计算效率问题
    • 以往的分割方法常常需要先做“超像素分割”、“候选框生成”或“条件随机场优化”,步骤繁琐而慢。
    • 如果能让网络直接“输入整张图 → 输出像素级预测”,就会更快更干净。

为什么提出 FCN

论文的核心动机在于:
  • 把分类网络直接改造为能做密集预测的工具
  • CNN 的全连接层,其实可以转化为卷积层,从而支持任意大小输入并输出对应大小的预测图。
  • 通过“全卷积”的形式,模型可以:
    1. 端到端训练:直接用像素标签优化网络,不需要额外步骤。
    2. 高效推理:相比传统的“分块处理”,整图卷积计算更快。
    3. 多层特征结合:通过“跳跃连接”,把粗的语义信息和细的边界信息结合起来,得到既理解全局又保留细节的结果。

FCN网络结构

image.png
上图模型结构为针对VOC数据集的21个语义分割,即数据集包含21种不同分割类型。当图像进入神经网络,第一个卷积层将图像由三通道转换为96通道 feature map,第二个卷积层转换为256个通道,第三个卷积层384个通道,直到最后一个卷积层变为21个通道,每个通道对应不同分割类型。实际上,卷积层整个网络结构中卷积层的通道数可以根据不同任务进行调整,前面每经过一层会对图像进行一次宽高减半的下采样,经过5个卷积层以后,feature map 的尺寸为输入的1/32,最后通过转置卷积将 feature map 宽高恢复到原始输入图像尺寸。

1)整体思路:把“分类网络”卷积化,做像素级预测

  • 去掉全连接层:把原来分类网络尾部的全连接层(FC)改成等价的卷积层(例如常见做法:fc6 -> 7×7 conv,4096通道;fc7 -> 1×1 conv,4096通道;最后 1×1 conv -> C 类)。这样网络对任意大小输入都能产生空间化的类别分数图(score map)
  • 转置卷积(反卷积)上采样:由于下采样(池化/步幅)导致特征图分辨率变小(通常到1/32),需要用转置卷积把分数图上采样回原图大小,实现逐像素预测。
  • 像素级损失:在上采样到原图尺度后,对每个像素做 softmax,使用像素级交叉熵训练。
只用最深层的语义信息会**“懂什么但边界糊”;解决办法是把浅层的细节**融合进来,得到更精细的分割。三种标准变体如下:

FCN-32s(最简单,结果较粗)

  • 直接将最深层(步幅 32)的分数图一次上采样 ×32到原图,得到预测。
  • 结构最简单,边界最糊,作为基线。
image.png

◉ FCN-16s(加入 pool4 的跳跃连接)

  • 先把最深层分数图上采样 ×2 → 步幅 16
  • pool4(步幅 16)对应的浅层分数图进行逐元素相加(Add 融合)
  • 上采样 ×16得到最终预测。
  • 这样既保留了深层语义,也引入了更细的位置信息,边界明显更清晰。
image.png

FCN-8s(再加 pool3 的跳跃连接,最细)

  • 把最深层分数图上采样 ×4 → 步幅 8
  • 同时将 pool4 的分数图上采样 ×2 → 步幅 8
  • 再与 pool3(步幅 8)的分数图三路融合(Add)
  • 最后上采样 ×8到原图,得到最细的结果(边界最好)。

融合方式:逐像素相加(Add)是论文与多数实现的默认做法;融合前需通过 1×1 卷积把各支路调到相同通道数(即 C 类),并确保空间尺寸(步幅)对齐。

image.png