欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

基于深度学习的多视角 3D 重构

最编程 2024-06-24 08:40:07
...

基于深度学习的多视三维重建是指,利用神经网络技术解决多视立体视觉中的稠密重建问题,即输入为多视角拍摄的RGB图像及各个视角的位姿,输出为整个物体或场景的三维点云。传统的稠密重建方法流程如下,1. 针对每一个视角做深度估计;2. 利用多个视角的信息对深度进行滤波平滑;3. 将各个视角的深度图融合在一起形成点云。与之对比,基于深度学习的多视三维重建针对的主要是流程1,通过深度学习的手段来完成单视角的深度估计,其输入为该视角图像(reference image)与一系列对应参与多视重建的相关图像(neighboring/source images),输出为该视角的深度图。这类的网络有很多,如MVSNet,CasMVSNet,PatchMatchNet等。这里主要记录一下MVSNet及PatchMatchNet。

网络结构

MVSNet

mvsnet.png

MVSNet与语义分割网络有很多类似的地方,其实深度估计问题也可以理解为一个语义分割问题。我们将可能的深度设定一个范围(d_{min}, d_{max}),并将深度按一定方式划分成n份(一般是按深度的倒数平均划分),对于每个像素而言,它的深度大致会有n个取值,网络最终输出来的是这n个取值的概率,最后可以计算出深度的期望值,即为网络推理出来的深度。
d = \sum d_i*P_i
MVSNet主要有几部分:

  1. 特征提取:通过常用的一些卷积网络配置,将输入的reference image和source image转化成下采样的feature map。

  2. 差异计算:对于reference image每个像素,深度估计本质上是要找到一个深度,使得它与source image上对应的像素在某种维度上差异最小。

    • 给定一个深度,假设该点的法向法向永远垂直于相平面,则可以估计出一个homography来计算对应点。这里homo的估计与传统PatchMatch方法中的类似,只是把normal方向替换成垂直于相平面的方向,即这里采用的是fronto-parallel window,而不是slanted window。
    • 利用这个homo,可以将source image对应的feature map转换到reference image的视角,再将其平均之后与reference的feature map对应位置相减,得到一个描述二者差异的一个volume。
  3. 代价生成:这一步基本上就是一个U-Net的配置,作用是把差异的volume转化成深度的概率图。

  4. 深度优化:这一步主要是解决卷积以后边界丢失的问题,通过加入原图(一般而言边界比较清晰),与深度图一起形成一个4通道的volume,再经过几次卷积以后得到一个新的深度概率。Loss将考虑Loss0和Loss1的和。

PatchMatchNet

patchmatchnet.png

PatchMatchNet基本上是在利用神经网络模拟传统的PatchMatch算法,其网络结构大的模块有以下几个部分:

  1. 特征生成:利用常用的encoder-decoder的结构生成特征,不同层对应了不同分辨率的特征
  2. PatchMatch:传统的PatchMatch方法主要有计算代价,传播优化,随机优化等几步,这里的PatchMatch模块主要就是模拟这些算法过程
  3. 多分辨率的级联:与一些常见的分割网络一样,先在低分辨率上生成结果,再以此为基础生成高分辨率的结果,而loss将兼顾各个分辨率
  4. 深度优化:与MVSNet类似,优化边界
patchmatch.png

PatchMatch的过程

  • 输入:每一张image(包括reference和source)都会生成三个feature map,大小分别为(W/2, H/2, C), (W/4, H/4, C), (W/8, H/8, C),分别在不同的stage当做输入;初始深度图,stage3来源于随机初始化,而其他stage来自于上一stage的结果;

  • 以stage3为例,介绍整个过程。

    1. Initialization:初始深度图为随机值,对于每个像素,其深度的倒数在(1/d_{max}, 1/d_{min})之间均匀分布取D_f个值,得到大小为(W/8, H/8, D_f)的深度图。

    2. Differentiable warping:对于每个像素,根据不同的深度,可以计算出单应变换homo,然后将source image对应的feature map变换到reference image的视角。每一张source image将对应得到大小为(W/8, H/8, C, D_f)的warp 特征图。

    3. Group-wise correlation:对于reference image的一个像素p,给定一个深度d_j,其特征向量F_0(p, d_j),大小为1\times C. 而对于source image的同样像素,其特征向量F_i(p,d_j), 1\times C. 然后我们将C分成G个组,每个组中有K个特征值,保证K*G=C. 分块求向量内积,定义S_k(p, d_j)= \frac{G}{C}\langle F_0(p, d_j)^g, F_i(p, d_j)^g\rangle.经过这个操作以后,对于每张source image我们将得到大小为(W/8, H/8, G, D_f)的特征图。

    4. 1\times1\times1 Conv:把分块那一维给卷积掉,得到大小为(W/8, H/8, D_f)的特征图,再附上sigmoid操作,使得特征图中所有的值变成概率分布P(p,d_j)\in[0,1].

    5. Maxpooling: 再把深度那一维取最大值,得到大小为(W/8, H/8)的weight图。

    6. Multiplication: 把上述结果和Group-wise correlation的结果进行pixel对应的相乘,得到新的特征图大小为(W/8, H/8, G, D_f).

    7. Matching cost computation:直接把所有source image得到的上述结果加在一起,得到新的特征图(Aggregated matching cost)大小为(W/8, H/8, G, D_f). 再经过1\times 1\times 1 conv去掉分组那一维,得到大小为(W/8, H/8, D_f)的特征图。结合上几步来看,其实就是将各个source image得到的group correlation做了一个加权平均。

    8. Adaptive spatial cost aggregation:对于每个像素而言,上面的cost都是单个像素计算而来的,考虑类似NCC的计算,需要引入一个局部的邻域来表达cost。虽然在计算feature的时候引入了CNN,相当于已经有一定的感受野了,这里还是做了一次空间的聚合。具体来说,每个像素的cost将由邻域的像素cost加权平均得到,但是这里的邻域不是常规意义下的几邻域,而是在这个基础上加了一个偏移,这个偏移量是可以通过网络学习的。这种自适应的邻域选择,主要是为了避免在边界处深度的大跳跃。下图显示了邻域的自适应选择。这一步过后依然是大小为(W/8, H/8, D_f)的特征图。

      adaptive.png

    9. Depth regression:以上1-8步对应了代价计算的过程。第8步输出的结果,对应了深度的概率,通过计算期望,可以得到最终的深度图,大小为(W/8, H/8),与下采样的ground truth比较就形成了其中一个loss.

    10. Adaptive propagation:传统的方法中,传播的过程是有一个固定的邻域像素集合,通过比较这些像素的cost与当前像素的cost来决定是否将这些像素对应的深度传播给当前像素。而PatchMatchNet抛弃了固定的邻域选择,而是采用和步骤8中差不多的思路,先预定邻域位置,假设有K_p个邻域像素,再通过CNN学习出一个offset. 这里也没有显式地比较这些offset后的像素和当前像素的cost,而是直接将(W/8, H/8)的深度图直接扩充为(W/4, H/4, K_p)大小的深度图,这里还包含了一次上采样。

    11. Local perturbation:和传统方法一样,传播之后为了更好地优化深度值,会有一个随机优化的过程。以步骤9输出的深度图为基础,先上采样一次,然后再在一定的深度范围R_k内将深度值随机出N_k个值,这样深度图的大小就变成了(W/4, H/4, N_k)。和步骤10得到的传播结果放在一起,最终喂给stage2的深度图大小即为(W/4, H/4, K_p + N_k).

  • 以步骤11的深度图,以及大小为(W/4, H/4, C)的特征图为输入,循环2-9步就完成了stage2,再循环一次就完成了stage1.

  • 而在stage0时,不再进行PatchMatch的计算,而是直接采用MVSNet中深度优化的操作,引入原图的边界信息,得到新一轮的深度图。

  • 最终的loss将每个stage的loss相加得到。

讨论

泛化性

PatchMatchNet的泛化性确实不错,在DTU数据上训练的模型在我们自己拍的数据上也能得到不错的结果。主要的原因在于,整个网络设计都在模仿传统的PatchMatch方法,利用深度图的groundtruth代替了以NCC为代表的score计算方法,神经网络在各个模块中扮演了自适应设定参数的角色,如在传播的邻域选择上等。

性能

论文显示,PatchMatchNet在DTU数据上有很好的完整性,但在我们自有的数据上,并没有看到这一点,相反完整性还略差。这也许和其中的一些参数设置或者使用DTU训练结果有关系。理论上分析,基于深度学习的方法有个很大的不同是在feature map上去寻找差异,而不是在原图上,另外通过不同层次的downsample及卷积,差异的定义不再局限于一个微小的邻域,即它的感受野会更大。但是,同时需要看到的是,这类方法与传统方法比较,并没有大的实质性突破,特别是在弱纹理的数据上,这与网络设计模拟传统算法流程不无关系。

推荐阅读