Connecting the Dots: 应用于主动单目深度估计的深度学习模型(CVPR2019)

作者‖ flow 毕业于中国科学院大学,人工智能领域优质创作者

编辑‖ 3D视觉开发者社区
✨如果觉得文章内容不错,别忘了三连支持下哦~

导语:

Connecting theDots是由德国图宾根大学团队发表于2019CVPR的论文,作者在主动单目结构光深度估计问题上提出了一套基于深度学习的解决方案,是当时第一篇提出利用深度学习对该问题进行解决的文章,本文将对作者提出的方案进行详细解读。

Connecting the Dots:Learning Representations for Active Monocular Depth Estimation
Connecting the Dots: 应用于主动单目深度估计的深度学习模型(CVPR2019)_第1张图片

论文地址:点击即进

附件链接:这里领取

数据链接:看这里哦

0. 概述

这篇文章是2019年的CVPR,在单目结构光深度估计问题上提出了一套基于深度学习的解决方案,截至当时,是第一篇提出利用深度学习对该问题进行解决的文章,具体的贡献有:

  • 粗暴卷积。作者不将深度估计问题视作一个找同名点的问题,而是论证且实验了*简单的卷积结构足以获取高质量的视差估计结果。

  • 自监督。由于单目结构光的GT不容易获取,因此作者通过设计精巧的损失函数对网络进行自监督。

  • 实时图解耦。文章认为实时图是可以分离为散斑图以及泛光图的,其中的泛光图可以用于提升深度图的边缘效果,具体实现方式是以一种弱监督的方式对影像以及深度边缘的联合分布进行建模。

  • 合成仿真数据。一套模拟打散斑图的合成数据方式,允许主动深度估计算法在可控的条件下进行验证。

在下文中,将对单目结构光的成像原理及其数学表达、网络结构及损失函数、实验结果进行介绍。为简便起见,以下将简称本文方法为CTD。
所谓的单目结构光深度估计,我们知道,双目的深度估计是易于理解的几何交会关系,而单目结构光的设定则可以简单地将其理解为更换掉双目中的一个相机,并将其替换为结构光相机,结构光相机发射设计过的散斑图案到物体上,然后被另一个IR相机(相当于原双目的另一目)接收。不同距离接收到的散斑图案是不一样的,具体来说,是会在水平方向上进行左右的平移,而这个特性,就使得我们可以通过计算某散斑图与一固定距离的散斑图之间的视差,进而基于简单的空间几何关系来得到深度,类似于双目中的 z = b f / d z=bf/d z=bf/d 。往往,我们通过简单的块匹配方法就能够得到比较高的匹配精度,进而得到比较好的深度估计结果,然而,随着深度学习的蔓延,使得人们会去探索是否深度学习也能够对该任务有很好的表现。

1. 空间结构光成像原理及数学表达

CTD将单目结构光的工作原理表述为下图的形式:
Connecting the Dots: 应用于主动单目深度估计的深度学习模型(CVPR2019)_第2张图片
简单来说,就是Laser通过DOE将局部结构唯一的散斑投影到物体上,然后相机对信息进行接收成像。类比双目,我们可以将投影视作第二个相机,其虚拟的影像平面给出了由DOE确定的参考散斑,这些散斑在局部来说,是唯一的,因此,我们可以通过经典的基于窗口的匹配方法建立其由相机感知到的影像与投影打出的虚拟影像之间的对应关系 。得到视差 d d d后,该文通过 z = b f / d z=bf/d z=bf/d的方式来获取深度。其实通常来说,我们更倾向于利用模组采集一个参考距离的白墙的实时图,直接作为参考散斑图,而非CTD所表述的归至虚拟投影平面,而这时就不可以用 z = b f / d z=bf/d z=bf/d的方式进行深度求取了。

至于可以为实时图解耦提供数理支撑的数学表达:

我们现在来假设 I I I是一个被人工加了高斯噪声的二维影像, J J J是无噪声的二维影像,即:

I ( x ) ∼ N ( J ( x , y ) , σ 1 2 J ( x , y ) + σ 2 2 ) \begin{aligned}I(\mathbf{x}) & \sim \mathcal{N}\left(J(x, y), \sigma_{1}^{2} J(x, y)+\sigma_{2}^{2}\right) \\ \\\end{aligned} I(x)N(J(x,y),σ12J(x,y)+σ22)
而无噪声的二维影像 J J J,本身由两部分构成,一部分是反射来的投影散斑: R R R, 另一部分是环境光影像/泛光图: A A A,换言之,我们认为 J J J R R R A A A的叠加,即:

