以下链接是个人关于MVSNet(R-MVSNet)-多视角立体深度推导重建 所有见解,如有错误欢迎大家指出,我会第一时间纠正。有兴趣的朋友可以加微信:17575010159 相互讨论技术。若是帮助到了你什么,一定要记得点赞!因为这是对我最大的鼓励。文末附带\color{blue}{文末附带}文末附带公众号−\color{blue}{公众号 -}公众号−海量资源。\color{blue}{ 海量资源}。海量资源。

3D点云重建0-00:MVSNet(R-MVSNet)–目录-史上最新无死角讲解:https://blog.csdn.net/weixin_43013761/article/details/102852209

话不多说,我们继续前面的3.3 Depth Map

3.3 Depth Map

。。。。。。

Depth Map Refinement 从probability volume,也就是论文图示的这个部分:

得到的,是一个不错的深度图,但是因为比较大的感受野范围进行了正则化,边界可能会存在平滑的现象(翻译得有模有样,但是不知道啥意思)。他有点类似于语义分割,或者说抠图。为什么这么说?因为r img肯定是包含了边界信息的,因此我们用r img去对初始深度图进行提炼,让深度图的表述更加精确。其灵感主要来自于最近比较流行的抠图算法,在MVSNet最后阶段,我们采用了端到端训练的残差网络对MVSNet,把r img图像改变成和初始深度图的大小一样,然后他他们组合成4个通道的特征图,当作网络的输入,如下:

然后经过经过11层,通道数为32的2D卷积,输出一个单通道的深度图,这个深度图就是上面的Refined Depth Map。在2D卷积的最后一层是没有使用BN,ReLU以及残差网络单元。另外为了防止一定范围内的偏差,在送入网络的时候,把像素转化到[0,1],等提炼之后再恢复过来。

3.4 Loss

loss部分其实很好理解。他主要考虑到两方面的loss,一个GT(ground truth )与初始深度图计算损失,一个是与提炼之后的深度图计算损失。再这里还要涉及的一个问题就是,我们的GT(ground truth )可能只有部分是有效的的,如下:

可以看待GT中,有的地方是紫色的,可以理解为背景。对于背景是不需要参与损失计算的。所以我们再源码中看到mask的操作(后续讲解),计算loss的公式如下,万变不离其宗,就是像素做差:

这里的PvalidP_{valid}Pvalid​表示的就是GT有效的像素,d(p)d(p)d(p)表示GT中像素P的深度,d^i(p)\hat{d}_i(p)d^i​(p)表示初始深度图像素p的深度,d^r(p)\hat{d}_r(p)d^r​(p)表示提炼深度图像素p的深度,其中的参数λ\lambdaλ在实验中是被设置为1的。

4 Implementations

4.1 Training

Data Preparation 现在 MVS的数据集提供的GT一般都是点云或者网格形式,所以我们需要取去产生深度图的GT。DTU是一个比较大的MVS(多视角立体)数据集,其中的图像包含了一百多个场景,每个场景都有不同的关照强度对应,并且带有正常点云的相关标签,我们只使用过滤出来的screened Poisson surface reconstruction(SPSR-大概是个神经网络,猜的)去生成网格曲面, 然后根据这些视点生成我们训练要的深度图。为了获得高质量的网格结果,我们把SPSR的参数,depth-of-tree设置为11,trimming-factor为9.5(减少边缘区域网格的虚影)。MVSNet在和其他的网络做比较的时候,我们选择了相同的训练集和测试集。考虑到每个scan(后面代码分析解释)中有49种图片,每种图片带有7种不同的关照强度。我们会把每个图片都当初r img进行训练。DTU 数据集总共提供了27097个训练样本。
View Selection 我们每次训练使用一张r img和两张s img(N=3),那么我们怎么去选择这些视角图呢?作者定义了一个分值s(i,j)=∑pG(θij(p))s(i,j) = \sum_pG(\theta_{ij}(p))s(i,j)=∑p​G(θij​(p))。对每个s img都会和r img计算这个sss分值,这里ppp是两幅图 i img和 j img的公共轨迹,θij(p)=(180/π)arccos((ci−p)⋅(cj−p))\theta_{ij}(p)=(180/\pi)arccos((c_i-p)·(c_j-p))θij​(p)=(180/π)arccos((ci​−p)⋅(cj​−p))表示的是PPP偏移基线的角度,ccc表示的是摄像头的中心。GGG是一个高斯分段函数,根据θ\thetaθ的不同,计算方式不一样:

