Monodepth阅读笔记

前言

这篇文章是第一篇提出无监督单目深度估计方法的论文,此前的有监督的单目深度估计一般是通过CNN拟合出来一个Depth Map。Monodepth是一种无监督的单目深度估计,将单目深度估计问题转化成一个图像重建的问题。

具体来说,就是根据输入的单张图像重建出一张已知基线的另外一个视角的图像,此时的深度只需要根据双目深度估计的公式即可计算出来。

单目深度估计简介(Monocular Depth Estimation)

单目深度估计任务指的是利用单张RGB图像,通过设计的算法,得到表示图像中场景到相机距离的深度图(depth map),在本篇论文以前,大多数基于深度学习的单目深度估计方法都是利用神经网络去直接拟合一个深度图出来,都是有监督的深度估计方法。本篇论文是首次提出无监督单目深度估计方法的论文。

视差(disparity)与深度(depth)

先了解一下disparity和depth的关系,一个简单的双目成像系统如下图所示:

其中\(P\)是空间中的一点,\(b\)表示基线,\(P_{L}、P_{R}\)分别表示点\(P\)在两个成像平面上的成像点,\(O_{L}、O_{R}\)表示左右两个相机的投影中心,\(f\)是焦距,指成像平面与基线之间的距离,设视差为\(d\),则根据disparity的定义(同一物体在两个成像平面上所处位置)有

\[d=|X_{L}-X_{R}| \]

两个成像点之间的距离为:

\[P_{L}P_{R}=b-(X_{L}-\frac{L}{2})-(\frac{L}{2}-X_{R})=b-(X_{L}-X_{R}) \]

根据相似三角形理论,有

\[\frac{Z-f}{Z}=\frac{P_{L}P_{R}}{b}=\frac{b-(X_{L}-X_{R})}{b} \]

化简,可得

\[Z=\frac{bf}{X_{L}-X_{R}}=\frac{bf}{d} \]

其中,\(Z\)就表示的是深度depth,在双目估计任务中,\(b、f\)一般是已知的(根据相机的参数可以得到),所以可以发现深度(depth)和视差(disparity)成反比关系,当求得二者其中之一,另外一个也相当于求出来了。

主要思想

既然视差和深度成反比关系,如果能求得视差,其实也就算是求出了深度,但是要求视差,必须要有两张图像,这又与单目深度估计这一任务的要求相违背。

既然需要两张图,那我就利用输入的单张图像生成另一个视角下的图像不就好了,这个时候就能计算视差,从而求出深度了,这就是MonoDepth的核心思想。

Pipeline

图中一共有三种生成视差图的训练方式,文中使用的的是第三种,首先介绍一下符号,\(I^{l}、I^{r}\)分别表示,来自于数据集的左视图和右视图,\(d^{l}、d^{r}\)在文中的说法是(dense correspondence field),其实就是学出来的视差信息,而且将它作用于图像上时,就可以重建出一张另一视角的图片,这对应上图中的Sampler这一步。重建图像使用的是来自于空间变换网络(STN)[1]的图像采样器,使用视差图对输入图像进行采样。STN使用双线性采样,其中输出像素是四个输入像素的加权和。现在依次来看三种训练方式:

  • 第一种:首先输入左视图\(I^{l}\),经过CNN输出一个\(d^{r}\),然后通过\(\widetilde{I^{r}}=d^{r}(I^{l})\)利用输入的左视图重建出右视图\(\widetilde{I^{r}}\),然后设计损失让重建出来的\(\widetilde{I^{r}}\)和真实的右视图\(I^{r}\)尽量接近。
  • 第二种:首先输入左视图\(I^{l}\),经过CNN输出一个\(d^{l}\),然后通过\(\widetilde{I^{l}}=d^{l}(I^{r})\)利用输入的右视图重建出左视图\(\widetilde{I^{l}}\),然后设计损失函数让重建出来的\(\widetilde{I^{l}}\)要和真实的\(I^{l}\)尽可能接近。
  • 第三种:首先输入左视图\(I^{l}\),经过CNN输出两个视差图\(d^{l}、d^{r}\),然后利用\(\widetilde{I^{r}}=d^{r}(I^{l})\)\(\widetilde{I^{l}}=d^{l}(I^{r})\)分别重建出两个视角上的图像\(\widetilde{I^{l}}\)\(\widetilde{I^{r}}\),然后设计损失函数让\(\widetilde{I^{l}}\)\(I^{l}\)\(\widetilde{I^{r}}\)\(I^{r}\)都尽量接近。

注:在训练时需要重建图像,在测试的时候,直接输入左视图即可

损失函数

文中使用的损失函数如下:

\[C=\sum_{s=1}^{4}C_{s} \]

其中\(s\)表示尺度,网络输出了四个尺度上的结果,计算它们各自的损失,然后加起来作为最后的损失。

\[C_{s}=\alpha_{ap}(C_{ap}^{l}+C_{ap}^{r})+\alpha_{ds}(C_{ds}^{l}+C_{ds}^{r})+\alpha_{lr}(C_{lr}^{l}+C_{lr}^{r}) \]

主要有三项组成,其中\(\alpha_{ap}、\alpha_{ds}、\alpha_{lr}\)是权重参数,\(C^{l}\)表示在左视图上计算损失,其他的同理。

外观匹配损失(Appearance Matching Loss)

该损失的计算公式如下:

\[C_{ap}^{l}=\frac{1}{N}\sum_{i,j}\alpha \frac{1-SSIM(I_{ij}^{l},\widetilde{I_{ij}^{l}})}{2}+(1-\alpha)||I_{ij}^{l}-\widetilde{I_{ij}^{l}}|| \]

这是计算左视图损失的公式,右视图同理。其中\(\alpha\)是权重参数,\(SSIM\)(Structural Similarity),叫结构相似性,是一种衡量两幅图像相似度的指标,越大表示图像越相似。\(I_{i,j}\)表示图像上的一个像素点。该损失主要是使重建的图和原图尽可能相似。

视差平滑损失(Disparity Smoothness Loss)

计算公式如下:

\[C_{ds}^{l}=\frac{1}{N}\sum_{i,j}|\partial_{x}d_{i,j}^{l}|e^{-||\partial_{x}I_{i,j}^{l}||}+|\partial_{y}d_{i,j}^{l}|e^{-||\partial_{y}I_{i,j}^{l}||} \]

其中\(\partial_{x}、\partial_{y}\)表示视差图在\(x,y\)区域的梯度,该项损失是想让输出的视差图尽可能平滑,视差图不平滑的地方一般都在边缘,对应的是梯度比较大的地方,利用梯度信息来约束平滑性是比较合理的。

左右视差一致性损失(Left-Right Disparity Consistency Loss)

计算公式如下:

\[C_{lr}^{l}=\frac{1}{N}\sum_{i,j}|d_{i,j}^{l}-d_{ij+d_{i,j}^{l}}^{r}| \]

文中说由于训练时是输入两张图,测试的时候只输入左视图,为了保证左右视差的一致性所以加了这么一个损失,式中后一项是指右视差图投影到左视差图得到的结果,损失函数想让右视差图经过投影到左视差图的结果和左视差图尽可能差异要小。

Reference

[1] M. Jaderberg, K. Simonyan, A. Zisserman, and K. Kavukcuoglu. Spatial transformer networks. In NIPS, 2015. 3, 4

posted @ 2022-09-16 22:11  Ranchongzhi  阅读(645)  评论(0)    收藏  举报