草庐IT

单目深度估计--深度学习篇

江南綿雨 2023-12-08 原文

文章目录

一:深度估计应用背景

1.深度估计的定义

假设我们有一张2d图片 I I I,我们需要一个函数 F F F 来求取其相对应的深度 d d d.这个过程可以写为:

d = F ( I ) d = F(I) d=F(I)

这里的深度信息 d d d其实就代表着由3D物体投射而来的2D图像中每个像素点与相机的实际距离

但是众所周知, F F F是非常复杂的函数,因为从单张图片中获取具体的深度相当于从二维图像推测出三维空间,即使人眼在两只眼睛来定位自然世界的物体的情况下也依然会有问题存在,更何况使用单张照片了。所以传统的深度估计在单目深度估计上效果并不好,人们更着重于研究立体视觉 (Stereo Vision),即从多张图片中得到深度信息.因为两张图片就可以根据视角的变化得到图片之间disparity的变化,从而达到求取深度的目的。话说多了,先往后看。

2.深度估计的应用场景



除了上面两张图片中提到的应用场景,深度估计还可以运用于3D重建,障碍物检测,SLAM等一系列需要深度信息的下游任务中。因此,可见深度估计往往作为上游任务存在,重要性不言而喻。

3.几种深度估计的方法

  • 利用激光雷达或结构光在物体表面的反射获取深度点云
    这种方法可谓是“土豪法”,直接利用传感器扫一扫,便可获得高精度点云深度信息,但是价格昂贵!

  • 传统的双目测距
    双目立体视觉,由两个摄像头组成,像人的眼睛能看到三维的物体,获取物体长度、宽度信息,和深度的信息。摄像头的位置是一般手动标定(比如张正友相机标定算法),然后通过目标点在图像坐标系和世界坐标系中的位置来推导相机内外参数矩阵的过程,往往是一个坐标转换的过程。

  • 传统的单目测距
    单目视觉是能获取二维的物体信息,即长度、宽度,所以如果想要测距,需要拍摄出几张不同角度(时序)的图像,再通过Mobileye单目测距等一系列方法,进行求解。同时,计算量复杂,而且精度不如双目高,往往是在条件艰难的时候使用。

4.使用深度学习估计的优缺点

前面铺垫完了几种传统领域的几种常见方法,现在开始聊聊今天的主角–深度学习单目估计。顾名思义,深度学习深度学习,第一反应End2End,把图像往训练好的网络里一扔,不需要任何人工参与,直接得出最后的深度图,一个词,方便!同时,我们只需要单目相机,一个词,成本低

那有什么缺点呢,首先是80m以内的深度估计精度还行,但是再远误差就很大了,可见精度低、估计距离局限性,都是它的缺点。当然,还有一个深度学习一直绕不走的问题,需要大量训练集,在一些缺少训练数据的环境里显然是不容忽视的问题。

但是毕竟和时代前沿技术搭边了,咱们就来好好唠一唠,下面进入正题。

二:单目深度估计模型

1.使用的数据集

这里讲解的深度估计模型,使用的是KITTI数据集,取景于城市、乡村的道路上,该数据集在多个研究领域内被广泛使用,具体见下图:

2.整体网络架构

深度估计模型是输入一张图像,输出一张包含深度信息的图片,所以是一种生成模型,那么必然离不开编码和解码这个核心过程了,见下图:

当然,真正的网络架构没有这么简单,但都是围绕编码-解码进行的,下面展示CVPR最近发布的一种网络架构,我将逐模块地讲解这个“庞然大物”:

3.分模块解析

Ⅰ:层级

其实就是经过几层池化后,每次缩一半,这里的backbone使用的是Resnet101。和U-net等网络的操作相似,主要是为了后面的操作,如图:

Ⅱ:ASPP

作者在backbone的最后一个特征图做了ASPP,这里什么是ASPP不再赘述了,就是空洞卷积和SPP的结合,之所以用ASPP目的就是加点特征多样性,同时保留一定的分辨率(也是图像分割领域常规操作)。如图所示:

Ⅲ:特征图减法操作

在深度估计研究领域,物体的轮廓深度信息是一个挑战,作者为了有效解决这个问题,进行了神操作,将两张特征图 A − B A-B AB相减(特征图B是上采样后和A一样尺寸的特征图),提取出了差异特征,得到轮廓特征图L。如下图:

Ⅳ:特征融合

进行一顿叠加,首先充分利用高层特征图与本层特征图的融合,得到中间特征图X,来增加特征的多尺度性。接着拼接高层的预测结果R‘’和本层的轮廓图L,大杂烩乱炖后得到本层预测结果R。每层都是这样操作,如图所示:

Ⅴ:Coarse-to-Fine

最后是细节“雕琢”的阶段,对每一层的R进行融合,得到最后的预测结果R‘’‘,如图所示:

Ⅵ:权重参数预处理WS与pre_act操作

在真个网络中还加入了一些细节,首先是加入了权重标准化WS操作,让权重参数分布更均匀一些,不然经过ReLU后大量权重会被杀死(笔者提出疑问,那这样为什么不换一下激励函数,比如Mish,Leaky ReLU,Swish啥的??),接着还加入了pre_act,就是先对x进行ReLU,然后再进入卷积层,比较佛系,对于他们的实验,确实准确度有了质的飞跃,如下图所示:

