RefineNet: Multi-Path Refinement Networks for High-Resolution Semantic Segmentation解读
代码开源https://github.com/guosheng/refinenet
参考博客
http://blog.****.net/melpancake/article/details/54143319
http://blog.****.net/bea_tree/article/details/58208386
http://blog.****.net/zhangjunhit/article/details/72844862
这篇文章核心创新点在于设计了类似金字塔图像,从原始图像的多个尺度来提取不同尺度的特征,最后通过设计多路径细化的结构将不同尺度的特征map进行融合,从而将粗糙的高层语义特征和细粒度的低层特征融合。同时网络的实现上也采用了残差网络的快捷连接的结构,从而有助于网络梯度的传播,有效地训练网络。
文章的核心就是"Exploit multi-level features for high-resolution prediction with long-range residual connections."
1 Introduction
直接将 CNN 网络模型如 VGG 、Residual Net 用于语义分割存在的问题就是 CNN 卷积池化得到的特征图是降采样32倍的,很多细节丢失,这对于分割问题来说得到的结果太粗糙了。
解决方法之一就是通过学习反卷积滤波器来放大特征图 up-sampling operation,这个方法因为不能恢复 low-level visual features 所以导致分割的精度不高。
文献【6】通过引入 atrous (or dilated) convolutions 通过 larger receptive fields 避免降采样。这个方法尽快很成功,但是仍然有两个缺点:1)因为卷积核比较大,卷积的区域较大,计算量也就比较大。再就是 a large number of high-dimensional and high-resolution feature maps 导致需要较大的 GPU 内存,尤其在训练时,这就导致输出结果的尺寸是输入的 1/8 ; 2) dilated convolutions 引入了 coarse sub-sampling of features,这可能导致重要信息的丢失。
文献【36】【22】使用了 intermediate layers 来生成高分辨率分割结果。这里我们认为 features from all levels 对于语义分割都是有帮助的。这里我们提出了一个框架将所有的特征融合起来用于语义分割。
RefineNet block的作用就是把不同resolution level的feature map进行融合。网络结构如下:
最左边一栏就是FCN的encoder部分(文中是用的ResNet),先把pretrained ResNet按feature map的分辨率分成四个ResNet blocks,然后向右把四个blocks分别作为4个path通过RefineNet block进行融合refine,最后得到一个refined feature map(接softmax再双线性插值输出)。
注意除了RefineNet-4,所有的RefineNet block都是二输入的,用于融合不同level做refine,而单输入的RefineNet-4可以看作是先对ResNet的一个task adaptation。
接下来仔细看一下RefineNet block,可以看到主要组成部分是Residual convolution unit, Multi-resolution fusion, Chained residual pooling, Output convolutions. 切记这个block作用是融合多个level的feature map输出单个level的feature map,但具体的实现应该是和输入个数、shape无关的。
- Residual convolution unit就是普通的去除了BN的residual unit;
- Multi-resolution fusion是先对多输入的feature map都用一个卷积层进行adaptation(都化到最小的feature map的shape),再上采样再做element-wise的相加。注意如果是像RefineNet-4那样的单输入block这一部分就直接pass了;
-
Chained residual pooling 没太看懂怎么残差相加的(其中的ReLU非常重要),之后再修改;
博主理解
- 可以看到和传统的encoder-decoder模式不同,这里的decoder部分直接取了encoder部分的各层feature map进行融合,这种形式应该不能称为decoder了,但效果确实好,而且引入的额外计算也不是特别多。
- 传统的encoder-decoder框架的semantic segmentation方案一般输出的轮廓都不太行,需要外加dense crf,而最近看见许多高分辨率的paper都不需要外加crf,应该是一个趋势。
- 这篇文章里关于残差结构的很多分析很值得学习。
- Output convolutions就是输出前再加一个RCU。