参考代码:AdelaiDepth-LeReS
1. 概述
在诸如MiDaS这样的深度估计网络中采用scale-shift invariant空间上做监督,导致生成的深度图存在shift未知的问题,最直观是通过深度图将RGB像素映射到3D空间,得到的结果见下图第3幅图所示:
那么为了克服shift和focal两个维度上未知,这里分别采用两个网络去预测这两个分量的漂移和缩放因子,因而得到更加符合几何特性的深度估计结果,对应的是上图中的最后一幅图。
2. 方法设计
2.1 整体结构
文章方法划分为2个部分:DPM(负责深度估计任务)和PCM(负责深度上的shift和focal变换参数预测),也就是下面这幅图的上半部分:
需要注意的是上面提到的DPM和PCM是分别单独训练的,并不是end-to-end的。在infer阶段其是采用类似迭代的方式进行求取的。具体可以参考下面的这两个函数的实现:
# LeReS/lib/test_utils.py#L111
def refine_focal(depth, focal, model, u0, v0):
...
def refine_shift(depth_wshift, model, focal, u0, v0):
...
2.2 深度估计与监督
对于深度估计网络这里是采取编解码的形式构建,其结构见下图所示:
PS:只不过需要注意的是该网络的输出与使用的损失函数是根据不同质量数据的输入而做对应改变的,具体可以参考论文Appendix的B部分,这里不展开叙述。而且在文中也提到了对于采用的多种来源的数据是采用均匀采样的形式进行组合。
在MiDaS中给介绍了好几种类型的scale-shift invariant空间变换方法,之外还存在
- 1)采用绝对值最大最小归一化,Min-Max normalization
- 2)绝对中值差归一化,median absolute deviation normalization
- 3)按照均值方法归一化,Z-score normalization
在这篇文章中借鉴了Z-score的形式对深度GT进行变换,使得深度监督变得scale-shift invariant,其将最近和最远像素分别对应的10%去除,之后求取得到剩余深度的均值方差
μ
t
r
i
m
\mu_{trim}
μtrim和
σ
t
r
i
m
\sigma_{trim}
σtrim。则对GT的归一化处理为:
d
ˉ
i
∗
=
d
i
∗
−
μ
t
r
i
m
σ
t
r
i
m
\bar{d}_i^{*}=\frac{d_i^{*}-\mu_{trim}}{\sigma_{trim}}
dˉi∗=σtrimdi∗−μtrim
则在该对应空间上的深度损失描述为:
L
I
L
N
R
=
1
N
∑
i
N
∣
d
i
−
d
^
i
∗
∣
+
∣
t
a
n
h
(
d
i
100
)
−
t
a
n
h
(
d
^
i
∗
100
)
∣
L_{ILNR}=\frac{1}{N}\sum_i^N|d_i-\hat{d}_i^{*}|+|tanh(\frac{d_i}{100})-tanh(\frac{\hat{d}_i^{*}}{100})|
LILNR=N1i∑N∣di−d^i∗∣+∣tanh(100di)−tanh(100d^i∗)∣
PS:上面的深度空间映射是image-level的。以及这里提供的scale-shift invariant变换与其它一些变换对性能的影响:
归一化参数描述的是整体深度回归情况,为了对深度平面与边界增加约束,这里借鉴了Structure-Guided Ranking Loss中采样的方式,对深度平面与边界进行采样,这部分损失函数也就是文中提到的pair-wise normal损失(PWN)。在这里会首先使用MiDaS中提到的最小二成拟合方法将预测深度图与GT深度图进行拟合。之后再进行采样操作,只不过这里采样的对象发生了变化,这里平面的寻找是通过下面文章的方法进行拟合的,也就得到对应的 “surface normal” :
Enforcing geometric constraints of virtual normal for depth prediction
对于有
N
N
N个采样点
{
(
A
i
,
B
i
)
,
i
=
0
,
…
,
N
}
\{(A_i,B_i),i=0,\dots,N\}
{(Ai,Bi),i=0,…,N},其损失计算被描述为:
L
P
W
N
=
1
N
∑
i
N
∣
n
A
i
⋅
n
B
i
−
n
A
i
∗
⋅
n
B
i
∗
∣
L_{PWN}=\frac{1}{N}\sum_i^N|n_{A_i}\cdot n_{B_i}-n_{A_i}^{*}\cdot n_{B_i}^{*}|
LPWN=N1i∑N∣nAi⋅nBi−nAi∗⋅nBi∗∣
其中,
n
n
n代表的就是 “surface normal”。
此外,还在上述提到的归一化深度空间上引入了多尺度梯度损失:
L
M
S
G
=
1
N
∑
k
=
1
K
∑
i
=
1
N
∣
∇
x
k
d
i
−
∇
x
k
d
^
i
∗
∣
+
∣
∇
y
k
d
i
−
∇
y
k
d
^
i
∗
∣
L_{MSG}=\frac{1}{N}\sum_{k=1}^K\sum_{i=1}^N|\nabla_x^kd_i-\nabla_x^k\hat{d}_i^{*}|+|\nabla_y^kd_i-\nabla_y^k\hat{d}_i^{*}|
LMSG=N1k=1∑Ki=1∑N∣∇xkdi−∇xkd^i∗∣+∣∇ykdi−∇ykd^i∗∣
则整体上损失函数描述为上述几个损失函数组合的形式:
L
=
L
P
W
N
+
λ
a
L
I
L
N
R
+
λ
g
L
M
S
G
L=L_{PWN}+\lambda_aL_{ILNR}+\lambda_gL_{MSG}
L=LPWN+λaLILNR+λgLMSG
其中,
λ
a
=
1
,
λ
g
=
0.5
\lambda_a=1,\lambda_g=0.5
λa=1,λg=0.5
整体上讲文章给出的深度估计网络与其它一些深度估计网络的性能对比:
2.3 PCM模块
在通过深度估计网络得到深度预测
d
d
d之后,可以通过focal参数通过下面的变换关系将图像坐标变换到3D坐标下去
{
x
=
u
−
u
0
f
d
y
=
v
−
v
0
f
d
z
=
d
\begin{cases} x=\frac{u-u_0}{f}d \\y=\frac{v-v_0}{f}d \\z=d \end{cases}
⎩⎪⎨⎪⎧x=fu−u0dy=fv−v0dz=d
则上文中提到的shift和focal分别去控制坐标变换之后的畸变程度和XY缩放尺度。则为了是的深度估计结果更加符合真实几何约束(只需要对scale参数进行校准,就可以用于测量),这里通过PVCNN构建了shift和focal上的预测网络,对于shift部分其是在focal给定的情况下最小化该分支的参数:
L
θ
=
min
θ
∣
N
(
F
(
u
0
,
v
0
,
f
∗
,
d
∗
+
Δ
d
∗
)
,
θ
)
−
Δ
d
∗
∣
L_{\theta}=\min_{\theta}|\mathcal{N}(\mathcal{F}(u_0,v_0,f^{*},d^{*}+\Delta_d^{*}),\theta)-\Delta_d^{*}|
Lθ=θmin∣N(F(u0,v0,f∗,d∗+Δd∗),θ)−Δd∗∣
对应focal部分是固定shift之后去优化:
L
θ
=
min
θ
∣
N
(
F
(
u
0
,
v
0
,
α
f
∗
f
∗
,
d
∗
)
,
θ
)
−
α
f
∗
∣
L_{\theta}=\min_{\theta}|\mathcal{N}(\mathcal{F}(u_0,v_0,\alpha_f^{*}f^{*},d^{*}),\theta)-\alpha_f^{*}|
Lθ=θmin∣N(F(u0,v0,αf∗f∗,d∗),θ)−αf∗∣
在下表中展示了对shift参数进行恢复之后性能的差异: