【MVSNet】结构分析与理解

文章目录

  • 简单来说
    • 特征提取与单应变换
    • 方差聚合和代价体回归
  • Loss与衡量指标

简单来说

MVSNet在理解的时候确实有很多困惑的地方。经过几个月的摸索,简单的讲解一下该模型到底是怎么运作的。

MVSNet本质上就是一个深度估计网络,有参考视角source视角两个部分的图像输入,输出的就是每个参考视角的深度图。之后依照MVS传统方法介绍的深度图融合可以融合出点云,最后使用规范的衡量方法对比点云重建的质量。也就是说,MVSNet的核心不是直接把3D模型建出来了,只是在深度图上完成了端到端的学习。

模型其实和深度学习相关的部分很少,主要就是前面的特征提取和中间的3D正则化部分。下面逐个分析一下。

【MVSNet】结构分析与理解_第1张图片

特征提取与单应变换

第一步就是特征提取。其实这一步的目的就是提取隐层特征,用来代替传统方法中的那些特征。这里探讨一下根本问题,基于深度图的MVS方法最关键的除了特征图,就是matching cost,匹配代价。抛开网络不看,深度图是怎么算出来的呢?MVSNet文中说了一个深度假设层,当时困惑了很久。其实深度图的计算就是一个一维搜索的过程,说白了就是试出来哪个深度比较准,我就要哪个深度。假设在ref图像有个点,首先我给他一个初始深度假设d,那么由相机摄影模型以及平面扫描的我们可以知道,假设这个d是准的,那么他可以通过相机内外参数将这个点投影到src上,且投影过去这个点和原来src看到的这个点应该是完全相同的。所以有个先验就是,只要是深度图准确,就可以将ref图像投影到src上,与src完全一样。本着这个特点,MVSNet将CNN加了进去,用来更好的匹配特征。

详细来说,输入了src和ref,MVSNet不再直接使用RGB而是使用特征图。因为特征通道数很多,他涵盖的信息远远超过RGB,所以在后面计算匹配时会更加鲁棒和准确。之后,如上文说的,既然可以把ref投到src上,那么类似的,正确预测的深度也可以通过src投影回ref上来进行匹配计算。这种2D到2D的变换可以利用单应矩阵来变换实现。将所有的src视图投影回ref上后,开始进行之前说的猜深度的过程。(注意,当前步骤还是若干个图,还没有变成一个)对于每张warp之后的图,都将他们扩展深度假设层数个维度,用来表征在特定深度上的信息。这样,文中说的特征体就产生了,特征体有src+ref个,他们分别表示各自猜测的该场景的深度值。

方差聚合和代价体回归

方差聚合这个操作就是一个投票的机制,判断所有特征体之间的差异,就是一种类似匹配代价的东西,但还不完全是。为什么要判断差异呢?回到本质上来,MVS是要为ref构建他的深度图,他的深度图如果准的话,那么其他视角通过深度图可以完全投影回ref视角上,和ref一模一样,假设非理想情况深度图没有这么准,那么投影回ref视角的图与原ref越像,说明深度图越准。用方差来聚合可以显示出各个图像之间的差异。

因此,生成的matching cost就可以表示深度。如何去表达呢?通过后面的3D正则化网络来学习。将3D的这个代价体通过网络学习到一个每个像素在不同深度上的概率分布,就可以代表深度。至此MVSNet整体大致的流程就结束了。之后的refine被证明没有太大的用处。文中消耗最大的地方就在于这一块说的代价体约束,因为每次迭代都需要从整个范围来寻找更新那个假设的深度,导致显存消耗严重,后面的CVPMVSNet, CasMVSNet提出的方法都是针对深度假设代价体构建提出的方法。

Loss与衡量指标

在深度图生成那里,由概率体生成深度图有两种方法,基于回归和基于分类的方法,这两种对应不同的loss。通常回归方法使用L1直接约束,而分类将深度估计转换成深度方向上的分类问题,使用交叉熵损失函数。

MVS经典数据集有DTU、Tanks and Temples。其中DTU处理的方法在mvsnet-pytorch里面有介绍,使用的是官方提供的matlab评估程序,评价指标是完整度comp和准确度acc,两个平均值越低越好。对于TNT数据集,衡量指标是f-score,由官网提供的测试方法来进行定量测试,指标越高越好。

当然经过学习,发现指标也是衡量模型好坏的一部分,一篇好的文章重在思路和可实现性,空中楼阁的文章实验结果虽然好,可能背后的原因是我们不得而知的。

你可能感兴趣的:(MVS,计算机视觉,人工智能,深度学习)