针对的问题
SGM的惩罚参数是通过经验方法计算得到的,难以对其进行调整,以控制视差图的平滑度。
解决方法
提出基于学习的惩罚参数估计方法SGM-Nets。输入image patch和对应的位置,即可输出三维物体结构的惩罚参数。同时惩罚参数会根据正负视差的变化而产生变化,从而可以更加有区别的表示物体结构。
同时,引入了一种损失函数,可以利用稀疏注释的视差图,比如激光传感器捕获的真值。
因此,本文贡献如下:
1.首次提出将神经网络用于SGM,并且引入了新的损失函数。
2.新的SGM参数化可以把正负视差变化分开,以便更加有区分度地表示物体结构。
3.2017年kitti数据集的SOTA
背景介绍 Semi-global matching
SGM中的能量函数定义如下:
E ( D ) = ∑ x ( C ( x , d x ) + ∑ y ∈ N x P 1 T [ ∣ d x − d y ∣ = 1 ] + ∑ y ∈ N x P 2 T [ ∣ d x − d y > 1 ∣ ] ) E(D) = \sum_{x}(C(x,d^x)+\sum_{y\in N_x}P_1T[|d^x-d^y|=1]+\sum_{y \in N_x}P_2T[|d^x-d^y>1|]) E(D)=∑x(C(x,dx)+∑y∈NxP1T[∣dx−dy∣=1]+∑y∈NxP2T[∣dx−dy>1∣])
其中 C ( x , d x ) C(x,d^x) C(x,dx)代表了 x x x点处视差值为 d x d^x dx的匹配代价。因此,第一项代表了所有像素对视差图D的匹配代价之和。
第二项表示了x的邻域像素y对x的倾斜表面惩罚。
第三项表示了邻域像素y对x不连续视差的惩罚。 P 2 P_2 P2通常根据图像梯度设置的,例如 P 2 = P 2 ′ / ∣ I ( x ) − I ( y ) ∣ P_2 = P'_2/|I(x)-I(y)| P2=P2′/∣I(x)−I(y)∣,从而可以区分出视差不连续的区域。
T [ ⋅ ] T[\cdot] T[⋅]代表了Kronecker delta函数,条件满足时,值为1;否则,值为0.
为了最小化 E ( D ) E(D) E(D),在x像素点处视差为d的沿r方向的代价值 L r ′ ( x , d ) L'_r(x,d) Lr′(x,d)如下所示:
x 1 x_1 x1代表了前一个像素 ( x 0 − r ) (x_0-r) (x0−r)
c ( x , d ) c(x,d) c(x,d)代表了像素级的匹配代价。
为了避免累加带来的巨大数值,将减去 x 1 x_1 x1的最小路径代价。
那么,采用WTA的策略整合所有方向的聚合代价,得到 x 0 x_0 x0处的视差值 D D D。
方法SGM-Net
在训练阶段,SGM-Net迭代训练从而最小化Path Cost和Neighbor Cost。
在测试阶段,通过SGM-Net估计 P 1 P_1 P1与 P 2 P_2 P2,通过SGM估计稠密视差图。
1.标准参数化
Path Cost(平滑项)
对于上述方法,获得正确视差的必要条件如下:
L
r
(
x
0
,
d
i
x
0
)
>
L
r
(
x
0
,
d
g
t
x
0
)
,
∀
d
i
∈
[
0
,
d
m
a
x
]
≠
d
g
t
L_r(x_0,d_i^{x_0})>L_r(x_0,d_{gt}^{x_0}),\qquad\forall d_i \in [0,d_{max}] \not=d_{gt}
Lr(x0,dix0)>Lr(x0,dgtx0),∀di∈[0,dmax]=dgt
因此,设计了损失函数如下:
与softmax等损失函数相比,该损失函数更容易进行反向传播。为此,首先计算 E g E_g Eg关于 P 1 P_1 P1和 P 2 P_2 P2的损失函数。
为此,观察下图,
x 0 x_0 x0视差为 d 5 x 0 d_5^{x_0} d5x0和 d g t 5 d_{gt}^5 dgt5的路径cost
其中 β \beta β代表了 m i n k L r ( x 1 , k ) min_{k}L_r(x_1,k) minkLr(x1,k)
把上式进行推广,则路径cost如下所示:
其中, δ d x n ← d i x 0 = { d x k − d x k − 1 } ∀ k ∈ [ 1 , n ] \delta d^{x_n \gets d_i^{x_0}}=\{d^{x_k}-d^{x_{k-1}} \} \qquad \forall k\in[1,n] δdxn←dix0={dxk−dxk−1}∀k∈[1,n] 其中 x 0 x_0 x0最终的视差为 d i x 0 d^{x_0}_i dix0
γ = ∑ i = 1 n c ( x i , d ) − m i n k L ( x i , k ) \gamma=\sum_{i=1}^n c(x_i,d)-min_kL(x_i,k) γ=∑i=1nc(xi,d)−minkL(xi,k), γ \gamma γ不包括 P 1 P_1 P1和 P 2 P_2 P2
把上式代入 E g E_g Eg并对 P 1 P_1 P1和 P 2 P_2 P2求微分,可得到下式:
根据这些方程就可以通过前向和反向传播来最小化损失函数。
但这个损失函数不考虑中间路径,例如上图中红点线表示每个像素穿过正确的视差路径,橙色线在 x 2 x_2 x2前后与正确路径不同,这会导致 x 3 x_3 x3和 x 2 x_2 x2处的惩罚项出现错误。
Neighbor cost
为了移除视差路径上视差值的模棱两可,引入Neighbor cost。基本思想是在连续像素处穿过正确视差的路径的cost一定是所有路径中最小的。
Border边界,Slant倾斜平面,Flat光滑。红色代表正确路径,蓝绿色代表错误路径。
在上图中,意味着 F b ( ⋅ ) F_b(\cdot) Fb(⋅), F s ( ⋅ ) F_s(\cdot) Fs(⋅), F f ( ⋅ ) F_f(\cdot) Ff(⋅)小于 N ( ⋅ ) N(\cdot) N(⋅)
因此可以给出Neighbor cost如下式所示:
其中
F X F_X FX根据 x 1 , x 0 x_1,x_0 x1,x0是连续,倾斜还是平坦,分为三种情况 F b , F s , F f F_b,F_s,F_f Fb,Fs,Ff
Neighbor cost使用的前提是 x 1 x_1 x1处的视差值计算正确,即 L r ( x 1 , d g t x 1 ) L_r(x_1,d_{gt}^{x_1}) Lr(x1,dgtx1)必须对所有视差具有最小的累计cost。否则,不太可能正确预测像素 x0 处的视差。
优点是两个连续像素的聚合成本应该在正确的视差下最小化。 同时,由于必要条件,很难将邻居成本应用于所有像素。
Loss
对于neighbor cost,针对每一种方向r,随机提取了同样数目的边界 G b G_b Gb,倾斜 G s G_s Gs,平面 G f G_f Gf。这些像素都具有视差真值。
对于path cost,随机从具有真值的像素中选择训练集。
最终的训练流程如算法框图所示,是迭代训练的。
训练过程中,应该是一个patch共用SGM的八个输出,即 [ P 1 , P 2 ] × [ 4 × d i r e c t i o n s ] [P_1,P_2]\times [4\times directions] [P1,P2]×[4×directions]