赞
踩
大多数深度估计方法只能处理白天或夜间图像,而对于白天和夜间图像之间的照明变化,其性能会有所降低。为了缓解光照变化导致的性能降低问题,ADDS-DepthNet
算法采用了一种域分离的网络,将昼夜图像对的信息划分为两个互补的子空间:私有域和不变域。私有域包含昼夜图像的唯一信息(光照等),不变域包含必要的共享信息(纹理等)。
同时,为了保证白天和夜晚图像包含相同的信息,域分离网络将白天图像和对应的夜间图像(使用GAN方法生成)作为输入,通过正交性和相似损失学习私有域和不变域的特征提取,从而减小域差距,获得更好的深度图。最后,利用重建和光度损失对互补信息和深度图进行有效地深度估计。
注:可能有读者对于标题中的“域”有疑问,原文中对应的单词为Domain,翻译软件会翻译为“区域、领域、定义域、范围、范畴等”,但是这样翻译可能难以理解,结合论文中描述的内容、以及对应的代码,我个人认为这个“Domain”是特征的集合,不知道这样会不会更好理解一些:
本文中会提到的私有域,原文中的描述为private domains,或者是private feature(我认为这里的domains和feature所表达的意思是一样的,或者说,把它们理解为一个东西会更容易理解一些),所谓的私有,其实是针对白天和夜间而言的,作者认为在同一个地点、同一个角度拍摄的白天照片、夜间照片,其获取的特征是有不同之处的,因为有不同,所以对各自来说,相当于彼此之间private(即你的有我没有,我有的你没有),我们两个在某个方面有不一样的特征;同理,不变域中的不变,是Invariant这个单词,直白地说,就是你有的我也有,我有的你也有,我们两个在某个方面的特征是一样的,所以叫做不变域。最后举个例子,小帅和小美的私有域是性别这个特征(小帅是男生,小美是女生),而他们的不变域是物种这个特征(都是人类),这样是不是简单多了!
参考资料:
无人驾驶车辆在路上行驶时,通常需要配置激光雷达获得高精度点云数据,从点云数据中获取主车与周围各个障碍物的距离。但是,激光雷达的成本高,因此,很多学者尝试用相机来估计主车与周围各个障碍物的距离,从而尽可能地降低成本。
用专业术语来说,深度估计就是通过图像采集装置采集物体的图像,利用物体的图像估计物体各点到图像采集装置的成像平面的垂直距离,该垂直距离即为该物体上对应点的深度信息。
目前有很多深度估计方法,如果按照使用的传感器来分,可以分为三大类:基于TOF相机、基于双目摄像头和基于单目摄像头的深度估计。
TOF相机内置红外光的传感器,通过发射光脉冲并接收打到物体反射回来的脉冲信号,最后计算光脉冲的飞行时间得到目标物体的距离。
目前很多单反相机为了获取准确的焦点,会在相机上内置TOF测距传感器。
注:上图源于网络
双目摄像头就像人的眼睛,其深度估计的过程往往是一个坐标转换的过程,也就是说,如果使用的是双目摄像头,那么通常使用传统方法来估计深度:对双目摄像头拍摄的两张图像进行对比,对其中的特征点进行匹配,然后经过极线矫正后进行视差计算,最后从视差得到深度。
注:上图源于《双目视觉相机的产品落地化》原文链接:https://www.sohu.com/a/325701231_391994
单目摄像头只能获取二维的物体信息,即长度、宽度,所以如果想要测距,需要拍摄出几张不同角度(时序)的图像进行解算,通常其解算过程非常复杂,而且精度不如双目摄像头高,因此在单目摄像头面前,传统的测距方法并不能取得很好的效果。
注:上图源于Xingshuai Dong, Matthew A. Garratt, Sreenatha G. Anavatti, & Hussein A. Abbass (2023). Towards Real-Time Monocular Depth Estimation for Robotics: A Survey
下面主要介绍使用深度学习模型进行单目深度估计的方法。
基于监督学习的单目深度估计方法在模型训练时需要依赖真实深度,同时需要依赖庞大的数据进行网络模型的训练,数据集一般包括单目图像和对应的深度图。
但是,真实深度值的获取成本高昂,且范围有限,需要精密的深度测量设备和移动平台,而且,采集的原始深度标签通常是稀疏点,不能与原图很好的匹配。
基于自监督学习的单目深度估计方法由于在网络训练时不依赖深度真值,因此成为了单目深度估计研究中的热点。自监督学习根据图像对之间的几何关系重建出对应的图像,从而通过图像重建损失监督网络的训练。
ADDS-DepthNet
算法就是一种基于自监督学习的单目深度估计算法。其自监督信号源于:在现实世界中,如果视角固定,同一个场景物体的深度信息应该是不变的,不会随着光照角度的推移而出现变化。
上面根据硬件来区分了深度估计的几种思路,由于这篇文章涉及到的内容比较细,所以这里再简单介绍一下基于单目摄像头的,并且是针对白天、夜晚甚至是全天场景的单目深度估计方法。
近年来,自监督深度估计得到了广泛的研究,Monodepth和SFMLearner是第一个采用训练深度网络和独立位姿网络的自监督单目深度估计方法。一些方法在户外场景进行了改进,并在KITTI数据集和Cityscape数据集上进行了充分的测试,但因为夜间的低能见度和不均匀光照,所以在夜间的效果并不是特别好。
夜间深度估计比白天下进行深度估计要难一些,多光谱迁移网络MTN就使用额外的传感器来估计夜间深度估计,采用热成像相机传感器来减少夜间能见度低的影响,还有方法增加了激光传感器来提高额外信息。同时,也有一些方法采用生成式对抗网络来进行夜间深度估计。
虽然夜间单目深度估计已经取得了显著的进展,但由于白天图像和夜间图像之间存在较大的差异,因此这些方法的性能有限。
大多数深度估计和立体匹配域自适应方法主要集中在合成域和真实域之间或不同数据集之间的迁移。大多数方法通常将图像从一个域转换到另一个域。
一些方法采用图像翻译技术来生成标签(比如用白天的图像生成夜间的图像),还有一些方法通过使用域不变离焦模糊来作为直接监督,解决了合成图像到真实深度估计的问题。相比于这些方法,ADDS
算法提出了一种有效的全天自监督深度估计的域分离框架,该框架能有效的处理图像之间的域转移问题。
ADDS
算法提出了一种域分离框架来消除干扰的影响,该框架用GAN的思路产生的白天图像和相应的夜间图像作为网络为输入。
注:上图源于Lina Liu, Xibin Song, Mengmeng Wang, Yong Liu, & Liangjun Zhang (2021). Self-supervised Monocular Depth Estimation for All Day Images using Domain Separation… international conference on computer vision.
ADDS
算法架构包括三个部分:共享权重的深度网络(中间橙色区域粉色结构)、白天私有网络(上方蓝色区域黄色结构)和夜间私有网络(下方蓝色区域绿色结构)。
白天和夜间图像是共享权重的深度网络的输入,该网络首先提取不变特征,然后估计相应的深度图。同时,白天私有特征提取器和夜间私有特征提器(蓝色区域)分别提取白天和夜晚的特征,这些私有特征受到正交性损失的约束,以获得互补特征。并且添加私有和不变特征来重建具有重建损失的原始输入图像。在推理时,仅使用 O d O^d Od、 O n O^n On和共享权重的深度网络来估计深度。
对于相同场景里白天和夜间图像,尽管这些图像对的照明非常不同,但其深度信息应该是一致的。这意味着场景的对应的白天图像和夜晚图像的基本信息应该是相似的。ADDS
算法将白天和夜间图像的信息分成两部分:
I
d
=
I
i
d
+
I
p
d
,
I
n
=
I
i
n
+
I
p
n
其中, I i d I_{i}^{d} Iid和 I i n I_{i}^{n} Iin表示白天和夜晚图像的不变信息(“都有的,你有我也有”),应类似于相同场景; I p d I_{p}^{d} Ipd和 I p n I_{p}^{n} Ipn分别表示白天和夜间图像的私有信息(照明等,“你有我没有,我有你没有”)。
场景的照明随着时间的推移而不同,而场景的深度是恒定的,因此场景的照明分量 ( I p d \left(I_{p}^{d}\right. (Ipd和 I p n ) \left.I_{p}^{n}\right) Ipn)在自监督深度估计中发挥的作用较少。
此外,很难保证场景的真实世界白天和夜间图像包含除了私有信息(照明等)之外的相同信息,因为在室外场景中总是有移动的对象。这将误导网络获取图像的私有和不变信息。因此,ADDS
算法使用CycleGAN将白天图像转换为夜间图像,这样白天图像和相应生成的夜间图像被视为输入图像对,它确保了不变信息是一致的,并且所有对象都位于相同的位置,从而减少了在分离私有信息的过程中重要信息的丢失。注意,这里也可以使用其他GAN算法。
域分离框架将图像分离为特征层中的两个互补子空间(如图5所示),并且将不变分量用于深度估计。
ADDS
算法使用两个网络分支分别在特征级别提取图像的私有和不变信息。给定输入的白天图像序列
{
I
t
−
1
d
,
I
t
d
,
I
t
+
1
d
}
\left\{I_{t-1}^{d}, I_{t}^{d}, I_{t+1}^{d}\right\}
{It−1d,Itd,It+1d}和相应的生成的夜晚图像序列
{
I
t
−
1
n
,
I
t
n
,
I
t
+
1
n
}
\left\{I_{t-1}^{n}, I_{t}^{n}, I_{t+1}^{n}\right\}
{It−1n,Itn,It+1n},其中
t
t
t表示按时间顺序排列的第
t
t
t帧图像,白天专用特征提取器
E
p
d
E_{p}^{d}
Epd和夜晚专用特征提提取器
E
p
n
E_{p}^{n}
Epn用于提取白天图像和夜晚图像
f
p
d
f_{p}^{d}
fpd和
f
p
n
f_{p}^{n}
fpn的私有特征,分别地不变量特征提取器
E
i
d
E_{i}^{d}
Eid和
E
i
n
E_{i}^{n}
Ein分别用于提取白天和夜晚图像
f
i
d
f_{i}^{d}
fid和
f
i
n
f_{i}^{n}
fin的不变量特征。由于输入的白天和夜间图像包含相同的基本信息,因此
E
i
d
E_{i}^{d}
Eid和
E
i
n
E_{i}^{n}
Ein 是权重共享的,定义为
E
s
E_{s}
Es。然后特征提取过程可以公式化为:
f
p
t
d
=
E
p
d
(
I
t
d
)
,
f
p
t
n
=
E
p
n
(
I
t
n
)
f
i
t
d
=
E
s
(
I
t
d
)
,
f
i
t
n
=
E
s
(
I
t
n
)
其中下标中的 t t t表示昼夜时间的第 t t t帧。
然后,基于上一步得到的特征重建白天和夜间图像的相应深度图。其中,红色解码器 D s D_{s} Ds表示共享权重的深度网络的深度恢复模块,黄色解码器 R d R^{d} Rd和绿色解码器 R n R^{n} Rn表示白天、夜间图像的重建分支。深度图和图像重建的过程可以表示为:
I
ˉ
t
d
=
R
d
(
f
p
t
d
+
f
i
t
d
)
I
ˉ
t
n
=
R
n
(
f
p
t
n
+
f
i
t
n
)
d
t
d
=
D
s
(
f
i
t
d
)
d
t
n
=
D
s
(
f
i
t
d
)
其中 I ˉ t d \bar{I}_{t}^{d} Iˉtd和 I ˉ t n \bar{I}_{t}^{n} Iˉtn是 R d R^{d} Rd和 R n R^{n} Rn重建的第 t t t帧图像, d t d d_{t}^{d} dtd和 d t n d_{t}^{n} dtn是 D s D_{s} Ds估计的相应深度图。
为了以自监督学习的方式获得全天图像的私有和不变特征并很好地估计深度信息,ADDS
算法利用了不同的损失,包括重建损失(Reconstruction Loss)、相似性损失(Similarity Loss)、正交性损失(Orthogonality Loss)和光度损失(Photometric Loss)。
网络的总训练损失为:
L total = λ 1 L recons + λ 2 L simi + λ 3 L ortho + λ 4 L p m L_{\text {total }}=\lambda_{1} L_{\text {recons }}+\lambda_{2} L_{\text {simi }}+\lambda_{3} L_{\text {ortho }}+\lambda_{4} L_{p m} Ltotal =λ1Lrecons +λ2Lsimi +λ3Lortho +λ4Lpm
其中,
λ
1
,
λ
2
,
λ
3
,
λ
4
\lambda_{1}, \lambda_{2}, \lambda_{3}, \lambda_{4}
λ1,λ2,λ3,λ4是权重参数。在ADDS
算法中,作者根据经验设置为
λ
1
=
0.1
,
λ
2
=
λ
3
=
λ
4
=
1
\lambda_{1}=0.1, \lambda_{2}=\lambda_{3}=\lambda_{4}=1
λ1=0.1,λ2=λ3=λ4=1。
下面对每一种损失做详细的介绍。
私有特征和不变特征是互补信息,可用于重建原始RGB图像。因此,使用重建损失来细化域分离框架,其定义为:
L
recons
=
1
N
∑
x
(
I
ˉ
t
x
d
−
I
t
x
d
)
2
+
1
N
2
(
∑
x
(
I
ˉ
t
x
d
−
I
t
x
d
)
)
2
+
1
N
∑
x
(
I
ˉ
t
x
n
−
I
t
x
n
)
2
+
1
N
2
(
∑
x
(
I
ˉ
t
x
n
−
I
t
x
n
)
)
2
其中 x ∈ [ 1 , N ] x \in[1, N] x∈[1,N], N N N是 I t n I_{t}^{n} Itn和 I t d I_{t}^{d} Itd的像素数。
白天图像和相应生成的夜间图像(使用CycleGAN生成)作为模型输入,因此白天和夜间图像的估计深度图应一致。由于白天图像在深度估计中有优势,所以夜间图像的估计深度尽可能接近白天,即白天图像的深度被用作伪标签以约束夜间图像的深度。因此,相似性损失定义为:
L s i m i = 1 N ∑ x ( d t x n − d ~ t x d ) 2 L_{s i m i}=\frac{1}{N} \sum_{x}\left(d_{t x}^{n}-\widetilde{d}_{t x}^{d}\right)^{2} Lsimi=N1x∑(dtxn−d txd)2
其中 x ∈ [ 1 , N ] x \in[1, N] x∈[1,N], N N N是 d t n d_{t}^{n} dtn和 d t d d_{t}^{d} dtd的像素数, x x x表示第 x x x个像素。 d ~ t d \widetilde{d}_{t}^{d} d td表示在反向传播期间, d t d d_{t}^{d} dtd的梯度被切断。
另外,图像的私有特征和不变特征是互补的,并且完全不同。因此,ADDS
算法使用两种类型的正交性损失来保证私有特征和不变特征完全不同,分别是纯特征正交性损失
L
f
L_{f}
Lf(Direct feature orthogonality loss)和Gram矩阵正交性损失
L
g
L_{g}
Lg(Gram matrices orthogonality loss)。
私有特征和不变特征提取器的输出是具有大尺寸的三维私有特征 f p f_{p} fp和不变特征 f i f_{i} fi。为了降低复杂性,首先使用 1 × 1 1×1 1×1的卷积层来减小私有特征和不变特征( ( v p \left(v_{p}\right. (vp和 v i ) \left.v_{i}\right) vi))的大小,然后拉直为一维特征向量。最后,计算私有特征和不变特征向量之间的内积(正交性损失),其定义为 L f L_{f} Lf。
Gram矩阵被广泛用于样式转换中,以表示特征的样式。私有特征和不变特征可以被认为具有不同的风格。因此,ADDS
算法首先计算私有特征和不变特征的Gram矩阵
(
η
p
\left(\eta_{p}\right.
(ηp 和
η
i
)
\left.\eta_{i}\right)
ηi),然后将其拉直为一维特征向量,从而可以计算这些向量之间的正交性损失,这被定义为
L
g
L_{g}
Lgg。
L f L_{f} Lf和 L g L_{g} Lg的计算过程可以定义为:
v
i
t
d
=
C
r
s
d
(
f
i
t
d
)
,
v
p
t
d
=
C
r
p
d
(
f
p
t
d
)
v
i
t
n
=
C
r
s
n
(
f
i
t
n
)
,
v
p
t
n
=
C
r
p
n
(
f
p
t
n
)
其中, C r s d , C r p d , C r s n C_{r s}^{d}, C_{r p}^{d}, C_{r s}^{n} Crsd,Crpd,Crsn和 C r p n C_{r p}^{n} Crpn分别是白天和夜间图像的不变特征和私有特征的1×1卷积运算。
最后,正交性损失定义为:
L
ortho
=
L
f
+
L
g
L
f
=
V
(
v
i
t
d
)
⋅
V
(
v
p
t
d
)
+
V
(
v
i
t
n
)
⋅
V
(
v
p
t
n
)
L
g
=
V
(
η
i
t
d
)
⋅
V
(
η
p
t
d
)
+
V
(
η
i
t
n
)
⋅
V
(
η
p
t
n
)
其中 V V V是将多维特征转换为一维特征的操作。
光度损失的计算公式为:
I
^
t
d
=
P
(
d
t
d
,
pose
(
t
−
1
,
t
)
d
,
I
(
t
−
1
)
d
)
I
^
t
n
=
P
(
d
t
n
,
pose
(
t
−
1
,
t
)
n
,
I
(
t
−
1
)
n
)
L
p
m
=
α
2
(
1
−
SSIM
(
I
^
t
d
,
I
t
d
)
)
+
(
1
−
α
)
∥
I
^
t
d
−
I
t
d
∥
1
+
α
2
(
1
−
SSIM
(
I
^
t
n
,
I
t
n
)
)
+
(
1
−
α
)
∥
I
^
t
n
−
I
t
n
∥
1
其中 pose ( t − 1 , t ) \operatorname{pose}_{(t-1, t)} pose(t−1,t)是姿态估计过程, I ^ \hat{I} I^是重投影图像,并且 α = 0.85 \alpha=0.85 α=0.85是根据经验设置的。
PaddleVideo是飞桨官方出品的视频模型开发套件,旨在帮助开发者更好的进行视频领域的学术研究和产业实践。
# 下载PaddleVideo源码
%cd /home/aistudio/
!git clone https://gitee.com/PaddlePaddle/PaddleVideo.git
%cd PaddleVideo
/home/aistudio
正克隆到 'PaddleVideo'...
remote: Enumerating objects: 1162, done.[K
remote: Counting objects: 100% (1162/1162), done.[K
remote: Compressing objects: 100% (817/817), done.[K
remote: Total 1162 (delta 291), reused 1157 (delta 289), pack-reused 0[K
接收对象中: 100% (1162/1162), 55.39 MiB | 1.90 MiB/s, 完成.
处理 delta 中: 100% (291/291), 完成.
检查连接... 完成。
/home/aistudio/PaddleVideo
# 安装依赖库
!python -m pip install --upgrade pip
!pip install --upgrade -r requirements.txt
PaddleVideo提供了在Oxford RobotCar dataset数据集上训练好的ADDS模型,为了快速体验模型效果的开发者可以直接下载。
# 下载在Oxford RobotCar dataset数据集上训练好的模型参数
!wget https://videotag.bj.bcebos.com/PaddleVideo-release2.2/ADDS_car.pdparams
--2023-01-14 15:29:07-- https://videotag.bj.bcebos.com/PaddleVideo-release2.2/ADDS_car.pdparams
正在解析主机 videotag.bj.bcebos.com (videotag.bj.bcebos.com)... 182.61.200.195, 182.61.200.229, 2409:8c04:1001:1002:0:ff:b001:368a
正在连接 videotag.bj.bcebos.com (videotag.bj.bcebos.com)|182.61.200.195|:443... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度: 212077193 (202M) [application/octet-stream]
正在保存至: “ADDS_car.pdparams”
ADDS_car.pdparams 100%[===================>] 202.25M 3.18MB/s in 53s
2023-01-14 15:30:01 (3.85 MB/s) - 已保存 “ADDS_car.pdparams” [212077193/212077193])
# 导出推理模型
%cd /home/aistudio/PaddleVideo
!python tools/export_model.py -c configs/estimation/adds/adds.yaml \
-p ADDS_car.pdparams \
-o inference/ADDS
/home/aistudio/PaddleVideo
Building model(ADDS)...
W0114 15:32:56.978492 957 gpu_resources.cc:61] Please NOTE: device: 0, GPU Compute Capability: 7.0, Driver API Version: 11.2, Runtime API Version: 11.2
W0114 15:32:56.982515 957 gpu_resources.cc:91] device: 0, cuDNN Version: 8.2.
Loading params from (ADDS_car.pdparams)...
model (ADDS) has been already saved in (inference/ADDS).
导出的推理模型保存在:
/PaddleVideo/inference
└── ADDS
├── ADDS.pdiparams
├── ADDS.pdiparams.info
└── ADDS.pdmodel
使用PaddleVideo/tools/predict.py
加载模型参数,并输入一张图片,其推理结果会默认以伪彩的方式保存下模型估计出的深度图。
这里提供了两张测试图片,分别是白天和夜间拍摄的照片,拍摄设备是大疆Osmo Action灵眸运动相机:
!python tools/predict.py --input_file /home/aistudio/test_img/night.jpg \
--config configs/estimation/adds/adds.yaml \
--model_file inference/ADDS/ADDS.pdmodel \
--params_file inference/ADDS/ADDS.pdiparams \
--use_gpu=True \
--use_gpu=True \
--use_tensorrt=False
以下是测试图片和对应的预测深度图:
从测试结果来看,我个人觉得白天的深度图要好一些,但是晚上的深度图就要差一些了,不过也有可能是晚上拍出来的图像质量较差,并且环境暗了一些。但毕竟是基于自监督学习做的,所以这个结果还行吧。
另外,这里还准备了两个测试视频,位于/home/aistudio/test_video/
,大家拿来可以自行测试,视频转图片的脚本也准备好了,位于/home/aistudio/video2image.py
。
论文最后展示了比较有意思的量化结果,这里给大家展示一下:
注:上图源于Lina Liu, Xibin Song, Mengmeng Wang, Yong Liu, & Liangjun Zhang (2021). Self-supervised Monocular Depth Estimation for All Day Images using Domain Separation… international conference on computer vision.
这张图展示的是卷积层的特征图可视化。从上到下分别是:(a)白天私有特征,(b)夜间私有特征,(c)白天不变功能特征,(d)夜间私有特征。第一列显示了相应的输入图像,从左到右的其余列是包含更多信息的前10个特征图。
首先看输入,这里展示的图像,不管是白天还是夜间拍摄的图像,都是比较亮的,也就是说,在做深度估计时,图片一定要清晰,上面用的测试不太清晰,效果可能就不太好。
另外,可视化特征图后,可以在一定程度上看出模型的各个部分是怎么“分工”的,并且,可视化结果里有一些地方是黑的,说明这个地方没有提供有效的信息。有意思的是,对于白天私有特征和夜间私有特征,其浅层特征是比较清晰的,越深越模糊,并且他们对道路两边的物体比较敏感(比如停在道路两边的车辆,或是从旁边经过的车辆);而对于白天共有特征和夜间共有特征,可以发现它们的可行驶边缘的两条线比较亮,,而道路两边的区域相对来说比较暗。这也反映了私有特征和共有特征确实是互补的。
郑博培,百度飞桨开发者技术专家,AI Studio精选项目审稿人,前任百度飞桨北京领航团团长、百度飞桨领航团技术面试官,多次参与各大竞赛基线系统的开发、多次担任课程讲师及助教。
我在AI Studio上获得至尊等级,点亮10个徽章,来互关呀!!!
https://aistudio.baidu.com/aistudio/personalcenter/thirdview/147378
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。