点击上方“3D视觉工坊”,选择“星标”

干货第一时间送达

一、摘要

无监督单目深度估计算法已经被证明能够在驾驶场景(如KITTI数据集)中得到精确的结果,然而最近 [5] (ICCV 2019) 指出这类算法在更复杂的场景(如室内NYUv2数据集)中难以训练。比如,GeoNet [8] (CVPR 2018) 甚至无法得出合理的结果。即使 [5] 和最新的 [6] (CVPR 2020) 针对这一问题提出了更鲁棒的训练框架,结果精度也非常有限。本文从理论和统计结果上分析了这一问题。得出结论:1、在无监督单目深度估计训练过程中,相机运动中的旋转部分是噪音而平移部分是信号。2、在NYUv2等手持相机拍摄的视频中旋转是相机运动的主要成份,而在KITTI等驾驶视频中平移是主要成份。这个结论解释了为什么无监督算法在驾驶场景表现良好而在室内场景难以训练这一现象。根据结论,本文提出了一种数据预处理的方法来解决问题。结果证明在处理后的数据上进行训练,算法性能得到大幅提升。文章以现有的无监督算法SC-SfMLearner [4] (NeurIPS 2019) 作为训练框架,得出远超SOTA [6] (CVPR 2020) 的深度估计结果。比如,在AbsRel error 上 0.147 vs. 0.189,在Acc (delta<1.25) 上 0.804 vs. 0.701。可视化对比结果如图3。

论文:Unsupervised Depth Learning in Challenging Indoor Video: Weak Rectification to RescueJia-Wang Bian, Huangying Zhan, Naiyan Wang, Tat-Jun Chin, Chunhua Shen, Ian Reid, arXiv:2006.02708, 2020.

论文地址:https://arxiv.org/abs/2006.02708
代码地址:https://github.com/JiawangBian/Unsupervised-Indoor-Depth
中文主页:https://jwbian.net/unsupervised-indoor-depth-cn

二、算法回顾

1.最早是 [1] (ECCV 2016) 提出利用颜色不变性在已知相机内外参数的双目图像上训练单目深度估计网络。原理是通过网络估计出左图的深度,然后根据深度与相机参数来建立左右图的像素映射关系,接下来使用右图和映射关系来生成虚拟的左图,最后将生成的图像与真实的图像比较(即photometric loss)来训练网络。训练框架如下:

2.根据 [1],SfMLearner [2] (CVPR 2017) 提出在已知相机内参的单目视频上训练单目深度估计网络。原理是在视频前后帧上除了训练depth CNN外,再额外引入一个Pose CNN来估计相机外参(也就是相机运动),然后在训练过程中使用photometric loss来同时监督这两个网络。框架如下:

3.基于[2], SC-SfMLearner [4] 提出geometry consistency loss来约束在视频前后帧上所估计出深度的一致性,然后利用这个几何一致性来检测运动物体和遮挡区域。在计算photometric loss时移除这些病态区域,可以提升算法性能。而且用这种训练方式得到的深度估计结果具有在长视频上的尺度一致性,可以用来做SLAM / VO等任务。框架如下:

4.评论:这一类无监督算法都是利用图像深度与相机内外参数共同计算3D投影,从而生成新图像并计算photometric loss来训练网络。正是由于图像深度与投影的密切关系,使得梯度可以从图像生成误差,到投影误差,再到深度估计误差来训练网络。因此,我们接下来从投影、相机参数、与图像深度相互关系的角度来分析问题。

三、问题分析

无监督算法在KITTI上运行良好,然而在NYUv2难以训练。对比这两个数据集,除了图像纹理光线问题之外,前者相机运动简单(相机固定在车上,主要是向前开车),而后者运动轨迹复杂(手持相机,任意运动)。由于基于视频训练的无监督算法依赖对相机运动轨迹的估计(如第二部分所述),本文认为是复杂的相机运动给训练造成了障碍。因此,文章接下来首先从理论上分析相机运动对深度估计的影响,然后再统计在不同数据集上的相机运动的情况。

  1. 相机运动对深度估计的影响

在无监督深度估计框架中,图像深度与相机运动共同作用于3D投影,从而生成新图像并计算photometric loss来训练网络。接下来我们分别分析完整的3D投影、纯旋转投影、和纯平移投影。我们发现在完整投影和纯平移投影中,图像深度与相机运动密切相关,它们共同影响了投影结果。而在纯旋转投影过程中,图像深度与投影不相关。从控制变量法的角度,这个现象就证明了:旋转是噪音,平移是信号。具体分析如下:

