UCS-Net,论文名为:Deep Stereo using Adaptive Thin Volume Representation with Uncertainty Awareness,CVPR2020(CCF A)
本文是MVSNet系列的第8篇,建议看过【论文精读1】MVSNet系列论文详解-MVSNet之后再看便于理解。
为了得到细粒度的重建深度,之前的方法在构建代价体时往往使用固定的深度假设,这就导致需要稠密的深度采样,在消耗大量内存和计算资源同时,很难实现高精度的深度估计
模型同样是由粗到细的优化深度图,仍然包含特征提取,代价体构建,代价体正则化和深度回归四个组件,不同之处在于使用多尺度特征提取,以及在构建代价体时,深度采样利用上一层概率体输出各像素的置信度方差来选择深度假设样本,并进行迭代优化,论文将整个流程分为3个stage来进行。
为了理解方便,以下按照Stage 1、Stage 2(Stage3与2一致)即训练的流程来介绍该模型。
使用2D Unet来在三个不同的网络层输出特征图,尺寸分别[W/4, H/4, 8], [W/2, H/2, 16], [W, H, 32],Stage 1 使用最小尺寸的特征图构建代价体。
遵循MVSNet构建代价体的流程,只不过对于均匀采样的深度数由256变为64.
正常使用3D UNet来正则化代价体得到概率体,同时使用soft argmin来回归深度预测图
之前的方法(包括Stage1)的深度回归中,都是仅仅使用概率体的各个深度概率图上对各点的概率和对应深度求期望,而本文以像素为单位,沿深度方向上求方差(以概率为权重)来作为不确定性的估计,公式表述更容易理解:
V ^ ( x ) = ∑ j = 1 D P j ( x ) ⋅ ( d j ( x ) − d ˉ ( x ) ) 2 \hat{V}(x)=\sum_{j=1}^{D}P_{j}(x)\cdot(d_{j}(x)-\bar{d}(x))^2 V^(x)=j=1∑DPj(x)⋅(dj(x)−dˉ(x))2
V(x)代表像素x的深度方差,Pj(x)代表x在第j个深度平面上的概率,dj(x)代表第j个深度平面的深度假设值,d(x)~代表x在概率体深度方向求期望的深度值。
σ ^ ( x ) = V ^ ( x ) \hat{σ}(x)=\sqrt{\hat{V}(x)} σ^(x)=V^(x)
C ( x ) = [ d ˉ ( x ) − λ σ ^ ( x ) , d ˉ ( x ) + λ σ ^ ( x ) ] C(x)=[\bar{d}(x)-λ\hat{σ}(x),\bar{d}(x)+λ\hat{σ}(x)] C(x)=[dˉ(x)−λσ^(x),dˉ(x)+λσ^(x)]
将方差开根号作为标准差σ,以深度预测值±λσ 为深度置信区间,下一个Stage的深度采样将利用这个深度置信区间来进行。
使用2D Unet来在三个不同的网络层输出特征图,尺寸分别[W/4, H/4, 8], [W/2, H/2, 16], [W, H, 32],Stage 2使用[W/2, H/2, 16]的特征图构建代价体。
根据当前Stage需要的深度采样数n(3个Stage分别为64,32,8),从上一个Stage计算出的深度置信区间 C(x) = [ d ˉ ( x ) − λ σ ^ ( x ) , d ˉ ( x ) + λ σ ^ ( x ) ] [\bar{d}(x)-λ\hat{σ}(x),\bar{d}(x)+λ\hat{σ}(x)] [dˉ(x)−λσ^(x),dˉ(x)+λσ^(x)] 均匀采样,选取n个深度假设平面,这个深度区间C(x)就决定了新的代价体的"物理深度"。
如上图所示,展示了原始RGB图像、真实深度图、预测深度图,以及下边的三个阶段对于红点的深度概率体各深度的概率展示,其中紫色区域代表了不同Stage下红点的深度置信区间,可以观察到该区间(也即代价体的物理长度)越来越小,深度预测也越来约逼近真实值。
与Stage 1一致
在DTU数据集上达到除传统Gipuma之外的精度最高,完整度和overall最高
在Tanks上也取得了极为明显的效果提升
在DTU上对各Stage进行消融实验
- Scale x2代表对当前尺寸的深度图在宽和高方向进行双线性插值后的误差
- 各Scale x2后的精度,与下一个Stage的结果相比(用ATV)都不如,说明了ATV的有效性
无论是时间消耗还是内存消耗,相比MVSNet和RMVSNet都极大的减少,且推断的深度图尺寸与原图一致
这篇论文的效果真的让人好的没话说…最重要的是思路和操作方式都很清晰和简单,以至于连时间和内存消耗都大幅减少——这一切就是简单的做了一个深度方差、以在迭代的从基于方差的、以原始深度期望为中心的置信区间里不断优化。强到令人怀疑。。虽然github上开源了代码,但是issues里有人说训练损失降不下来,或者精度不够,打算之后自己训练一下试试效果