轻量级实时语义分割:Guided Upsampling Network for Real-Time Semantic Segmentation
本论文发表于2018年BMCV。
介绍
论文贡献
- 提出一个新颖的名为Guided Upsampling Network多分辨率网络架构,512x1024分辨率图像在GPU可达到33FPS的速度,且在cityscapes达到70.4%IoU.
- 用增量式的方式筛选出每一个选择的好处与坏处,让实验更容易重复。
- 设计了GUM(Guided Upsampling Module),有效地利用上采样过程中的高分辨率线索。
最近工作中值得注意的是SegNet,ENet,ICNet,ERFNet这些轻量级网络。其中ENet和ERFNet已经在上期博客中讲过。
网络设计
作者采用一种增量式、递进式的研究方法,从一个baseline模型开始,不断地加一些处理方式并分析利弊。
一、Input downsampling
一个天真的方法就是采用下采样使处理速度加快,但容易丢失精度。作者采用DRN-D-22在imagenet的预训练模型为encoder并且使用简单的双线性插值化作为decoder。
下图显示了baseline和使用下采样输入训练和评估,并加入不同的factor得到的结果。可见FPS从6.7到50.6但精度少了8%,这是难以接受的。
二、Multiresolution encoder
作者设计了一个多分辨率架构防止精度流失。encoder分为两个branchs:一个使用DRN-D-22(Dilated Residual NetWork 22 type D)除了最后两层的低分辨率branch。一个是在dilated 卷积之前,只有DRN-D-22的第一层的中分辨率branch。第一个branch主要目的在于解析更大的上下文特征,第二个branch目的则是解析更多局部特征帮助恢复decoeing细节。
作者对三个不同的encoder 配置做了实验,enc24表示处理之前所定义的sub-sampling factors 2和4(这里没搞明白),enc24shared则表示对两个分支进行权重共享。实验发现,shared权重的版本更好。作者认为通过减少网络参数的数量,分支之间的权值共享,引出了一种隐式的正则化形式。衡量精度与速度,最终作者采用了enc24shared作为下一步改进的baseline版本。
三、Fusion module
融合的第一步就是将encoder两个branchs结合起来。作者实验了add和concat两种融合策略。同时也试验了两种融合策略如下图所示。
实验结果如下图所示:
四、数据增强
由于系统是在室外的场景跑的,有光线的干扰。于是作者先对光线进行了转换。
色彩抖动是指以随机顺序修改图像的亮度、饱和度和对比度。
Lighting抖动是一种基于PCA的[13]噪声抖动,我们使用
σ
=
0.1
\sigma= 0.1
σ=0.1作为标准差来产生随机噪声。
同时也进行了几何转换:使用0.5到2之间的比例因子重新标定图像,借用[23]的值。
最终发现只有几何转换有效,故下一步使用其作为系统的一部分。
Guided unsampling module
很多语义分割算法没有预测完整的分辨率图,这些算法产生了低于输入的分辨率,且上采样往往采用无参数方法,如最近邻法或二元插值法。使用这些方法的缺点在于接近对象边界的像素经常被分配到错误的类。如下左图,Predicted Map上面的像素点恰好处于物体边缘,直接上采样容易被分错。
作者认为,通过独立预测每一个单个像素来生成语义地图是非常低效的。GUM背后的想法是通过偏移向量的指导表来引导上采样操作,该指导表将采样引向正确的语义类。 一个引导模型预测的是一个较高分辨率的指引偏移表。GUM执行最近邻上采样操作通过利用偏移表。
作者其实做了两件事情,一件事就是生成高分辨率的指引偏移表,另一件事就是使用指引偏移表进行上采样操作。
首先说说,如何使用指引偏移表进行上采样操作。
这里不得不提起15年NIPS上的一篇论文《Spatial Transformer Networks》。
STN(Spatial Transformer Networks)对feature map(包括输入图像)进行空间变换,输出一张纠正过的理想图像,再使用神经网络进行识别。
此处参考:
https://www.cnblogs.com/aoru45/p/11488935.html
https://www.cnblogs.com/liaohuiqiang/p/9226335.html
“如下图所示,输入模型的图像可能是摆着各种姿势,摆在不同位置的凉宫春日,我们希望STN把它纠正到图像的正中央,放大,占满整个屏幕,然后再丢进CNN去识别。”
STN网络框架
如图所示,主要是分为三个步骤。
- Localisation set。这部分学习仿射变换的
θ
\theta
θ参数,仿射变换包括缩放、剪切、旋转和平移,用矩阵表示即为:
[
x
′
y
′
]
=
[
a
b
c
d
]
[
x
y
]
+
[
e
f
]
\left[\begin{array}{l} x^{\prime} \\ y^{\prime} \end{array}\right]=\left[\begin{array}{ll} a & b \\ c & d \end{array}\right]\left[\begin{array}{l} x \\ y \end{array}\right]+\left[\begin{array}{l} e \\ f \end{array}\right]
[x′y′]=[acbd][xy]+[ef]
即 θ = a , b , c , d , e , f \theta = {a,b,c,d,e,f} θ=a,b,c,d,e,f - Grid generator。使用学到的
θ
\theta
θ参数对
U
U
U进行矩阵变换。
( x i s y i s ) = T θ ( G i ) = A θ ( x i t y i t 1 ) = [ θ 11 θ 12 θ 13 θ 21 θ 22 θ 23 ] ( x i t y i t 1 ) \left(\begin{array}{l} x_{i}^{s} \\ y_{i}^{s} \end{array}\right)=\mathcal{T}_{\theta}\left(G_{i}\right)=\mathrm{A}_{\theta}\left(\begin{array}{c} x_{i}^{t} \\ y_{i}^{t} \\ 1 \end{array}\right)=\left[\begin{array}{lll} \theta_{11} & \theta_{12} & \theta_{13} \\ \theta_{21} & \theta_{22} & \theta_{23} \end{array}\right]\left(\begin{array}{l} x_{i}^{t} \\ y_{i}^{t} \\ 1 \end{array}\right) (xisyis)=Tθ(Gi)=Aθ⎝⎛xityit1⎠⎞=[θ11θ21θ12θ22θ13θ23]⎝⎛xityit1⎠⎞
其中 ( x i t , y i t ) \left(x_{i}^{t}, y_{i}^{t}\right) (xit,yit)为输出feature map的第i个坐标点,这里的V和U的长宽是可以不一致的。 ( x i s , y i s ) {(x_{i}^{s},y_{i}^{s})} (xis,yis)为输入feature map的点。 - Sampler。第二步计算出了V坐标点对应的U坐标点像素值。但由于第二步算出的V的坐标可能是小数,而图像中不允许出现小数,于是可使用插值法。常见的插值法有两种,分别是最近邻插值和双线性插值。公式如下:(U为原图中的像素点,V为变换后的像素点)
最近邻插值:
V i c = ∑ n H ∑ m W U n m c δ ( ⌊ x i s + 0.5 ⌋ − m ) δ ( ⌊ y i s + 0.5 ⌋ − n ) V_{i}^{c}=\sum_{n}^{H} \sum_{m}^{W} U_{n m}^{c} \delta\left(\left\lfloor x_{i}^{s}+0.5\right\rfloor-m\right) \delta\left(\left\lfloor y_{i}^{s}+0.5\right\rfloor-n\right) Vic=n∑Hm∑WUnmcδ(⌊xis+0.5⌋−m)δ(⌊yis+0.5⌋−n)
其中 δ \delta δ为Kronecker delta函数,当里面的变量为0时输出才为1,所以上式只有在m取得x方向上距离对应点最近的整数点以及n取得y方向上距离最近的整数点时有值,其值就为对应两个方向都最近的点的值。
双线性插值:
V i c = ∑ n H ∑ m W U n m c max ( 0 , 1 − ∣ x i s − m ∣ ) max ( 0 , 1 − ∣ y i s − n ∣ ) V_{i}^{c}=\sum_{n}^{H} \sum_{m}^{W} U_{n m}^{c} \max \left(0,1-\left|x_{i}^{s}-m\right|\right) \max \left(0,1-\left|y_{i}^{s}-n\right|\right) Vic=n∑Hm∑WUnmcmax(0,1−∣xis−m∣)max(0,1−∣yis−n∣)
只有当m和n取值为对应点xy方向上距离为1以内的整数时才有值,而距离对应点最近的整数点是有四个的,比如(0.5,0.5)距离其最近的四个点分别为(0,0),(0,1),(1,1),(1,0),后面两个取值就成了距离权重,前面U取值为四个点之一的整数点的值,所以这个式子可以解释为以距离作为权重,取最近的四个点的值的加权求和。
那作者要想根据指引表来进行上采样只需要对以上式子做如下改变:
最近邻法+指引表:
V
i
=
∑
n
H
∑
m
W
U
n
m
δ
(
⌊
x
i
S
+
p
i
+
0.5
⌋
−
m
)
δ
(
⌊
y
i
s
+
q
i
+
0.5
⌋
−
n
)
V_{i}=\sum_{n}^{H} \sum_{m}^{W} U_{n m} \delta\left(\left\lfloor x_{i}^{S}+p_{i}+0.5\right\rfloor-m\right) \delta\left(\left\lfloor y_{i}^{s}+q_{i}+0.5\right\rfloor-n\right)
Vi=n∑Hm∑WUnmδ(⌊xiS+pi+0.5⌋−m)δ(⌊yis+qi+0.5⌋−n)
双线性插值法+指引表:
V
i
=
∑
n
H
∑
m
W
U
n
m
max
(
0
,
1
−
∣
x
i
s
+
p
i
−
m
∣
)
max
(
0
,
1
−
∣
y
i
s
+
q
i
−
n
∣
)
V_{i}=\sum_{n}^{H} \sum_{m}^{W} U_{n m} \max \left(0,1-\left|x_{i}^{s}+p_{i}-m\right|\right) \max \left(0,1-\left|y_{i}^{s}+q_{i}-n\right|\right)
Vi=n∑Hm∑WUnmmax(0,1−∣xis+pi−m∣)max(0,1−∣yis+qi−n∣)
其中 ϕ i = ( p i q i ) \phi_{i}=\left(\begin{array}{l} p_{i} \\q_{i}\end{array}\right) ϕi=(piqi)表示每个网格元素在x维和y维上的采样坐标偏移量。它们是直到模块第 i i i个 ϕ i \phi_i ϕi的输出。
作者解释了STN与GUM的关系,引导模板(Guidance Module)相当于STN的前两步(Localization Net和Grid Generator),只不过STN是将仿射变换的参数都算出来了,但是GUM没有,GUM是直接学习了x和y的偏移模板,于是就有了以上的式子。
然后,我们再说说如何生成高分辨率的指引偏移表。
很简单,就是把生成偏移表当成是神经网络的一个分支,从而使整个网络的参数可以通过端到端的反向传播进行训练。
并对GM模块进行了三种不同设计:large-rf,high-res和fusion。并对他们进行验证,最后fusion模块实验效果更好,其由两个卷积-BN层与一个上采样层组成。
实验部分
作者在Titan Xp GPU上跑了如下结果。使用的是Cityscapes的数据集。
总结
总结一下GUN主要做的几件事情,首先使用两路高低分辨率图像进行特征学习(前一部分的卷积核是shared的),然后对两者使用sum+post-process方式进行融合,在这个过程也学习了一个上采样指引表(受STN思路启发),再上采样步骤时使用上采样指引表达到更好的效果。