(a) 完整投影:如果一个点(u1, v1)从一张图像投影到另一张图像的(u2, v2),那么它将满足:

这里,K是一个3×3的相机参数矩阵,R是3×3的旋转旋转,t是3×1的平移向量,d1, d2分别代表这个点在两张图像上的深度。也就是说当我们知道(u1,v2, d1), K, R, t,就可以计算出(u2, v2, d2)。这说明了在完整投影过程中,图像深度与相机运动共同影响了投影结果。

(b)纯旋转投影:当相机运动只包含旋转而没有平移的时候,那公式(2)就变成了:

其实这里[KRK^-1]就是homography matrix (H)。重写公式(3)就得到:

这里的c=d1/d2是可以从等式最后一行解出来的,也即 c = 1/(h31u1 + h32v1 + h33)。然后可以得到:

也就是说,我们可以从(u1,v1),K, R 来直接计算出 (u2, v2)。这个过程与d1无关。而无监督算法正是通过这种投影关系来约束和训练深度估计网络的,所以这种纯旋转的图像不能提供有效的梯度。而且尤其是当旋转估计不准确时,会造成错误的梯度影响训练。因此,本文认为相机运动中的旋转部分是噪音。

(c)纯平移投影:当相机运动只包含平移而没有旋转时,公式(2)就变成了:

解方程,可以得到:

也就是说,在从(u1,v2) 到 (u2,v2) 的投影中,d1是与t相关联的。必须知道d1,才能完成投影。正是这种关系使得深度与投影有了联系,从而可以利用这种联系来训练深度估计网络。所以得到结论,平移是信号。

  1. 在不同数据集上相机运动的分布

(a)对比视频前后帧相机运动的绝对大小(图2a),我们发现在NYUv2上相机的平均旋转 (R=2.28度) 远大于在KITTI上 (R=0.25度)。而在NYUv2上平均平移(T=0.05米) 远小于在KITTI上 (T=0.99米)。根据之间的结论:旋转是噪音,平移是信号。这就说明了为什么无监督算法在KITTI上运行良好,而在NYUv2上难以训练。另外,旋转和平移分别在图像平面上造成的warping flow的大小 (图2a) 也证明了相同的结论。

(b)由于投影是训练过程中的关键,我们希望投影误差 (warping error) 能够对深度误差 (depth error) 比较敏感。因此我们根据GT手动生成一些错误的depths然后分析这些错误的depths所造成的warping errors。图2b的结果反应了在NYUv2 上当AbsRel=1.0 (错了1倍,严重错误) 时, warping error ~= 3px。而在KITTI上,warping error ~= 15px。这就导致了在NYUv2上投影误差很难有效区分精确与不精确的深度估计。这是由于在NYUv2上的相机平移过小,从而深度变化只能引起较小的投影位置变化。

(c)图2中Rectified NYUv2是经过我们处理后的数据集。以上问题都得到了有效解决。接下来的章节介绍我们的数据处理方法。

四、解决方案

由上述分析可知,理想数据的特征是“无旋转+适量的平移”。因为平移太大了会导致图像差异过大,平移太小了会出现图2b所示的问题(warping error 对 depth error不敏感)。然而在NYUv2这种手持相机拍摄的视频中,相机运动主要成份是旋转。为了解决这个问题,我们提出:1、首先选择平移在合理范围内的图像对;2、通过旋转图像到同一平面来消除相对旋转。具体如下:

1.选择平移在合理范围内的图像对:首先因为NYUv2的帧率很高(30fps),我们首先下采样视频(每10帧抽一张)。接下来对每张图像我们都将其与后面的10张图像进行特征匹配来计算相对旋转和平移,这里使用的SIFT+GMS [7] + RANSAC + 5-point 算法。然后,我们可以根据得到的匹配和相机参数来计算平均的translation flow(和图2b一样,只是我们不需要GT来算,而是在得到的匹配上计算)。以KITTI上显示的结果为经验,我们保留满足“10px < translation flow <50px” 的图像对。

