FCN相关问题的一些整理 (FCN VGG Segnet resnet )

本文介绍了FCN、VGG和ResNet在深度学习中的应用和特点。FCN作为全卷积网络,解决了密集预测问题;VGG通过小卷积核和多层设计探索了网络深度与性能的关系;ResNet则通过残差结构解决了深度网络中的梯度消失问题,使得网络可以达到千层以上仍然有效。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



1  FCN 相对CNN的优点

1) 2014年,加州大学伯克利分校的Long等人提出的完全卷积网络(Fully Convolutional Networks),推广了原有的CNN结构,在不带有全连接层的情况下能进行密集预测。

这种结构的提出使得分割图谱可以生成任意大小的图像,且与图像块分类方法相比,也提高了处理速度。在后来,几乎所有关于语义分割的最新研究都采用了这种结构。
2)  除了全连接层结构,在分割问题中很难使用CNN网络的另一个问题是存在池化层。池化层不仅能增大上层卷积核的感受野,而且能聚合背景同时丢弃部分位置信息。然而,语义分割方法需对类别图谱进行精确调整,因此需保留池化层中所舍弃的位置信息。

研究者提出了两个不同形式的结构来解决这个问题。
1) 第一种方法是编码器-解码器(encoder-decoder)结构。 在这种方法中,一种典型结构为U-Net网络。
2) 第二种方法使用了称作空洞卷积的结构,且去除了池化层结构。
3) 条件随机场(Conditional Random Field,CRF)方法通常在后期处理中用于改进分割效果。CRF方法是一种基于底层图像像素强度进行“平滑”分割的图模型,在运行时会将像素强度相似的点标记为同一类别。加入条件随机场方法可以提高1~2%的最终评分值。

FCN 论文:Fully Convolutional Networks for Semantic Segmentation
主要贡献 
http://www.dataguru.cn/article-11733-1.html
提出了跳跃连接来改善上采样的粗糙程度。
1)将端到端的卷积网络推广到语义分割中;
2)重新将预训练好的Imagenet网络用于分割问题中;
3)使用反卷积层进行上采样;
4)提出了跳跃连接来改善上采样的粗糙程度。

用卷积运算实现的全连接层结构
1)在将VGG等预训练网络模型的全连接层卷积化之后,由于CNN网络中的池化操作,得到的特征图谱仍需进行上采样。
2)反卷积层在进行上采样时,不是使用简单的双线性插值,而是通过学习实现插值操作。
此网络层也被称为上卷积、完全卷积、转置卷积或是分形卷积。

3 VGG 特点:

 VGGNet:

(1) 牛津大学计算机视觉组(Visual Geometry Group)和GoogleDeepMind公司的研究员一起研发的

(2)探索了卷积神经网络的深度与其性能之间的关系,反复读碟3*3的小型卷积核和2*2的最大池化层,16-19层深的卷积神经网络

(3)取得了ILSVRC2014比赛分类项目的第2 名,定位项目的第1名。

(4)VGG的网络结构:

  • 5段卷积层+3段全连接层
  • 两个3*3的卷积层串联相当于1个5*5的卷积层,即一个像素会跟周围5*5的像素产生关联,感受野大小为5*5
  • 三个3*3的卷积层串联的效果相当于1个7*7的卷积层。
  • 3个串联的3*3的卷积层,比1个7*7的卷积层参数量少,只有后者的(3*3*3)/(7*7)=55%
  • 3个3*3的卷积层比1个7*7的卷积层有更多的非线性变换,前者可以使用三次ReLU激活函数,后者只有一次
  • 至于为什么用3x3的滤波器尺寸,
  • 是因为这是能捕捉到各个方向的最小尺寸了,如ZFNet中所说,由于第一层中往往有大量的高频和低频信息,却没有覆盖到中间的频率信息,且步长过大,容易引起大量的混叠,因此滤波器尺寸和步长要尽量小;这里使用1x1的卷积模版是因为1x1就相当于可以看作是一种对输入通道进行线性变换的操作(增加决策函数的非线性且不会影响到感受野的大小)。

(5)VGG训练技巧:

  • 先训练级别A的简单网络,再复用A网络的权重来初始化后面的几个复杂模型,训练收敛的速度更快。
  • 训练时采用multi-scale方法做数据增强,将原始图像缩放到不同尺寸S,然后再随机裁切224*224的图片,这样能增加很多数据量,防止过拟合。
  • 预测时,VGG采用Multi-scale的方法,输入图像为多尺度Q,且对于每个Q在最后一个卷积层使用滑窗的方式进行分类预测,将不同窗口的分类结果平均,再将不同尺寸Q的结果平均得到最后结果。

