ASPP
分成了两部分:
第一个部分ASPPModule:
(1)__init__函数就根据dilations产生不同的卷积层。
# 一个dilation产生一个卷积核
for dilation in dilations:
self.append(
ConvModule(
self.in_channels,
self.channels,
1 if dilation == 1 else 3, #卷积核尺寸,当dilation=1时,1×1,p=0的卷积核;当不等于1时,3×3,p=dilation
dilation = dilation,
padding = 0 if dilation == 1 else dilation, #=1,p=0;不等于1,p=dilation
conv_cfg=self.conv_cfg,
norm_cfg=self.norm_cfg,
act_cfg=self.act_cfg))
根据DeepLabv3的配置文件,dilations=(1, 12, 24, 36),其实就是根据膨胀系数使用较大的padding,来保证feat_map的不变。空洞卷积的计算公式,就是改变卷积核的大小k’=k+(k-1)*(d-1),其中k为原来卷积核的大小,d为膨胀系数。然后特征图尺寸的计算是一样的。
(2)forward函数:对输入的x,每种尺度卷积来一次,输出成列表出来
第二个部分ASPPHead:
- _init__函数:
(a)初始化image_pool,一个平均池化层(尺度掉到1),然后1×1卷积(带BN)
(b)初始化ASPP
(c)初始化bottleneck卷积块,3×3,p=1,带BN - forward函数:输入x
(a)x进行image_pool前向传播得到x1,然后对x1使用双线性插值恢复到x的尺度。
(b)x再经过ASPP模块,和(a)一起得到有5个元素的list
(c)将list中的元素进行cat,然后进行卷积处理,然后进行分割