R-MVSNet提出了一种基于递归方式的多视角重建方法,通过递归方式的代价空间正则化(cost volum regularization)来代替原本的3D代价空间,不但减少了内存消耗还提升了模型的精度和效率,使得高分辨率的深度图/立体重建成为可能。

GRU减小内存消耗、规模化能力与较强泛化性,重建先前不能重建的大场景、得到较高的重建精度。
本文作为MVSNet的改进,一作同样来自于港中文权龙老师课题组的Yaoyao, code

1.多视角立体视觉

多视角立体视觉(multi-view stereo)利用多张图像及对应的相机参数恢复场景的稠密三维表达。绝大多数基于学习的方法都基于代价空间正则化(cost volume regularization)来进行训练和预测。但基于三维卷积的方式对于计算资源的消耗巨大,此外基于八叉树的OctNet和O-Net、基于分治策略的DeepMVS以及SurfaceNet也都面领着精度或速度的问题。针对代价空间的正则化,目前主要有以下几种不同的策略:

最右边是最常用的三维卷积方法,虽然其计算的范围非常大但却需要消耗大量的内存和算力。为了解决这一问题,研究人员提出了三种序列处理的方法在深度方向上对代价空间进行处理。
上图最左边的是一种赢者通吃的策略,利用对应深度的平面上最好的点代替这一个深度,这种方法虽然简单但会受到噪声较大的影响;
第二种策略是在每个深度上进行处理,可以获取这一深度上的空间信息,但对于不同深度上的信息则缺乏感知;
第三种就是本文中所采用的方法,利用基于GRU的循环正则化机制来处理代价空间,通过在深度方向上的循环处理是的它可以同时收集每个深度上的空间信息和不同深度上的上下文信息。

为了序列地处理代价空间给,研究人员利用GRU进行循环的正则化操作。GRU是一种循环神经网络结构,其中包含了用于保留先前状态值的重置门r和用于更新当前值的更新门z。研究人员将代价空间C进行改造使其能应用GRU来进行处理。

代价空间可以视为不同深度上的损失图在深度方向上叠加而成。这一工作中最为重要的观点在于将不同深度的代价图视为类似时间序列以便使用循环神经网络进行处理,某一深度正则化后的输出值不同与当前状态相关还与先前的深度有关,这一就与图一中的正则化方式对应了起来。某个深度下正则化的输入Cr可以表示为下面的公式,其中t=1,...,n{t=1,...,n}t=1,...,n:
Cr(t)=(1−U(t))⊙Cr(t−1)+U(t)⊙Cu(t)C_r(t)=(1−U(t))⊙C_r(t−1)+U(t)⊙C_u(t)Cr​(t)=(1−U(t))⊙Cr​(t−1)+U(t)⊙Cu​(t)
其中U代表了当前状态下的更新图,其决定着当前输入Cu中哪些值会被保留,而上一个状态中哪些值会被抛弃;而Cu则来源于当前输入和上一步输入间的相互作用,其中R表示将上一输出中的哪些值重置并与当前输入C相衔接作为当前的新输入Cu:
Cu(t)=σc(Wc∗[C(t),R(t)⊙Cr(t−1)]+bc)C_u(t)=σ_c(W_c ∗[C(t),R(t)⊙C_r(t−1)]+b_c)Cu​(t)=σc​(Wc​∗[C(t),R(t)⊙Cr​(t−1)]+bc​)
那么决定着这些重置和更新状态的重置门map和更新门map如何计算呢?它们依旧与当前输入C(t)和上一个正则化输入Cr(t-1)相关:
R(t)=σg(Wr∗[C(t),Cr(t−1)]+br)U(t)=σg(Wu∗[C(t),Cr(t−1)]+bu)R(t)=σ_g(Wr ∗[C(t),Cr(t−1)]+b_r) \\ U(t)=σ_g(Wu ∗[C(t),Cr(t−1)]+b_u) R(t)=σg​(Wr∗[C(t),Cr(t−1)]+br​)U(t)=σg​(Wu∗[C(t),Cr(t−1)]+bu​)
这里的W和b都是可训练的参数,通过大量的数据学习出针对不同的空间和深度信息如何抛弃和保留信息。在实际使用中,研究人员使用了三层的GRU,输入特征为16通道,其输入特征的通道数从16降为4降为1,最后将不同深度上通过GRU正则化后的代价图{Cr(i)}i=1D{\{C_r(i)\}}^D_{i=1}{Cr​(i)}i=1D​衔接起来而后得到用于计算损失的概率体积。

