文献:
《Unsupervised Monocular Depth Estimation with Left-Right Consistency》
http://openaccess.thecvf.com/content_cvpr_2017/papers/Godard_Unsupervised_Monocular_Depth_CVPR_2017_paper.pdf
基于深度学习的深度估计
- 基于监督学习的单目深度估计方法,真实深度图监督+直接拟合。用深度神经网络强行拟合数据集的监督信号。这样做的问题在于,获取实际场景中的深度信息极为困难,因为获取数据集很困难,所以数据集规模往往会比较小,导致泛化性能比较差。
- 无监督学习的方法。
不使用真实的深度图作为监督信号。
整体思路:假设有一个双目相机,将真实的左视图作为网络的输入,经过一个卷积神经网络之后的输出是两张分别对应双目左视图和右视图的视差图。此时,将真实的右视图拿出来,预测得到的基于左视图为基底的视差图与这个真实的右视图一起进行处理,就可以得到重建后的左视图。相似的,也可以得到重建后的右视图。拿重建后的左右视图和真实的左右视图做对比,可以得到loss函数,从而通过反向传播训练网络。相当于变向的拿真实的左右图来代替真实的深度图作为groudtruth,避开了深度图作为label的问题。这就将深度预测的问题看成了回归问题。
示意图:
训练的时候是通过双目图像,但做前向预测的时候,是输入单张图,网络就可以预测视差d,由相机基线b和焦距f,可以算出深度Depth = b * f / d。得到的深度信息具有绝对尺度。
网络结构:
网络说明:将图像经过Resnet50或者VGG。这里以Retnet50为例说明,Encoder过程会先将图像尺寸降到原来的1/64用来提取特征,之后Decoder的过程中,通过插值和反卷积的方法得到了尺寸为原图,原图的1/2,原图的1/4和原图1/8的特征图。然后将这四个尺寸的特征图与原编码器中得到的相同的尺寸的特征图进行concat(如果生成了视差图也要把视差图加入concat过程),最后分别再经过一层卷积层,生成四个尺寸的视差图。生成四个尺寸的视差图后,又将原始左右图也变成了同样的金字塔图。
损失函数:网络中的损失函数由三个函数构成
- .Appearance Matching Loss
这个损失函数是用于比较真实左右图与重建的左右图,目的是让真实的左右图和重建的左右图尽可能的像。
其中SSIM部分是找两张图片的相似程度,后面部分直接比较两张图片的像素差,进一步使得预测的图像和真实的图像尽可能地相像。
关于SSIM:SSIM是一种衡量两张图像相似度的指标。
输入就是两张图像,通过对两张图像的亮度比较,对比度比较,结构比较来衡量两张图像的相似性,SSIM是一个0-1之间的数,数字越大表明两张图像的差距越小,当两张图一样时SSIM = 1.
亮度:
对比度:
结构相似性:
C1 = (K1 * L)的平方,C2 = (K2 * L)的平方,C3 = C2 / 2均为常数,避免除0。K1 = 0.01,K2 = 0.03为默认值,L为像素值的范围,一般是255。工程上取α=β=γ=1,得:
出处:https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=1284395
2) .Disparity Smoothness Loss
目的是为了得到的视差图更加平滑
为了鼓励视差在局部平滑,对视差的梯度进行了L1惩罚。因为图像深度不连续性经常发生在图像的梯度上,所以使用图像梯度来加权。
这里是对四个尺寸的视差图都做了梯度惩罚。
3) .Left-Right Disparity Consistency Loss
目的是使左右视差图尽可能的相似,因为在训练中,我们其实只使用了左视图来作为网络的输入,但输出却要让网络输出左右视图差。故加入这个loss来保证两个视差图尽可能的相似。同时也进行了L1惩罚。这里同样也是对四个尺寸的视差图做了一致性损失函数。
数据集:
针对室外环境的:1)KITTI dataset 2)Cityscapes dataset
针对室内环境的:
1)Fetch Indoor Navigation dataset
2)NYU dataset
深度估计的度量标准:
1.绝对相对误差:
2.平方相对误差:
3. 均方根误差:
4. 对数均方根误差:
5. 精确度(%):
关于源代码的训练,前向,转深度图的问题:
1.转深度图的问题。
网络的输出实际上是视差图disparities,无论是代码中disp,还是disp_pp均不是直接的深度图,只是视差图。
首先,需要将网络输出的视差图disp_pp * image_width,因为作者将model生成的视差图用图像宽度做了normalize, 所以转成深度图前必须要乘以图像宽度:
kitti的焦距f:
相机内参K:
3x3矩阵
[ fx, 0, cx, 0, fy, cy, 0, 0, 1]