200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > 【三维深度学习】多视角立体视觉模型R-MVSNet

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

时间:2021-06-26 13:57:16

相关推荐

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

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。