图像分割中的全卷积网络(FCN)算法
字数 2271 2025-10-27 08:13:39
图像分割中的全卷积网络(FCN)算法
题目描述:全卷积网络(FCN)是语义分割领域的里程碑式算法。它的核心思想是将传统卷积神经网络(CNN)中用于分类的全连接层替换为卷积层,从而使网络可以接受任意尺寸的输入图像,并输出与之尺寸相同的像素级分类图(即分割图)。在FCN出现之前,基于CNN的分割方法通常需要以图像块(patch)为单位进行密集预测,效率低下且感受野有限。FCN实现了端到端的像素级语义分割,显著提升了这一领域的性能。
解题过程:
-
问题分析与传统方法的局限
- 目标:语义分割的任务是为图像中的每一个像素分配一个类别标签(例如,“人”、“车”、“天空”)。
- 传统CNN的瓶颈:经典的CNN(如AlexNet, VGG)通常以整个图像作为输入,最后通过全连接层输出一个固定维度的向量,用于图像级分类(例如,整张图片是“猫”还是“狗”)。这无法提供像素级的位置信息。
- 早期解决方案:一种朴素的方法是以每个像素为中心,截取一个周围的小图像块(patch),将这个patch输入CNN,预测中心像素的类别。这种方法存在巨大缺陷:
- 计算冗余:相邻patch的重叠区域会被重复计算,效率极低。
- 感受野与精度的权衡:大的patch能提供更多上下文信息(大感受野),但定位精度差;小的patch定位精度高,但感受野有限,可能无法理解大物体的整体结构。
-
FCN的核心思想:全卷积化
- 关键洞察:FCN发现,可以将CNN中的全连接层(如VGG-16最后的3个全连接层)等价地看作卷积核覆盖整个特征图的“卷积层”。
- 例如,一个含有4096个神经元的全连接层,其输入是VGG-16最后一个池化层输出的7x7x512的特征图。这个全连接操作可以看作是用4096个 7x7x512 的卷积核,对 7x7x512 的特征图进行卷积,最终得到 1x1x4096 的输出。
- 全卷积化的结果:经过这种转换,整个网络不再包含全连接层,全部由卷积层和池化层构成。这使得网络可以接受任意宽高的图像作为输入。网络的最终输出将不是一个分类向量,而是一个低分辨率(由于池化层下采样)的“热力图”或“特征图”。
- 关键洞察:FCN发现,可以将CNN中的全连接层(如VGG-16最后的3个全连接层)等价地看作卷积核覆盖整个特征图的“卷积层”。
-
网络结构详解:编码器与解码器
-
编码器(下采样路径)
- 作用:通过一系列的卷积和池化层,逐步提取图像的深层、高级语义特征。特征图的尺寸越来越小,通道数越来越多,每个像素的感受野越来越大。
- 骨干网络:FCN通常使用预训练的分类网络(如VGG-16、ResNet)作为编码器,并将其全连接层移除。例如,输入一张HxWx3的图像,经过VGG-16编码后,会得到一個 (H/32) x (W/32) x 512 的粗粒度特征图。
-
解码器(上采样路径)
- 问题:编码器输出的特征图尺寸太小(例如原图的1/32),无法直接用于像素级预测。我们需要将其放大到原始图像的尺寸。
- 解决方案:转置卷积(Transposed Convolution)
- 也称为反卷积或上采样卷积。它不是通过池化来缩小尺寸,而是通过插入零值或学习参数的方式,将小特征图“放大”到大特征图。
- 具体来说,转置卷积通过在输入特征图的像素之间插入空白(stride>1时),然后进行标准的卷积操作,从而实现尺寸的上采样。
- 跳跃连接(Skip Connections)
- 问题:仅通过转置卷积将32倍下采样的特征图上采样回原图尺寸,结果会非常粗糙,丢失了大量细节信息(如物体边界)。这是因为编码过程中的池化层丢弃了位置细节。
- 解决方案:FCN引入了跳跃连接,将编码器中相同尺寸的、更浅层的特征图与解码器中上采样后的特征图进行融合。
- 浅层特征图的特点:来自网络较早层(如VGG-16的
pool3或pool4层),尺寸较大,包含更多的细节和边缘信息,但语义性较弱。 - 融合过程:例如,FCN-32s是直接将32倍下采样的特征图上采样32倍;FCN-16s则是先将32倍下采样的特征图上采样2倍(变为16倍下采样),然后与编码器
pool4层(16倍下采样)的特征图进行相加(element-wise addition),最后再上采样16倍。FCN-8s则进一步融合了pool3层的特征。这种融合同时保留了深层的语义信息和浅层的细节信息。
-
-
损失函数与训练
- 输出:网络的最终输出是一个与输入图像宽高相同、通道数等于类别数(C)的特征图。对于每个像素位置,在通道维度上应用Softmax函数,得到该像素属于每个类别的概率。概率最大的那个类别即为该像素的预测标签。
- 损失函数:使用逐像素的交叉熵损失。将每个像素的预测概率分布与真实标签(一张与输入图像同尺寸的标签图,每个像素值是类别ID)进行比较,计算损失。然后对所有像素的损失求和或求平均。这就将分割问题转化为了一个密集的分类问题。公式可以简化为:
Loss = -Σ (y_true * log(y_pred)),对图像中的所有像素求和。
-
总结与推理
- 流程回顾:
- 输入:任意尺寸的图像。
- 前向传播:图像经过编码器(如VGG)提取特征,再经过解码器(转置卷积+跳跃连接)上采样,得到与输入同尺寸的C通道输出。
- 计算损失:将输出与真实分割图比较,计算逐像素交叉熵损失。
- 反向传播:通过梯度下降优化网络参数。
- 推理(预测):训练好的模型可以直接输入一张新图像,前向传播一次,即可输出整张图像的分割结果图。
- 流程回顾:
通过以上步骤,FCN成功地解决了端到端的语义分割问题,为每个像素赋予了语义标签,并因其高效和有效性成为了后续许多分割算法的基石。