ASPP
空洞空间卷积池化金字塔atrous spatial pyramid pooling ASPP))对所给定的输入以不同采样率的空洞卷积并行采样,相当于以多个比例捕捉图像的上下文。
上图为deeplab v2的ASPP模块,deeplabv3中向ASPP中添加了BN层,其中空洞卷积的rate
的意思是在普通卷积的基础上,相邻权重之间的间隔为rate-1
, 普通卷积的rate
默认为1,所以空洞卷积的实际大小为 k + k − 1 ) r a t e − 1 ) k+k-1)rate-1) k+k−1)rate−1),其中k为原始卷积核大小。
输出大小如何计算?
问题:当rate
接近feature map
大小时, 3 × 3 3\times3 3×3滤波器不是捕获全图像上下文,而是退化为简单的 1 × 1 1\times1 1×1滤波器,只有滤波器中心起作用。
改进:Concat( 1 × 1 1\times 1 1×1卷积 , 3个 3 × 3 3\times 3 3×3空洞卷积 +,pooled image feature)并且每个卷积核都有256个且都有BN层。
#without bn version
class ASPPnn.Module):
def __init__self, in_channel=512, depth=256):
superASPP,self).__init__)
self.mean = nn.AdaptiveAvgPool2d1, 1)) #1,1)means ouput_dim
self.conv = nn.Conv2din_channel, depth, 1, 1)
self.atrous_block1 = nn.Conv2din_channel, depth, 1, 1)
self.atrous_block6 = nn.Conv2din_channel, depth, 3, 1, padding=6, dilation=6)
self.atrous_block12 = nn.Conv2din_channel, depth, 3, 1, padding=12, dilation=12)
self.atrous_block18 = nn.Conv2din_channel, depth, 3, 1, padding=18, dilation=18)
self.conv_1x1_output = nn.Conv2ddepth * 5, depth, 1, 1)
def forwardself, x):
size = x.shape[2:]
image_features = self.meanx)
image_features = self.convimage_features)
image_features = F.upsampleimage_features, size=size, mode='bilinear')
atrous_block1 = self.atrous_block1x)
atrous_block6 = self.atrous_block6x)
atrous_block12 = self.atrous_block12x)
atrous_block18 = self.atrous_block18x)
net = self.conv_1x1_outputtorch.cat[image_features, atrous_block1, atrous_block6,
atrous_block12, atrous_block18], dim=1))
return net