代码地址:RefineNet
1. 概述
导读:由于传统的CNN网络中带有池化层与stride不为1的卷积,使得特征分辨率逐渐下降。对此文章提出了RefineNet,这是一个多路径优化网络,其采集并利用CNN网络下采样路径上的可用信息,之后以shortcut连接的方式获取高分辨率的预测结果,并且这个网络可以端到端训练。网络在VOC-2012分割数据集上的性能为83.4。
下面是文章的方法进行分割得到的结果示例:
对于CNN网络带来的特征分辨率下降的问题,文中分析了解决该问题的两个思路:
- 1)使用上采样方法,如upsampling,但是这个方法不能恢复在下采样过程中丢失的低层次视觉特征,自然也不会产生高质量的分割结果;另外一个思路是使用膨胀卷积扩大感受野,如DeepLab系列方法,但是这样会带来较大的计算与显存开销,并且膨胀卷积会得到较为粗糙的下采样特征,可能会导致重要信息丢失;
- 2)使用CNN网络的中间层来生成高质量的分割结果,中间层的特征包含了低层次的空间视觉信息。
这篇文章采用的思路是第二种,使用高层次的特征去识别图像的区域,而低层次的特征用以寻找分割的边缘等细节信息。这篇文章提出的方法能够很好使用这些低层次的信息以实现高分辨率分割,文章的主要贡献如下:
- 1)提出了多路优化网络RefineNet,使用多个尺度的信息来得到高分辨分割结果,它是通过不断使用来自低层次特征的信息来优化高层次低分辨率的信息得到的。而且backbone网络设计灵活可以任意更换;
- 2)提出的网络可以端到端训练;
- 3)提出了链式残差池化用以增加感受野;
- 4)文章提出的网络结构在多个数据集上表现均不错;
2. 方法设计
2.1 现有方法分析
对于分割任务主要是在与训练好的模型(VGG、ResNet…)上进行的,这类基础模型的结构如下:
为了实现语义分割在其后端加入上采样层,得到分割网络
如上图所示的结构是需要很大的资源开销的。
对此,文章提出了新的分割算法RefineNet,其网络结构见下图所示:
特征在每个stage上迭代进行优化得到最后的分割结果。
2.2 RefineNet Block
下面是RefineNet内部实现的具体结构:
RefineNet block的结构如图3所示,其中只有RefineNet-4的输入只有一个(最后一个stage嘛,自然只有一个),而其它的RefineNet模块是有多个的。该模块由以下几个部分组成:
1. Residual convolution unit
这是一个由去掉BN层的简单ResNet结构构成的单元,用于连接主干网络的特征。在文章将RefineNet-4的filter数量设置为512,而其它的RefineNet模块设置为256;
2. Multi-resolution fusion
这个模块是用于将不同分辨率的特征进行融合,对于分辨率小的特征图是通过上采样使其分辨率一致,之后将两个特征图相加得到融合的特征。对于RefineNet-4的输入只有一个的情况,会直接通过,不会做任何改变;
3. Chained residual pooling
这个模块的结构类似于ResNet结构,是用于捕获图像较大区域的背景上下文信息,它使用多个窗口尺寸去池化输入特征,之后将其使用可学习的参数融合起来。其基本结构就是池化与卷积的组合(pooling block),文中将其设置为两个这样的基本结构级联,且stride=1。之后再通过相加的形式与原特征相融合。作者提出在整个学习过程中带权重的卷积层可以去学习pooling block的重要性;
4. Output convolutions
这个地方的输出使用的是之前提到的RCU模块,这样的话每个RefineNet之间就存在3个RCU了;
3. 实验结果
CityScapes数据集:
VOC数据集: