空洞卷积(扩张卷积dilated convolution)

为什么用空洞卷积?

普通的Deep CNN中普遍包含Up-sampling / pooling layer,导致

  • 内部数据结构丢失;空间层级化信息丢失。

  • 小物体信息无法重建 (假设有四个pooling layer 则任何小于 2^4 = 16 pixel 的物体信息在理论上将无法重建和分割。)
    普通卷积过程如下:
    空洞卷积(扩张卷积dilated convolution)_第1张图片
    在这样显著缺陷问题的存在下,语义分割问题一直处在瓶颈期无法再明显提高精度, 而 dilated convolution 的设计就良好的避免了这些问题。

  • 空洞卷积是可以在不做pooling损失信息的情况下,指数级增加感受野,让每个卷积输出都包含较大范围的信息。

  • 不降低图像高分辨率的前提下增加感受野,能够很好的结合上下文信息,从而精细语义分割效果。
    空洞卷积过程如下:

空洞卷积(扩张卷积dilated convolution)_第2张图片
上图是一个扩张率为2的3×3卷积核,感受野与5×5的卷积核相同,而且仅需要9个参数。
在相同的计算条件下,空洞卷积提供了更大的感受野。空洞卷积经常用在实时图像分割中。当网络层需要较大的感受野,但计算资源有限而无法提高卷积核数量或大小时,可以考虑空洞卷积。

空洞卷积

Dilated/Atrous Convolution(中文叫做空洞卷积或扩张卷积) 或者是 Convolution with holes。从字面上就很好理解,是在标准的 convolution map 里注入空洞,以此来增加 reception field。相比原来的正常convolution,dilated convolution 多了一个 hyper-parameter 称之为 dilation rate(膨胀率) 指的是kernel的间隔数量(正常的 convolution 是 dilatation rate 1)。

下图对于膨胀率有一个比较直观的体现:
空洞卷积(扩张卷积dilated convolution)_第3张图片
  dilation rate=1          dilation rate=2       dilation rate=4
假设原始特征为feat0

  • 首先使用扩张率为1的空洞卷积生成feat1,feat1上一点相对feat0感受野为3*3(如图a);

  • 然后使用扩张率为2的空洞卷积处理feat1生成feat2(如图b),使第一次空洞卷积的卷积核大小等于第二次空洞卷积的一个像素点的感受野,图b即feat1上一个点综合了图a即feat0上3*3区域的信息,则生成的feat2感受野为7*7,即整个图b深色区域;

  • 第三次处理同上,第二次空洞卷积的整个卷积核大小等于第三次空洞卷积的一个像素点的感受野,图c即feat2上每个点综合了feat0上7*7的信息(感受野),则采用扩张率为3的空洞卷积,生成的feat3每一个点感受野为15*15

相比较之下,使用stride为1的普通3*3卷积,三层之后感受野仅仅为(kernel-1)*layer+1=7。
由此可见,感受野大大增加!
膨胀率为2 的卷积核:
空洞卷积(扩张卷积dilated convolution)_第4张图片

空洞卷积目前存在的问题

  • 感受野跳跃问题
    假设仅仅多次叠加 dilation rate=2 的 3 x 3 kernel 的话,则会出现这个问题:
    空洞卷积(扩张卷积dilated convolution)_第5张图片
    会发现得到的感受野并不连续,也就是并不是所有的 pixel 都用来计算了,因此这里将信息看做 checker-board (棋盘效应)的方式会损失信息的连续性。这对 pixel-level dense prediction 的任务来说是致命的。

空洞卷积计算

感受野计算

(1)正常图像空洞卷积:
感受野尺寸 s i z e = ( d i l a t i o n − 1 ) ∗ ( k e r n e l s i z e − 1 ) + k e r n e l s i z e size=(dilation-1)*(kernelsize-1) + kernelsize size=(dilation1)(kernelsize1)+

你可能感兴趣的:(图像分割,空洞卷积,图像分割)