J ( x , y ) = A ( x , y ) + R ( x , y ) J(x, y) =A(x, y)+R(x, y) J(x,y)=A(x,y)+R(x,y)

我们现在继续假设反射情况是朗伯反射,那么 R R R的反射强度则取决于散斑发射的强度 P P P, 物体的深度 Z Z Z, 物体的反射率 M M M,以及表面相对于光源的角度,即:

R ( x , y ) = P ( x , y ) M ( x , y ) cos ⁡ ( Θ ( x , y ) ) Z ( x , y ) 2 R(x, y) =\frac{P(x, y) M(x, y) \cos (\Theta(x, y))}{Z(x, y)^{2}} R(x,y)=Z(x,y)2P(x,y)M(x,y)cos(Θ(x,y))

在这个公式中,有个蕴含假设是物体到光源的距离存在二次衰减情况。实际上严格地讲,二次衰减仅仅对点光源适用,但是,考虑到激光束的发散情况,该文认为其衰减情况与二次衰减应当是类似的。

以上的3个公式将用于对实时图进行解耦,具体指将其解耦为泛光图以及散斑图。这里再强调一下,为什么会想要费工夫做这样的解耦呢?因为对于泛光图来说,其包含的关于深度的密集信息往往与边缘是对齐的,而散斑图则互补地携带了深度信息。因此,该模型能够相比起那些仅仅考虑了稀疏散斑的传统方法而言,在边界上更有优势。

2. 网络结构

CTD将单目结构光深度估计看做一个视差回归问题,具体的网络结构如下:
Connecting the Dots: 应用于主动单目深度估计的深度学习模型(CVPR2019)_第3张图片
网络结构图中的绿色框内表示了几何损失(见“3. 损失函数”中的描述)的计算示意,既然是用于约束跨视点的几何关系,自然需要输入不同视点的信息,即红框内的视点i以及蓝框内的视点j。整个模型中需要训练的参数用黄色表示,视差和边缘的解码器对于所有的视点来说是参数共享的。对于任何的两视图 ( i , j ) (i,j) (i,j)来说,由于其相对的位姿对于这个场景来说是唯一的,所以在训练的实例之间不共享。

对于这整个网络结构而言,我们输入两个视点的影像,这两个视点分别标注为 i i i j j j,那么对应地,对应这两个视点所得到的实时图则标注为 I i I_i Ii I j I_j Ij,其对应的LCN处理后的图像则标注为 P ^ i \hat{P}_i P^i P ^ j \hat{P}_j P^j。以下将具体介绍网络的几个组件。

2.1. 影像预处理:LCN

相机接收到的实时图表现与各种各样的因素有关,比如环境照明,比如物体材质,比如深度,比如投影模式等等。为了尽可能地减少这些因素的影响,尤其是减弱材质M以及深度Z的影响,采用了local contrast normalization(以下将简称LCN)的预处理方式:
Connecting the Dots: 应用于主动单目深度估计的深度学习模型(CVPR2019)_第4张图片
经过这样的预处理后,环境光照明将比散斑显著降低,进而,在 P ^ \hat{P} P^中估计深度的时候可以被忽略掉。值得注意的是,由于文章自己标注习惯的原因,这里的 P ^ \hat{P} P^并不是指参考散斑图的LCN,而是实时图的LCN。

2.2. 视差解码器

将原始的影像和经过LCN的影像进行concat后,再将其喂给视差解码器,而这个所谓的视差解码器将会直接预测出视差,对视差进行回归而不是对深度进行回归的原因是视差才是跟影像直接相关的东西。此外,在自监督的设定下,对视差这种相对的目标进行回归比对绝对位置进行回归实验效果要好多了。解码器的设置和UNet的架构非常相似。

2.3. 边缘解码器

CTD认为由于散斑的稀疏性,不足以预测出足够正确和锐利的物体边界。而物体边界的信息,却可以很方便地从泛光图中取得,此外,作者认为视差梯度和泛光图的梯度一致是比较合理的假设。

考虑到泛光图的边界可以通过借助局部信息,很好的从散斑以及其他干扰项中分离出来,文章使用了一个浅U-Net架构来从影像中来预测边缘 E E E,具体来说,边缘解码器最终预测了每一个像素是边缘的概率。

如下图所示,边缘解码器可以较好地将边缘给识别出来。

