基于深度学习的多视三维重建是指,利用神经网络技术解决多视立体视觉中的稠密重建问题,即输入为多视角拍摄的RGB图像及各个视角的位姿,输出为整个物体或场景的三维点云。传统的稠密重建方法流程如下,1. 针对每一个视角做深度估计;2. 利用多个视角的信息对深度进行滤波平滑;3. 将各个视角的深度图融合在一起形成点云。与之对比,基于深度学习的多视三维重建针对的主要是流程1,通过深度学习的手段来完成单视角的深度估计,其输入为该视角图像(reference image)与一系列对应参与多视重建的相关图像(neighboring/source images),输出为该视角的深度图。这类的网络有很多,如MVSNet,CasMVSNet,PatchMatchNet等。这里主要记录一下MVSNet及PatchMatchNet。
网络结构
MVSNet
MVSNet与语义分割网络有很多类似的地方,其实深度估计问题也可以理解为一个语义分割问题。我们将可能的深度设定一个范围,并将深度按一定方式划分成
份(一般是按深度的倒数平均划分),对于每个像素而言,它的深度大致会有
个取值,网络最终输出来的是这
个取值的概率,最后可以计算出深度的期望值,即为网络推理出来的深度。
MVSNet主要有几部分:
特征提取:通过常用的一些卷积网络配置,将输入的reference image和source image转化成下采样的feature map。
-
差异计算:对于reference image每个像素,深度估计本质上是要找到一个深度,使得它与source image上对应的像素在某种维度上差异最小。
- 给定一个深度,假设该点的法向法向永远垂直于相平面,则可以估计出一个homography来计算对应点。这里homo的估计与传统PatchMatch方法中的类似,只是把normal方向替换成垂直于相平面的方向,即这里采用的是fronto-parallel window,而不是slanted window。
- 利用这个homo,可以将source image对应的feature map转换到reference image的视角,再将其平均之后与reference的feature map对应位置相减,得到一个描述二者差异的一个volume。
代价生成:这一步基本上就是一个U-Net的配置,作用是把差异的volume转化成深度的概率图。
深度优化:这一步主要是解决卷积以后边界丢失的问题,通过加入原图(一般而言边界比较清晰),与深度图一起形成一个4通道的volume,再经过几次卷积以后得到一个新的深度概率。Loss将考虑Loss0和Loss1的和。
PatchMatchNet
PatchMatchNet基本上是在利用神经网络模拟传统的PatchMatch算法,其网络结构大的模块有以下几个部分:
- 特征生成:利用常用的encoder-decoder的结构生成特征,不同层对应了不同分辨率的特征
- PatchMatch:传统的PatchMatch方法主要有计算代价,传播优化,随机优化等几步,这里的PatchMatch模块主要就是模拟这些算法过程
- 多分辨率的级联:与一些常见的分割网络一样,先在低分辨率上生成结果,再以此为基础生成高分辨率的结果,而loss将兼顾各个分辨率
- 深度优化:与MVSNet类似,优化边界
PatchMatch的过程
输入:每一张image(包括reference和source)都会生成三个feature map,大小分别为
,
,
,分别在不同的stage当做输入;初始深度图,stage3来源于随机初始化,而其他stage来自于上一stage的结果;
-
以stage3为例,介绍整个过程。
Initialization:初始深度图为随机值,对于每个像素,其深度的倒数在
之间均匀分布取
个值,得到大小为
的深度图。
Differentiable warping:对于每个像素,根据不同的深度,可以计算出单应变换homo,然后将source image对应的feature map变换到reference image的视角。每一张source image将对应得到大小为
的warp 特征图。
Group-wise correlation:对于reference image的一个像素
,给定一个深度
,其特征向量
,大小为
. 而对于source image的同样像素,其特征向量
. 然后我们将
分成
个组,每个组中有
个特征值,保证
. 分块求向量内积,定义
.经过这个操作以后,对于每张source image我们将得到大小为
的特征图。
Conv:把分块那一维给卷积掉,得到大小为
的特征图,再附上sigmoid操作,使得特征图中所有的值变成概率分布
.
Maxpooling: 再把深度那一维取最大值,得到大小为
的weight图。
Multiplication: 把上述结果和Group-wise correlation的结果进行pixel对应的相乘,得到新的特征图大小为
.
Matching cost computation:直接把所有source image得到的上述结果加在一起,得到新的特征图(Aggregated matching cost)大小为
. 再经过
conv去掉分组那一维,得到大小为
的特征图。结合上几步来看,其实就是将各个source image得到的group correlation做了一个加权平均。
-
Adaptive spatial cost aggregation:对于每个像素而言,上面的cost都是单个像素计算而来的,考虑类似NCC的计算,需要引入一个局部的邻域来表达cost。虽然在计算feature的时候引入了CNN,相当于已经有一定的感受野了,这里还是做了一次空间的聚合。具体来说,每个像素的cost将由邻域的像素cost加权平均得到,但是这里的邻域不是常规意义下的几邻域,而是在这个基础上加了一个偏移,这个偏移量是可以通过网络学习的。这种自适应的邻域选择,主要是为了避免在边界处深度的大跳跃。下图显示了邻域的自适应选择。这一步过后依然是大小为
的特征图。
adaptive.png Depth regression:以上1-8步对应了代价计算的过程。第8步输出的结果,对应了深度的概率,通过计算期望,可以得到最终的深度图,大小为
,与下采样的ground truth比较就形成了其中一个loss.
Adaptive propagation:传统的方法中,传播的过程是有一个固定的邻域像素集合,通过比较这些像素的cost与当前像素的cost来决定是否将这些像素对应的深度传播给当前像素。而PatchMatchNet抛弃了固定的邻域选择,而是采用和步骤8中差不多的思路,先预定邻域位置,假设有
个邻域像素,再通过CNN学习出一个offset. 这里也没有显式地比较这些offset后的像素和当前像素的cost,而是直接将
的深度图直接扩充为
大小的深度图,这里还包含了一次上采样。
Local perturbation:和传统方法一样,传播之后为了更好地优化深度值,会有一个随机优化的过程。以步骤9输出的深度图为基础,先上采样一次,然后再在一定的深度范围
内将深度值随机出
个值,这样深度图的大小就变成了
。和步骤10得到的传播结果放在一起,最终喂给stage2的深度图大小即为
.
以步骤11的深度图,以及大小为
的特征图为输入,循环2-9步就完成了stage2,再循环一次就完成了stage1.
而在stage0时,不再进行PatchMatch的计算,而是直接采用MVSNet中深度优化的操作,引入原图的边界信息,得到新一轮的深度图。
最终的loss将每个stage的loss相加得到。
讨论
泛化性
PatchMatchNet的泛化性确实不错,在DTU数据上训练的模型在我们自己拍的数据上也能得到不错的结果。主要的原因在于,整个网络设计都在模仿传统的PatchMatch方法,利用深度图的groundtruth代替了以NCC为代表的score计算方法,神经网络在各个模块中扮演了自适应设定参数的角色,如在传播的邻域选择上等。
性能
论文显示,PatchMatchNet在DTU数据上有很好的完整性,但在我们自有的数据上,并没有看到这一点,相反完整性还略差。这也许和其中的一些参数设置或者使用DTU训练结果有关系。理论上分析,基于深度学习的方法有个很大的不同是在feature map上去寻找差异,而不是在原图上,另外通过不同层次的downsample及卷积,差异的定义不再局限于一个微小的邻域,即它的感受野会更大。但是,同时需要看到的是,这类方法与传统方法比较,并没有大的实质性突破,特别是在弱纹理的数据上,这与网络设计模拟传统算法流程不无关系。