(6)VGG结论:

  • LRN层作用不大。 LRN全称为Local Response Normalization,即局部响应归一化层
  • 越深的网络效果越好
  • 1*1的卷积也是很有效的,但是没有3*3的卷积好,大一些的卷积核可以学习更大的空间特征。

SegNet
FCN网络中,通过上卷积层和一些跳跃连接产生了粗糙的分割图,为了提升效果而引入了更多的跳跃连接。

然而,FCN网络仅仅复制了编码器特征,而Segnet网络复制了最大池化指数。

<think>好的,我需要比较SegNet与PSPNet这两种深度学习模型在语义分割中的特点和应用场景。首先,我应该回顾一下两种模型的基本结构和工作原理,然后找出它们的优缺点,最后根据这些信息分析它们的适用场景。 首先,SegNet。根据引用[3],SegNetFCN之后的一个改进模型,主要特点是使用了编码器-解码器结构,并且在解码器中引入了池化索引(pooling indices)。编码器部分类似于VGG16,通过卷积和池化层逐步下采样,而解码器则通过上采样和卷积来恢复空间分辨率。池化索引的作用是在上采样时保留位置信息,这样可以在减少参数量的同时保持较高的精度。SegNet的结构相对简单,计算效率较高,适合实时应用,比如自动驾驶中的场景理解[^1][^3]。 然后是PSPNet。引用[1]和[3]提到,PSPNet提出了金字塔池化模块(Pyramid Pooling Module),通过不同尺度的池化操作来捕获多尺度上下文信息。这个模块能够融合不同区域的上下文信息,帮助模型更好地理解全局场景,从而改善对大小不一物体的分割效果。PSPNet通常在复杂场景中表现更好,比如城市街景或自然景观中的细粒度分割,但计算量较大,可能不适合实时应用[^3]。 接下来需要比较两者的结构差异。SegNet依赖池化索引来恢复细节,而PSPNet通过金字塔池化整合多尺度特征。这意味着SegNet可能在边缘细节保持上更好,而PSPNet在处理不同尺寸物体时更鲁棒。在应用场景上,SegNet适用于需要快速推理的场景,而PSPNet适合对精度要求高且允许较高计算资源的任务。 还需要考虑它们的实现细节。例如,SegNet的解码器结构较为轻量,参数较少,而PSPNet由于金字塔池化模块的存在,参数和计算量更大。引用[2]提到PSPNet结合了ResNet等骨架网络,可能进一步提升性能,但这也增加了模型复杂度。 最后,总结两者的对比,结构差异导致不同的优缺点,进而影响适用场景。需要确保这些分析都有引用支持,并且正确对应到参考文献。</think>### SegNet与PSPNet对比分析 #### 1. **模型结构与核心思想** - **SegNet** - **结构特点**: 采用对称的编码器-解码器架构,编码器部分与VGG16相似,通过卷积和池化层逐步下采样;解码器通过池化索引(记录池化操作的位置)进行上采样,恢复空间分辨率。 - **优势**: 池化索引减少了参数数量,同时保留了细节信息,适合实时应用(如自动驾驶)[^3]。 - **局限**: 对多尺度特征融合能力较弱,复杂场景下分割精度受限。 - **PSPNet** - **结构特点**: 在骨干网络(如ResNet)后添加金字塔池化模块(Pyramid Pooling Module),通过不同尺度的池化操作捕获多尺度上下文信息,最后融合特征并上采样[^1]。 - **优势**: 多尺度特征融合能力强,适用于复杂场景(如街景、医学图像)。 - **局限**: 计算量大,实时性较差。 #### 2. **性能对比** | **指标** | **SegNet** | **PSPNet** | |----------------|-------------------------------------|-------------------------------------| | **精度** | 中等(依赖池化索引恢复细节) | 较高(多尺度上下文增强全局感知) | | **速度** | 较快(轻量解码器) | 较慢(金字塔池化增加计算量) | | **参数量** | 较少(约29.5M) | 较多(依赖骨干网络,如ResNet-101) | | **适用场景** | 实时任务(自动驾驶、视频分割) | 高精度需求(遥感、医学图像) | #### 3. **应用场景** - **SegNet**: - 自动驾驶中的道路分割。 - 计算资源受限的移动端部署。 - **PSPNet**: - 城市街景解析(如Cityscapes数据集)[^1]。 - 医学图像中器官或病灶的精细分割[^2]。 #### 4. **实现示例(PyTorch伪代码)** ```python # SegNet解码器示例(池化索引上采样) class SegNetDecoder(nn.Module): def forward(self, x, pool_indices): # 使用池化索引进行上采样 x = nn.MaxUnpool2d(kernel_size=2)(x, pool_indices) return x # PSPNet金字塔池化模块 class PSPModule(nn.Module): def __init__(self, pool_sizes=[1, 2, 3, 6]): self.p
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值