Ⅶ:损失函数


化简后的损失函数中的 d d d 其实就是每个像素点预测深度和真实深度的差值,重点是后面的 d i d j di dj didj求和是什么意思,前面为什么还加了个负号。举个例子,大家就理解了,找出两个像素点,预测值和真实值的差值分别是 d 1 d1 d1 d 2 d2 d2,如果两个差值都是负数,那么相乘是个正值,前面加个负号,那么代表不被惩罚,相反的如果两者异号则被惩罚。可见损失函数中这一项的目的是,希望得到的预测值要么都是低了一点,要么都高了一点,而不是这里预测大了,那里预测小了,这样效果其实更糟糕,模型更不可靠。


  至此我对利用深度学习进行单目深度估计的原理,进行了简单讲解,希望对大家有所帮助,有不懂的地方或者建议,欢迎大家在下方留言评论。

我是努力在CV泥潭中摸爬滚打的江南咸鱼,我们一起努力,不留遗憾!

有关单目深度估计--深度学习篇的更多相关文章

  1. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  2. CAN协议的学习与理解 - 2

    最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

  3. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

  4. ruby - 我正在学习编程并选择了 Ruby。我应该升级到 Ruby 1.9 吗? - 2

    我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or

  5. ruby - 我如何学习 ruby​​ 的正则表达式? - 2

    如何学习ruby​​的正则表达式?(对于假人) 最佳答案 http://www.rubular.com/在Ruby中使用正则表达式时是一个很棒的工具,因为它可以立即将结果可视化。 关于ruby-我如何学习ruby​​的正则表达式?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1881231/

  6. 深度学习12. CNN经典网络 VGG16 - 2

    深度学习12.CNN经典网络VGG16一、简介1.VGG来源2.VGG分类3.不同模型的参数数量4.3x3卷积核的好处5.关于学习率调度6.批归一化二、VGG16层分析1.层划分2.参数展开过程图解3.参数传递示例4.VGG16各层参数数量三、代码分析1.VGG16模型定义2.训练3.测试一、简介1.VGG来源VGG(VisualGeometryGroup)是一个视觉几何组在2014年提出的深度卷积神经网络架构。VGG在2014年ImageNet图像分类竞赛亚军,定位竞赛冠军;VGG网络采用连续的小卷积核(3x3)和池化层构建深度神经网络,网络深度可以达到16层或19层,其中VGG16和VGG

  7. 机器学习——时间序列ARIMA模型(四):自相关函数ACF和偏自相关函数PACF用于判断ARIMA模型中p、q参数取值 - 2

    文章目录1、自相关函数ACF2、偏自相关函数PACF3、ARIMA(p,d,q)的阶数判断4、代码实现1、引入所需依赖2、数据读取与处理3、一阶差分与绘图4、ACF5、PACF1、自相关函数ACF自相关函数反映了同一序列在不同时序的取值之间的相关性。公式:ACF(k)=ρk=Cov(yt,yt−k)Var(yt)ACF(k)=\rho_{k}=\frac{Cov(y_{t},y_{t-k})}{Var(y_{t})}ACF(k)=ρk​=Var(yt​)Cov(yt​,yt−k​)​其中分子用于求协方差矩阵,分母用于计算样本方差。求出的ACF值为[-1,1]。但对于一个平稳的AR模型,求出其滞

  8. Unity Shader 学习笔记(5)Shader变体、Shader属性定义技巧、自定义材质面板 - 2

    写在之前Shader变体、Shader属性定义技巧、自定义材质面板,这三个知识点任何一个单拿出来都是一套知识体系,不能一概而论,本文章目的在于将学习和实际工作中遇见的问题进行总结,类似于网络笔记之用,方便后续回顾查看,如有以偏概全、不祥不尽之处,还望海涵。1、Shader变体先看一段代码......Properties{ [KeywordEnum(on,off)]USL_USE_COL("IsUseColorMixTex?",int)=0 [Toggle(IS_RED_ON)]_IsRed("IsRed?",int)=0}......//中间省略,后续会有完整代码 #pragmamulti_c

  9. ruby-on-rails - 这个 C 和 PHP 程序员如何学习 Ruby 和 Rails? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我来自C、php和bash背景,很容易学习,因为它们都有相同的C结构,我可以将其与我已经知道的联系起来。然后2年前我学了Python并且学得很好,Python对我来说比Ruby更容易学。然后从去年开始,我一直在尝试学习Ruby,然后是Rails,我承认,直到现在我还是学不会,讽刺的是那些打着简单易学的烙印,但是对于我这样一个老练的程序员来说,我只是无法将它

  10. ruby Hash 包括另一个哈希,深度检查 - 2

    进行这种深度检查的最佳方法是什么:{:a=>1,:b=>{:c=>2,:f=>3,:d=>4}}.include?({:b=>{:c=>2,:f=>3}})#=>true谢谢 最佳答案 我想我从那个例子中明白了你的意思(不知何故)。我们检查子哈希中的每个键是否在超哈希中,然后检查这些键的对应值是否以某种方式匹配:如果值是哈希,则执行另一次深度检查,否则,检查值是否相等:classHashdefdeep_include?(sub_hash)sub_hash.keys.all?do|key|self.has_key?(key)&&ifs

随机推荐