单目深度估计:UnsupervisedMonocular Depth Estimation with Left-Right Consistency论文及代码全解析

    这篇无监督的单目深度方法在github上共收获了1.6k星。本文将主要讲解这篇文章的主要创新点,以及其torch版本的代码讲解。

论文讲解

1.视差

单目深度估计:UnsupervisedMonocular Depth Estimation with Left-Right Consistency论文及代码全解析

图一:左视图(上),右视图(中),左视差图(下)

    视差图中的每一个像素点都保存着左右视图的视差。值得注意的是之所以叫左视差图,是因为视差图是双向的,在这篇文章中就用到了左右两张视差图。视差与深度成反比因此我们知道了视差就可以推出来对应的深度。

2.利用图像重建来获取深度

单目深度估计:UnsupervisedMonocular Depth Estimation with Left-Right Consistency论文及代码全解析

图二:本文的图像重建结构
    给定左视图,右视图,左视差图的情况下,最容易想到的方法是:利用左视差图中每一个像素点的视差值来索引右视图对应的像素值用得到的像素值来填充左视差图即可还原左视图。

单目深度估计:UnsupervisedMonocular Depth Estimation with Left-Right Consistency论文及代码全解析

图三:图像重建的基本思路
    这种最原始的思路就是图二中所对应的naive的结构。(文章中是用右视差图还原的思路是一致的),naive的结构中输入为左视图,经过CNN拟合出右视差图,利用右视差图来索引左图即可还原右图。我们观察网络的输入输出,分别是左视图和右视图,是不一致的。我们知道encoder-decoder的结构一般要求输入和输出尽量相同来减小reconstruction error。因此有了第二种No LR的思路,网络的输入为左视图,经过CNN拟合出左视差图,利用左视差图来索引右视图中对应的像素值来还原左图。这样我们整个网络的输入和输出就都是左视图了。前面我们提到过视差图是分左右两种的,如果说我们通过CNN学习到的左右视差图是一致的(这里的一致不是指左右视差图是一模一样的),则证明我们得到的视差图是很精确的用它来还原得到的reconstruction error也会更小。顺着这样的思路,作者提出了新的框架,即图二中的第三种框架,网络的输入是左视图,通过CNN同时拟合出左右视差图(如何同时学习出左右两种视差图见后面的代码解析),再分别索引右视图和左视图来重构。我们网络的优化目标是使reconstruction error最小,意味着我们得到的视差图最精确,根据视差图与深度图成反比,我们就能获得精确的深度图。视差图作为我们需要的结果,是以网络中间产物的形式产出的。

3.网络的关键结构

单目深度估计:UnsupervisedMonocular Depth Estimation with Left-Right Consistency论文及代码全解析

图四:网络的关键结构
    观察上图,我们看到首先输入一个维度为[H,W,D]的特征图,通过C(CNN)拟合出了左右视差图,以左视差图dl为例,通过S(Bilinear Sampling,双线性插值),还原出了左视图(就是前文反复说明利用左视差图中的视差索引右视图中对应的像素值用来填充左视差图最终还原出左视图),以及用右视差图重新索引得到的新的左视差图(思路同上,如果左右视差图是一致的,这里的新得到的左视差图就应该与之前的完全一样)。将维度为[H,W,D]的图片通过UC(Up-Convolution,反卷积)将分辨率翻倍,将dl,dr通过US(Up-Sampling,上采样),以及前一个过程得到的feature map ,concat在一起。最后通过最后一个C(CNN),输出维度为[2H,2W,D/2]的特征图(分辨率翻倍,通道数减半)。在图4不同颜色的下划线示意了三种不同的loss。注意,这个模块在整个网络中反复出现,在torch版本中,总共有4个这样的模块,即生成了四种尺度下的视差图。

4.各种loss的解析

Ⅰ.Appearance Matching Loss

单目深度估计:UnsupervisedMonocular Depth Estimation with Left-Right Consistency论文及代码全解析

图五:Appearance Matching Loss公式

式中SSIM即结构相似性,SSIM越大证明两张图片越相似。IijlI_{ij}^{l}I~ijl{\tilde{I}}_{ij}^{l}分别代表左视图和重构的左视图。即我们希望重构后的图像与原图越相似越好。

Ⅱ.Disparity Smoothness Loss

单目深度估计:UnsupervisedMonocular Depth Estimation with Left-Right Consistency论文及代码全解析

图六:Disparity Smoothness Loss公式

式中xdijl\partial xd^{_{ij}^{l}}xIijl\partial xI^{_{ij}^{l}}分别代表左视差图与左视图在x轴上的梯度(对于数字图像来说其实就是差分,计算方法见代码解析)。我们希望得到的视差尽量的平缓,因此我们对视差图d的梯度进行了l1正则,但是深度的不连续往往出现在图像的梯度处,因此我们加入了权重项,允许在图像梯度较大时,视差图的梯度也较大。这样就可以获得全局平滑,但是在深度不连续处边界明显的深度图了。

Ⅲ.Left-Right Disparity Consistency Loss

单目深度估计:UnsupervisedMonocular Depth Estimation with Left-Right Consistency论文及代码全解析

图六:Left-Right Disparity Consistency Loss公式

式中dijld_{ij}^{l}dijrd_{ij}^{r}分别代表左右视差图,利用左视差图中的视差在右视差图中索引得到新的左视差图。使用l1正则,使重新索引到的左视差图与原视差图尽量相似,这样就保证了左右视差的一致。(比较绕,结合代码看会好很多)

总结

    受限于篇幅,就先不放代码的讲解了。代码方面具体参考的是pytorch-monodepth,如果大家有需要的话,最近抽空把代码解析赶出来。文章中没有表达清楚的,或者有错误的地方也欢迎大家给我指正