2.在得到的图像对上,我们已经计算出了图像之间的相对旋转R,也就是说我们只要将其旋转到同一个平面就可以得到无相对旋转的图像对。这一点和stereo rectification特别像。但区别是我们只旋转图像而不要求两张图像行对齐。这是因为双目rectification是用在左右两个相机采集的照片上,而我们的算法作用在视频上(注意:对前-后运动的图像进行行对齐会得到特别奇怪的结果)。所以这个方法命名为 weak rectification。综上,就得到了符合“小旋转+适量平移”的图像对(见图2b)。我们发现仍有残存的旋转,这是由于不够精确的匹配造成的。为了解决这一问题,在训练Pose CNN时,仍然使其输了6-D参数(3-D for rotation, 3-D for translation)。这里的旋转估计用来弥补数据预处理中的不足。在NYUv2上,原始的training sequences总共包括268K图像。我们在下采样10倍后的26.8K图像上进行上述的图像处理,总共得到67K图像对用于训练。

五、实验结果

1.本文用SC-SfMLearner [4] 作为训练框架,其中Depth CNN和Pose CNN都使用ResNet18 作为encoder。在NYUv2上的结果如下, 其中 [36] 和[38] 分别是本文提到的 [5] [6]。

2.Ablation study 结果如下。可以看到 monodepth2 [3] 在处理后的数据上也能取得不错的结果,虽然SC-SfMLearner [4] 更好一点:

3.SC-SfMLearner在NYUv2上的训练曲线如下图所示,基中 “pt”指 ImageNet上的预训练。

4.效率分析:在单张 V100 GPU上训练网络50 epochs总共耗时25小时(其实上图红线在5个epochs时已经收敛了)。在单张RTX 2080 GPU上进行inference,可以达到约210fps。

5.为了证明算法的通用性,也在7Scenes数据集上做了通用性测试和finetune (对7scenes数据集也进行了本文的预处理)。结果如下:

6.深度估计可视化对比结果如下 ([38]是本文中的[6]):

7.3D点云可视化结果如下:

六、 参考文献
[1] Garg et al., Unsupervised cnn for single view depth estimation: Geometry to the rescue. ECCV 2016
[2] Zhou et al., Unsupervised learning of depth and ego-motion from video. CVPR 2017
[3] Godard et al., Digging into self-supervised monocular depth prediction. ICCV 2019
[4] Bian et al., Unsupervised scale-consistent depth and ego-motion learning from monocular video. NeurIPS 2019
[5] Zhou et al., Moving indoor: Unsupervised video depth learning in challenging environments. ICCV 2019
[6] Zhao et al., Towards better generalization: Joint depth-pose learning without posenet. CVPR 2020.
[7] Bian et al., GMS: Grid-based motion statistics for fast, ultra-robust feature correspondence. IJCV 2020
[8] Yin et al., GeoNet: Unsupervised learning of dense depth, optical flow and camera pose. CVPR 2018.

本文仅做学术分享,如有侵权,请联系删文。

推荐阅读:

  • 专辑|相机标定

  • 专辑|3D点云

  • 专辑|SLAM

  • 专辑|深度学习与自动驾驶

  • 专辑|结构光

  • 专辑|事件相机

  • 专辑|OpenCV学习

  • 专辑|学习资源汇总

  • 专辑|招聘与项目对接

  • 专辑|读书笔记

重磅!3DCVer-学术论文写作投稿 交流群已成立

扫码添加小助手微信,可申请加入3D视觉工坊-学术论文写作与投稿 微信交流群,旨在交流顶会、顶刊、SCI、EI等写作与投稿事宜。

同时也可申请加入我们的细分方向交流群,目前主要有3D视觉CV&深度学习SLAM三维重建点云后处理自动驾驶、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、学术交流、求职交流等微信群,请扫描下面微信号加群,备注:”研究方向+学校/公司+昵称“,例如:”3D视觉 + 上海交大 + 静静“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进去相关微信群。原创投稿也请联系。

▲长按加微信群或投稿

▲长按关注公众号

3D视觉从入门到精通知识星球:针对3D视觉领域的知识点汇总、入门进阶学习路线、最新paper分享、疑问解答四个方面进行深耕,更有各类大厂的算法工程人员进行技术指导。与此同时,星球将联合知名企业发布3D视觉相关算法开发岗位以及项目对接信息,打造成集技术与就业为一体的铁杆粉丝聚集区,近1000+星球成员为创造更好的AI世界共同进步,知识星球入口:

学习3D视觉核心技术,扫描查看介绍,3天内无条件退款

圈里有高质量教程资料、可答疑解惑、助你高效解决问题