Connecting the Dots: 应用于主动单目深度估计的深度学习模型(CVPR2019)_第5张图片

3. 损失函数

相比起双目来说,单目结构光的深度估计的损失函数复杂许多,主要是需要自监督的缘故。

3.1. 光度损失

photometric metric L P L_P LP : 约束了左图(实时图)和warpped的右图(参考图)之间的一致性。

在单张影像上计算。类似于双目的自监督模式,这不过是用投射的散斑替代了双目中的参考影像,小写的 p p p指的都是局部窗口,所谓的 C C C指的是局部使用smooth Census transform:

L P i ( P ^ i , P , D i ) = ∑ x , y ∥ p ^ i ( x , y ) − p ( x − D i ( x , y ) , y ) ∥ C \mathcal{L}_{P}^{i}\left(\hat{\mathbf{P}}_{i}, \mathbf{P}, \mathbf{D}_{i}\right)=\sum_{x, y}\left\|\hat{\mathbf{p}}_{i}(x, y)-\mathbf{p}\left(x-D_{i}(x, y), y\right)\right\|_{C} LPi(P^i,P,Di)=x,yp^i(x,y)p(xDi(x,y),y)C

P ^ i \hat{P}_i P^i表示经由LCN处理后的实时图, P P P表示参考的散斑图。

对于CTD来说,光度损失是一个很基础很重要的损失,由于自监督的形式,网络接触不到GT,因此,CTD直接将光度损失作为指标去选择最优模型。

3.2. 视差损失

disparity loss L D L_D LD"Our disparity loss models first-order(e.g., gradient) statistics of the disparity map conditioned on the edges of the latent ambient image."

L D L_D LD在单张影像上计算。因为文章认为如果自监督仅仅用 L P L_P LP太稀疏了,根本没法拿到比较好的边缘信息,所以在 L D L_D LD中对边缘图 E E E和视差图的梯度幅度之间进行建模。

假设现在用一个二值 e e e来对泛光图中的边缘进行表达,对于那些是边缘的像素, e = 1 e=1 e=1,不是的话, e = 0 e=0 e=0。假设 e e e符合伯努利分布,即:

p ( e ) = λ e ( 1 − λ ) 1 − e p(e)=\lambda^{e}(1-\lambda)^{1-e} p(e)=λe(1λ)1e

其中的参数 λ \lambda λ由边缘解码器提供,即:

λ = E ( x , y ) ∈ [ 0 , 1 ] . \lambda=E(x, y) \in[0,1] . λ=E(x,y)[0,1].

更有,我们假设 d ′ d' d是视差图的梯度幅度,假设条件概率 p ( d ′ ∣ e ) p(d'|e) p(de)符合half-sided拉普拉斯分布,且参数 μ = 0 \mu = 0 μ=0,则有:

p ( d ′ ∣ e ) = [ d ′ ≥ 0 ] exp ⁡ ( − ∣ d ′ ∣ / b e ) b e p\left(d^{\prime} \mid e\right)=\left[d^{\prime} \geq 0\right] \frac{\exp \left(-\left|d^{\prime}\right| / b_{e}\right)}{b_{e}} p(de)=[d0]beexp(d/be)

也就是说,当边缘分布确定的时候,我的视差图梯度理应是满足上述分布的。

联合概率分布为:

p ( d ′ , e ) = exp ⁡ ( − ∣ d ′ ∣ / b 0 ) b 0 p e = 0 + exp ⁡ ( − ∣ d ′ ∣ / b 1 ) b 1 p e = 1 ⋅ p\left(d^{\prime}, e\right)=\frac{\exp \left(-\left|d^{\prime}\right| / b_{0}\right)}{b_{0}} p_{e=0}+\frac{\exp \left(-\left|d^{\prime}\right| / b_{1}\right)}{b_{1}} p_{e=1} \cdot p(d,e)=b0exp(d/b0)pe=0+b1exp(d/b1)pe=1

最后,这个联合概率分布再套上负 l o g log log概率,就是最终的视差loss了,即:

L D i ( D i ′ , E i ) = ∑ x , y − log ⁡ ( p ( D i ′ ( x , y ) , E i ( x , y ) ) ) \mathcal{L}_{D}^{i}\left(\mathbf{D}_{i}^{\prime}, \mathbf{E}_{i}\right)=\sum_{x, y}-\log \left(p\left(D_{i}^{\prime}(x, y), E_{i}(x, y)\right)\right) LDi(Di,Ei)=x,ylog(p(Di(x,y),Ei(x,y)))