2.R-MVSNet

在认识了GRU的基础上,我们就可以有效地利用递归的方法处理立体视觉中的cost volum了,下图显示了本方法的主要架构。

R-MVSNet的主要分为三个部分,首先是多视图特征抽取部分,而后将不同视图的特征转化到与参考相机视锥平行的平面上来,并构建不同深度上的损失图map;而后利用GRU的递归正则化方法对代价空间进行有效处理;最后得到概率体积P与基准的二进制占据体积计算交叉熵。整个网络被视为分类问题来进行训练。

在上图中可以看到,某个深度下的损失图与先前的深度损失图相结合计算得到当前深度下正则化的损失图。在GRU的处理中,首先将某个深度下32通道的损失图经过卷积作用变为16通道的损失图;而后利用输出通道数为16,4,1的GRU连续处理,最终得到单通道的正则化损失图Cr(0)~Cr(D-1)。

将每个深度上正则化处理的损失图结合,并利用softmax计算得到概率体积P,此时与基于深度图与独热编码生成的占据空间Q(occupancy volume)进行交叉熵计算来得到模型的损失。
∑p∑i=1D−P(i,p)⋅logQ(i,p)\sum_{\bold{p}}\sum_{i=1}^{D}{−P(i, \bold{p}) · log Q(i, \bold{p})}p∑​i=1∑D​−P(i,p)⋅logQ(i,p)
其中p指的是图像坐标系中的空间坐标(深度图上的x,y),i指的是不同深度层。

值得注意的是,在训练时模型需要计算整个概率体积,而在测试时则无需计算整个体积,而可以利用赢者通吃的方法序列化地来计算出每一个深度层上的像素对应深度。

