Neural RGB-D Sensing: Depth and Uncertainty from a Video Camera

title

这也是CVPR best paper finalist里面的一篇文章,做的内容是利用RGB的视频来估计场景的深度和深度的不确定度。

主要思路

文章的主要思路有两步:

  1. 与往常DL-based的单帧深度估计方法不同,文章对每个pixel估计一个深度的不确定度,也就是深度的概率分布,从而对每个输入的帧,都能够得到一个3D的深度概率volume;
  2. 这些不同帧得到的volume随后被一个类似于贝叶斯滤波的方法进行多帧融合,削弱深度值的不确定性,增强准确率、鲁棒性和时域稳定性。

文章的主要出发点在于,主动的depth sensing有很多缺点,例如有限的操作空间(室内)、有限的空间分辨率、能量消耗大、传感器之间会有串扰等,而从image或者images获取深度又一般会存在尺度二义性、高计算复杂度等问题,单帧图像深度估计更是会出现很多不确定性高的情况,例如没有纹理的区域、镜面或者透明的材料、遮挡等等。本文提出使用深度值概率分布来代替深度值,通过多帧融合增强估计的深度概率的准确性和鲁棒性。另外,该算法还能有效地解决domain shift的问题。

框架与方法

文章的整体框架图如下:

framework

整体的方法分为三个部分,第一个部分是深度值概率分布的估计,第二个部分是多帧DPV的融合,第三个部分是DPV的refine(分辨率提升)。

DPV估计(D-net)

对于每个pixel (u,v)(u,v),DPV给出它所对应的点的深度值概率分布为p(d;u,v)p(d;u,v),DPV是建立在一个3D视锥上的,视锥的每一个平面都代表着同一深度的平面,文章没有使用参数化的概率分布例如GMM,而是直接用非参数化的概率分布,最后得到的深度和置信度分别定义如下:

d^(u,v)=d=dmind=dmaxp(d;(u,v))d\hat{d}(u, v)=\sum_{d=d_{\min }}^{d=d_{\max }} p(d ;(u, v)) \cdot d

C^(u,v)=p(d^,(u,v))\hat{C}(u, v)=p(\hat{d},(u, v))

也就是最后得到的深度是整个分布的期望,而置信度则是对应的概率值。

再说第一个部分的网络,输入一系列的视频帧,对每一个给定的深度候选值d,计算一个cost map,最后将所有cost map做一个softmax,得到最后的概率分布:

L(dtIt)=kNt,ktf(It)warp(f(Ik);dt,δTkt)L\left(d_{t} | I_{t}\right)=\sum_{k \in \mathcal{N}_{t}, k \neq t}\left\|f\left(I_{t}\right)-\operatorname{warp}\left(f\left(I_{k}\right) ; d_{t}, \delta T_{k t}\right)\right\|

p(dtIt)=softmax(L(dtIt))p\left(d_{t} | I_{t}\right)=\operatorname{softmax}\left(L\left(d_{t} | I_{t}\right)\right)

其中dtd_t是第t帧的值为d的深度值,δTkt\delta T_{kt}则是第k帧到第t帧的camera pose矩阵,计算出DPV之后,就知道这一帧的深度情况,同时也能知道这一帧深度的置信度了。

但是有一个问题,这一步用的f是一个叫PSM-Net的网络,是一个金字塔结构,它输出的是1/4的输入image的size,因此要在第三步做refine再把DPV的空间分辨率再提上来。(为什么不直接用原分辨率的网络呢?文中也没说)

DPV

从上图可以看出,在occlusion的边界上的点,深度的置信度是比较低的,这是符合我们的预期的。

多帧DPV的融合(K-Net)

文章的另一个出发点是,通过将各帧估计的DPV融合在一起来减少每个点的不确定度,以及增强准确率。也就是说,我们有利用1到t帧信息已经融合好的第t帧的DPV,以及一个利用t+1帧信息通过D-Net得到的DPV,想要得到一个更好的t+1帧的DPV,怎么做呢?

一个非常直接的思路是,首先把t时刻的DPV全部warp到t+1帧,然后再用warp后的t时刻DPV和当前t+1时刻的DPV做个概率相乘:

 Predict :p(dtI1:t)p(dt+1I1:t) Update :p(dt+1I1:t)p(dt+1I1:t+1)\begin{array}{ll}{\text { Predict } :} & {p\left(d_{t} | I_{1 : t}\right) \rightarrow p\left(d_{t+1} | I_{1 : t}\right)} \\ {\text { Update } :} & {p\left(d_{t+1} | I_{1 : t}\right) \rightarrow p\left(d_{t+1} | I_{1 : t+1}\right)}\end{array}

Predict的步骤就是做warp:

p(dt+1I1:t)=warp(p(dtI1:t),δTt,t+1)p\left(d_{t+1} | I_{1 : t}\right)=\operatorname{warp}\left(p\left(d_{t} | I_{1 : t}\right), \delta T_{t, t+1}\right)

然后将warp后的t帧DPV和当前的t+1帧的DPV做一个相乘再重新归一化的融合,但是这样会带来一个问题,那就是它把正确的信息和不正确的信息粗暴地融合在了一起,例如当有occlusion的时候,不同时刻的帧上的概率分布可能差别很大,因此置信度太低,文章又提出使用简单的加权形式:

E(dt+1I1:t+1)=λE(dt+1I1:t)+E(dt+1It+1)E\left(d_{t+1} | I_{1 : t+1}\right)=\lambda \cdot E\left(d_{t+1} | I_{1 : t}\right)+E\left(d_{t+1} | I_{t+1}\right)

但是这种全局的加权仍然是不够好的,会将好的点也加小的权重,因此文章提出使用K-net来做进一步的改进:

E(dt+1I1:t+1)=E(dt+1I1:t)+g(ΔEt+1,It+1)E\left(d_{t+1} | I_{1 : t+1}\right)=E\left(d_{t+1} | I_{1 : t}\right)+g\left(\Delta E_{t+1}, I_{t+1}\right)

这里的g就是一个关于二者残差的函数,这种方式可以自适应地融合各个帧得到的DPV,其实这个idea是很直接的,就是对各个帧进行更加adpative的融合嘛,正常思路,不过被它解释得花里胡哨的,还在supp里加上了一小段说明,说这种方式和卡尔曼滤波很像,可以对应起来,其实确实有点像,如下是卡尔曼滤波的更新公式:

ht+1=Wt+1ht+K(Vht+1VWt+1ht)=Wt+1ht+KV(ht+1Wt+1ht)\begin{aligned} h_{t+1} &=W_{t+1} h_{t}+K\left(V h_{t+1}-V W_{t+1} h_{t}\right) \\ &=W_{t+1} h_{t}+K V\left(h_{t+1}-W_{t+1} h_{t}\right) \end{aligned}

其中WtW_t作为卡尔曼滤波中的过度矩阵,对应着t帧DPV到t+1的warp操作,而KV就对应着文章中的K-Net,像是蛮像的,但其实不就是拿二者的残差来预测一个refinement嘛,讲得太玄乎了。。。

进一步refine(R-Net)

前面提到了一个疑惑就是为什么要用低分辨率的,文章没有解释,只是用了一个R网络,借助RGB图像和低分辨率的DPV来一起refine得到高分辨率的DPV,网络结构就是个U-Net,没啥好说的。

Camera pose

关于camera pose,训练的时候使用的是GT的,测试的时候,文章使用了多种方法,有用GT作为upperbound的,也有用一些camera pose估计方法估计的,文章还比较了一下各种camera pose估计方法的差异。

Domain shift

文章提到,由于方法并不单纯是估计深度,而是计算深度的置信度,它的泛化能力会比其他的网络更好,文章也做实验验证了这一点

总结

文章提出的方案很有意思,摆脱了传统深度估计方法使用深度作为最终估计结果的策略,而是估计了每个pixel上深度的置信程度,这个置信度map其实是很有用的,第一,对它的预测能够解决像occlusion、镜面、透明等情况下的低置信度和不鲁棒性问题,第二,这个map可以用于深度或者三维重建的refine的guidance。

总体而言,文章提出的点还是很新颖的,我不知道之前的深度估计里面有没有这么做过,另外这篇文章还做了个多帧融合,这个多帧融合也不是想象中那么直接,虽然被它解释过度了,但是也还可以。

有两个比较concern的点,一个是为什么前面要用低分辨率的,后面再SR上去,这很奇怪,另一个是关于和卡尔曼滤波的关联那一块,我觉得有点玄乎了。。。

文章目录
  1. 1. 主要思路
  2. 2. 框架与方法
    1. 2.1. DPV估计(D-net)
    2. 2.2. 多帧DPV的融合(K-Net)
    3. 2.3. 进一步refine(R-Net)
    4. 2.4. Camera pose
    5. 2.5. Domain shift
  3. 3. 总结
|