Point-MVSNet全文名称:Point-Based Multi-View Stereo Network,是2019提出的使用coarse-to-fine方法来优化深度图推断过程的网络结构,与上一篇CVP-MVSNet都是迭代优化的思想,不同的是Point-MVSNet在点云上进行操作,而CVP-MVSNet]是使用图像在代价体上操作,因而速度和内存消耗都比Point-MVSNet少,文末会对两者做一个详细的对比。
本文是MVSNet系列的第5篇,建议看过【论文精读1】MVSNet系列论文详解-MVSNet之后再看便于理解。
一、问题引入
传统基于代价体的方法需要3D CNN逐深度的去处理代价体上的特征来推断出概率体,并以此为基础计算深度图,然而实际物体表面点只处于某些深度下,因此直接对接近表面3D的点位置进行计算无疑是更高效的。
二、论文核心创新
- 使用PointFlow模块,输入是unprojected点云(由粗糙深度图加相机参数以非投影方式获取的点)+hypothesized点云(在unprojected点云前后某个Δdi距离的假设点),输出是每个unprojected点的位置偏移量Δd,进而投影为各点深度偏移量得到残差深度图
- PointFlow模块当中通过多层边缘卷积(Edge Conv)动态提取点云的局部特征信息(来自DGCNN)
- 点云中各点特征是2D-3D的,即包含了2D图像纹理特征与3D的几何位置先验。
三、模型介绍
论文模型主要分为两部分,第一是粗糙深度图重建,第二是迭代深度图优化。
1.粗糙深度图重建
该部分基本遵从MVSNet的方法,使用分辨率、深度采样数由1/4、256减少至1/8、48(或96)来实现1/20的内存消耗。
2.迭代深度图优化
2.1 2D-3D特征挖掘(2D-3D feature lifting)
- 该部分为每个3D点构造特征表示向量,传统的3D点p可表示为Xp(x,y,z)包含了空间几何位置的先验信息,而论文又使用卷积网络提取了多个视角下图片的2D高级视觉特征,并通过方差法来提取属于点P的多视角2D纹理特征Cp,两者做连接[Cp,Xp]即构成了所谓的2D-3D特征。
- 另外,使用了图像特征金字塔来实现迭代优化、多次进行的目的,但也导致论文讲解结构的安排比较混乱,为了方便理解下文直接按照训练流程的步骤来解释。
2.1.1 3D特征构建 & 生成假设3D点集
这一步即下图中红框部分的内容,包括非投影的深度图到3D点云变换和假设点生成
利用1中所得的初始深度图,可以通过非投影(unprojection)的方式来生成初始的空间点云X=[X1,X2,…,Xn],其中点云中点数目n为图像像素点数即H/8xW/8,此时每个点Xp包含了其3D特征[x,y,z]
对该初始空间点云X,我们称这些点为unprojected点,接下来要生成与这些点深度方向一致、但存在深度位移的假设点(hypothesized point),具体如下图所示:
该图可以看作一个俯视图,红色点p是初始unprojected点,连接参考相机和红点这条射线称为深度方向t,每一个单位深度位移为s,在每个红点前后m个位移间隔处设置蓝色hypothesized点p’ ,此时生成了每个unprojected点的假设点集{p’k}表述如下(打不出来,p’即图中的p加上波浪):
此时的点云X’包含了原始的unprojected点(n个)和每个unprojected点对应的2m个hypothesized点,即共计n x(2m+1)个,每个点Xp’都有不同的3D特征[x,y,z]
2.1.2 动态特征提取(dynamic feature fetching)
- 这一步的目的是提取2.1.1中点云X‘内每个点对应的图像上的2D特征,这个特征是从特征金字塔输出的三个尺度的特征图里找到的;同时每个unprojected点、和它同深度方向上产生的hypothesized点对应的各视图上对应的2D特征是一样的,因此实际是找点云X中每个点的2D特征
- 由于要迭代优化深度图,即推断出新的深度图之后会利用它重复上边2.1.1生成新的点云X和X’,然后再次执行该步骤为其中每个点找到2D特征,新的点云中的点3D坐标会发生变化,各点对应的图像上的特征也会随之变化,因此被称为动态特征提取(dynamic feature fetching)
-
首先利用2D金字塔卷积网络为N张原始视图提取图像特征,通过3次下采样,为每个视图i提供3个不同层级的特征图Fi=[Fi1,Fi2,Fi3]
-
对每一层尺度下的特征图,由于已知相机参数,可以利用非投影(unprojection)方式,获取点云中每个点Xp在该层不同视角图片下对应的2D特征点,进而找出在对应特征图i上的特征Fip;那么每个三维点Xp的2D特征Cp,可以看作其在不同视角图片下对应特征图上2D特征的方差,即 C p = ∑ i = 1 N ( F i p − F p ‾ ) N C_p=\frac{\sum_{i=1}^{N}(F_i^p-\overline{F^p})}{N} Cp=N∑i=1N(Fip−Fp)
-
为每个三维点Xp求3个特征层级的2D特征,此时点Xp在第j层的2D特征表述为 C j = ∑ i = 1 N ( F i j − F j ‾ ) N , ( j = 1 , 2 , 3 ) C^j=\frac{\sum_{i=1}^{N}(F_i^j-\overline{F^j})}{N},(j=1,2,3) Cj=N∑i=1N(Fij−Fj),(j=1,2,3)
-
此时点云中每个点Xp都对应了2D方差特征Cj(j=1,2,3),进行“增强”得到特征增强点云,即后文PointFlow模块的输入,实际就是连接两者的2D特征和3D位置[Cp,Xp],此时特征增强点云上每个点Xp的特征都是2D-3D的,公式表述为 C p = c o n c a t [ C p j , X p ] , ( j = 1 , 2 , 3 ) C_p=concat[C_p^j,X_p],(j=1,2,3) Cp=concat[Cpj,Xp],(j=1,2,3)
2.2 PointFlow模块
使用PointFlow模块的动机在论文中有提到:For each point, we aim to estimate its displacement to the ground truth surface along the reference camera direction by observing its neighboring points from all views, so as to push the points to flow to the target surface( 即旨在为每个初始的unprojection点估计沿着深度方向上与真实物体表面的位移值,而这个过程是通过所有视图观察各unprojection点与周围点实现的,从而推动该点流向真实的目标表面,也即我们说Point-MVSNet是直接在点云上进行操作的原因。)
具体来讲,该过程可分为五步:
- 利用kNN思想为每个unprojection点找到其k个临近点
- 使用DGCNN中提出的边缘卷积(Edge Conv),计算各点与其邻近点之间的局部结构信息
- 通过3层边缘卷积并使用shortcut-connection来连接每一层的输出,以获取在不同尺度下的局部结构特征
- 将各unprojection点的局部结构特征(上一步的输出)输入共享参数的MLP,得到该unprojection点的各个假设点(2m+1个,包含自身)的概率标量并进行softmax操作
- 各unprojection点的偏移量Δd等于各假设点的概率乘以其偏移深度
针对上述5个步骤中的细节做以下解释:
(1)kNN中计算k个距离最近点用的是各点的2D-3D特征
(2)边缘卷积示意图如下:
- 首先看图中间,xi代表点云当中的某个点,xji1-xjik代表其最近的k个点,边缘卷积首先要为每个点构建k个“边缘特征”——表示在图中就是中心点与临近点的k条连线eij。各个边缘特征计算公式为 e i j = h Θ ( x i , x j ) e_{ij}=h_Θ(x_i,x_j) eij=hΘ(xi,xj),其中hΘ代表的是用于学习的网络参数,也即图左边的神经网络层表示的过程。
- 在此基础上,对各中心点与周围k个点计算出的k个边缘特征做一个聚合,可以是sum,max等等,从而计算出中心点经边缘卷积后的特征xi’,整个过程用公式表述为 x i ′ = □ j : ( i , j ) ∈ ε h Θ ( x i , x j ) x_i'=□_{j:(i,j)∈ε}h_Θ(x_i,x_j) xi′=□j:(i,j)∈εhΘ(xi,xj),□表示的是聚合函数,下标的含义是对与点i最近邻的每个点j计算边缘特征最终对它们进行聚合。
- 此时的xi’即为对中心点边缘卷积后的新特征点,其包含了该点的局部结构信息。
- 计算边缘特征的h_Θ的输入其实有多种,论文沿用了DGCNN所用的(xi, xi - xj),即使用中心点的主体特征和中心点与临近点的“残差特征”
- 聚合函数使用max和average pooling,调参后效果差异不大
(3)使用3层边缘卷积来在不同尺度上提取局部结构特征,并将每一层输出shortcut connect来作为局部点特征输入至MLP。
(4)将包含各unsample点多尺度局部2D-3D特征的边缘卷积结果输入共享参数的MLP,输出该unprojection点的各个假设点(2m+1个,包含自身)的概率标量并进行softmax操作
(5)该softmax之后的2m+1个概率标量代表了各假设点为真实表面上点的概率,因此其深度位移量与概率相乘可得该unsample点的偏移深度,公式表述为: Δ d p = E ( k s ) = ∑ k = − m k = m k s × P r o b ( p ′ ) Δd_p=E(ks)=\sum_{k=-m}^{k=m}ks×Prob(p') Δdp=E(ks)=k=−m∑k=mks×Prob(p′),随后将各点的位移投影回深度图上即得到该次残差深度预测图。
2.3 迭代优化深度
- 在上一步获取残差图后,首先将其与初始深度图相加得到优化深度图
- 随后根据该深度图反投影出新的点云集,并重复2.1中构建假设点、动态为这些点提取2D-3D特征得到特征增强点云的过程,随后输入2.2pointFlow模块得到新的深度残差图,从而实现迭代优化深度的目标,
- 需要注意的是随着迭代进行,构建假设点时的单位位移深度s会逐渐减小,以达到更高精度的深度预测。
2.4 训练损失函数Loss
与MVSNet类似将深度预测看作一个回归问题,使用L1损失来预测深度图和真实深度图间的绝对误差,不过由于是迭代进行优化,加上了权重参数来控制各迭代步骤的重要性占比。
公式当中Pvalid表示有效的真实像素集,l为迭代次数,训练时权重λ (i)设置为1.0,s(i)为第i次迭代中单位位移深度。
s(i)作为分母且随着迭代进行不断减小,该次迭代损失权重会增大,即让深度预测更加精细时继续进行优化。
转载:https://blog.csdn.net/qq_41794040/article/details/127917341