目录
4.Encoder-Decoder with Atrous Convolution
1.SPP
Spatial Pyramid Pooling :空间金字塔池化,任意尺寸输入+ 固定比例池化 = > 固定长度输出。 如fastrcnn等中的变体ROI pooling。
它将同一张图像的不同尺寸大小作为输入,一般情况下图片的大小不同的话,需要对图像进行大小调整如裁剪拉伸等,但是这样会导致原图像的严重变形影响结果。而SPP不要求输入图像的大小,而且能够得到定长的特征。
如下右图所示:黑色部分为13*13*256的特征图,对其进行不同池化(蓝色部分:核大小为4*4,步长为3,结果为4*4;青色部分:核大小为7*7,步长为6,结果为2*2;灰色部分:核大小为13*13,步长为13,结果为1*1),共提取出(4*4+2*2+1*1)*256d的特征向量。可见通过这种方式提取的特征长度不会受到输入大小的影响。
2.Atrous Convolution
又名Dilated convolutions即空洞卷积/带孔卷积/扩张卷积/膨胀卷积/多孔卷积,论文参见【1】。和普通的卷积操作不同的地方在于空洞卷积即将卷积核中按照一定的规律插入了一些(rate-1)为零的值,使得感受野增加,而无需通过减小图像大小来增加感受野。小卷积核叠加的方式能够线性增加感受野,而此种方式是指数级增加感受野。
如下图所示,图中a为标准卷积,卷积核感受野为3*3,设此时rate=1。当rate=2时,如图b所示,kernel中相邻点插入(2-1)个零,即对原图间隔1进行采样,此时感受野变为7*7。当rate=4时,如图b所示,kernel中相邻点插入(4-1)个零,即对原图间隔3进行采样,此时感受野变为15*15。
如图:
3.ASPP
Atrous Spatial Pyramid Pooling:空洞空间卷积【3】
当不使用空洞卷积时,模型仅仅是串行进行残差块Block1-7的叠加,如图3a所示。使用空洞卷积时,依旧为串行连接,模型由残差块Block1-4,以及Block4的复制品Block5-7组成,不同的是Block5-7为空洞卷积的结果,此时特征图大小没有发生变化,如图3b所示。
ASPP将空洞卷积和SPP结合起来,模型如图5所示,大括号中将Block3产生的结果进行含有不同rate(1,,6,12,18)的四个平行空洞卷积核操作,然后将输出这些的结果与image level进行(Depth)拼接,最后通过一个不含激活的1*1卷积。
ASPP示例代码:
def atrous_spatial_pyramid_pooling(net, scope, depth=256, reuse=None):
#from: https://github.com/sthalles/deeplab_v3/blob/master/network.py
"""
ASPP consists of (a) one 1×1 convolution and three 3×3 convolutions with rates = (6, 12, 18) when output stride = 16
(all with 256 filters and batch normalization), and (b) the image-level features as described in https://arxiv.org/abs/1706.05587
:param net: tensor of shape [BATCH_SIZE, WIDTH, HEIGHT, DEPTH]
:param scope: scope name of the aspp layer
:return: network layer with aspp applyed to it.
"""
with tf.variable_scope(scope, reuse=reuse):
feature_map_size = tf.shape(net)
# apply global average pooling
image_level_features = tf.reduce_mean(net, [1, 2], name='image_level_global_pool', keepdims=True)
image_level_features = slim.conv2d(image_level_features, depth, [1, 1], scope="image_level_conv_1x1",
activation_fn=None)
image_level_features = tf.image.resize_bilinear(image_level_features, (feature_map_size[1], feature_map_size[2]))
at_pool1x1 = slim.conv2d(net, depth, [1, 1], scope="conv_1x1_0", activation_fn=None)
at_pool3x3_1 = slim.conv2d(net, depth, [3, 3], scope="conv_3x3_1", rate=6, activation_fn=None)
at_pool3x3_2 = slim.conv2d(net, depth, [3, 3], scope="conv_3x3_2", rate=12, activation_fn=None)
at_pool3x3_3 = slim.conv2d(net, depth, [3, 3], scope="conv_3x3_3", rate=18, activation_fn=None)
net = tf.concat((image_level_features, at_pool1x1, at_pool3x3_1, at_pool3x3_2, at_pool3x3_3), axis=3,
name="concat")
net = slim.conv2d(net, depth, [1, 1], scope="conv_1x1_output", activation_fn=None)
return net
4.Encoder-Decoder with Atrous Convolution
预备知识:
Depthwise separable convolution:深度可分卷积,不同于普通卷积,它由Depthwise conv 后接 Pointwise conv构成,降低参数量。
假设下面特征图都是三通道,Depthwise conv如下图a所示,它使用三个3*3卷积核对三个输入通道分别进行空间卷积,那么便会产生三张特征图;如下图b所示的Pointwise conv,一个1*1*3卷积核作用于三张特征图上,产生一张特征图。若产生四张特征图则需要4个1*1*3的卷积核即可。
deeplabv3+:Encoder-Decoder with Atrous Convolution
该模型由两部分组成:
(a)编码器。更深的编码器能够捕获更广范围的信息,相当于特征图的空间尺度变小,感受野变大,深度增加。DeepLabv3(如上方图5)使用ASPP模块,该模块将不同rate的空洞卷积结果和原图拼接获得多尺度特征。DeepLabv3的编码器是由DeepLabv3的logits之前的最后一层特征图构成。该特征图由256个通道构成,含有丰富的语义信息。
(b)解码器。将编码器结果进行四倍的双向上采样,与编码器中的backbone内同尺度特征经过1*1卷积(减小通道)后的结果进行拼接。将拼接的结果经3*3卷积核(改善特征)后进行四倍的双线性上采样,生成最终预测结果。
参考文献:
【1】https://arxiv.org/pdf/1511.07122.pdf
【2】Dilated/Atrous conv 空洞卷积/多孔卷积_Shane Zhao的博客-CSDN博客_空洞卷积
【3】Rethinking Atrous Convolution for Semantic Image Segmentation