DeepLabv3+ 模型详解
文章目录
1 简介
Deeplabv3+1是一个语义分割网络,它是在DeepLabv3的基础上增加了一个Decoder模块,它的Backbone可以是ResNet-101或者
Xception,其中卷积操作采用的是atrous convolution。
Encoder-Decoder网络已经成功应用于许多计算机视觉任务,通常,Encoder-Decoder网络包含:
- 逐步减少特征图并提取更高语义信息的Encoder模块
- 逐步恢复空间信息的Decoder模块
DeepLabv3+使用DeepLabv3作为Encoder模块,并添加一个简单且有效的Decoder模块来获得更清晰的分割。
图1. DeepLabv3+网络结构
2 Encoder
2.1 ResNet-101 as Network Backbone
ResNet的主要贡献:
- 提出了一种残差模块,通过堆叠残差模块可以构建任意深度的神经网络,而不会出现“退化”现象
- 提出了批归一化方法来对抗梯度消失,该方法降低了网络训练过程对于权重初始化的依赖
- 提出了一种针对ReLU激活函数的初始化方法
图2. ImageNet大赛历年冠军
2.1.1 问:在“基础”的卷积神经网络中持续叠加更深的层数会发生什么?
在ResNet网络出现之前,随着“基础”的卷积神经网络层数的加深,会出现精度下降的情况,这是因为在训练过程中,网络的正、反向信息流动不顺畅,网络没有被充分训练,其实就是梯度消失2
图3. 不同层数的网络在训练集和测试集上的错误率
如图所示,随着网络层数的增加,训练集和测试集的错误率都上升了
图4. 网络层数的增加导致错误率上升的原因
为了解决这一问题,Kaiming He3提出了ResNet,ResNet中增加了残差模块,解决了梯度消失的问题,这种恒等映射结构可以保证随着网络层数的加深,即使它的性能不会得到提高,也会保持原来的性能不变。
为什么要叫残差模块呢?
F
(
X
)
=
H
(
X
)
−
X
F(X) = H(X) - X
F(X)=H(X)−X
其中
H
(
X
)
H(X)
H(X)表示输出,
X
X
X表示输入,所以
F
(
X
)
F(X)
F(X)叫做残差,学习
F
(
X
)
F(X)
F(X)的模块就叫残差模块
图5. 残差模块
2.1.2 问:为什么ResNet中的残差模块会有用呢?
**正向信息流:**可以用图像处理中的例子,假如X就是原图,F(X)就是边缘细节图,则H(X) = X + F(X)就是锐化后的结果,可以看到,它加强了我们视觉上感兴趣的地方,同理,经过这一模块之后,不仅我们原来的特征保留了下来,而且还加强了对于我们的任务有用的特征,从而保证了前向传播的顺畅。
**反向梯度流:**X处梯度的反向传播有两条通道,即使F(X)那条通道的局部梯度为0,还有一个X,即梯度为1,所以梯度的反向传播也是顺畅的。
图6. 残差模块work的解释
ResNet的性能这么好的根本原因:可以看作多个子网络的集成
图7. 残差网络高效的原因
2.1.3 ResNet的残差模块
其中添加的X称为跳跃连接,这里的第一个1*1卷积是为了减少通道数,减少计算量,第二个1*1卷积是为了恢复原来的通道数,实现相加。
图8. “瓶颈”结构残差模块
2.1.4 ResNet的网络结构
假设输入 ( N , C i n , H i n , W i n ) (N,C_{in},H_{in},W_{in}) (N,Cin,Hin,Win) ,卷积操作后输出 ( N , C o u t , H o u t , W o u t ) (N,C_{out},H_{out},W_{out}) (N,Cout,Hout,Wout)
普通卷积之后的特征图尺寸计算公式:
H
o
u
t
=
(
H
i
n
−
F
+
2
P
)
/
S
+
1
W
o
u
t
=
(
W
i
n
−
F
+
2
P
)
/
S
+
1
H_{out}=(H_{in}-F+2P)/S+1 \\ W_{out}=(W_{in}-F+2P)/S+1
Hout=(Hin−F+2P)/S+1Wout=(Win−F+2P)/S+1
空洞卷积之后的特征图尺寸计算公式:
H
o
u
t
=
(
H
i
n
−
D
∗
(
F
−
1
)
+
2
P
−
1
)
/
S
+
1
W
o
u
t
=
(
W
i
n
−
D
∗
(
F
−
1
)
+
2
P
−
1
)
/
S
+
1
H_{out}=(H_{in}-D*(F-1)+2P-1)/S+1 \\ W_{out}=(W_{in}-D*(F-1)+2P-1)/S+1
Hout=(Hin−D∗(F−1)+2P−1)/S+1Wout=(Win−D∗(F−1)+2P−1)/S+1
池化之后的特征图尺寸计算公式:
H
o
u
t
=
(
H
i
n
−
F
)
/
S
+
1
W
o
u
t
=
(
W
i
n
−
F
)
/
S
+
1
H_{out}=(H_{in}-F)/S+1\\ W_{out}=(W_{in}-F)/S+1
Hout=(Hin−F)/S+1Wout=(Win−F)/S+1
计算特征图大小时,卷积层向下取整,池化层向上取整
图10. ResNet网络结构
2.1.5 ResNet的Pytorch实现
2.2 ASPP结构
ASPP全称为Atrous Spatial Pyramid Pooling,它是在SPP的基础上,采用了Atrous Convolution
2.2.1 SPP结构
图11. 添加SPP结构
在SPP出来之前,所有神经网络都是要输入固定尺寸的图片,比如经常遇到的224×224,图片输入网络前都要resize到224×224,导致图片变形,其中的信息也变形了,从而限制了识别精度。
而SPP和ASPP就是为了解决这个问题,它可以让网络输入原图而不必resize。4
如上图所示,最左边的图表示经过卷积得到的256-d特征图,采取三种不同的划分方式,并分别进行池化:
- 直接对整个特征图进行池化,每一维得到一个池化后的值,输出一个1*256的向量
- 将特征图分成4等份,每份单独进行池化,最终输出4个1*256的向量
- 将特征图分成16等份,每份单独进行池化,最终输出16个1*256的向量
将三种划分方式池化后输出的结果进行拼接,输出(1+4+16)*256 = 21*256的特征
由图中可以看出,整个过程对于输入的尺寸大小完全无关,因此可以处理任意尺寸的候选框。
空间池化实际是一种自适应的层,无论你的输入是什么尺寸,输出都是固定的
2.2.2 Atrous Convolution
Atrous Convolution(空洞卷积),它有一个rate参数,称为膨胀率,相比普通卷积,空洞卷积有什么好处呢?
-
扩大感受野
在deep net中为了增加感受野且降低计算量,总要进行降采样(pooling或s2/conv),这样虽然可以增加感受野,但空间分辨率降低了。为了能不丢失分辨率,且仍然扩大感受野,可以使用空洞卷积。这在检测,分割任务中十分有用。一方面感受野大了可以检测分割大目标,另一方面分辨率高了可以精确定位目标。
-
捕获多尺度上下文信息:
空洞卷积有一个参数可以设置dilation rate,具体含义就是在卷积核中填充dilation rate-1个0,因此,当设置不同dilation rate时,感受野就会不一样,也即获取了多尺度信息。