CTD认为,这样的概率分布假设足以表达边缘与视差图梯度的一致性了,但是如果想要扩展成其他的分布情况也是ok的。

3.3. 几何损失

geometric loss L G L_G LG : 对两视图构建的几何进行约束。使用跨视点的几何损失。在两张影像上计算。

为了能够构建几何损失,需要对视差图做一些变换,将第二个视角的视差图 D j D_j Dj转换为三维点云的形式 X j X_j Xj

X j = ( X j , 1 , . . . , X j , H W ) X_j = (X_{j,1},...,X_{j,HW}) Xj=(Xj,1,...,Xj,HW)

具体来说,视差图与3D点云之间的变换可以由该公式来实现:

x = b f d K − 1 ( x , y , 1 ) ⊤ \mathbf{x}=\frac{b f}{d} \mathbf{K}^{-1}(x, y, 1)^{\top} x=dbfK1(x,y,1)

而后,我们可以通过 [ R , t ] [R,t] [R,t]矩阵将 X j X_j Xj变换到视角 i i i的相机坐标系下,数学上可以表示为: X j ′ = R i j X j + t i j X_j' = R_{ij}X_j + t_{ij} Xj=RijXj+tij。进而,几何损失 L G L_G LG就可以通过比较 X j ′ X_j' Xj中的每一个三维点与视角 i i i中的三维点之间的距离来进行设计,具体为:

L G i j ( D i , X j ′ ) = ∑ x ∈ X j ′ min ⁡ ( ∣ x z − b f D i − 1 ( K x ) ∣ , τ ) \mathcal{L}_{G}^{i j}\left(\mathbf{D}_{i}, \mathbf{X}_{j}^{\prime}\right)=\sum_{\mathbf{x} \in \mathbf{X}_{j}^{\prime}} \min \left(\left|\mathbf{x}_{z}-b f D_{i}^{-1}(\mathbf{K} \mathbf{x})\right|, \tau\right) LGij(Di,Xj)=xXjmin(xzbfDi1(Kx),τ)

注意,该损失在应用的时候是双向的,即既计算 i i i j j j,也计算 j j j i i i的。

3.4. 边缘损失

edge loss L E L_E LE:边缘损失。在单张影像上计算。如果仅仅根据视差loss L D L_D LD来训练边缘解码器,容易导致最后所有的像素的 E ( x , y ) E(x,y) E(x,y)都变成1。

L E k ( E k , A k ) = − ∑ x , y A k ′ ( x , y ) log ⁡ E k ( x , y ) + w ( 1 − A k ′ ( x , y ) ) log ⁡ ( 1 − E k ( x , y ) ) \begin{aligned} \mathcal{L}_{E}^{k}\left(\mathbf{E}_{k}, \mathbf{A}_{k}\right)=-\sum_{x, y} A_{k}^{\prime}(x, y) \log E_{k}(x, y)+& \\ w\left(1-A_{k}^{\prime}(x, y)\right) \log \left(1-E_{k}(x, y)\right) & \end{aligned} LEk(Ek,Ak)=x,yAk(x,y)logEk(x,y)+w(1Ak(x,y))log(1Ek(x,y))

在进行 L E L_E LE的计算时,是需要监督的,主要是来自泛光图的监督,而泛光图是很好获取的,关掉投影就可以了。而且,普遍认为估计边缘是比较简单的任务,所以边缘解码使用了浅层的UNet结构。

3.5. 整体损失

现在,我们假设 D D D是一堆影像序列,其中的某个影像序列命名为 T \mathcal{T} T,序列 T \mathcal{T} T中单独的影像命名为 I I I,共有 M M M张,即:

T = { I i } i = 0 M \mathcal{T}=\left\{\mathbf{I}_{i}\right\}_{i=0}^{M} T={Ii}i=0M

那么现在对于整体的 D D D来说,整体的损失为:
∑ T ∈ D [ 1 M ∑ i ∈ T ( L P i + L D i ) + 1 M 2 ∑ i , j ∈ T L G i j ] + ∑ k ∈ E L E k \sum_{\mathcal{T} \in \mathcal{D}}\left[\frac{1}{M} \sum_{i \in \mathcal{T}}\left(\mathcal{L}_{P}^{i}+\mathcal{L}_{D}^{i}\right)+\frac{1}{M^{2}} \sum_{i, j \in \mathcal{T}} \mathcal{L}_{G}^{i j}\right]+\sum_{k \in \mathcal{E}} \mathcal{L}_{E}^{k} TDM1iT(LPi+LDi)+M21i,jTLGij+kELEk

