单目图像深度估计 - 深度篇:David Eigen的两篇研究


目录

  1. 入门篇:图像深度估计相关总结
  2. 应用篇:Learning to be a Depth Camera
  3. 尺度篇:Make3D
  4. 迁移篇:Depth Extraction from Video Using Non-parametric Sampling
  5. 深度篇:David Eigen
  6. 无监督篇:Left-Right Consistency & Ego Motion
  7. 相对深度篇:Depth in the Wild & Size to Depth
  8. SLAM辅助篇:MegaDepth
  9. 方法比较篇:Evaluation of CNN-based Methods

单目图像深度估计 - 深度篇:David Eigen的两篇研究

终于写到了目前比较主流的深度学习方法。随着大规模的数据集的出现以及硬件运算能力的提高,数据驱动的方法开始在计算机视觉、自然语言理解等领域发光发热。David Eigen可以说是第一个把深度学习方法用于单目图像深度估计的人,他提出的多尺度CNN网络到现在仍然在被引用和对比。这篇笔记就写一下Eigen的两篇经典论文:
[1] Depth Map Prediction from a Single Image using a Multi-Scale Deep Network,NIPS 2014. Project Page
[2] Predicting Depth, Surface, Normals and Semantic Labels with a Common Multi-Scale Convolutional Architecture,ICCV 2015 Project Page
从题目可以看出,第一篇Paper侧重于单目图像深度估计的任务中多尺度深度网络的应用,第二篇Paper主要内容为提出一个通用的网络可以解决单目深度估计、语义分割和法向量预测三个Task。从网络结构来看,第二篇提出的网络是在第一篇Paper中提出的网络的基础上进行的微调,同时也对loss进行了小小的调整,但整体改动不大。因此这篇阅读笔记也重点记一下第一篇Paper。

1. Depth Map Prediction from a Single Image using a Multi-Scale Deep Network


从2维推导出3维其实是一个ill-posed的Task,因为在拍摄照片即从三维(现实世界)到二维(照片)的过程中,信息的丢失是不可逆的。然而在计算机视觉相关的任务中,深度信息的增加可以提高相应算法的识别率,比如图像分割、识别等,而这些计算机视觉方法所代表的能力(比如环境感知)往往是机器人等热门AI技术所需要的。因此能否利用大规模的已有数据去训练深度网络使其可以对缺失的三维信息进行估计的研究具有很重要的现实意义。

1.1 网络结构

