深入研究自监督单目深度估计:Monodepth2_Tom Hardy的博客-程序员信息网

技术标签: 算法  机器学习  计算机视觉  深度学习  人工智能  

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

干货第一时间送达

单目深度估计模型Monodepth2对应的论文为Digging Into Self-Supervised Monocular Depth Estimation,由伦敦大学学院提出,这篇论文的研究目标是从单目RGB图像中恢复出对应的深度,由图1所示:该网络可以从单目图像中恢复对应的深度,图中不同颜色代表不同的深度。

论文地址:在公众号「计算机视觉工坊」,后台回复「Monodepth2」,即可直接下载。

图1 Monodepth深度估计图

目前单目深度估计的难点,同时也是本论文着重解决的方向:

1、图像序列中存在遮挡。

2、当场景中发生物体运动的情况,如场景中运动的车辆,此时图像序列不仅存在因相机位姿而产生的图像改变,还存在因运动物体而产生的图像亮度的改变

从理论上说:在未给定第二帧图像的情况下估计图像对应的绝对或相对深度值是一个病态问题,因为无法通过构建三角化求解对应深度。然而,从直觉上说:人类通过在现实场景中生活、学习,获得了单眼估计深度的能力。因此,类比人类的学习能力,利用深度学习技术,从单目图像中获取对应的深度是可行的。该篇论文联合相机位姿估计与单目深度估计两项任务,使单目深度估计成为了可能。具体来说便是:首先利用单目深度估计网络进行逆深度估计,需要注意的是:该逆深度被限定在0与1之间,也就是说,该网络估计的为相对逆深度。然后进行相机位姿估计。最后利用相机位姿与视差计算亮度投影误差,作为网络模型的损失函数,利用梯度下降进行参数更新。接下来,本文将分三部分对Monodepth2模型进行介绍,分别是Monodepth2中的逆深度估计模块,相机位姿Pose估计模块,以及训练中使用的损失函数。

一、逆深度估计模块

该模块的作用是从单目图像中估计图像每个像素点的逆深度,在求解出逆深度之后,只需要对其取倒数便可获取对应的深度。这里需要说明,估计出来的逆深度被限定在0到1之间,与以真实深度存在一个比例因子,因此只可表示相机与场景的相对距离。该深度估计模块又可分为两个子模块,分别为特征编码子模块与特征解码子模块。特征编码子模块采用Res18模型结构,对输入图像进行32倍下采样,共生成5级特征,级数越高,特征空间分辨率越低(表示能力越强),但特征个数越多(对应通道部分)。特征解码子模块与U-Net解码模块部分一致,从第5级开始,联合特征编码子模块中相同分辨率的特征进行深度估计,该模块输出4级逆深度map(第五级因空间分辨率过低而不求解对应的逆深度),级数越低,空间分辨率越大,最大的空间分辨率与输入图像保持一致。

二、相机位姿Pose估计模块

该模块的作用为:由连续帧之间图像的变化情况,估计出相机之间的位姿(相机的运动情况)。该模块有两种处理情况,以下将对这两种情况分别介绍。

2.1 连续帧情况

首先进行符号的说明,用-1代表进行逆深度估计图像的前一帧图像,1代表进行逆深度估计图像的后一帧图像,0代表进行逆深度估计的当前图像。在该情况下利用相机位姿估计模块分别估计:从前一帧图像-1到当前图像0之间的位姿,与从当前图像0到后一帧图像1之间的位姿。

2.2 双目情况

同样进行符号说明,用0代表进行逆深度估计的当前图像(左目图像),"s"代表当前0图像对应的右目图像。在该情况下,因双目相机的位姿已固定,因此位姿也已固定(不需要利用pose估计模块进行估计)。

2.3 相机位姿模块结构

该模块同样分为特征编码子模块与特征解码子模块,其中该模块中的特征编码子模块与深度估计模块中的特征编码子模块结构一致,但参数独立,同样为Res18模型结构。因相机位姿求取的是图像连续帧之间的刚性运动,因此在该论文中,利用空间分辨率最低的第5级特征(抽象能力最强)输入进对应该模块的特征解码子模块来进行位姿估计。位姿解码子模块为3层卷积结构,对输入的第5级特征进行解码,并回归出对应每个像素点的运动信息。例如,位姿估计网络的输入为(256,6,20),那么经过解码回归之后输出的特征为(12,6,20)。对维度1(对应长),维度2(对应宽)求取均值可得连续帧之间的轴角与平移向量。在求得轴角后可通过罗德里格旋转公式求取旋转矩阵,如下图2所示。

图2 罗德里格旋转公式

