Note for Dilated Conv
最近在做edge detection类型的任务,在edge detection领域,也开始使用了很多semantic segmentation的方法;其中一类就是Dilated Con. 这里特此汇总一下相关的学习资源,和自己在阅读和学习时的心得。
Resources:
各种资源汇总:
Blogs:
- 总结-空洞卷积(Dilated/Atrous Convolution) 知乎专栏LINK 【深度好文】 包含了Dilated Conv问题的讨论。
- 如何理解空洞卷积(dilated convolution)? 知乎提问LINK
- Semantic Segmentation学习流程 https://zhuanlan.zhihu.com/p/145009250 https://zhuanlan.zhihu.com/p/76603228 https://zhuanlan.zhihu.com/p/27794982
- Object Detection–RCNN,SPPNet,Fast RCNN,FasterRCNN论文详解 https://blog.csdn.net/u011974639/article/details/78053203#sppnet
- Witnessing the Progression in Semantic Segmentation: DeepLab Series from V1 to V3+ LINK
Papers:
- Multi-Scale Context Aggregation by Dilated Convolutions 2016 LINK
- Dilated Residual Networks 2017 LINK
- DeepLab: Semantic Image Segmentation with Deep Convolutional Nets, Atrous Convolution, and Fully Connected CRFs 2017 LINK
- Rethinking Atrous Convolution for Semantic Image Segmentation 2017 LINK
- Understanding Convolution for Semantic Segmentation 2018 LINK
- Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation 2018
- LiteSeg: A Novel Lightweight ConvNet for Semantic Segmentation 2019
- RefineNet
- V. Jampani, M. Kiefel, and P. V. Gehler. Learning sparse high dimensional filters: Image filtering, dense crfs and bilateral
neural networks. In CVPR, 2016. 一种独特的卷积方式 (bilateral convolution)
Others:
- 《A guide to convolution arithmetic for deep learning》 and gifs github LINK
Note:
本部分是上面资源or paper学习后的note.
Paper Reading:
本部分是一些经典paper阅读后的note.
Multi-Scale Context Aggregation by Dilated Convolutions 2016
Author: Fisher Yu 2016 LINK 第一篇提出空洞卷积的方法。空洞卷积是下面的那篇BDCN使用到了,这也是我第一次了解这个卷积操作。
Journal: ICLR 2016
提出Dilated Conv的paper. 一种专门design for dense prediction(例如:semantic segmentation)的方法
这种空洞卷积(Dilated Conv)support exponential expansion of the receptive field without loss of resolution or coverage!
作者还指出,将这种Dilated Conv可以作为插入模块,来提升这种dense prediction的性能。
总结:
Dilated Conv的好处:
- 扩大感受野:在deep net中为了增加感受野且降低计算量,总要进行降采样(pooling或s2/conv),这样虽然可以增加感受野,但空间分辨率降低了。为了能不丢失分辨率,且仍然扩大感受野,可以使用空洞卷积。这在检测,分割任务中十分有用。一方面感受野大了可以检测分割大目标,另一方面分辨率高了可以精确定位目标。
- 捕获多尺度上下文信息:空洞卷积有一个参数可以设置dilation rate,当设置不同dilation rate时,感受野就会不一样,也即获取了多尺度(multi-scale)信息。
所以我们可以对于一个feature map使用几组不同dilation rate和padding的dilated Conv来让获取multi-scale信息,之后再concatenate并过一个conv聚合并学习这样的multi-scale的信息。
而语义分割(semantic segmentation)由于需要获得较大的分辨率图,因此经常在网络的最后两个stage,取消降采样操作,之后采用空洞卷积弥补丢失的感受野。
背景:
在图像分割领域,图像输入到CNN(典型的网络比如FCN)中,FCN先像传统的CNN那样对图像做卷积再pooling,降低图像(feature)尺寸的同时增大感受野,但是由于图像分割预测是pixel-wise的输出,所以要将pooling后较小的图像尺寸upsampling到原始的图像尺寸进行预测(upsampling一般采用deconv反卷积操作),之前的pooling操作使得每个pixel预测都能看到较大感受野信息。因此图像分割FCN中有两个关键,一个是pooling减小图像尺寸增大感受野,另一个是upsampling扩大图像尺寸。在先减小再增大尺寸的过程中,肯定有一些信息损失掉了,那么能不能设计一种新的操作,不通过pooling也能有较大的感受野看到更多的信息呢?答案就是dilated conv。
Detail About Dilated Conv:
对于公式化卷积的过程可以如下所示。
其使用的卷积核与普通CNN一直,只不过对于每一个Dilated Conv存在一个factor l.
下图就是Dilated Conv的一个直观实例,也显示出了其特点:The number of parameters associated with each layer is identical. The receptive field grows exponentially while the number of parameters grows linearly.
dilated的好处是不做pooling损失信息的情况下,加大了感受野,让每个卷积输出都包含较大范围的信息。在图像需要全局信息或者语音文本需要较长的sequence信息依赖的问题中,都能很好的应用dilated conv。
下图是传统的卷积:或者说是1-dilated Conv
而下图是2-dilated Conv
值得注意的是这里的这里对于filter的初始化不能是随机的。
DeepLab V2: Semantic Image Segmentation with Deep Convolutional Nets, Atrous Convolution, and Fully Connected CRFs 2017
Author: Liang-Chieh Chen 2017 LINK DeepLab系列方法的v2 是semantic segmentation领域的一个较为经典的方法,其中使用了dilate conv(即:Atrous Conv)。
Journal\Conference: TPAMI 2017
Other‘s Blog:
本文主要的3个核心点在于:
- We highlight convolution with upsampled filters, or ‘atrous convolution’, as a powerful tool in dense prediction tasks.(dilate conv的细节见上文)
- 提出了atrous spatial pyramid pooling (ASPP),这个模块(是SSP Spatial Pyramid Pooling的改进)。其可以提取multi-scale的信息。
- 使用条件随机场改善localization of object boundarie。可以提升localization performance(虽然这种方法现在并不经常使用了,但也是直观的能够改善结果的trick)DCNN和CRF的组合不是新话题,以前的paper着重于应用局部CRF,这忽略像素间的长期依赖。而DeepLab采用的是全连接的CRF模型,其中高斯核可以捕获长期依赖性,从而得到较好的分割结果。 CRF的部分还未详细了解,之后会单独做一个Blog
作者还给出了两种实现空洞卷积的方法(当然现在空洞卷积已经被implement至各大API中了):
- 第一个是通过插入空洞(零)来隐含地对滤波器进行上采样,或等效稀疏地对输入特征图进行采样。通过向im2col函数(从多通道特征图中提取矢量化块)添加稀疏采样底层特征图实现了这一点。
- 第二种方法,用一个等于空洞卷积率r等效的因子对输入特征图下采样,对于每一个r×r的移位,都对其进行去交织以产生$r^2$大小的的分辨率映射。然后将标准卷积应用于这些中间特征图,并隔行扫描生成原始图像分辨率。通过将多孔卷积变换为常规卷积,可以使用现成的高度优化的卷积方法。作者已经在TensorFlow框架中实现了第二种方法。
其整体的模型如下图所示:
比较有亮点的就是atrous spatial pyramid pooling (ASPP)了,这个模块在之后的许多模型中都有使用。
首先要提一下这个方法的灵感来源,即:spatial pyramid pooling(SPP),是在object detection领域提出的方法,作用是来处理region proposal获得的区域不一样,导致之后进入CNN输出的结果不一样,无法使用全连接层,使用SSP就可以让任意size的input输出相同大小的output(使用多组不同大小的卷积)。如下图所示。
作者在文中尝试了两种方法来处理语义分割中的尺度变换:
- 第一种方法相当于标准多尺度处理。(现在已经out了)将原始图像放缩为不同的大小,分别输入到使用相同参数的多个DCNN中,融合score map得到预测结果。为了产生最终的结果,对并行DCNN分支特征图进行双线性插值使其恢复到一定的分辨率,并融合它们,在不同尺度上获取每个位置的最大响应。在训练和测试期间都这样做。多尺度处理显著提高了性能,但代价是需要在输入图像的多个尺度上对所有DCNN层计算特征响应(计算量大)。
- 第二种方法受SPPNet中SPP模块的的启发,它指出在任意尺度的区域,可以用从单个尺度图像中进行重采样提取的卷积特征进行准确有效地分类。我们用不同采样率的多个并行的空洞卷积实现了他们的方案的一个变体。并行的采用多个采样率的空洞卷积提取特征,再将特征融合,类似于空间金字塔结构。所提出的“多孔空间金字塔池化”(DeepLab-ASPP)方法泛化了DeepLab-LargeFOV变体。
DeepLab v2的做法与SPPNet类似,并行的采用多个采样率的空洞卷积提取特征,再将特征融合,类似于空间金字塔结构,形象的称为Atrous Spatial Pyramid Pooling (ASPP)。示意图如下:
即:在同一Input Feature Map
的基础上,并行的使用4个空洞卷积,空洞卷积配置为r = { 6 , 12 , 18 , 24 },核大小为3 × 3。最终将不同卷积层得到的结果做pixel level sum到一起。
Conclusion
DeepLabv2将空洞卷积应用到密集的特征提取,进一步的提出了空洞卷积金字塔池化结构、并将DCNN和CRF融合用于细化分割结果。实验表明,DeepLabv2在多个数据集上表现优异,有着不错的分割性能。
Dilated Residual Networks 2017
Author: Fisher Yu 2017 LINK
Journal\Conference: CVPR 2017
基本来讲就是Dilated Conv + Residual network(残差网络)。本篇文章的模型并不复杂,但是其在文中详细指出了Dilated Conv的存在问题: Gridding!
模型结构(Dilated Residual Network)
首先我们看看ResNet,它大致可分为6个阶段,即 conv1~5加上最后的分类层:
其中conv2~5为4个分别由相同结构、规模的Residual Block堆砌而成,每个阶段都会进行 stride=2 的下采样(striding),其带来的作用是:
- feature maps 尺寸在长宽上都减半
- 令下一层的receptive field翻倍
作者认为feature maps尺寸的快速衰减容易造成信息的损失,是不合理,为了解决这个问题,而不改变下一层的receptive field,作者使用dilate conv来代替部分卷积层。
即如下图所示:
具体来说,就是:
- 在conv4、conv5阶段不下采样,feature maps 尺寸相较conv3 不变。
- 由于原ResNet 的conv4视野相对于conv3是两倍,conv5是conv3的四倍,为了弥补视野行的缺陷,如上图 DRN 在 conv4 设置卷积的 dilation=2,conv5 的dilation=4,卷积核大小依然为3x3。
Dilated Conv的问题 Gridding and Degridding
这样设计在不增加模型参数量的情况下,提高了模型对小物体的识别精度,但存在一个的问题,作者称之为 gridding。
Gridding artifacts occur when a feature map has higher-frequency content than the sampling rate of the dilated convolution.
下图就是整个网络出现gridding实例,DRN-A-18就是上文所提出的模型(未针对gridding问题进行修正)的结果。可以看到其activation map呈现了一种grid pattern.
一个小问题是,上面这张图是怎么得到出来的?利用的是NIN里的 AvgPooling + conv1x1 替代全连接层输出分类。这样可以使得模型参数量大大减少的同时,提高模型的精度,所以许多模型都采用这种方式输出预测分类,而这样训练出来的模型,将 AvgPooling 取消,对于 h*w 大小的 feature map 上的每一点,即 shape 为 (1,1,c) 的 tensor 使用原有的 conv1x1,
下图是另一个此现象的示例:In Figure 4(a), the input feature map has a single active pixel. A 2-dilated convolution (Figure 4(b)) induces a corresponding grid pattern in the output (Figure 4(c)).
作者为了解决这个问题,设计了一种degridding方法,如下图所示
绿色的线表示一个downsampling by stride 2. 同一个level的layer包含同样的dilation和空间分辨率。
主要来讲,从A->B->C包含如下操作
- Removing max pooling. 原因:这种最大池化操作会导致出现high-amplitude high-frequency activations,其会传播到后面的层,并加剧这种gridding的现象。
- Adding layers.
- Removing residual connections.
Rethinking Atrous Convolution for Semantic Image Segmentation 2018
Author: Liang-Chieh Chen 2018 LINK 也就是DeepLab V3
Journal\Conference: arXiv 2018
作者首先提到了semantic segmentation这类dense prediction任务的困难之处。
通常语义分割面临两个挑战:1)由于池化和卷积的降采样操作,导致分辨率的大大降低。atrous convolution的使用可以减缓这个问题。2)样本集中存在不同尺度的目标。作者总结目前(截止至2018年)有以下四类方法来减缓“存在不同尺度的目标”的问题:a)多尺度输入。b)the encoder-decoder structure 。取encoder网络不同分辨率的feature maps,在decoder网络中逐步进行上采样恢复到原来的分辨率。c)在原有的网络后面再串联一个额外的模块,比如串联CRF模块或者额外卷积层。d)spatial pyramid pooling , probes an incoming feature map with filters or pooling operations at multiple rates and multiple effective field-of-views, thus capturing objects at multiple scales.
如下图所示:
在本文中,使用一组同rate的Dliated Conv和batch normalize(通过实验,发现效果好)。
并用其作为捕获上下文信息的模块以及建立空间金字塔池化结构的工具。具体来说,复制ResNet中的最后几个block,将它们级联,同时使用包含多个带孔卷积并行的ASPP模块(如图d)。本文的级联模块直接应用于feature map而不是belief map(应该是softmax的最终结果)。对于给定的模块,本文在实验中发现加入batch normalization去训练的效果更好。为了更好地捕获全局上下文信息,本文提出使用图像层次的特征来强化ASPP。
We discuss an important practical issue when applying a 3 × 3 atrous convolution with an extremely large rate, which fails to capture long range information due to image boundary effects, effectively simply degenerating to 1 × 1 convolution, and propose to incorporate image-level features into the ASPP module.
Going Deeper with Atrous Convolution:
上面的使用的为resnet网络。这里的output_stride值的是the ratio of input image spatial resolution to final output resolution.
这里另一个值得注意的点是(dilate conv的缺点):
具有不同dilate rate的ASPP可以有效地捕获多尺度信息。然而,作者发现随着采样率变大,有效滤波器权重的数量(即权重施加到有效特征区域而不是填充零点的区域)变小。如当把一个3×3的具有不同孔的比率的卷积核应用到65×65特征图上时(效果如下图所示)。在比率值接近于特征图大小的极端情况下,3×3滤波器,不再是捕获整个图像上下文,而是退化为简单的1×1滤波器,因为只有中心滤波器的权重才有效。
这就是dilate conv 的一个缺点和问题所在。
作者为了克服上面这个问题并将全局上下文信息整合到模型中,作者采用了image-level features。具体来说,作者在模型的最后一个特征图上采用了global average pooling,将生成的图像级特征输入到256个1×1过滤器(加入batch normalization)中,然后bilinearly upsample the feature to the desired spatial dimension。最后,作者改进ASPP,a)当输出步长等于16,ASPP包括一个1×1卷积和三个3×3卷积,其中3×3卷积的dilate rate为(6,12,18)(所有的滤波器个数为256且加入了batch normalization)。
b)image-level features. 注意,当输出步长等于8时,rate加倍。在产生最终logits(不知道咋翻)的1×1卷积之前,所有分支的结果特征被连接并通过另一个1×1卷积(也有256个滤波器和加入了batch normalization)。
如下图所示:
Others:
Coding For Dliated Conv
若使用pytorch的话,非常简单,在现有的conv2d中已经支持了参数Dilation这个参数,当其为1是(默认值),此时就是正常的卷积。
1 | conv1 = nn.Conv2d(1, 1, 3, stride=1, bias=False, dilation=1) *# 普通卷积* |
其本质可以看成是对于filter的一个扩展,将filter中间填入0。
How to Compute the Output Size of Dilated Conv?
首先回顾一下标准CNN的计算,设输入feature map尺寸为$(H,W)$,卷积核的大小为: $(K_h,K_w)$, stride为: $(S_h, S_w)$, Padding为 P.
所以标准CNN的输出size就是:
$$H_{new} = \frac{H-K_h+2P}{S_h} + 1, W_{new} = \frac{W-K_w+2P}{S_w} + 1$$
而Dilated Conv可以看成将卷积核填充0. 设 dilatation rate = r.
正常情况下$H=W=F, K_h=K_w=K, S_h=S_w=S$
所以新的kernel的大小为: $K_{new} = K + (K-1)(r-1)$,所以dilated Conv的输出size为:
$$F_{new} = \frac{F-K_{new}+2P}{S}+1 = \frac{F-(K + (K-1)(r-1))+2P}{S}+1$$
How to Compute the Receptive Field of Diltaed Conv?
A Blog’s Link LINK
CNN感受域的的计算如下:从这个公式可以看到,相比前一层,当前层的感受野大小在两层之间增加,这是一个指数级增加。
$$F_i=(F_{i-1}-1) \cdot stride+K_{size}$$
$F_i$为第i层的感受野,stride为第i层的stride,$K_{size}$为卷积核或池化核尺寸。
对于Dilated Conv,其本质可以理解为在卷积核里补充0,即将原始的K变为$K_{new} = K + (K-1)(r-1)$,再带入公式计算即可。
Problems of Dilated Conv
是的,空洞卷积是存在理论问题的,论文中称为gridding,其实就是网格效应/棋盘问题。因为空洞卷积得到的某一层的结果中,邻近的像素是从相互独立的子集中卷积得到的,相互之间缺少依赖。
- 局部信息丢失:由于空洞卷积的计算方式类似于棋盘格式,某一层得到的卷积结果,来自上一层的独立的集合,没有相互依赖,因此该层的卷积结果之间没有相关性,即局部信息丢失。
- 远距离获取的信息没有相关性:由于空洞卷积稀疏的采样输入信号,使得远距离卷积得到的信息之间没有相关性,影响分类结果。
一些解决方法:
- Panqu Wang,Pengfei Chen, et al**.Understanding Convolution for Semantic Segmentation.//**WACV 2018
- Fisher Yu, et al. Dilated Residual Networks. //CVPR 2017
- Zhengyang Wang,et al.**Smoothed Dilated Convolutions for Improved Dense Prediction.//**KDD 2018.
- Liang-Chieh Chen,et al**.Rethinking Atrous Convolution for Semantic Image Segmentation//2017**
- Sachin Mehta,et al. ESPNet: Efficient Spatial Pyramid of DilatedConvolutions for Semantic Segmentation. //ECCV 2018
- Tianyi Wu,et al.Tree-structured Kronecker Convolutional Networks for Semantic Segmentation.//AAAI2019
- Hyojin Park,et al.Concentrated-Comprehensive Convolutionsfor lightweight semantic segmentation.//2018
- Efficient Smoothing of Dilated Convolutions for Image Segmentation.//2019