文章中提出了一个多尺度的混合网络,网络具有两个部分,分别为:

  1. 一个全局粗网络(coarse-scale network):在全局的level对整幅图像的深度进行初步预测,全局信息通过全连接层实现,粗网络得到的结果分辨率较小,因此需要进一步优化。
  2. 一个局部精网络(fine-scale network):在粗网络的预测结果基础上,结合原始输入图片的局部信息对预测结果进行进一步优化。
    网络结构如下图所示:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lnggo34E-1619678923513)(https://raw.githubusercontent.com/QunnieKong/UsefullCodePics/master/HexoPics/depth5_depth_map_model.png)]

第一部分为全局粗网络,深度估计与其他Task的一个区别就是全局性,人类在确定深度的时候就用到了很多全局特征,比如消失点、物体位置、遮挡关系等等(这些在入门篇中有相关介绍),而其他Task比如人脸识别,可能更重要的是找到某一局部的特征。因此在全局的层面上对深度进行预测是比较重要的一个环节。
全局粗网络包括7层,其中前5层为卷积和最大池化层,后两层为全连接层。输入图像的尺寸为304X228(NYU_Depth_v2图像的原始尺寸为640X480,此处先对图像进行了参数为2的下采样,然后裁剪掉了部分边界),输出图像的尺寸为74X55,即原图的四分之一。
除了粗精度网络的最后一层使用线性函数,所有隐藏层都使用Relu(rectified linear units)激活。其中有一些tricks,比如引用了一种自学习upsampling,可自主学习图像边界;粗网络和细网络的训练不同步进行,训练好了粗网络后将参数固定再训练细网络;在Layer6有dropout操作,1到5层使用在ImageNet数据集上预训练得到的参数进行初始化等。

第二部分为细网络,其中fine layer1进行了池化操作形成74X55大小的特征图stack,这个大小正好和粗网络的输出一致,因此在fin layer2可以将粗网络的输出作为一个feature map输入。为保持图像大小不变,后续的两层卷积层都进行的是0填充(zero-padded,用0填充边界使卷积后的结果大小不会改变)卷积。

在网络训练的过程中,用到了数据增加和异常点排除的Tricks。

  • Data Augmentation:这是数据驱动的深度学习方法都需要的一步,由于深度网络的训练过程需要大量的数据,越大越好,因此对已有的数据进行缩放、旋转、随机裁剪、色彩改变、翻转等操作,可有效增加训练数据量,提高网络识别正确率。
  • 在NYU_Depth数据集中,由于硬件的原因,部分数据点的深度数据是缺失的,作者使用mask来标记这些缺失的点,并且采用直接下采样的方法使缩小尺寸后的图像和mask仍然具有对应关系,因此可以在训练过程总过滤掉数据缺失的点。
1.2 Scale-Invariant Error & Training Loss

文章的另一创新点为尺度不变损失函数,公式如下:
eq1
其中:
在这里插入图片描述
对任意尺度的深度预测结果y及对应的真实深度图y*来说,得到的error是一样大的,因此体现其尺度不变性。如果用d表示log空间中预测值和实际值的差异,上述公式可写作:
单目图像深度估计 - 深度篇:David Eigen的两篇研究_第1张图片

由此可得到Training Loss如下,其中参数λ为0到1之间的值,当λ等于0时l2error不对loss进行影响:
在这里插入图片描述
以上就是NIPS 2014这篇Paper的主要内容,在实验部分,作者在NYU和KITTI两个数据集都进行了实验,取得了比较好的结果。但这种方法存在以下缺点:

  1. 输出的预测结果很小,只为原始输入图像的四分之一
  2. 边界仍然不够清晰,且四个角点有明显的错误点
  3. 在室内数据集上训练得到的网络只适用于室内图片的预测
    以上三点也是大部分深度方普遍存在的缺点。

2. Predicting Depth, Surface Normals and Semantic Labels with a Common Multi-Scale Convolutional Architecture


这篇文章的主要创新点在于用一个结构通用(不同任务只需要改动参数)的网络可进行三种不同的Task并且得到令人满意的结果。但我们的关注点在单目图像深度估计这一部分,因此关于法向量估计和图像语义分割的部分就不写在这篇笔记中了。
这篇文章的网络结构在上一篇基础上进行了一些改进,但先粗后细的思想仍然没变,改进后的网络结构如下图:
单目图像深度估计 - 深度篇:David Eigen的两篇研究_第2张图片
由图可见,网络结构由两部分变为了三部分,并且网络的层数有所增加。与文献[1]不同的是:

  1. 增加了Scale3使输出图片的大小扩大至输入图像的二分之一。
  2. 新提出的网络(DNL)中,coarse网络不再将预测结果传输给fine网络,而是将多通道的feature maps传输给fine网络,使得coarse网络和fine网络可以同时训练。
  3. 粗网络提出了两种不同的网络结构(AlexNet和VGG),
    Training Loss也有相应的小改动,改动后的loss如下:

单目图像深度估计 - 深度篇:David Eigen的两篇研究_第3张图片

在尺度不变Loss的基础上增加了图像梯度的部分,这部分可使得在预测值和实际值接近的基础上其趋势也要接近。
在训练的过程中,对coarse和fine网络同时进行训练,然后固定其参数训练scale3的网络。

从实验结果来看,改进后的网络在预测正确率和输出图片质量(大小)上均有所提高,同时VGG的效果好于AlexNet,因此作者提出在深度学习方法中,网络size对预测结果有很重要的影响。

你可能感兴趣的:(单目图像深度估计,计算机视觉,机器学习,算法)