模型内部的基本结构构造入下表所示,其中包含了共享的特征抽取部分,将特征映射到参考目标视角下的可差分单应性部分、代价图构建、GRU循环处理代价空间部分和最终的概率体积生成部分。(此处cost map和概率体积部分符号存疑,需对照代码或与作者求证

3.多视角立体视觉重建流程

R-MVSNet估计参考视角下的深度图需要以下三种输入,包括N个视角下的源图像、参考视角下的深度范围[dmin, dmax]以及深度方向上的采样数量。Todo(rjj):基于配对得分降序选择原图
其中深度范围的确定遵循与水平分辨率相同的原则,某个深度采样下的对应深度由下式子计算(inverse depth setting),其中D为深度采样的数量:
d(i)=1(1dmin−1dmax)∗1D−1+1dmax,i∈[1,D]−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−D=1dmin−1dmax1dmin−1dmin+ρd(i)= \frac{1}{(\frac{1}{d_min} −\frac{1}{d_max})*\frac{1}{D−1}+\frac{1}{d_max}} ,i∈[1,D] \\ -------------------------------------\\ D = \frac{\frac{1}{d_{min}}-\frac{1}{d_{max}}}{\frac{1}{d_{min}}-\frac{1}{d_{min}+\rho}} d(i)=(dm​in1​−dm​ax1​)∗D−11​+dm​ax1​1​,i∈[1,D]−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−D=dmin​1​−dmin​+ρ1​dmin​1​−dmax​1​​
其中ρ为两个投影到水平像素坐标下相邻空间点间的距离。这意味着深度上的分辨率应该与其在水平方向上的空间分辨率相匹配,由此定义深度方向上的采样数量。

在对模型进行有效训练后,可以从正则化后的代价空间map中计算出深度图,为了获得亚像素级别的深度精度研究人员利用了多视角光学一致性(photo-consistency)来对深度图进行进一步的优化。具体来讲,是利用了参考视图下的深度将某个视角下的图像i投影到参考视图下,并计算参考视图下的重投影误差:

其中第一项为像素间的光度误差、第二项为深度平滑误差、第三项为颜色一致性,第四项为邻域的深度差异用于平滑。

最后一步就是将深度图进行滤波和融合得到三维点云。利用光度和几何连续性来对深度图进行滤波。由于正则化后的代价空间生成了对应不同采样深度的概率体积,此时就将不同深度的概率体积作为执行度量来对对应深度图进行滤波,除去致信概率小于0.3的点。同时几何连续性保证某个点需要被三个以上视角看到一保证多视角下的深度连续性;最后利用可见性融合及算数平均融合来提升深度精度并得到点云。

上图中可以看到参考视角下的图像及其对应的初始深度图,初始深度图虽然已经有着很好的效果,但在某些位置还存在较多的噪声、缺乏更有效的细节。(g)显示了初始的深度梯度,某些表面还存在较多噪声也不够平滑。通过优化后的深度图和深度梯度在细节上更为精确,表面也更为平滑。f显示了来自概率体积的概率图,它作为置信概率可以滤去深度图中一些置信度较低的点,最明显的就是图像上部的天空部分。

4.实验细节

这一模型的训练是在DTU数据上进行的,其中包含了7个不同光照下的100个扫描场景,基于数据集的基准点云渲染得到训练所需的深度图,其输入为三个大小为640x512的视图、深度范围425mm-905mm采样192个深度结果。值得注意的是,为了避免GRU带来的bias训练过程中模型前传的正则化从dmin到dmax,反传则从dmax到dmin,正则化时深度方向从小到大从大到小。
在测试时,输入的图像视角为5个,正对Tanks和Temples数据集其相机参数通过OpenMVG计算。优化过程则利用OpenGL实现。

在实验过程中主要使用了DTU,Tanks and Temples,ETH3D三个数据集。
其中DTU主要包含了室内的场景,主要使用了重建的平均精度和平均完整性来度量其性能:

Tanks主要包含了室外更为复杂的场景,其中包括视野外相机轨迹的中级数据和大规模复杂场景的高级数据。R-MVSNet重建了所有场景的数据,R-MVSNet较高的内存利用率显示了其可拓展性和规模化能力。其排名和重建结果如下所示:
由于R-MVSNet利用递归的方法处理代价空间,其内存消耗与深度分辨率/采样率D无关,使得它可以处理大深度范围的场景,同时具有较高的内存利用率。通过改变深度采样数量D可以实现更高的深度分辨率,在[425mm,905mm]范围内D=512时可达0.419mm分辨率。

5.各模块的有效性

通过消融性分析,研究人员还对不同网络结构以及后处理方式得到的结果进行了比较。针对网络结构,主要在二维图像特征下比较了不同重建方法的效果,从左上角折线图中可以看到除了内存消耗巨大的3D-CNN外GRU方法取得了很好的效果。底图中也可以看到在较高的计算效率下 GRU方法也达到了接近GRU的效果:

针对不同后处理方法,深度优化、光度滤波、几何度量滤波和深度图融合等,上图中左表第二到四行最后一列都显示了模块对于整体精度的贡献。

最后值得注意的是,本方法的运行时间只与输入图像的大小input size和优化过程的迭代次数有关,在D=256情况下DTU上运行的典型时间是9.1s(2.9s推理和6.2s的深度图优化),由于显存11G的限制其可处理最大分辨率为3072x2048;这一方法还具有较强的泛化能力,包括其训练输入是DTU中N ×W ×H ×D = 3×640×512×256,但在不经过调优的情况下进行了文章中的全部实验,具有良好的尺寸泛化性和数据集泛化性。(这一模型可以输入任意尺寸和视角数量的图像)

在文章的最后,也许提出这样的疑问:GRU是不是可以通过流式的3D-CNN简单的滑动处理来代替呢?研究人员设计了一个实验来分析这一问题,将D=256的代价空间分解成大小为64,不长为32的7个子空间,而后利用3D-CNN来对这7个子空间进行处理。在产生深度图阶段,一种方法是利用3D-cnn正则化处理后的结果衔接直接回归出深度图的volum fusion方式;另一种基于子代价空间生成7个深度图和概率图,并基于概率图来融合实现完整的深度图,结果入下图所示:

不出意外这两种结果都比3D-cnn和GRU方式的R_MVSNet结果要差,究其原因在于:不同子空间上的差异很大,它们之间不能作为整体进行正则化是的误差较大;其感受野也远小于3D-CNN的全尺寸感受野,无法有效利用3D-CNNs的强大正则化能力。

最后的最后来看结果:




pic from pexels.com

【三维深度学习】多视角立体视觉模型R-MVSNet相关推荐

  1. 【三维深度学习】多视角立体视觉网络MVSNet

    基于深度学习的多视角立体视觉模型MVSNet提出了一种基于多视角图像和相机参数重建出目标深度图的有效方法.MVSNet将不同视角下的图像信息进行有效抽取,对相机外参进行有效编码在精巧的融合与优化后得到 ...

  2. 三维深度学习中的目标分类与语义分割

    (转载的文章,仅供学习,如有侵权请随时联系删帖) 在过去的几年中,基于RGB的深度学习已经在目标分类与语义分割方面取得了非常好的效果,也促进了很多技术的发展,深度学习在现实生活中的应用也越来越多.但是 ...

  3. 计算机视觉方向简介 | 三维深度学习中的目标分类与语义分割

    三维数据的表示方法 ●  point cloud:点云,也就是三维坐标系统中点的集合,这些点通常以x,y,z坐标来表示,并且一般用来表示物体的外表形状.当然,除了最基本的位置信息以外,也可以在点云中加 ...

  4. 三维深度学习之pointnet系列详解(一)

    目前二维深度学习取得了很大的进步并且应用范围越来越广,随着三维设备的发展,三维深度学习得到了很大的关注. 最近接触了三维深度学习方面的研究,从pointnet入手,对此有了一点点了解希望记录下来并分享 ...

  5. 【三维深度学习】多视角场景点云重建模型PointMVS

    PointMVS区别于先前利用cost volum来进行多视角处理的方法,直接基于点云的方式对场景进行处理.从过由粗到细的迭代优化过程,充分结合了几何先验信息和2D纹理信息来来增强点云特征,并利用图网 ...

  6. 【三维深度学习】基于片元的渐进式三维点云上采样模型

    点云上采样对于从稀疏三维数据重建稠密三维点云十分有效.但面对非规则.无需.稀疏.噪声和不完整的点云结构,图像领域的超分辨.补全.稀疏加密等方法无法直接用于点云上采样中.PointNet系列方法基于全连 ...

  7. 【三维深度学习】多视角立体视觉 MVSNet代码解读

    MVSNet通过将相机几何参数编码到网络中,实现了端到端的多视角三维重建,并在性能和视觉效果上超越了先前算法,并在eccv2018 oral中发表. 模型主要包含四个主要步骤:图像特征抽取.多视角可微 ...

  8. 【三维深度学习】点云上采样网络PU-Net 代码分析

    PU-Net的代码是基于Tensorflow code,并从PointNet++和PointSetGeneration中进行了诸多借鉴.PU-Net是一个点云上采样模型,可以将非规则的点云输入通过点云 ...

  9. 【三维深度学习】Sparse Convolutional Network 基于稀疏采样不变性的深度稠密重建

    为了从稀疏的深度采样(Lidar)中重建出稠密的深度信息, 研究人员提出了一种高效的稀疏卷积层,用于在训练过程中精确定位数据缺失的位置,实现了具有稀疏不变性的特征抽取和重建手段.Sparsity In ...

最新文章

  1. Slog92_使用React框架进行前端开发4
  2. java 中文 图片_java之服务器端写图片中文乱码
  3. wenbao与最优比率生成树
  4. 013.Zabbix的Items(监控项)
  5. UC上云 为网络大型游戏保驾护航
  6. MySQL用户管理和权限管理
  7. HALCON学习之旅(一)
  8. 知荐 | 自动驾驶的“大脑”:决策规划篇
  9. 中配置kylin_Kylin集群模式部署(使用同一HBase存储)
  10. 编译exe不弹窗口_详解matlab mbuild -setup找不到C++编译器解决方案
  11. [小知识] 关于Excel中行列的固定
  12. 3.27 如何使用udp给飞秋发消息(python)
  13. 6个免抠素材网站,免费可商用
  14. 百度云盘MP3音乐外链、视频外链教程
  15. oracle中的Start With关键字
  16. [XMAN2018排位赛]AutoKey
  17. python英文分词库_Python中文分词库jieba,pkusegwg性能准确度比较
  18. python外卖点餐系统毕业设计开题报告
  19. 米老师解惑----1
  20. 做好异常处理,防止无故翻车

热门文章

  1. linux内核那些事之early boot memory-memblock
  2. 6D位姿估计算法Densefusion代码阅读
  3. Conv2d中的groups参数(分组卷积)怎么理解? 【分组卷积可以减少参数量、且不容易过拟合(类似正则化)】
  4. numpy.ceil() 和 numpy.floor()--向上取整和向下取整
  5. Apache与Tomcat 区别与联系
  6. Ripro主题角标美化
  7. 网站随机背景音乐源码
  8. 织梦cms仿知名吧站长导航网站模板
  9. 阿里助手 5.12.2
  10. 搏天短网址生成网站源码v3.1