三、训练中使用的损失函数

本论文的创新点集中在对损失函数的改进。分别提出了:1.一种适用于单目遮挡情况下的匹配损失函数。2.一种在单目情况下检测相机间有无运动的标记方法。3.一种多尺度的匹配损失函数。以下将对这三种情况分别进行探讨。

3.1 一种适用于单目遮挡情况下的匹配损失函数

绝大多数单目深度(也包括光流与立体匹配)无监督方法都采用亮度投影误差(photometric reprojection error)作为训练的损失函数,亮度投影误差被定义为:利用深度与相机位姿对源图像进行采样,并与目标图像进行比对之后得到的误差,如下图3所示

具体来说便是:利用相机位姿与深度获得采样坐标,利用采样坐标对源图像(-1或1号图像)进行采样,在未发生遮挡的情况下,采样后的图像应与目标图像(0号图像)在同位置的像素点亮度保持一致,这样在训练过程中,学习到使得采样图像与目标图像亮度值趋于一致的深度与相机位姿,计算该深度与相机位姿的模型参数即为最优参数。然而现实场景复杂多变,存在大量遮挡情况,在遮挡情况下,亮度投影误差会失效,因为采样之后的图像像素点发生了遮挡,对亮度投影误差进行简单的求取平均操作无法有效衡量该区域的匹配情况,如图5所示。

图5 遮挡情况示意图

因此,本论文对此种情况做出了改进,用取最小值操作取代取平均操作,如此做法可使亮度投影误差函数忽略遮挡处不正确的亮度值,进而使模型专注非遮挡区域的计算,整个计算过程如下图5所示:

图5 论文中提出的最小化亮度守恒损失函数

3.2 一种在单目情况下检测相机间有无运动的标记方法

单目深度估计需要进行如下假设:场景静止、相机运动。如训练集中存在使此假设不成立的图像序列,会严重影响网络的精度。因此,本文利用一种检测相机间有无运动的标记方法,剔除图像序列中未发生运动的像素点。过程如下图6所示:

图7 图像序列中静止点可视化图

图中黑色像素点为静止点,需要从整个损失函数中剔除。

3.3 一种多尺度的匹配损失函数

此方法过程比较简单,即对逆深度估计模块估计出的4级逆深度map进行上采样到与输入同尺寸,并对上采样之后的4级逆深度map求取损失函数。

四、 总结

本文对单目深度估计模型Monodepth2的主要计算过程进行了介绍,通过以上三个步骤的改进,该模型达到state-of-the-art,因此可作为一般深度估计模型的baseline方法。

备注:作者也是我们「3D视觉从入门到精通」特邀嘉宾:一个超干货的3D视觉学习社区

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

下载1

在「计算机视觉工坊」公众号后台回复:深度学习,即可下载深度学习算法、3D深度学习、深度学习框架、目标检测、GAN等相关内容近30本pdf书籍。

下载2

在「计算机视觉工坊」公众号后台回复:计算机视觉,即可下载计算机视觉相关17本pdf书籍,包含计算机视觉算法、Python视觉实战、Opencv3.0学习等。

下载3

在「计算机视觉工坊」公众号后台回复:SLAM,即可下载独家SLAM相关视频课程,包含视觉SLAM、激光SLAM精品课程。

重磅!计算机视觉工坊-学习交流群已成立

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

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

▲长按加微信群或投稿

▲长按关注公众号

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

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

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

觉得有用,麻烦给个赞和在看~  

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_29462849/article/details/118160817

智能推荐

Java继承泛型父类在运行时获取泛型信息_yzpyzp的博客-程序员信息网

对于泛型类型的属性和方法可以通过Filed和Method在运行时获取泛型信息,但是如何在运行时获取泛型类的泛型信息呢我们知道java的泛型是伪泛型,只是在编译的时候进行类型检查,编译后,所有的泛型信息都会被擦除,因此在运行时无法使用反射获取范型的类型。比如对于泛型类List<String> ,在编译的时候会检测所有加入到list里面的是否是String类型,编译后的class文件中是不会有范型信息的。那么该如何获取泛型类的泛型信息呢,可以通过子类继承泛型类的方法来实现。public cla

程序员面试宝典之字符串常用库函数strcpy memcpy memset_xiaoxiao407的博客-程序员信息网_原 字符串函数---strcpy()与strncpy()详解及实现

<br />void *memset(void *s,int c,size_t n)<br />作用:将已开辟内存空间 s 的首 n 个字节的值设为值 c。<br /><br /><br />strcpy<br />原型:extern char *strcpy(char *dest,char *src);<br />用法:#i nclude<br />功能:把src所指由NULL结束的字符串复制到dest所指的数组中。<br />说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳s

