目录
- 参考资料
- 第1章 前言
- 第2章 RefineNet网络结构
- 2.1 整体结构
- 2.2 Single RefineNet
- 第3章 Pytorch实现RefineNet
参考资料
论文:
RefineNet: Multi-Path Refinement Networks for High-Resolution Semantic Segmentation
博客:
RefineNet
第1章 前言
目前流行的深度网络,比如VGG,Resnet等,由于pooling和卷积步长的存在,feature map会越来越小,导致损失一些细粒度的信息(低层feature map有较丰富的细粒度信息,高层feature map则拥有更抽象,粗粒度的信息)。对于分类问题而言,只需要深层的强语义信息就能表现较好,但是对于稠密预测问题,比如逐像素的图像分割问题,除了需要强语义信息之外,还需要高空间分辨率。针对这些问题,很多方法都提出了解决方案:
- Deconvolution:将反卷积作为上采样操作,但是缺点则是下采样毕竟舍去一部分信息,肯定无法准确恢复在下采样过程中丢失的低层次视觉特征。
- 空洞卷积:没有下采样,而且在不增加参数个数前提下,获得更大的感受野,被成功应用于DeepLab,但弊端有两个:
- 1.它需要在高分辨率特征上计算卷积,而这些特征通常高维,计算量很大,而且在使用空洞卷积时,往往限制最后的输出尺寸为原始输入的1/8;
- 2.空洞卷积过程产生的粗糙特征可能也会丢失一部分重要细节。
- 通过skip connection来产生高分辨率的预测。
作者认为高级语义特征可以更好地进行分类识别,而低级别视觉特征有助于生成清晰、详细的边界。所以作者认为第3点是很好的思路。基于此,作者提出了RefineNet,其主要贡献为:
- 提出一种 Multi-path refinement 网络,称为 RefineNet 。这种网络可以使用各个层级的features,使得语义分割更为精准。
- RefineNet中所有部分都利用 residual connections(identity mappings) ,使得梯度更容易短向或者长向前传,使段端对端的训练变得更加容易和高效。
- 提出了一种叫做 chained residual pooling 的模块,它可以从一个大的图像区域捕捉背景上下文信息。
从网络结构来看,RefineNet是U-Net的一个变种,主要对Decoder部分进行了优化改进。
第2章 RefineNet网络结构
2.1 整体结构
RefineNet的Encoder部分以ResNet为基础,Deconder部分使用新提出的RefineNet为基础。一个基本的框架(4-Cascaded RefineNet)如下图所示:
4-Cascaded RefineNet
将预训练的ResNet分成四部分。根据特征图的采样率,用4个RefineNet单元构成4级联结构。
也就是说除了 RefineNet4 只接受一个ResNet模块的输出,其他三个RefineNet3、2、1都有 2 个输入:ResNet模块的输出+上一个RefineNet模块的输出。
下面是作者提出的其他三种结构:
- (a) Single RefineNet :它从ResNet的四个块中获取所有四个输入,并在单个RefineNet中融合全分辨率特征图;
- (b)2-Cascaded RefineNet:它只使用两个 RefineNet 模块。底部的 RefineNet-2 有两个来自ResNet块 3 和 4 的输入,另一个有三个输入,两个来自剩余的ResNet块,一个来自 RefineNet-2;
- (c)4-Cascaded 2-Scale RefineNet:输入图像被缩放到 1.2 和 0.6 倍,并输入到 2 个独立的ResNets 中生成特征图。
不同的 RefineNet 变体
- 由于网络容量较大,4-Cascaded 2-Scale RefineNet 的效果最好,但也导致训练时间较长。
- 所以,作者在实验中使用4-Cascaded RefineNet 与SOTA方法进行比较。
2.2 Single RefineNet
RefineNet 共包含下面三个核心模块:
- 残差卷积模块RCU(Residual Conv Unit);
- 多分辨率融合模块(Multi-Resolution fuse);
- 链式残差池化模块(Chained Residual Pooling);
(1)RCU:RCU是原始ResNet中卷积单元的简化版本(去掉了批处理规范化层batch-normalization layers);RCU模型的作用是对预训练的ResNet的权重进行微调,每一个输入经过连续两个RCU模块。
模块中包含激活(ReLU)和卷积(Conv3x3)操作,然后使用加法将前后的特征图融合,这在设计上ResNet思想相同。
(2)Multi-resolution Fusion:作用是两个输入通过这个模块融合到高分辨率特征图上。对输入的特征图做适当的卷积然后产生同样维度的特征映射,然后对所有通道的结果求和(若只有一个输入路径,例如RefineNet-4,则不需要这个模块)。
(3)Chained Residual Pooling:链式残差池化的目的是为了从大的图像区域捕获其上下文背景信息。所有池化块的输出特征图通过残差连接的求和与输入特征图融合在一起。
(4)Output Conv: 最后放置另一个RCU,对多路径融合的特征图进行非线性操作,生成feature供进一步处理或最终预测。
第3章 Pytorch实现RefineNet
参考代码:
refinenet_pytorch
博客:
语义分割网络RefineNet原理与Pytorch实现(附代码地址)