最新开源无监督单目深度估计方法,解决复杂室内场景难训练问题,效果性能远超SOTA...相关推荐

  1. 最强无监督单目深度估计Baseline--MonoViT--简介与代码复现

    1. 无监督单目深度估计 单目深度估计是指,借助于深度神经网络,从单张输入视图中推理场景的稠密深度信息:该技术可以广泛用于自动驾驶.虚拟现实.增强现实等依赖于三维场景感知理解的领域,同时也可以为其他视 ...

  2. ECCV2022 | 基于整合IMU运动动力学的无监督单目深度估计

    点击下方卡片,关注"自动驾驶之心"公众号 ADAS巨卷干货,即可获取 点击进入→自动驾驶之心技术交流群 0. 引言 虽然近年来无监督单目深度学习取得了很大的进展,但仍然存在一些基本 ...

  3. 无监督单目深度估计 Unsupervised Monocular Depth Estimation with Left-Right Consistency 论文方法分析

    最近在做深度估计相关的毕业设计,一般的基于深度学习单目深度估计算法都是基于监督学习的方法,也就是说我希望输入一张拍摄到的单目照片,将它通过卷积神经网络后生成一张深度图.在这个过程中我们就要求需要有大量 ...

  4. 重磅!单目深度估计方法:算法梳理与代码实现

    应用背景介绍 在自动驾驶中,如何获取车辆行人等目标的深度信息,是当前很多研究中较为重要的技术点,如3D重建,障碍物检测,SLAM等等.传统上,获取高精度目标深度信息的方法,通常是利用激光雷达或结构光在 ...

  5. 单目深度估计方法:现状与前瞻

    今天为大家推荐的是<中国图象图形学报>2019年第12期论文<单目深度估计技术进展综述>,该文由中国图象图形学学会成像探测与感知专委会组织,北京理工大学刘越教授等学者撰写,对国 ...

  6. 夜间奇异规范:夜间高效自监督单目深度估计(ICCV 2021)

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨泡泡机器人 来源丨 泡泡机器人SLAM 标题: Regularizing Nighttime W ...

  7. 粒度语义感知表示增强的自监督单目深度估计 Fine-grained Semantics-aware Representation Enhancement

    Fine-grained Semantics-aware Representation Enhancement for Self-supervised Monocular Depth Estimati ...

  8. 深入研究自监督单目深度估计:Monodepth2

    单目深度估计模型Monodepth2对应的论文为Digging Into Self-Supervised Monocular Depth Estimation,由伦敦大学学院提出,这篇论文的研究目标是 ...

  9. 单目深度估计方法综述

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 一 相关概念介绍 1. 深度估计 深度估计,就是获取图像中场景里的每个点到相机的距离信息,这种距离信息 ...

最新文章

  1. springboot 集成jwt设置过期时间_传说中的jwt,我们来征服一下
  2. Linux环境中配置环境变量无效
  3. 神州信息预计2020年全年净利润4.35亿至6亿元
  4. 关于IIS的IUSER和IWAM帐户
  5. zabbix利用sendEmail邮件报警
  6. 关于删库 恢复 (慎重使用,未亲测)
  7. iOS.Debug.Simulator
  8. jrebel离线激活_jrebel激活
  9. 荧光仪电源维修Spellman电源维修FF60P4X3313
  10. html5制作涂鸦板,HTML5实现涂鸦板
  11. JS脚本defer的作用 (转自一路前行)
  12. python分割图片数字_python实现图片中文字分割效果
  13. python3 全局热键_python3注册全局热键的实现
  14. 基于单片机的四层电梯仿真设计(#0012)
  15. 2022 IDEA大会引领科技创新趋势 沈向洋团队重磅发布低空经济白皮书
  16. java $ 怎样用_jsp中$是什么意思?怎么用?
  17. clion之Clion License Activation破解
  18. BUG InvalidArgumentError (see above for traceback): You must feed a value for placeholder tensor 'Pl
  19. dedecms获取顶级栏目名称、二级栏目名称实现方法
  20. xshell修改终端字符编码

热门文章

  1. 关于 x-requested-with 请求头 区分ajax请求还是普通请求
  2. ASP.NET Core中的依赖注入(2):依赖注入(DI)
  3. 经典文章之java 操纵Excel[转]
  4. 虚函数表指针,虚函数表
  5. 《世界上最伟大的50种思维方法》总结
  6. 秒懂上线必不可少的安全测试!
  7. 阿里二面:为什么要分库分表?
  8. 硬不硬你说了算!近 40 张图解被问千百遍的 TCP 三次握手和四次挥手面试题
  9. 百度某员工哀叹:身边的混子太多,坚持了一年,简直浪费生命!
  10. 如何使用Leangoo自动生成燃尽图