赞
踩
语义分割面临的困境:
与检测模型类似,语义分割模型也是建立是分类模型基础上的,即利用CNN网络来提取特征进行分类。在CNN分类模型中,一般情况下会通过stride>1的卷积层或者池化层进行降采样,此时特征图维度降低,但是特征更高级,语义更丰富。
但是下采样层又是不可缺少的。
总之,这是语义分割所面临的一个困境或者矛盾,也是大部分研究要一直解决的。
语义分割任务的两种解决方案:
语义分割任务主要存在两种不同的解决方案:
减少下采样率,但是又可以保证感受野
。例如利用空洞卷积,那么我们就可以让原图的下采样倍数仅为8,那么最终的特征图语义不仅语义丰富而且相对精细,可以直接通过插值恢复原始分辨率。DeepLab系列网络(如下图)就是属于典型的DilatedFCN。扩张率(dilation rate)
的超参数,该参数定义了卷积核处理数据时各值的间距。扩张率,也称空洞数(Hole Size)。下图是我们熟悉的标准卷积(k=3,p=1,s=2,r=1)
下图是扩张率为2空洞卷积(k=3,p=0,s=2,r=2)
扩张率(dilation rate)定义了卷积核处理数据时各值的间距
设空洞卷积的卷积核大小为
k
,
空洞数为
d
,等效卷积核大小为
k
′
k
′
=
k
+
(
k
−
1
)
×
(
d
−
1
)
设当前层感受野为
R
F
i
+
1
,上一层感受野为
R
F
i
R
F
i
+
1
=
R
F
i
+
(
k
′
−
1
)
×
S
i
S
i
表示之前所有层步长的乘积
(
不包括当前层
)
,因此当前层步长不影响当前层的感受野。另外,感受野和
p
a
d
d
i
n
g
无关。
设空洞卷积的卷积核大小为k,空洞数为d,等效卷积核大小为k' \\ k' = k + (k-1)×(d-1) \\ 设当前层感受野为RF_{i+1},上一层感受野为RF_{i} \\ RF_{i+1} = RF_{i} + (k'-1)× S_i \\ S_i表示之前所有层步长的乘积(不包括当前层),因此当前层步长不影响当前层的感受野。另外,感受野和padding无关。
设空洞卷积的卷积核大小为k,空洞数为d,等效卷积核大小为k′k′=k+(k−1)×(d−1)设当前层感受野为RFi+1,上一层感受野为RFiRFi+1=RFi+(k′−1)×SiSi表示之前所有层步长的乘积(不包括当前层),因此当前层步长不影响当前层的感受野。另外,感受野和padding无关。
例子1:
从左到右分别为a、b、c子图,三幅图是相互独立进行卷积的,大框表示输入图像(感受野默认为1),深绿色表示
3
×
3
3×3
3×3的卷积核,绿色区域表示卷积后的感受野。
在卷积核不变的情况下,增加扩张率可以增加感受野
。例子2:
请注意下图和上面的图有区别,上图的三幅图是独立的,而下图是从左到右连续进行卷积。
经过上述例子,我们已经知道空洞卷积可以增大感受野,那么如何理解可以不改变图像输出特征图的尺寸呢?
我们来看下标准卷积计算特征图尺寸的公式:
设输入特征图为
(
H
,
W
)
,
卷积核大小为
(
K
,
K
)
,
填充为
P
,步长为
S
,输出为
O
H
,
O
W
O
H
=
H
+
2
P
−
K
S
+
1
O
W
=
W
+
2
P
−
K
S
+
1
设输入特征图为(H,W),卷积核大小为(K,K),填充为P,步长为S,输出为OH,OW \\ OH=\frac{H+2P-K}{S} + 1 \\ OW=\frac{W+2P-K}{S} + 1 \\
设输入特征图为(H,W),卷积核大小为(K,K),填充为P,步长为S,输出为OH,OWOH=SH+2P−K+1OW=SW+2P−K+1
使用空洞卷积可以不改变图像输出特征图的尺寸
。不过,天下没有免费的午餐,保持分辨率意味着较大的运算量。需要注意的是,在空洞卷积里面,上面式子中的K为等效的卷积核,想要输入和输出不变,需要填充。
Dilation_conv2d = nn.Conv2d(
in_channels = in_channels,
out_channels = out_channels,
kernel_size = kernel_size ,
stride = stride,
padding=padding,
dilation=dilation # 设置扩张率
)
import torch import torch.nn as nn input_data = torch.randn(1, 3, 64, 64) dilated_conv1 = nn.Conv2d(in_channels=3, out_channels=64, kernel_size=3, dilation=2, padding=2, # 设置dilation=2后,等效卷积核kernel_size=5,因此设置padding=2 stride=1) output = dilated_conv1(input_data) print("Input shape:", input_data.shape) print("Output shape:", output.shape)
Input shape: torch.Size([1, 3, 64, 64])
Output shape: torch.Size([1, 64, 64, 64])
膨胀率为 2
的空洞卷积;论文地址:https://arxiv.org/abs/1702.08502
规则1 第二层的两个非零元素之间的最大距离小于等于该层卷积核的大小,
即
M
2
<
K
即M_2<K
即M2<K
M
i
=
m
a
x
[
M
i
+
1
−
2
r
i
,
M
i
+
1
−
2
(
M
i
+
1
−
r
i
)
,
r
i
]
M
i
:第
i
层两个非零元素之间的最大距离
r
i
:
第
i
层的扩张率
最后一层
M
n
=
r
n
M_i = max[M_{i+1}-2r_i, M_{i+1}-2(M_{i+1}-r_i),r_i ] \\ M_i:第i层两个非零元素之间的最大距离 \\ r_i:第i层的扩张率 \\ 最后一层M_n = r_n
Mi=max[Mi+1−2ri,Mi+1−2(Mi+1−ri),ri]Mi:第i层两个非零元素之间的最大距离ri:第i层的扩张率最后一层Mn=rn
公式比较难理解,举例如下:
参数
K
=
3
,
r
=
[
1
,
2
,
5
]
,
此时
M
3
=
r
3
=
5
M
2
=
m
a
x
[
M
3
−
2
r
2
,
M
3
−
2
(
M
3
−
r
2
)
,
r
2
]
=
m
a
x
[
5
−
4
,
5
−
2
(
5
−
2
)
,
2
]
=
2
此时
M
2
<
3
,满足规则,因此这样设置扩张率不会出现栅格效应问题。
假如此时
r
=
[
1
,
2
,
9
]
,那么此时
M
3
=
r
3
=
9
M
2
=
m
a
x
[
M
3
−
2
r
2
,
M
3
−
2
(
M
3
−
r
2
)
,
r
2
]
=
m
a
x
[
9
−
4
,
9
−
2
(
9
−
2
)
,
2
]
=
5
此时
M
2
>
3
,不满足规则,因此这样设置扩张率会出现栅格效应问题。
参数K=3,r=[1,2,5],此时M_3=r_3=5 \\ M_2 = max[M_{3}-2r_2, M_{3}-2(M_{3}-r_2),r_2 ] \\ =max[5-4,5-2(5-2),2]=2 \\ 此时M_2 < 3,满足规则,因此这样设置扩张率不会出现栅格效应问题。\\ 假如此时r=[1, 2, 9],那么此时M_3=r_3=9 \\ M_2 = max[M_{3}-2r_2, M_{3}-2(M_{3}-r_2),r_2 ] \\ =max[9-4,9-2(9-2),2]=5\\ 此时M_2 > 3,不满足规则,因此这样设置扩张率会出现栅格效应问题。\\
参数K=3,r=[1,2,5],此时M3=r3=5M2=max[M3−2r2,M3−2(M3−r2),r2]=max[5−4,5−2(5−2),2]=2此时M2<3,满足规则,因此这样设置扩张率不会出现栅格效应问题。假如此时r=[1,2,9],那么此时M3=r3=9M2=max[M3−2r2,M3−2(M3−r2),r2]=max[9−4,9−2(9−2),2]=5此时M2>3,不满足规则,因此这样设置扩张率会出现栅格效应问题。
规则2:扩张系数从1开始设置
其实这也不算做一个规则,但原论文中都是从1开始的。
规则3:扩张系数的公约数不能大于1
如果设置扩张系数为[2,4,8],他们之间的公约数为2,大于1了,仍然会出现gridding effect的问题。
另外还有一个建议:将扩张系数设置为锯齿形状[1,2,3,1,2,3]
参考链接如下:
关于HDC可以参考B站up主[霹雳吧啦Wz]视频:https://www.bilibili.com/video/BV1Bf4y1g7j8
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。