收缩、清空和删除SQL Server数据库文件及日志文件_winner213的博客-程序员信息网

网上搜集了一些关于如何收缩、清空和删除SQL Server 数据库文件及日志文件的方法。这样可以保证在不影响数据库系统正确工作的前提下又节省了服务器的磁盘空间。

oracle sql 注入危害实例演示_菜菜的中年程序猿的博客-程序员信息网

1、通过sql注入获取用户无权限获取的信息1.1 获取无法访问的表名1.2 获取表中的列1.3 获取无法访问表的信息2、sql注入窃取dba权限oracle sql中不使用绑定变量除了会影响性能,还会有安全隐患。接下来进行实例演示。在scott 用户下有一个非常重要的表bonus,储存员工的奖金工资信息。对于sh用户没有权限访问这个表,但是可以访问scott用户的如下存储过程。test_i...

JAVA常用小功能实现方法整理_weixin_30820077的博客-程序员信息网

一、JAVA代码实现1.给查询的list进行分页: 1 List&lt;ReportQueryEntity&gt; allList = reportQueryService.execute(merno, cname, orgcode); 2 int count = allList.size(); 3 /*对查询的列表进行分页:截取每页的集合列表 */ 4 List&lt;R...

SpringBoot14:集成Swagger终极版_小段学长的博客-程序员信息网

学习目标:了解Swagger的概念及作用掌握在项目中集成Swagger自动生成API文档Swagger简介前后端分离前端 -&gt; 前端控制层、视图层后端 -&gt; 后端控制层、服务层、数据访问层前后端通过API进行交互前后端相对独立且松耦合产生的问题前后端集成,前端或者后端无法做到“及时协商,尽早解决”,最终导致问题集中爆发解决方案首先定义schema [ 计划的提纲 ],并实时跟踪最新的API,降低集成风险Swagger号称世界上最流行的API框架Restful Ap.

随便推点

Oracle11g卸载详解_eclipse_xu的博客-程序员信息网_卸载orcle11g不删安装包可以吗

Oracle真的很难卸载。。。。1、 开始->设置->控制面板->管理工具->服务 停止所有Oracle服务。2、 开始->程序->Oracle - OraHome81->Oracle Installation Products-> Universal Installer,单击“卸载产品”-“全部展开”,选中除“OraDb11g_home1”外的全部目录,删除。5、 运行regedit

LINUX下动态链接库的使用(dlopen/dlsym/dlclose/dlerror)_panamera12的博客-程序员信息网

dlopen基本定义  功能:打开一个动态链接库  包含头文件:#include &lt;dlfcn.h&gt;  函数定义:void * dlopen( const char * pathname, int mode );  函数描述:在dlopen的函数以指定模式打开指定的动态连接库文件,并返回一个句柄给调用进程。使用dlclose()来卸载打开的库。  mode:分为这两种  RTLD_LAZY 暂缓决定,等有需要时再解出符号  RTLD_NOW 立即决定,返回前解除所...

Linux下Oracle 11g安装(2)—— 系统准备篇_杰米尼123的博客-程序员信息网

1 安装Linux操作系统2 服务器参数确认2.1 使用root用户登录控制台2.2 内存要求物理内存Oracle 官方说明:最小:1GB建议:2GB以上通过如下命令确认当前系统内存大小:grep MemTotal /proc/meminfoSWAP 空间作用: 在物理内存不足时,将一部分物理存储转化为内存使用,将暂时不使用的内存数据存储到 SWAP 空间中,从而达到扩展内...

Now直播应用的后台服务器性能测试实践_写回的博客-程序员信息网

版权声明:本文由Oliver原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/208来源:腾云阁 https://www.qcloud.com/community 作者介绍:Oliver,腾讯服务器性能测试团队产品经理。 直播的火爆带来了海量的用户,也带来了海量的服务器并发。本文分析了目前直播行业存...

如何创建 SVN 服务器,并搭建自己的 SVN 仓库_帆酱的博客-程序员信息网

本文转自刘奇云的博客  地址:https://www.cnblogs.com/liuqiyun/p/6856997.htmlSVN是一个广泛使用的版本控制系统,在日常工作中有广泛的应用空间,比如文档管理,我们就可以搭建一个 SVN 仓库,日常需要归类保存的文档统统上传到仓库中,那如何创建 SVN 服务器, 又如何搭建 SVN 仓库呢? 这篇经验就给你答案!工具/原料  Visua...

推荐文章

热门文章

相关标签