1. 核心贡献
- 提出GCE(Guided Cost volume Excitation)模块,利用图像的特征图引导代价体(cost volume)的聚合过程;
- 在视差回归部分,提出利用top-k匹配代价执行soft-argmax/argmin;
- 基于上述两个模块,构建实时立体匹配网络CoEx。
2. 网络架构
当前多数基于深度学习的立体匹配网络,多包括特征提取、匹配代价计算、代价聚合及视差回归几个步骤。本文也不例外,作者将其前两个contribution定义为模块,并指出该模块可集成进其它基于cost volume(文中表述为volumetric,一个意思)的立体匹配架构中,同时不会显著增加计算开销。
2.1. 特征提取
CoEx利用预训练的MobileNetV2作为特征提取的骨干网络(backbone),这里主要为了轻量化,且可提供类似U-Net结构的多尺度特征。该特征将在后续代价聚合过程中作为weight与对应尺度的cost volume相乘,用以引导代价聚合过程。
CoEx的输入为左右目两张RGB图像( 3 × H × W 3 \times H \times W 3×H×W),所提取的特征分别为4x、8x、16x及32x倍降采样原图分辨率的尺寸。利用4x降采样分辨率的特征图构建相关性代价体(correlation cost volume),输出的cost volume的尺寸为 D / 4 × H / 4 × W / 4 D/4 \times H/4 \times W/4 D/4×H/4×W/4,其中D=192为设置的最大视差范围。
2.2. GCE模块构建
GCE如上图示,这里的Guided Channel Excitation和前面的GCE(Guided Cost volume Excitation)应该是一个东西,毕竟Guided Channel Excitation全文只出现了一次,可能是作者笔误。。
GCE模块用公式表示为:
α
=
σ
(
F
2
D
(
I
(
s
)
)
)
C
o
(
s
)
=
α
×
C
i
(
s
)
\alpha=\sigma(F^{2D}(I^{(s)})) \\ C_o^{(s)}=\alpha \times C_i^{(s)}
α=σ(F2D(I(s)))Co(s)=α×Ci(s)
其中, s s s表示不同尺度, I ( s ) I^{(s)} I(s)为 s s s尺度下的特征图, F 2 D F^{2D} F2D为2D的point-wise卷积(实际上就是将特征图的channel维度压缩为1,然后通过sigmoid( σ ( ⋅ ) \sigma(\cdot) σ(⋅))获得 α \alpha α作为该尺度下的权重图。
对1/4分辨率的cost volume利用hourglass结构进行encode下采样,获得不同尺度下的cost volume记为 C i ( s ) C_i^{(s)} Ci(s),进而将上述获得的权重 α \alpha α与其相乘获得 C o ( s ) C_o^{(s)} Co(s)。经过decode上采样和skip connection最终获得1/4分辨率的cost volume,作为视差回归的输入。
2.3. top-k视差回归
该模块是对GC-Net所提出soft-argmin的改进。soft-argmin中,在cost volume的视差维度
D
D
D执行softmax,并利用下式回归视差:
d
^
=
∑
d
=
0
D
d
×
S
o
f
t
m
a
x
(
c
d
)
\hat{d}=\sum_{d=0}^D {d \times Softmax(c_d)}
d^=d=0∑Dd×Softmax(cd)
然而,当softmax结果中出现多个峰值时,soft argmin表现并不理想。作者通过实验发现,对于每一个像素,在视差维度取前k个最可能的候选值进行视差回归,会得到更加准确的结果:
为了进一步降低计算量,作者选择在1/4分辨率的cost volume执行top-k soft-argmin,获得初始的视差图(1/4原始分辨率)后,再通过上采样获得原始分辨率的视差图。上采样这一步follow了另外一篇做分割的文章,想了解的话可以参考下原文。
2.4. loss
损失函数比较简单,利用预测视差与gt视差的smooth L1损失:
L
(
d
G
T
,
d
^
)
=
1
N
∑
i
=
1
N
s
m
o
o
t
h
L
1
(
d
G
T
−
d
i
^
)
L(d_{GT}, \hat{d})=\frac{1}{N} \sum_{i=1}^{N}smooth_{L_1}(d_{GT}-\hat{d_i})
L(dGT,d^)=N1i=1∑NsmoothL1(dGT−di^)
s m o o t h L 1 ( x ) = { 0.5 x 2 , i f ∣ x ∣ < 1 ∣ x ∣ − 0.5 , o t h e r w i s e smooth_{L_1}(x)= \begin{cases} 0.5 x^2, if |x|<1\\ |x|-0.5, otherwise \end{cases} smoothL1(x)={0.5x2,if∣x∣<1∣x∣−0.5,otherwise
x. 写在最后
论文读完,源码建议不要看了,代码质量不高看的我一头雾水。建议多读有科技企业参与或实力较强的实验室的论文和源码,养成良好的编码习惯。