本文主要对基于学习的多视角立体视觉中的第一篇深度学习方法:MVSNet进行翻译和解读,以及添加一些个人的理解,并且在文章中介绍MVSNet两个评价指标的原理(distance metric、percentage metric)
提出一种端到端的深度学习体系结构:从多视图图像,推断深度图。
网络:
创新点:
使用基于方差的损失度量,灵活地适应任意N视图的输入,这个度量将多个特征映射为一个损失特征
在DTU上训练,在Tanks and Temples上评估。
通过后处理,生成点云,与之前的技术相比,方法更好、速度更快。
泛化性强,不通过微调也可以有较好的效果
MVS:从重叠图像,估计出稠密的表示
MVS传统方法:
使用手工制作的相似性度量和工程正则化,计算密集的对应关系,恢复3D点。
局限:场景的 低纹理、镜面反射 区域,导致重建不完整。
最近的算法:
accuracy较好,但completeness需要提高
基于CNN的方法:
基于学习,引入全局语义信息(如:镜面反射的先验)
【立体匹配】适合使用CNN方法:图像对已经预先校正,问题变成水平像素方向的【视差估计】,不需要考虑相机参数。
【MVS】与立体匹配不同,输入图像是任意相机几何体,给学习方法的使用带来很大问题
SurfaceNet:提前构建彩色体素立方体(Colored Voxel Cubes),将所有图像像素颜色和相机信息,组合到单个的volume中,作为网络输入
LSM,Learned Stereo Machine:直接利用,可微的 投影/非投影,实现端到端的训练/推理。
这两种方法:都利用 regular grids 的体积表示,因为3D体积巨大的内存消耗,导致网络难以扩展。
LSM:仅处理【低体积分辨率】的合成对象;
SurfaceNet:采用启发式分治策略,大规模重建需要很长时间。
每次计算一个深度图,而不是一次计算整个3D场景。
【一个ref图像】和【多个src图像】作为输入,推断ref的深度图。
key insight:可微单应变形 (differentiable homography warping )
该操作隐式编码网络中的相机几何,从二维图像特征,构建三维损失立方,支持端到端训练。
相机几何(camera geometry):应该指的是相机与物体之间的几何关系。
可以适应输入中任意数量的src
该度量:将多个特征,映射为volume中的一个损失特征。
将损失立方(Cost Volume)进行多尺度3D卷积,回归初始深度图。
利用ref图像,对深度图进行细化,提高边界区域的accuracy。
与SurfaceNet和LSM的不同:
为了进行深度图推断,本文的3D Cost Volume建立在 camera frustum 上,而不是regular Euclidean space。
下面是一个相机椎体的示意图。
- 本文方法:将MVS重建问题,解耦为。更小的逐视图深度图估计问题,使大规模重建成为可能。
实验:
在DTU上训练和评估
经过简单的后处理,completeness和overall 与之前的相比最优。
在Tanks and Temples上验证泛化能力
不需要精调
运行时间比之前的技术更快
MVS方法分为:
1)直接点云重建:直接操作3D点,依靠传播策略逐渐加密重建,传播顺序进行,难以并行化,处理时间较长
2)体积重建:将三维空间,划分为规则的网格,估计每个体素是否附着在曲面上,空间离散化错误,高内存消耗
3)深度图重建:最灵活,将复杂的MVS问题解耦为相对较小的逐视图深度图估计问题,每次只关注一个参考和几个源图像
深度学习技术:用来更好地匹配 成对的patch
在立体匹配(Stereo Matching)中,一般都会构建 Cost Volume,来计算视差图,根据视差图生成深度图
https://www.zhihu.com/question/366970399/answer/1340892604
cost volume 表示 pixel-wise matching cost
x : ref img 中的一个 pixel
X_i : 在ref的拍摄方向上,给定深度 d_i 处,对应的三维点
x_i :X_i 投影到 matching img 上的位置
cost volume记录的就是x和x_i的matching cost或相似程度
ref img 和 matching img 都已知相对位姿,ref img 中的一个pixel 沿着拍摄方向确定 search space,投影到matching img上形成epipolar line。
ref img上的一个pixel只能对应于matching img中epipolar line上的pixel。
在Search Space中取不同深度,得到不同的点 (d_1, d_2, …, d_9),分别对应epipolar line上的点 (x_1, x_2, …, x_9)
对于每一个x_i和x,根据其邻域信息,计算matching cost,得到x_i与x的匹配程度
以上面的 (x_1, x_2, …, x_9)为例,可以得到9个matching cost,可以构成一个vector。
这个vector表示: x点在matching img上关于(d_1, d_2, …, d_9)的matching cost
ref img上的每个pixel形成一个vector,组合在一起形成一个三维的tensor,就是cost volume(损失立方)
SurfaceNet
LSM
MVSNet第一步:提取N个输入图像 { I i } i = 1 N \{I_i\}^N_{i=1} {Ii}i=1N的深度特征 { F i } i = 1 N \{F_i\}^N_{i=1} {Fi}i=1N。
使用:八层的2D卷积网络
在第三层和第六层,步长为2,将特征进行下采样,尺寸缩减为原来的一半。特征塔划分为三个scales。
每个scale内部,使用两个卷积层,提取更高级别的图像表示。
除了最后一个绿色的卷积,其余每个层都是Conv+batch-normalization+ReLU。
与常见的匹配任务类似,在所有的特征塔之间,参数共享,实现高效学习。
一个特征塔内部的结构:(输入图像为WxH)
Content | Kernel Size | Filter Number | Stride | Output |
---|---|---|---|---|
Conv+BN+ReLU | 3 x 3 | 8 | 1 | 8 x W x H |
Conv+BN+ReLU | 3 x 3 | 8 | 1 | 8 x W x H |
Conv+BN+ReLU | 5 x 5 | 16 | 2 | 16 x W/2 x H/2 |
Conv+BN+ReLU | 3 x 3 | 16 | 1 | 16 x W/2 x H/2 |
Conv+BN+ReLU | 3 x 3 | 16 | 1 | 16 x W/2 x H/2 |
Conv+BN+ReLU | 5 x 5 | 32 | 2 | 32 x W/4 x H/4 |
Conv+BN+ReLU | 3 x 3 | 32 | 1 | 32 x W/4 x H/4 |
Conv | 3 x 3 | 32 | 1 | 32 x W/4 x H/4 |
整个2D网络的输出,共32个通道,每个通道的特征尺寸降低至 W/4 x H/4
通道的增加,弥补了尺寸的减小
同时,每个图像都提取这样的一个32 x W/4 x H/4 的特征
第二步:从提取的特征和输入相机中,构建3D cost volume。
在reference camera frustum 上构建损失立方。
I 1 I_1 I1:ref
{ I i } i = 2 N \{I_i\}^N_{i=2} {Ii}i=2N:src
{ K i , R i , t i } i = 1 N \{K_i,R_i,t_i\}^N_{i=1} {Ki,Ri,ti}i=1N:每张图对应的,相机内参、旋转和平移(外参)
单应性矩阵:
https://www.sohu.com/a/223594989_100007727(这篇的转载:https://blog.csdn.net/lyhbkz/article/details/82254893,怕搜狐的这篇文章凉了)
https://www.cnblogs.com/wangguchangqing/p/8287585.html
单应性矩阵:能够将一个图像的坐标(u1,v1)变换到 图像2中对应的位置上(u2,v2)
考虑一个图形的坐标(u,v)和这个点在世界坐标系中的坐标(xw,yw),可以通过相机标定法,根据缩放、内参、外参(旋转、平移),计算(xw,yw)对应的(u,v).
将中间的参数乘起来,就可以得到一个3x3的矩阵:
即: x = H ⋅ x w x=H·x_w x=H⋅xw。,这个H就可以看做是xw和x之间转换的单应性矩阵。
考虑两个图像中对应的两个点x1,x2,在世界坐标系中对应点xw
x 1 = H 1 ⋅ x w x_1=H_1·x_w x1=H1⋅xw
x 2 = H 2 ⋅ x w x_2=H_2·x_w x2=H2⋅xw
就可以得到 x 2 = H 2 ⋅ H 1 − 1 ⋅ x 1 = H ⋅ x 1 x_2=H_2·H_1^{-1}·x_1=H·x_1 x2=H2⋅H1−1⋅x1=H⋅x1。这个H就可以看做是x1和x2之间转换的单应性矩阵。
根据上一步中提取到的特征图,将所有的特征图(包括ref)都warp到ref camera的不同平行平面上。
根据单应性变换公式: x ′ ∼ H i ( d ) ⋅ x x'\sim H_i(d)·x x′∼Hi(d)⋅x ,将第i个视角图像的特征 F i F_i Fi ,warp为深度d下的特征图 V i ( d ) V_i(d) Vi(d)。
对于每个视角的图像,在所有深度上,都要进行一次warp?
∼ \sim ∼ :projective equality
H i ( d ) H_i(d) Hi(d) : 第i个特征图 和 ref特征图在深度d下的单应变换矩阵
n1:ref相机的主轴
单应性矩阵是一个3x3的matrix,ref到自己的单应性矩阵是一个单位矩阵。
最后结果为:N个feature volumes { V i } i = 1 N \{V_i\}^N_{i=1} {Vi}i=1N
warping过程类似于: classical plane sweeping stereo
区别在于:可微线性插值,是从特征图 { F i } i = 1 N \{F_i\}^N_{i=1} {Fi}i=1N中采样
而不是从图像 { I i } i = 1 N \{I_i\}^N_{i=1} {Ii}i=1N中采样。
作为连接2D特征提取和3D正则化网络的步骤,warping以可微的方式实现,进而实现深度图推理的端到端的训练。
将多个feature volumes { V i } i = 1 N \{V_i\}^N_{i=1} {Vi}i=1N,聚合为一个Cost Volume C C C。
为了适应任意数量的输入view,提出一种基于方差的N view相似性cost度量M。
WHD分别为图像的宽度、高度、深度采样数256,F为特征图的通道数32。
V = W 4 ⋅ H 4 ⋅ D ⋅ F V=\frac{W}{4}·\frac{H}{4}·D·F V=4W⋅4H⋅D⋅F,为feature volume的size。上一步中得到了N个feature volumes。
本文的cost metric,定义了一种映射M,将N个feature volumes域,映射为1个。
V i ‾ \overline{V_i} Vi是所有feature volumes的平均volume,所有的操作都是按element进行的。
这里的cost volume只画了一个,其实是F个,即32通道的Cost Volume,每个都是 W 4 ⋅ H 4 ⋅ D \frac{W}{4}·\frac{H}{4}·D 4W⋅4H⋅D.
也就是说,上面的cost metric只是将多个视图的feature volume映射为1个,即对于每个通道的N张视图的feature volume,进行上面的映射,得到每个通道下的1个cost volume
传统的MVS方法,聚集ref和所有src之间的cost。
本文:所有视图都对matching cost做出同等贡献,并不优先考虑ref。
很多方法应用多个CNN层的平均来推断相似性,均值本身不提供关于特征差异的信息。
基于方差:明确度量了多视图的特征差异
根据图像特征计算的原始cost volume,可能会受到噪声的污染(non-Lambertian surfaces or 对象遮挡),应该结合平滑度约束,来推断深度图。
正则化的目的:refine上面的cost volume C C C,生成用于深度推断的probability volume P P P。
使用【多尺度3D-CNN】进行正则化
这里的四尺度网络类似于3D版本的UNet
使用编码器-解码器结构
以相对较低的内存和计算成本聚集来自大感受野的相邻信息
为了减少计算需求:
第一个3D卷积层,将32通道的cost volume减少到8通道
每个尺度内的卷积从3层更改为2层
最后一个卷积层输出一个单通道的volume
沿着深度方向,应用softmax,进行概率归一化
根据上述步骤,产生probability volume,有利于深度图推断
因为它不仅可以用于每个像素的深度估计
而且还可以用于测量:估计的置信度
3.3中会展示:通过分析深度重建的probability distribution,可以很容易地确定深度重建的质量,从而根据probability distribution得到一种简洁有效的异常值过滤策略。
从 P P P中检索深度图 D D D的最简单方式:像素级winner-take-all,例如argmax(P的维度为DxWxH,即对于某一个像素,选择所有深度下的最大概率值)
但是argmax无法产生sub-pixel估计(亚像素估计)
并且由于其不可微分性,无法使用反向传播进行训练
相反,我们沿着深度方向,计算期望值。(即所有深度假设的概率加权和)如下:
P(d):在深度d处,所有像素的概率估计。
这个操作可以称为soft argmin,完全可微的,并且能够逼近argmax的结果。
虽然,在cost volume构建的时候,深度假设是在 [ d m i n , d m a x ] [d_{min}, d_{max}] [dmin,dmax]之间均匀采样的,但此处的期望值,能够产生连续的深度估计。
输出的深度图与2D图像特征图大小相同
深度图和2D图像特征图,与输入图像相比,在每个维度上缩减了4倍。(因为两个stride=2的卷积)
尽管多尺度3D-CNN有很强的能力,将概率正则化为单峰分布。
但是,对于那些错误匹配的像素,其概率分布是分散的,并不能集中到一个峰值。
因此,将深度估计的质量 d ^ \hat d d^,定义为ground truth深度 在 估计附近的小范围内 的概率。
由于深度假设是沿着camera frustum离散采样的,所以只需要取四个最近深度假设的概率和,来测量估计的质量。
也可以使用其他的统计测量,如标准差、熵
本文在实验中得到,这些测量对深度图过滤的测量没有显著提升,但是概率和公式,可以更好的控制异常值过滤的阈值参数。
虽然从probability volume检索出的深度图是合格的输出,但由于正则化涉及较大的感受野,重建边界可能会出现过于平滑。
自然中的ref图像是包含边界信息的,所以使用ref图像作为指导,来细化深度图。
受最新图像抠图算法的启发,在MVSNet末尾应用了depth residual learning network 。
【初始深度图】 和【调整大小的ref图像】 连接为4通道的输入。
通过三个32通道的2D卷积层,一个1通道的卷积层,来学习深度残差。
前三层是stride为1的Conv+BN+ReLU,最后一层不包含学习负残差的BN和ReLU,步长为1。
添加回初始深度图,生成细化的深度图。
为了防止在某个深度scale上出现偏差(即深度的取值范围不同导致结果出现问题),将初始深度幅值预缩放到范围[0,1],并在细化后,将其转换回原scale
本文考虑:【初始深度图】 和 【细化深度图】 的损失。
使用【ground truth深度图】和【估计的深度图】之间的平均绝对差,作用训练损失。
因为ground truth深度图不总是完整的,只考虑哪些具有【有效ground truth labels】的像素。
p v a l i d p_{valid} pvalid是有效ground truth像素集合
d§:ground truth中p点的深度值
d i ^ ( p ) \hat{d_i}(p) di^(p):初始深度估计
d r ^ ( p ) \hat{d_r}(p) dr^(p):细化深度估计
λ \lambda λ:控制初始和细化深度图的损失在总损失中的权重,实验中设置为1
MVS数据集:以点云或网格形式给出 ground truth。
需要生成ground truth深度图。
使用screened Poisson surface reconstruction (SPSR)生成网格表面,然后将网格渲染到每个视点,生成对应视点的深度图
划分数据集:
Validation set: scans{3, 5, 17, 21, 28, 35, 37, 38, 40, 43, 56, 59, 66, 67, 82, 86, 106,117}.
Evaluation/Testing set: scans{1, 4, 9, 10, 11, 12, 13, 15, 23, 24, 29, 32, 33, 34, 48, 49,62, 75, 77, 110, 114, 118}.
Training set: the other 79 scans.
DTU数据集中,对于每个物体,都扫描49个不同的视角,并对每个视角采取7种不同照明条件
将每个图像在训练中,都看做一次ref img,即每个图像都作为训练样本
则训练样本总数:79x49x7
本文训练中设置图片数N=3,即 1 ref + 2 src.
根据稀疏点,对每个img pair,计算score(i,j)
p: 视角i和j的公共轨迹 common track
θij§:p的baseline angle
c:相机中心 camera center
G:是一个分段高斯函数,决定于某个 baseline angle θ0
实验中:
选择与ref图像成对的src中,score最高的两个,与ref一起作为网络输入的三张图像。
数据预处理:
因为:1)特征提取中图像将被缩小。2)3D正则化中存在四尺度编码器-解码器的结构,也会发生图像的放缩
所以:输入图像的size 必须能被32整除
本文:将图像块调整并裁剪为 W640xH512,同时改变对应的相机参数
深度假设:从425mm 到 935mm 以 2mm的分辨率均匀采样,D=256
Train参数:
input view number | image width | image height | depth sample number |
---|---|---|---|
N= 3 | W= 640 | H= 512 | D= 256 |
网络估计的是每个像素的深度值。
将结果转换为密集点云之前,过滤掉背景和遮挡区域的异常值。
光度一致性( photometric consistency )
衡量匹配的质量
根据概率深度图,将概率值小于0.8的像素看做异常点
几何一致性(geometric constraint )
衡量多个视图之间的深度一致性
类似于stereo中的left-right视差检查:
1)将ref pixel p1通过其深度d1,投影到另一个视图中的pixel pi
2)将pi根据其深度di,重新投影到ref中的pixel p_reproj
3)对于原来的点和深度p1和d1,以及重新投影回来的p_reproj和d_reproj,如果满足:
∣ p r e p r o j − p 1 ∣ < 1 并 且 ∣ d r e p r o j − d 1 ∣ < 0.01 |p_reproj-p_1|<1 并且 |d_reproj-d_1|<0.01 ∣preproj−p1∣<1并且∣dreproj−d1∣<0.01
就认为p1的深度估计d1在这两个视图中是一致的
本位选取N=3,所以需要三视图一致。
不满足一致性的ref中的pixel,看做异常点
应用 深度图融合,将不同视图的深度图,集成到统计的点云表示种。
重建中使用的是:基于可见性的融合算法(The visibility-based fusion algorithm)
可以将 不同视点之间的深度遮挡和冲突 最小化
为进一步抑制噪声,在滤波步骤,确定每个像素的可见视图,并将所有重投影深度的平均值,作为像素的最终深度估计。
将融合后的深度图,直接重新投影到空间,生成三维点云
在划分的DTU testing上评估
Test参数:
input view number | image width | image height | depth sample number |
---|---|---|---|
N= 5 | W= 1600 | H= 1184 | D= 256 |
该评价指标在论文 Large_scale_data_for_multiple_view_stereopsis 中介绍。
– Accuracy is measured as the distance from the MVS reconstruction to the structured light reference, encapsulating the quality of the reconstructed MVS points.
– Completeness is measured as the distance from the reference to the MVS reconstruction, encapsulating how much of the surface is captured by the MVS reconstruction.
– Overall:因为percentage metric中有一个f-score来综合acc和comp,mvsnet中添加了一个overall来综合distance metric中的acc和comp,overall的值是acc和comp的平均值
A comparison and evaluation of multiview stereo reconstruction algorithms
We now describe how we evaluate reconstructions by geometric comparison to the ground truth model.
Let us denote the ground truth model as G and the submitted reconstruction result to be evaluated as R. The goal of our evaluation is to assess both the accuracy of R (how close R is to G), and the completeness of R (how much of G is modeled by R). For the purposes of this paper, we assume that R is itself a triangle mesh.
R和G有多近(根据R点找对应的G点,看距离多少)
有多少G由R建模出了(根据G中的点,找R中有没有对应的点,边界点被去除)
在论文 Tanks and Temples: Benchmarking Large-Scale Scene Reconstruction 中介绍。
Accuracy
也可以叫做precision,衡量重建后的点云(R)到ground truth(G)的距离
公式(3)定义了R中的一个点r到G的距离:
r到G中所有点的距离中,最小的距离就是r到整个G的距离
公式(4)定义了在阈值d下,R的precision:
对于R中的所有点,计算这些点到G的距离;
统计所有距离小于d的点的个数;
Completeness
也可以叫recall,衡量G 到 R的距离。
公式(5)定义G中一个点g到R的距离,与公式(3)类似。
F-score
将precision和recall结合起来,计算F-score
The precision quantifies the accuracy of the reconstruction: how closely the reconstructed points lie to the ground truth. The recall quantifies the reconstruction’s completeness: to what extent all the ground-truth points are covered. Precision alone can be maximized by producing a very sparse set of precisely localized landmarks. Recall alone can be maximized by densely covering the space with points. However, either of these schemes will drive the other measure and the F-score to 0. A high F-score for a stringent distance threshold can only be achieved by a reconstruction that is both accurate and complete.
precision:量化重建的准确性,重建的点与GroundTruth有多接近
recall:量化重建的完整性,重建的点多大程度上覆盖了所有的GroundTruth
可以通过产生一组非常稀疏的精确局部地标,最大化precision;可以用点密集的覆盖空间,最大化recall。
但是这两种方案的实施,都会让另一种measure和f-score趋近于0。
Generalization 参数:
input view number | image width | image height | depth sample number |
---|---|---|---|
N= 5 | W= 1920 | H= 1056 | D= 256 |
在DTU训练得到的模型上,只需要修改输入图像数量、图像尺寸和深度假设,就可以在TAT上得到很好的泛化结果。
消融实验在验证集上进行
Validation参数:
input view number | image width | image height | depth sample number |
---|---|---|---|
N= 3 | W= 640 | H= 512 | D= 256 |
之前训练的模型View Number N=3
增加视图的数量可以降低Validation的损失。与MVS重建的认知一致。
同时,尽管模型是在N=3时训练的,但是在N=5时效果更好,说明模型非常灵活,可以应用于不同的输入设置。
比较:基于方差和基于均值的损失度量。
基于方差的收敛速度更快,验证损失更低。
显式差异度量,计算多视图特征相似性,更加合理。
比较:带有深度图细化的网络、不带深度图细化的网络
是否细化对验证损失影响不大。
但带有细化的网络,提高了percentage metric指标的结果。
MVSNet效率更高,重建一次scan大概需要230s,平均每个view4.7s
比Gipuma快5倍,比COLMAP快100倍,比SurfaceNet快160倍
问题:这个是重建点云的速度吗?
如果是的话,主要的时间是占用在生成点云上,还是估计深度上。
后面的FastMVSNet提高的是估计深度的速度,还是生成点云的速度。
如果主要时间是点云生成,而且FastMVSNet提高的只是深度估计的速度,那么应该找一个算法,能够加快点云的生成。
同时,应该调研一下,3D点云能否和CAD图纸进行模板匹配。
需要的GPU内存:与输入图像的大小、深度采样数D有关。
Tesla P100 graphics card(16GB)、consumer level GTX 1080ti graphics card(11GB)是可以的
DTU数据集,使用normal information法线信息,提供ground truth点云,以便将其转换为网格曲面,进而进行深度图的渲染,生成ground truth深度图。
但是TAT数据集是没有法线信息或网格曲面的,无法进行微调来获得更好的性能。
对DTU渲染得到的深度图效果很好,但仍有局限:
1)提供的GT网格不是100% 完整的,前景后面的一些三角形会错误地渲染到深度图中,作为有效像素,恶化训练过程。
2)如果像素在所有其他视图中,都被遮挡,则不应该将这个像素用于训练。但是如果没有完整的网格曲面,无法正确识别被遮挡的像素。
作者希望未来的MVS数据集,能够提供,具有完整遮挡和背景信息的GT深度图。
提出一种用于MVS重构的DL框架
以非结构化图像作为输入,以端到端的方式,推断ref image的深度图。
核心贡献:
1)将相机参数,编码为,可微单应性,以在camera frustum上构建cost volume。
2)构建的cost volume可以连接二维特征提取和三维损失正则化网络。
MVSNet效果更优,速度更快,没有微调的情况下,在TAT上具有很强的泛化性。