4. 实验

4.1合成数据仿真

为了能够有效地评估不同算法的效果,我们需要具有绝对精度的GT,尽管这样的GT可以通过高精度的3D扫描仪获得,但显然,成本是昂贵的。因此,CTD直接进行仿真,得到可用于评估的合成数据。仿真过程遵守了空间结构光成像原理及数学表达的指导,具体的仿真过程推荐阅读原论文中的描述,在此不做赘述,下图为仿真的实例结果:
Connecting the Dots: 应用于主动单目深度估计的深度学习模型(CVPR2019)_第6张图片

4.2. 论文实验结果

4.2.1 合成数据结果

共获取8448个序列,其中8192个序列用于训练,256个用于测试,每个序列包含4对图片。投影使用的散斑为kinect V1,基线设置为7.5cm,影像大小为640 * 480。三维模型源于shapenet,物体摆放距离在2m至3m之间,背景为一倾斜平面,距离在2m至7m之间。评价指标类似与双目的设定,使用 b a d ( x ) bad(x) bad(x)的形式,但更专注精细程度,因此使用 o ( 0.5 ) o(0.5) o(0.5) , o ( 1 ) o(1) o(1) o ( 2 ) o(2) o(2) o ( 5 ) o(5) o(5)作为评价指标。

CTD与其他方法的比较结果如下表所示:
Connecting the Dots: 应用于主动单目深度估计的深度学习模型(CVPR2019)_第7张图片
就表中的数值指标来看,CTD相对于其他方法在所有的指标上都具备一定优势。总体上看来,是有价值的。

4.2.2 真实数据结果

在真实数据上,文章采用了Chen等人(2014,CVPR)提供的数据集,这个数据中有五个扫描的模型,以及使用PrimeSense采集的序列数据(物体距离相机大约1米左右)。

具体来说,这五个扫描的模型如下图所示:
Connecting the Dots: 应用于主动单目深度估计的深度学习模型(CVPR2019)_第8张图片
将网络输出的视差转点云,而后与GT点云进行对齐。定量评估通过网络转的点云与GT点云之间的平均距离以及点云的完整性来衡量,同时,给出这两个指标的调和平均数作为综合指标。由于整个数据集只有60张影像,因此,HyperDepth(2016,CVPR)直接在所有的数据上进行训练。定量的指标结果见下表:
Connecting the Dots: 应用于主动单目深度估计的深度学习模型(CVPR2019)_第9张图片
定性的结果则如下图所示:
Connecting the Dots: 应用于主动单目深度估计的深度学习模型(CVPR2019)_第10张图片
对于更为复杂的真实场景,文章使用了Kinect v1采集了3191张数据用于训练,623张数据用于测试。下图为在测试集上定性的3D点云结果:
Connecting the Dots: 应用于主动单目深度估计的深度学习模型(CVPR2019)_第11张图片
并无定量的结果。但就目视效果上来看,泛化暂时看起来也是ok的。

参考文献

[1] Q. Chen and V. Koltun. Fast MRF optimization with application to depth reconstruction. In Proc. IEEE Conf. on Computer Vision and Pattern Recognition (CVPR), 2014.

[2] S. R. Fanello, C. Rhemann, V. Tankovich, A. Kowdle, S. Orts-Escolano, D. Kim, and S. Izadi. Hyperdepth: Learning depth from structured light without matching. In Proc. IEEE Conf. on Computer Vision and Pattern Recognition (CVPR), 2016

版权声明:本文为奥比中光3D视觉开发者社区特约作者授权原创发布,未经授权不得转载,本文仅做学术分享,版权归原作者所有,若涉及侵权内容请联系删文。

3D视觉开发者社区是由奥比中光给所有开发者打造的分享与交流平台,旨在将3D视觉技术开放给开发者。平台为开发者提供3D视觉领域免费课程、奥比中光独家资源与专业技术支持。点击加入3D视觉开发者社区,和开发者们一起讨论分享吧~

或可微信关注官方公众号3D视觉开发者社区,获取更多干货知识哦。如果您喜欢我们的文章,请多多支持我们,欢迎点赞、评论、收藏。感谢观看!

你可能感兴趣的:(3D视觉,开发者,结构光,人工智能,计算机视觉,深度学习,点云)