理解空洞卷积
标准卷积可以看做 r = 1 的空洞卷积,是空洞卷积的特殊形式。
标准卷积:以3*3为例,以下分辨率不变与分辨率降低的两个实例;
空洞卷积有两种实现方式:
- 第一种是插入空洞(零元素)或者对输入特征地图同等稀疏地采样,来对滤波器进行上采样。
-
第二种方法,通过一个等于atrous convolution rate r的因子对输入特征图进行子采样,对每个 r×r 可能的偏移,消除隔行扫描生成一个 r^2 降低的分辨率图。接下来对这些中间特征图使用标准卷积,隔行扫描生成原始图像分辨率。
空洞卷积,r=2, stride=1
空洞卷积的作用
- 扩大感受野:在deep net中为了增加感受野且降低计算量,总要进行降采样(pooling或s2/conv),这样虽然可以增加感受野,但空间分辨率降低了。为了能不丢失分辨率,且仍然扩大感受野,可以使用空洞卷积。这在检测,分割任务中十分有用。一方面感受野大了可以检测分割大目标,另一方面分辨率高了可以精确定位目标。
- 捕获多尺度上下文信息:空洞卷积有一个参数可以设置dilation rate,具体含义就是在卷积核中填充dilation rate-1个0,因此,当设置不同dilation rate时,感受野就会不一样,也即获取了多尺度信息。多尺度信息在视觉任务中相当重要啊。
从这里可以看出,空洞卷积可以任意扩大感受野,且不需要引入额外参数,但如果把分辨率增加了,算法整体计算量肯定会增加。
ps: 空洞卷积虽然有这么多优点,但在实际中不好优化,速度会大大折扣。
由于语义分割需要获得较大的分辨率图,因此经常在网络的最后两个stage,取消降采样操作,之后采用空洞卷积弥补丢失的感受野。
感受野计算
空洞卷积实际卷积核大小:
K=k+(k-1)(r-1),k为原始卷积核大小,r为空洞卷积参数空洞率;
感受野递推公式:
R(n-1) = f(n) + ( R(n) - 1 ) * S(n).
其中以n=0代表第零层。R(0)表示感受野。就是最高level的featuremap一个像素单元在几次卷积(下采样)之后对应原图的像素单元个数(也即是最后一个像素的输出占了原输入多少像素)。一般是11对应感受野 RR . 假设图像是方形的我们只推一边的线性长度为例。1→R这样。fn是得到第n层卷积用的filter边长(大小一般表示为f*f)。Sn是filter移动步幅。
卷积层输出计算公式:
N = (W − F + 2P )/S+1
输入图片大小 W×W,Filter大小 F×F,步长 S,padding的像素数 P
输出图片大小为 N×N
举例
经过三个r=2; 3*3 S=1的filter(即三层5*5, S=1的filter进行卷积)后一个1*1大小像素在原图中的感受野。
计算:
R2 = f3 + (R3-1)*S =5+(1-1)*1= 5
R1 = f2 + (R2-1)*S =5+(5-1)*1 = 5+4
R0 = f1 + (R1-1)*S =5+(9-1)*1 =5+(5+4-1)*1=5+4+4=13
推荐一个感受野计算网站
空洞卷积gridding问题(网格效应/棋盘问题)
k=3,r=2的扩张卷积,从Conv2−−>Conv3,25个像素只有9个像素做了贡献
可以看到top feature map使用扩张卷积只能以棋盘的形式查看信息,这会丢失大量信息.
-
当high layer中rrr变的越来越大,这会使得从输入中采样的数据越来越稀疏,不利于卷积学习,因为
- 局部信息丢失:由于空洞卷积的计算方式类似于棋盘格式,某一层得到的卷积结果,来自上一层的独立的集合,没有相互依赖,因此该层的卷积结果之间没有相关性,即局部信息丢失。
- 信息之间太远不相关:由于空洞卷积稀疏的采样输入信号,使得远距离卷积得到的信息之间没有相关性,影响分类结果。
-
r×r的区域从完全不同的“网格”集合内接收信息,这会损害本地信息的一致性。
解决方案
- anqu Wang,Pengfei Chen, et al.Understanding Convolution for Semantic Segmentation.//WACV 2018
代码:官方代码
通过图a解释了空洞卷积存在的问题,从左到右属于top-bottom关系,三层卷积均为r=2的dilatedConv,可以看出最上层的红色像素的感受野为13,很容易看出其存在的问题。
使用HDC的方案解决该问题,不同于采用相同的空洞率的deeplab方案,该方案将一定数量的layer形成一个组,然后每个组使用连续增加的空洞率,其他组重复。如deeplab使用rate=2,而HDC采用r=1,r=2,r=3三个空洞率组合,这两种方案感受野都是13。但HDC方案可以从更广阔的像素范围获取信息,避免了grid问题。同时该方案也可以通过修改rate任意调整感受野。
考虑到N个size为K*K的空洞卷积,对应的空洞率为[r1, r2, ..., ri, ..., rn]
HDC实例:
- 对于常见的扩张卷积核大小K=3,如果r=[1,2,5]则 r=[1,2,5]
- 如果r=[1, 2, 9],则 r=[1, 2, 9]
论文给出使用不同扩张率的扩张卷积策略是锯齿波(sawtooth wave-like)变化形式:即取几层为一组,每个组的扩张率从低向高增加,每个组类似,即扩张率变换类似锯齿波。锯齿波能同时满足小物体大物体的分割要求(小rate提取本地信息,大rate提取长距离信息)。
需要注意的是,一个组内的卷积不应该有一个固定的变换因子,即不要用大于1的公约数(例如2,4,8的公约数为2>1),否则依旧无法减小"girdding"效应。
- Fisher Yu, et al. Dilated Residual Networks. //CVPR 2017
论文详解
代码:https://github.com/fyu/drn
如果特征map有比空洞率更高频的内容,则grid问题更明显。
提出了三种方法:
Removing max pooling:由于maxpool会引入更高频的激活,这样的激活会随着卷积层往后传播,使得grid问题更明显。
Adding layers:在网络最后增加更小空洞率的残参block, 有点类似于HDC。
Removing residual connections:去掉残参连接,防止之前层的高频信号往后传播。
PS:空洞前与空洞后感受野可以不一致,但空洞后的感受野不要小于之前的,这样其实是不影响网络精调的,因为参数没有变。
参考链接:
总结-空洞卷积
HDC,UDC
Dilated Residual Networks
如何理解空洞卷积-知乎回答--梁思远
空洞卷积 hole Atrous 原理+图解析+应用
网友评论