在实验中,θ\thetaθ,σ1\sigma_1σ1​,σ2\sigma_2σ2​分别被设置为5,1,和10。为什么要根据这个公式来计算S,然后根据S选择视觉图,我也不是很了解,如果我后面想通了,就为大家解释一下,如果没有想明白,那就算了哈。当然,如果那位大佬想明白了,一定要告知我,小的感激不尽!\color{#FF0000}{当然,如果那位大佬想明白了,一定要告知我,小的感激不尽!}当然,如果那位大佬想明白了,一定要告知我,小的感激不尽!
注意的是,这些视角图在进行特征提取的时候都会变小,然后放入4个缩放尺寸的3D编码-解码卷积,输入图像的尺寸必须能被32整除。考虑到GPU内存消耗的原因,我们把图片由原来的1600×1200缩小到800×600,然后围绕着中心点进行剪裁,剪裁成W = 640 和 H = 512的图片当作网络的输入,所以输入摄像头的参数也要随之变化。假如输入的样本,其深度均匀的分布在[425,935]mn,分辨率为2mn(D=256),我们编程的框架是TensorFlow,使用Tesla P100显卡,迭代了100 000次。

4.2 Post-processing(后期处理)

Depth Map Filter(深度图过滤) 上面的网络是对每个像素进行深度估算,处于转化为3D点云操作的前面,有必要过滤掉背景以及一些异常点。我们提出了两种标准,称为photometric(关照)和geometric(几何) 一致性的深度图过滤。
photometric一致性深度匹配质量:在前面我们提到过,我们使用probability map(概率图)去评估深度估算的质量。可以注意到,这个体素概率低于0.8的可以看作离群点。

geometric 约束测量多个视角:其类似于这个人眼,利用左右视角差去观测立体目标。我们将参考像素p1p_1p1​通过他的深度d1d_1d1​投影到其他的视角像素pip_ipi​,然后根据pip_ipi​的深度did_idi​,又把pip_ipi​重映射到r img上面。简单的说,把其他2维视觉图,映射到立体空间,然后再重立体空间映射到另外一个视角。如果重映射的坐标preprojp_{reproj}preproj​ 和重映射深度dreprojd_{reproj}dreproj​ 分别满足∣preproj−p1∣<1|p_{reproj}-p_1|<1∣preproj​−p1​∣<1,∣dreproj−d1∣/d1<0.01|d_{reproj}-d_1|/d1<0.01∣dreproj​−d1​∣/d1<0.01。则认为p1p_1p1​的d1d_1d1​和另外的视觉是一致的。在我们的实验中,3个视角的深度应该是一致的。
通过上面两种简单的操作,对不同类型的异常值具有较好的鲁棒性。

Depth Map Fusion 类似于其他的多视角立体方法,我利用多个不同视角的深度图,集合到一个点云之中。在我们的算法中,使用了视角融合的算法,这样把遮挡,光照等影响降到了最低。为了进一步抑制噪声,我们对每个视角的每一个像素做了滤波操作(取得这个所有重映射深度的平均值dreproj‾\overline {d_{reproj}}dreproj​​,作为这个最后的深度估算值)。融合了深度之后,直接把深度图重映射到3D点云空间,如下插图:
Fig. 3:

图解:这是对DTU数据集的scan9进行重构。(a)从MVSNet网络获得的深度图。(b)过滤之后的深度图。(c)从ground truth mesh生成的深度图(d)r img(e)融合之后的点云(f)ground truth的点云

5 Experiments

5.1 Benchmarking on DTU dataset

我们首先在DTU评估数据集中的22 scan进行评估,输入图像数目N=5,宽W=1600,高=1184,深度D=256。为了定量的进行评估(用数字体现出来),我们计算了准确率差距,以及完整性的百分比差距。准确率距离差距的评估,由发布DTU数据集的官方提供的matlab代码完成。我们自己进行完整性百分比的评估。注意,百分比的评估,比准确率的评估更加全面,称为f−scoref-scoref−score,给出了一个类似于下面Table 1的测量结果:我们对了所有方法的距离评估,越小越好。完整性百分比的测量,越高越好。阈值分别取了1 mm以及2mm

定量的分析展现在上面的表格,准确率准最好的是Gipuma,在完整性方面,我们超出了所有方法,并且甩开他们十分的远。如下图Fig. 4,MVSNet生成了最完整的点云,特别是在那些结构不清楚的地方,在MVS中,那些问题一般是最难解决的,但是我们取得了很好的效果:
Fig. 4:

图解,这里是数据集中scans 9,11,75的结果,我们的 MVSNet生成了完整性最好的点云结构,获得最好的视觉效果。

5.2 Generalization on Tanks and Temples dataset(在坦克和寺庙数据集上的泛化能力)

对于DTU数据集,是在摄像头比较平稳,并且是室内环境。为了进一步证明MVSNet网络的泛化能力,我们在户外的数据集(Tanks,Temples)上进行了测试,使用基于DTU训练出来的模型,并且没有做任何的处理。对户外数据集进行重构时,N=5,W=1920,H=1056,D=256。深度的范围是由r img 和s img稀疏点云以及摄像头位置决定的。其由开源软件SfM和OpenMVG恢复(这里看得比较模糊,不过没有关系)
虽然MVSNet使用大量的室内数据集进行训练,但是他依然适用于室外场景。证明了这个网络的泛化能力比较强,定性的分析结果展示如下:
Fig. 6:

图解:(a)输入视角图数目不同,验证集的loss(b)是否使用:对图像进行特征提取,cost metric以及提炼等

5.3 Ablations

在这个部分主要分析MVSNet中的几个网络组件,下面是针对这些组件的所以研究。我们使用验证集的loss去评估重构的质量。使用的是数据集中的scan 18,其中N=5,W=640,H=512,D=256。

View Number 从上面的图中,我们可以看到,输入的视角图越多,其loss能够下降得越低。

Image Features 使用特征抽取,和不使用特征抽取,也就是是否使用网络中这个部分:

其效果的差距是十分明显的。

Cost Metric 我们对比了基于cost metric的方差操作和平均操作(在代码中,进行详细的解说-其是计算每个体素的方差)。其使用平均操作和方差操作的对比,在上面的Fig. 6中能清晰的看到,MVSNet使用方差的方法,效果要好很多。

Depth Refinement 在训练MVSNet的时候,可以选择对初始深度进行提炼,当然也可以不进行提炼。对比的结果也能在Fig. 6中看到,论文中说有一点点提高,但是提高得很少。说75.58提到了75.69(<1mm f-socre),79.98提到了80.25(<1mm f-socre),所以我们应该根据实际情况选择是否进行提炼,毕竟提高不了多少,但是参数却增加了好些。这个是否提炼,在源码中是有设定的。

5.4 Discussions(描述)

Running Time 反正就是说他的比别人的快,还快了不少

GPU Memory 他们是在16G的显卡训练的,然后还说可以在11G的显卡上进行训练。不知道为什么我的11G的显卡不可以。配置了很多次,但是依旧报错显卡内存不足

Training Data 因为DTU 数据集提供了比较完整的点云信息,所以我们可以先得到mesh surfaces,然后再去生成深度图,也就是我们网络的GT(ground truth)。但是没有办法在Tanks和Temples数据集上进行训练,因为改些数据集的点云信息提供得不是很完整。虽然使用点云合成的深度图当做GT,让我们的网络获得了一个比较令人满意的结果。但是也一定的局限性。
1.提高的ground truth meshes不是百分百的完整,在训练的时候,会把这些地方的前景当做有效像素来训练,可能降低模型的效果。
2.如果有的像素,在其他的视觉被遮挡住了,那么他应该是不能被用来训练的,因为没有完整的complete mesh surfaces我们不能正确的识别被遮挡的像素,所。所以希望MVS数据集能提供ground truth depth maps,并且完好的标记出遮挡区域,以及背景信息。

6 Conclusion

我们的比别人好,比别人好,真的比别人好。准确率比别人高,完整性比别高,泛化能力比别人强

结语

到这里,MVSNet的论文已经为大家翻译完成了,但是R-MVSNet对应的论文还没有翻译。这个后面再说吧,下面就是为大家解析代码了。

3D点云重建0-04:MVSNet-白话给你讲论文-翻译无死角(2)相关推荐

  1. 风格迁移1-05:Liquid Warping GAN(Impersonator)-白话给你讲论文-翻译无死角(2)

    以下链接是个人关于Liquid Warping GAN(Impersonator)-姿态迁移,所有见解,如有错误欢迎大家指出,我会第一时间纠正.有兴趣的朋友可以加微信:17575010159 相互讨论 ...

  2. 风格迁移1-04:Liquid Warping GAN(Impersonator)-白话给你讲论文-翻译无死角(1)

    以下链接是个人关于Liquid Warping GAN(Impersonator)-姿态迁移,所有见解,如有错误欢迎大家指出,我会第一时间纠正.有兴趣的朋友可以加微信:17575010159 相互讨论 ...

  3. 3D点云重建原理及Pytorch实现

    3D点云重建原理及Pytorch实现 Pytorch: Learning Efficient Point Cloud Generation for Dense 3D Object Reconstruc ...

  4. Docker:基于ubuntu18.04的介绍,安装与使用 - 最新无死角

    以下链接是个人关于深度学习环境搭建的所有链接,包含了各个框架: 深度学习环境搭建-史上最全无死角系列 有兴趣的朋友可以添加微信 17575010159 相互交流. 注意:本人编写该博客的时间为2020 ...

  5. python 3d重建_3D点云重建原理及Pytorch实现

    3D点云重建原理及Pytorch实现 Pytorch: Learning Efficient Point Cloud Generation for Dense 3D Object Reconstruc ...

  6. 多任务上实现SOTA,UBC、谷歌联合Hinton等提出3D点云的无监督胶囊网络

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨杜伟.小舟 来源丨机器之心 这是一种为 3D 点云提出的无监督胶囊架构,并且在 3D 点云重构. ...

  7. UBC、谷歌联合Hinton等提出3D点云的无监督胶囊网络,多任务上实现SOTA

    本文转载自机器之心. 机器之心报道 作者:杜伟.小舟 这是一种为 3D 点云提出的无监督胶囊架构,并且在 3D 点云重构.配准和无监督分类方面优于 SOTA 方法. 理解对象是计算机视觉的核心问题之一 ...

  8. 稠密点云重建MVS——基于多视角深度图像

    稠密点云重建MVS--基于多视角深度图像 前言 一.整体流程* 二.算法原理 1.全局视角图像序列选取方法 2.局部视角图像序列选取方法 2.深度与法向量优化算法 基本概念 极线搜索--查找图像中某个 ...

  9. PCL提取3D点云模型特征(3.0 FPFH快速点特征直方图)附完整代码

    一.概述 上一篇博客解释了PFH是什么以及如何利用PFH来提取点云的特征,那么讲了PFH(PCL提取3D点云模型特征(2.0 PFH点特征直方图 )附完整代码)之后肯定是要接着说FPFH的.本来想着把 ...

最新文章

  1. Redis6安装配置集群cluster以及集群宕机注意事项
  2. php mysql两个表合并_php – 我可以将两个MySQL查询合并为一个吗?
  3. linux各版本使用率,Windows10系统各版本份额出炉:十月更新占有率不高。
  4. JAVA中获取当前运行的类名,方法名,行数
  5. 【转】关于Ubuntu的sources.list 的总结
  6. mysql slave是什么_创建slave的搜索结果-阿里云开发者社区
  7. VTK:几何对象之PlanesIntersection
  8. 神奇的折纸艺术!无限翻转完全停不下来
  9. Java StringBuffer char charAt(int index)方法与示例
  10. mysql表名怎么拼接_mysql必知必会(一)
  11. 测试场景组件化轮子——用例元
  12. 专题_期权交易必备知识
  13. json转java代码_Java代码:javabean和json互转
  14. Java练手项目(好玩又有趣)
  15. 检查linux是否安装rar,rarlinux的安装及使用
  16. 通过mtd读写flash_linuxmtd读写flash
  17. 【pycharm】英文输入法变成全角字符无法输入
  18. python运行代码不成功_【Python】程序在运行失败时,一声不吭继续运行pass
  19. Windows安装Visual Studio Installer卡在正在验证 循环正在下载不安装,解决办法之服务问题
  20. python html生成图片_Python将html文件转为图片

热门文章

  1. Spring Cloud Gateway自带RequestRateLimiter限流应用及扩展 | Spring Cloud 16
  2. Android Q Beta 3 亮相 Google I/O'19
  3. 笔记本安装win10后 无线网卡驱动无法安装 问题的解决
  4. 【删除linux历史命令】
  5. android wifi热点广播,Android WiFi热点开发的示例代码
  6. 【英语六级-作文模板】高级的词汇、精炼的句型
  7. HTML+CSS学习demo合集
  8. JavaWeb-用Responds下载文件
  9. java 怎么保证余额_高并发下怎么做余额扣减?
  10. 听力口语学习方法漫谈