参考代码:ScaleDepth
动机与出发点
单目深度估计模型往往是在与训练集较为接近场景下表现尚可,要是当换了场景之后其泛化能力就出现问题,特别是对于更具实际价值的绝对深度估计任务。对于绝对深度估计任务其不仅仅需要确定相对深度关系,还需要确定真实深度的scale。自然的想法就是对这两种需求进行解耦,分别使用不同的模块进行预测那么便可能会比单纯绝对深度估计模型效果更好。首先对于深度的scale是与图片所处的场景强相关的,那么需要模型依据场景的类型来确定scale的值,文章中使用CLIP模型来实现场景和scale的对齐。下面就展示了不同场景下深度范围是存在较大差异的:
确定scale只是确定深度的最大范围,对于绝对深度估计而言还需要确定depth zero和relative depth,那么这部分就是在相对深度这个分支下完成的了,这里去确定像素所处深度的范围(文中称之为确定bins)和相对其它像素远近关系(划分到不同的深度bins类别下)。
文章的深度估计结果与其它一些深度估计方案的效果对比:
其实这篇文章的思路与ZoeDepth相似,都是预测相对深度和scale,只是在细节上略有差异,下图是ZoeDepth的算法结构:
另外,ZoeDepth中对于深度bins概率的计算和depth bins的划分是值得借鉴的。
方法设计
文章的网络结构如下图所示:
这里使用query的方式来确定depth bin和depth scale,需要注意的是这里为了约束attention的关注区域借鉴了Mask2Former中mask-attn的概念,所以在上图中多预测了一个感兴趣区域mask
B
∈
R
N
∗
K
∗
H
∗
W
B\in R^{N*K*H*W}
B∈RN∗K∗H∗W,其中
N
N
N是depth bins的数量。
相对深度估计
相对深度是由bin query
Q
b
∈
R
N
∗
D
Q_b\in R^{N*D}
Qb∈RN∗D与图像特征做transformer去抓取图像中像素的相对深度信息,之后通过MLP预测深度bin长度向量
L
∈
R
N
∗
1
L\in R^{N*1}
L∈RN∗1和深度bin特征
E
∈
R
N
∗
D
E\in R^{N*D}
E∈RN∗D。对于相对深度的预测首先是确定每个像素在不同深度bins下的概率:
P
=
s
o
f
t
m
a
x
(
E
@
F
T
)
∈
R
N
∗
H
∗
W
P=softmax(E@F^T)\in R^{N*H*W}
P=softmax(E@FT)∈RN∗H∗W
那么每个bin内它的深度是取中间值来确定的(通过这样的方式depth zero就可以通过学习的方式获取了):
θ
i
=
1
2
L
i
+
∑
j
=
0
i
−
1
L
j
\theta_i=\frac{1}{2}L_i+\sum_{j=0}^{i-1}L_j
θi=21Li+j=0∑i−1Lj
那么最后的深度结果就是深度概率在深度bins下的积分形式:
R
=
θ
∗
P
∈
R
1
∗
H
∗
W
R=\theta*P\in R^{1*H*W}
R=θ∗P∈R1∗H∗W
深度scale获取
为了将深度与场景关联就需要使得网络感知到图片所处的不同场景,这里是通过将由
Q
s
∈
R
M
∗
D
Q_s\in R^{M*D}
Qs∈RM∗D生成的场景向量
F
c
∈
R
1
∗
D
F_c\in R^{1*D}
Fc∈R1∗D与CLIP文本编码器对于不同场景文本输出向量
F
c
i
,
i
∈
[
1
,
C
]
F_c^i,i\in [1,C]
Fci,i∈[1,C]计算相似度来关联,它们之间的相似度计算描述为:
T
i
=
e
x
p
(
c
o
s
⟨
F
t
i
,
F
c
⟩
/
τ
)
∑
j
=
1
C
e
x
p
(
c
o
s
⟨
F
t
i
,
F
c
⟩
/
τ
)
T_i=\frac{exp(cos\langle F_t^i,F_c\rangle/\tau)}{\sum_{j=1}^Cexp(cos\langle F_t^i,F_c\rangle/\tau)}
Ti=∑j=1Cexp(cos⟨Fti,Fc⟩/τ)exp(cos⟨Fti,Fc⟩/τ)
对于深度scale的预测是通过MLP来实现的,其输出scale向量
S
∈
R
1
∗
1
S\in R^{1*1}
S∈R1∗1,那么之前获取到的相对深度在乘上scale便得到了绝对深度:
M
=
S
∗
R
,
∈
R
1
∗
H
∗
W
M=S*R,\in R^{1*H*W}
M=S∗R,∈R1∗H∗W
上面提到的几点对性能的影响:
损失函数
像素上的深度损失:
L
S
I
=
α
V
[
σ
]
+
λ
E
2
[
ϵ
]
,
α
=
10
,
λ
=
0.15
L_{SI}=\alpha\sqrt{\mathcal{V}[\sigma]+\lambda\mathcal{E}^2[\epsilon]},\alpha=10,\lambda=0.15
LSI=αV[σ]+λE2[ϵ],α=10,λ=0.15
其中,
V
[
⋅
]
,
E
[
⋅
]
\mathcal{V}[\cdot],\mathcal{E}[\cdot]
V[⋅],E[⋅]分别代表取方差和均值。另外
σ
=
l
o
g
M
^
−
l
o
g
R
,
ϵ
=
l
o
g
M
^
−
l
o
g
M
\sigma=log\hat{M}-logR,\epsilon=log\hat{M}-logM
σ=logM^−logR,ϵ=logM^−logM。对于场景相似度的约束使用交叉熵的方式进行约束:
L
T
I
=
−
∑
i
=
1
C
c
i
l
o
g
(
T
i
)
L_{TI}=-\sum_{i=1}^Cc_ilog(T_i)
LTI=−i=1∑Ccilog(Ti)
最后损失函数描述为:
L
t
o
t
a
l
=
L
S
I
+
β
L
T
I
,
β
=
0.01
L_{total}=L_{SI}+\beta L_{TI},\beta=0.01
Ltotal=LSI+βLTI,β=0.01
实验结果
NYU数据集下的性能比较:
不同场景数据下的性能表现: