空洞卷积aspp 学习笔记

x33g5p2x  于2022-01-04 转载在 其他  
字(2.8k)|赞(0)|评价(0)|浏览(200)

ASPP

以下内容转自:
空洞空间卷积池化金字塔(atrous spatial pyramid pooling (ASPP))对所给定的输入以不同采样率的空洞卷积并行采样,相当于以多个比例捕捉图像的上下文。

上图为deeplab v2的ASPP模块,deeplabv3中向ASPP中添加了BN层,其中空洞卷积的rate的意思是在普通卷积的基础上,相邻权重之间的间隔为rate-1, 普通卷积的rate默认为1,所以空洞卷积的卷积核实际大小为k + (k − 1)(rate−1),其中k为原始卷积核大小。

卷积核为3时,不同的rate,对应的卷积核大小:

| k | rate | k + (k − 1)(rate−1) | 卷积核大小 |
| 3 | 1 | 3+20 | 3 |
| 3 | 2 | 3+2
1 | 5 |
| 3 | 3 | 3+22 | 7 |
| 3 | 4 | 3+2
3 | 9 |
| 3 | 5 | 3+24 | 11 |
| 3 | 6 | 3+2
5 | 13 |
| 3 | 7 | 3+26 | 15 |
| 3 | 8 | 3+2
7 | 17 |
| 3 | 9 | 3+2*8 | 19 |

输出大小如何计算?

问题:当rate接近feature map大小时,3×3滤波器不是捕获全图像上下文,而是退化为简单的1 × 1 滤波器,只有滤波器中心起作用。

改进:Concat( 1 × 1  卷积 , 3个 3 × 3  空洞卷积 +,pooled image feature)并且每个卷积核都有256个且都有BN层。

#without bn version
class ASPP(nn.Module):
    def __init__(self, in_channel=512, depth=256):
        super(ASPP,self).__init__()
        self.mean = nn.AdaptiveAvgPool2d((1, 1)) #(1,1)means ouput_dim
        self.conv = nn.Conv2d(in_channel, depth, 1, 1)
        self.atrous_block1 = nn.Conv2d(in_channel, depth, 1, 1)
        self.atrous_block6 = nn.Conv2d(in_channel, depth, 3, 1, padding=6, dilation=6)
        self.atrous_block12 = nn.Conv2d(in_channel, depth, 3, 1, padding=12, dilation=12)
        self.atrous_block18 = nn.Conv2d(in_channel, depth, 3, 1, padding=18, dilation=18)
        self.conv_1x1_output = nn.Conv2d(depth * 5, depth, 1, 1)
 
    def forward(self, x):
        size = x.shape[2:]
 
        image_features = self.mean(x)
        image_features = self.conv(image_features)
        image_features = F.upsample(image_features, size=size, mode='bilinear')
 
        atrous_block1 = self.atrous_block1(x)
        atrous_block6 = self.atrous_block6(x)
        atrous_block12 = self.atrous_block12(x)
        atrous_block18 = self.atrous_block18(x)
 
        net = self.conv_1x1_output(torch.cat([image_features, atrous_block1, atrous_block6,
                                              atrous_block12, atrous_block18], dim=1))
        return net

原文链接:https://blog.csdn.net/qq_36530992/article/details/102628455

刚看到这张结构图,很多同学可能和我一样懵(原谅我比较笨),别的博客里配的文字也都是比较简单,有些词汇不够通俗,直到我看到了下面这张图:

如图所示,最左边的图图形表示卷积得到的256维特征图,对于每个区域(厚度为256),通过三种方式进行池化:

(1)直接对整个特征图池化,每一维得到一个池化后的值,构成一个1x256的向量

(2)将特征图分成2x2共4份,每份单独进行池化,得到一个1x256的向量,最终得到2x2=4个1x256的向量

(3)将特征图分成4x4共16份,每份单独进行池化,得到一个1x256的向量,,最终得到4x4=16个1x256的向量

将三种划分方式池化得到的结果进行拼接,得到(1+4+16)256=21256的特征。

由图中可以看出,整个过程对于输入的尺寸大小完全无关,因此可以处理任意尺寸的候选框。

空间池化层实际就是一种自适应的层,这样无论你的输入是什么尺寸,输出都是固定的(21xchannel)

ASPP结构

在介绍ASPP之前,首先要介绍Atrous Convolution(空洞卷积),它是一种增加感受野的方法。空洞卷积是是为了解决基于FCN思想的语义分割中,输出图像的size要求和输入图像的size一致而需要upsample,但由于FCN中使用pooling操作来增大感受野同时降低分辨率,导致upsample无法还原由于pooling导致的一些细节信息的损失的问题而提出的。为了减小这种损失,自然需要移除pooling层,因此空洞卷积应运而生。
普通卷积这里就不介绍了,我们来看一下空洞卷积的动态图,就一目了然了:

空洞卷积从字面上很好理解,是在标准的卷积中注入空洞,以此来增加感受野,相比原来的正常卷积,空洞卷积多了一个称之为 dilation rate 的参数,指的是kernel的间隔数量(一般的卷积 dilation rate=1)。
但是,空洞卷积也有其潜在的一些问题:

潜在问题 1:The Gridding Effect

假设我们仅仅多次叠加 dilation rate 2 的 3 x 3 kernel 的话,则会出现这个问题:

我们发现 kernel 并不连续,也就是并不是所有的 pixel 都用来计算了,因此这里将信息看做 checker-board 的方式会损失信息的连续性。这对 pixel-level dense prediction 的任务来说是致命的。

潜在问题 2:Long-ranged information might be not relevant.

我们从 dilated convolution 的设计背景来看就能推测出这样的设计是用来获取 long-ranged information。然而光采用大 dilation rate 的信息或许只对一些大物体分割有效果,而对小物体来说可能则有弊无利了。如何同时处理不同大小的物体的关系,则是设计好 dilated convolution 网络的关键。

相关文章

微信公众号

最新文章

更多