《Feature-metric Loss for Self-supervised Learning of Depth and Egomotion》论文笔记
Posted m_buddy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《Feature-metric Loss for Self-supervised Learning of Depth and Egomotion》论文笔记相关的知识,希望对你有一定的参考价值。
参考代码:FeatDepth
1. 概述
介绍:在自监督深度估计中以光度重构误差作为损失函数,需要计算的是每个像素点的对应差异,但是在一些无/弱纹理或是存在多个最小值的低辨识度像素,区域光度重构误差就会产生错误匹配结果。对此,这篇文章提出了一种新的重建误差度量FeatureMetric loss,也就是在feature map的维度计算loss,从而去约束重建的过程。那么怎么去生成满足要求的feature map呢?一个自然的办法便是使用自编码网络去重建输入彩色图像(也是一个自监督任务),而且还需要在feature map上做一阶和二阶梯度约束使得其满足自监督深度估计收敛条件。
在自监督深度估计任务中是以光度重构误差作为损失,但是光度重构误差最小时却不一定代表真实深度误差最小,特别是在无纹理区域上,这样的约束经常导致错误的深度估计结果。同时为了减少深度预测错误带来的不连续问题,通常会引入平滑约束,这样会导致在一些深度平面交汇处出现模糊的情况。为了使得重构误差中的单个像素更加具有辨别能力,文章提出了feature metric loss,也就是在特征图的维度实现重建最小化。其中运用到的特征图提取网络来自于自监督的自编码器。除了自编码器使用的重建损失外,还使用了discriminative loss和convergent loss,分别用于生成更具分辨能力的单像素表达以及减少像素之间的方差。
下图展示了MonoDepth2和文章方法的比较,这篇文章的方法效果更好:
2. 方法设计
2.1 pipeline结构
文章的整体pipeline见下图所示:
在上图的左边是用于训练自编码器的网络,其编码器会用于后面单目自监督估计中特征图的抽取。右边就是标准的单目自监督深度估计的pipeline了。
2.2 自编码器
这里使用的自编码器训练是采取自监督的形式进行的,在其训练过程中包含3个部分的损失:图像重建损失、discriminative loss和convergent loss。
图像重建损失: 这部分是直接用于自编码器生成和原图一致的结果:
L
r
e
c
∑
p
∣
I
(
p
)
−
I
r
e
c
(
p
)
∣
1
L_rec\\sum_p|I(p)-I_rec(p)|_1
Lrecp∑∣I(p)−Irec(p)∣1
discriminative loss: 这部分用于激励每个像素生成更具判别能力的信息表达,特别是用于区分无纹理区域的像素,因而会激励网络在这些区域产生更多的梯度
L
d
i
s
=
−
∑
p
∣
∇
1
ϕ
(
p
)
∣
1
L_dis=-\\sum_p|\\nabla^1\\phi(p)|_1
Ldis=−p∑∣∇1ϕ(p)∣1
convergent loss: 该损失函数用于对特征图上的梯度平滑,因而保证特征图梯度的连续性和较大的收敛半径
L
c
v
t
=
∑
p
∣
∇
2
ϕ
(
p
)
∣
1
L_cvt=\\sum_p|\\nabla^2\\phi(p)|_1
Lcvt=p∑∣∇2ϕ(p)∣1
对于上述中的
∇
1
=
∂
x
+
∂
y
,
∇
2
=
∂
x
x
+
2
∂
x
y
+
∂
y
y
\\nabla^1=\\partial_x+\\partial_y,\\nabla^2=\\partial_xx+2\\partial_xy+\\partial_yy
∇1=∂x+∂y,∇2=∂xx+2∂xy+∂yy。则整体的自编码器自监督损失函数描述为:
L
s
=
L
r
e
c
+
α
L
d
i
s
+
β
L
c
v
t
L_s=L_rec+\\alpha L_dis+\\beta L_cvt
Ls=Lrec+αLdis+βLcvt
其中,
α
=
β
=
1
e
−
3
\\alpha=\\beta=1e-3
α=β=1e−3。那么更进一步上述中的几个loss对网络的整体性能影响见下表:
2.3 深度估计约束
这里将自编码器中的编码器引入到深度估计网络中去,因而除了直接在图片维度进行光度重构误差,还在feature map的维度进行重构误差最小化。则深度自监督部分的损失函数描述为:
L
s
→
t
=
∑
p
L
f
m
(
ϕ
s
(
p
^
)
,
ϕ
t
(
p
)
)
+
∑
p
L
p
h
(
I
s
(
p
^
)
,
I
t
(
p
)
)
L_s\\rightarrow t=\\sum_pL_fm(\\phi_s(\\hatp),\\phi_t(p))+\\sum_pL_ph(I_s(\\hatp),I_t(p))
Ls→t=p∑Lfm(ϕs(p^),ϕt(p))+p∑Lph(Is(p^),It(p))
其中,前面的一项便是feature map上的重构误差,后面一项就是光度重构误差。对于feature map上的重构误差这里用L1范数的形式进行表示:
L
f
m
=
∣
ϕ
s
(
p
^
)
,
ϕ
(
I
t
(
p
)
)
∣
1
L_fm=|\\phi_s(\\hatp),\\phi(I_t(p))|_1
Lfm=∣ϕs(p^),ϕ(It(p))∣1
对于图像维度的光度重构误差描述为:
L
p
h
=
0.15
∑
p
∣
I
s
(
p
^
)
−
I
t
(
p
)
∣
1
+
0.85
1
−
S
S
I
M
(
I
s
(
p
^
)
,
I
t
(
p
)
)
2
L_ph=0.15\\sum_p|I_s(\\hatp)-I_t(p)|_1+0.85\\frac1-SSIM(I_s(\\hatp),I_t(p))2
Lph=0.15p∑∣Is(p^)−It(p)∣1+0.8521−SSIM(Is(p^),It(p))
而在实际运算过程中也会考虑遮挡的情况,这里跟Monodepth2中的处理机制一样,采取的是选择重构误差作为该点损失的形式:
L
s
→
t
′
∑
p
min
s
∈
V
L
s
→
t
(
ϕ
s
(
p
^
)
,
ϕ
t
(
p
)
)
L_s\\rightarrow t^'\\sum_p\\min_s\\in VL_s\\rightarrow t(\\phi_s(\\hatp),\\phi_t(p))
Ls→t′p∑s∈VminLs→t(ϕs(p^),ϕt(p))
因而,结合上述中的自编码器损失,总体损失描述为:
L
t
o
t
a
l
=
L
s
+
L
s
→
t
L_total=L_s+L_s\\rightarrow t
Ltotal=以上是关于《Feature-metric Loss for Self-supervised Learning of Depth and Egomotion》论文笔记的主要内容,如果未能解决你的问题,请参考以下文章
Paper Reading - Loss系列 - Focal Loss for Dense Object Detection
[论文理解]Focal Loss for Dense Object Detection(Retina Net)
RuntimeError: _thnn_nll_loss_forward not supported on CUDAType for Long
focal loss for multi-class classification
Focal Loss for Dense Object Detection 论文阅读
“nll_loss_forward_reduce_cuda_kernel_2d_index“ not implemented for ‘Float‘