论文地址:https://arxiv.org/abs/2112.08177
源码地址:https://github.com/baegwangbin/MaGNet
出发点:
主要包含以下几个步骤:
通过这种方式,最终输出是逐像素深度概率分布图,从中可以推断出期望值和相关的不确定性。
模型的目标为预测参考帧 I t I_t It 在 t 时刻的深度图,输入为一段时间序列内的图片: W t = { I t − 2 Δ t , I t − Δ t , I t , I t + Δ t , I t + 2 Δ t } \mathcal{W}_{t}=\left\{I_{t-2 \Delta t}, I_{t-\Delta t}, I_{t}, I_{t+\Delta t}, I_{t+2 \Delta t}\right\} Wt={It−2Δt,It−Δt,It,It+Δt,It+2Δt} 与相机参数,如图2所示,主要包含以下3个步骤:1. 对每一帧图像进行特征提取与深度概率分布预测;2. 通过概率分布来进行深度假设值采样,并生成多视图一致性权重;3. 使用匹配代价体来估计多视图深度概率体;
对于 W t ∈ R H × W \mathcal{W}_t \in R^{H\times W} Wt∈RH×W中的每张输入的图像 I t I_t It,使用D-Net来预测其深度概率分布图 ∈ R H 4 × W 4 \in R^{\frac{H}{4}\times \frac{W}{4}} ∈R4H×4W,对于 I t I_t It 每一个像素点 ( u , v ) (u, v) (u,v) ,将其概率分布参数化如式1所示:
p u , v ( d ∣ I t ) = 1 σ u , v ( I t ) 2 π e − 1 2 ( d − μ u , v ( I t ) σ u , v ( I t ) ) 2 (1) p_{u, v}\left(d \mid I_{t}\right)=\frac{1}{\sigma_{u, v}\left(I_{t}\right) \sqrt{2 \pi}} e^{-\frac{1}{2}\left(\frac{d-\mu_{u, v}\left(I_{t}\right)}{\sigma_{u, v}\left(I_{t}\right)}\right)^{2}}\tag1 pu,v(d∣It)=σu,v(It)2π1e−21(σu,v(It)d−μu,v(It))2(1)
其中 μ 和 σ \mu 和 \sigma μ和σ 是均值与方差,文中使用一个轻量级的编解码结构和EfficientNet B5来作为主干网络,使用线性激活层来计算均值 μ \mu μ ,使用修正的ELU函数来计算方差 σ \sigma σ : f ( x ) = E L U ( x ) + 1 f(x) = ELU(x) +1 f(x)=ELU(x)+1,由此来保证计得到的方差为正,且具有平滑的梯度;当训练其余的模块时需要将D-Net的权值冻结;使用NLL损失来监督模型训练:
L u , v ( d u , v g t ∣ I t ) = 1 2 log σ u , v 2 ( I t ) + ( d u , v g t − μ u , v ( I t ) ) 2 2 σ u , v 2 ( I t ) (2) L_{u, v}\left(d_{u, v}^{\mathrm{gt}} \mid I_{t}\right)=\frac{1}{2} \log \sigma_{u, v}^{2}\left(I_{t}\right)+\frac{\left(d_{u, v}^{\mathrm{gt}}-\mu_{u, v}\left(I_{t}\right)\right)^{2}}{2 \sigma_{u, v}^{2}\left(I_{t}\right)}\tag2 Lu,v(du,vgt∣It)=21logσu,v2(It)+2σu,v2(It)(du,vgt−μu,v(It))2(2)
上式表示,在物体边界点,当模型难以减小 ( d g t − μ ) 2 (d^{gt}-\mu)^2 (dgt−μ)2 的误差,就会使得标准差 σ 2 \sigma^2 σ2 较大来使得第二项变小,第一项会限制方差过大;在非边界区域,此时正确的深度值与估计的 μ \mu μ 相近,第二项近似为0,为了使整个损失函数较小,模型会趋向于将第一项变小,也就是 σ 2 \sigma^2 σ2 较小;
使用F-Net来提取每张图片的特征 ∈ R H 4 × W 4 \in R^{\frac{H}{4}\times \frac{W}{4}} ∈R4H×4W,然后基于对应点特征向量点乘的方式计算匹配代价体,对于像素点 ( u , v ) (u, v) (u,v) 在深度 { d k } k = 1 N s \{d_k\}_{k=1}^{N_s} {dk}k=1Ns,其匹配代价如式3所示:
s u , v , k ( I t ) = ∑ i ≠ t ⟨ f u , v ( I t ) , f u i k , v i k ( I i ) ⟩ (3) s_{u, v, k}\left(I_{t}\right)=\sum_{i \neq t}\left\langle\mathbf{f}_{u, v}\left(I_{t}\right), \mathbf{f}_{u_{i k}, v_{i k}}\left(I_{i}\right)\right\rangle\tag3 su,v,k(It)=i=t∑⟨fu,v(It),fuik,vik(Ii)⟩(3)
在depth维度进行softmax得到概率体 p u , v , k = s o f r m a x k ( s u , v , k ) p_{u,v,k}=sofrmax_k(s_{u, v, k}) pu,v,k=sofrmaxk(su,v,k),最后基于期望来计算深度图 d ^ u , v = ∑ k p u , v , k ⋅ d k \hat{d}_{u,v}=\sum_{k}p_{u,v,k}\cdot d_k d^u,v=∑kpu,v,k⋅dk,F-Net通过均匀采样的深度假设体 { d k } \{d_k\} {dk} 和最小化 d u , v ^ 与 d u , v g t \hat{d_{u,v}} 与 d_{u,v}^{gt} du,v^与du,vgt 之间的 L1来得到预训练权重;
文中定义每个像素的深度假设值搜索范围为 [ μ u , v − β σ u , v , μ u , v + β σ u , v ] [\mu_{u,v}-\beta\sigma_{u,v}\ , \ \mu_{u,v}+\beta\sigma_{u,v}] [μu,v−βσu,v , μu,v+βσu,v], β \beta β 为一个超参数,然后将搜索范围等分为10个区间,这样使得更多的深度假设值能接近 μ u , v \mu_{u,v} μu,v ,每个区间的中点为深度假设值,第k个深度假设值 d u , v , k d_{u,v,k} du,v,k 定义如式4所示:
d u , v , k = μ u , v + b k σ u , v w h e r e b k = 1 2 [ Φ − 1 ( k − 1 N s P ∗ + 1 − P ∗ 2 ) + Φ − 1 ( k N s P ∗ + 1 − P ∗ 2 ) ] (4) d_{u, v, k}=\mu_{u, v}+b_{k} \sigma_{u, v} \\ \ \\where \ \ \ \ \begin{aligned} b_{k}=\frac{1}{2}[& \Phi^{-1}\left(\frac{k-1}{N_{s}} P^{*}+\frac{1-P^{*}}{2}\right) &\left.+\Phi^{-1}\left(\frac{k}{N_{s}} P^{*}+\frac{1-P^{*}}{2}\right)\right] \end{aligned}\tag4 du,v,k=μu,v+bkσu,v where bk=21[Φ−1(Nsk−1P∗+21−P∗)+Φ−1(NskP∗+21−P∗)](4)
其中, Φ − 1 ( . ) \Phi^{-1}(.) Φ−1(.) 是概率函数,而 P ⋆ = e r f ( β / 2 ) P^\star = erf(\beta / \sqrt2) P⋆=erf(β/2) 表示区间 [ μ u , v − β σ u , v , μ u , v + β σ u , v ] [\mu_{u,v}-\beta\sigma_{u,v}\ , \ \mu_{u,v}+\beta\sigma_{u,v}] [μu,v−βσu,v , μu,v+βσu,v] 的概率质量;
注: { b k } \{b_k\} {bk} 只与 N s N_s Ns 和 β \beta β 有关,不需要逐像素计算;
图3左侧对比了均匀采样与本文提出的采样方式,对于不确定度高的像素,增加候选点之间的间距,从而可以评估更大范围的候选点。
如果深度假设值式正确的,说明对应的3D点是在物体的表面上,如果这个3D点在邻域视图中可见,那么相应的单视图预预到该深度的概率值应该要高;等价于 “如果从相邻视图估计的深度假设值的单视图深度概率低,则意味着深度候选是错误的或者它在该视图中不可见(例如由于遮挡)”;为此,多视角匹配分数如式5所示:
s u , v , k ( I t ) = ∑ i ≠ t w u i k , v i k , d i k d c ⟨ f u , v ( I t ) , f u i k , v i k ( I i ) ⟩ w u i k , v i k , d i k d c = δ ( p u i k , v i k ( d i k ∣ I i ) > p thres ) (5) \begin{aligned} s_{u, v, k}\left(I_{t}\right) &=\sum_{i \neq t} w_{u_{i k}, v_{i k}, d_{i k}}^{\mathrm{dc}}\left\langle\mathbf{f}_{u, v}\left(I_{t}\right), \mathbf{f}_{u_{i k}, v_{i k}}\left(I_{i}\right)\right\rangle \\ \\ w_{u_{i k}, v_{i k}, d_{i k}}^{\mathrm{dc}} &=\delta\left(p_{u_{i k}, v_{i k}}\left(d_{i k} \mid I_{i}\right)>p_{\text {thres }}\right) \end{aligned}\tag5 su,v,k(It)wuik,vik,dikdc=i=t∑wuik,vik,dikdc⟨fu,v(It),fuik,vik(Ii)⟩=δ(puik,vik(dik∣Ii)>pthres )(5)
其中,当单视图的深度概率 p u i k , v i k ( d i k ∣ I i ) > p thres p_{u_{i k}, v_{i k}}\left(d_{i k} \mid I_{i}\right)>p_{\text {thres }} puik,vik(dik∣Ii)>pthres 时, w u i k , v i k , d i k d c = 1 w_{u_{i k}, v_{i k}, d_{i k}}^{\mathrm{dc}}=1 wuik,vik,dikdc=1 ,否则等于0,将 s u , v , k ( I t ) s_{u, v, k}\left(I_{t}\right) su,v,k(It) 作为深度一致性权重; p thres p_{\text {thres }} pthres 的设定很重要,太高则会剔除过多的深度候选值(其中可能包含正确的深度值);文中设 p thres = exp ( − κ 2 / 2 ) / σ u i k , v i k 2 π p_{\text {thres }}=\exp \left(-\kappa^{2} / 2\right) / \sigma_{u_{i k}, v_{i k}} \sqrt{2 \pi} pthres =exp(−κ2/2)/σuik,vik2π,如果 d i , k d_{i,k} di,k 在k-sigma 的置信区间内则会p会趋向于1, p thres p_{\text {thres }} pthres 是由每个像素与视图共同决定;如果D-Net对于预测深度之不确定( σ \sigma σ 很大),则 p t h r e s p_{thres} pthres 很低,可以考虑更多的深度假设值;
深度一致性加权可以剔除具有低单视图深度概率的候选深度值。 尤其是当多视图匹配不明确或不可靠时,这种加权方式可以提高模型的鲁棒性。 例如,如果像素位于无纹理表面内,则深度候选范围太广将导致相似的匹配分数。 如果场景包含反射表面,则会在反射之间计算匹配分数,从而导致深度估计过高。 在这两种情况下,MaGNet 都可以通过偏向具有高单视图深度概率的深度候选来进行稳健的预测。
得益于基于概率分布的深度假设值采样策略,模型得到的匹配代价的维度为 H 4 × W 4 × N s \frac{H}{4}\times \frac{W}{4} \times N_s 4H×4W×Ns ,其中 N s N_s Ns 为深度假设值的数量;将其作为输入,使用 G-Net 更新单视图的均值与方差来估计多视角深度概率分布;由于 µ u , v µ_{u,v} µu,v 和 σ u , v σ_{ u,v} σu,v 没有在输入中编码,很难通过直接回归的方式更新的均值和方差。为此,G-Net采用残差学习的思想,估计均值与方差的归一化残差值 Δ μ u , v / σ u , v \Delta \mu_{u, v} / \sigma_{u, v} Δμu,v/σu,v。比如当两个像素点的在视差为 k ′ k^\prime k′ 匹配分数很高时,模型去学习 b k ′ b_{k^\prime} bk′ 来更新均值: μ u , v new = μ u , v + b k ′ σ u , v \mu_{u, v}^{\text {new }}=\mu_{u, v}+b_{k^{\prime}} \sigma_{u, v} μu,vnew =μu,v+bk′σu,v。同理,G-Net学习 σ u , v new / σ u , v \sigma_{u, v}^{\text {new }} / \sigma_{u, v} σu,vnew /σu,v 来更新方差值;通过这种方式来更新多视图的深度概率分布;注:G-Net 的输出可以反馈到采样模块,并且可以重复该过程以不断优化输出。
G-Net的输出为多视图概率分布图 ∈ R 2 × H 4 × W 4 \in R^{2\times \frac{H}{4}\times \frac{W}{4}} ∈R2×4H×4W,为了将这个概率分布图上采样到原图分辨率,本文提出一个可学习的上采样策略:模型的输入为D-Net的特征图,使用一个轻量化的CNN来预测 R 1 × ( 3 ∗ 3 ) × 4 × 4 × H 4 × W 4 ) R^{1\times(3*3)\times4\times4\times\frac{H}{4}\times \frac{W}{4})} R1×(3∗3)×4×4×4H×4W)的mask (4代表与原图的缩放比例) ,将概率分布图 R 2 × H 4 × W 4 R^{2\times \frac{H}{4}\times \frac{W}{4}} R2×4H×4W每个点的 3 × 3 3\times3 3×3的邻域像素取出来,组成邻域特征图 ∈ R 2 × ( 3 ∗ 3 ) × 1 × 1 × H 4 × W 4 \in R^{2\times(3*3)\times 1\times1\times\frac{H}{4}\times\frac{W}{4}} ∈R2×(3∗3)×1×1×4H×4W ,将其与mask点乘后在 3 ∗ 3 3*3 3∗3 维度上求和得到 R 2 × 4 × 4 × H 4 × W 4 R^{2\times 4\times4\times\frac{H}{4}\times\frac{W}{4}} R2×4×4×4H×4W ,最后resize得到 R 2 × H × W R^{2 \times H\times W} R2×H×W
def upsample_depth_via_mask(depth, up_mask, k):
# depth: low-resolution depth (B, 2, H, W)
# up_mask: (B, 9*k*k, H, W)
N, o_dim, H, W = depth.shape
up_mask = up_mask.view(N, 1, 9, k, k, H, W)
up_mask = torch.softmax(up_mask, dim=2) # (B, 1, 3*3, k, k, H, W)
up_depth = F.unfold(depth, [3, 3], padding=1) # (B, 2, H, W) -> (B, 2 X 3*3, H*W)
up_depth = up_depth.view(N, o_dim, 9, 1, 1, H, W) # (B, 2, 3*3, 1, 1, H, W)
up_depth = torch.sum(up_mask * up_depth, dim=2) # (B, 2, k, k, H, W)
up_depth = up_depth.permute(0, 1, 4, 2, 5, 3) # (B, 2, H, k, W, k)
return up_depth.reshape(N, o_dim, k*H, k*W) # (B, 2, k*H, k*W)
通过多次重复迭代 N i t e r N_{iter} Niter 次多视角匹配过程(基于概率分布的深度假设值采样——>多视图一致性权重匹配——>通过G-Net更新概率分布参数)可以得到 N i t e r N_{iter} Niter 个预测结果;在每次迭代中计算式2的NLL损失,每次迭代计算得到的NLL损失乘以 γ N iter − i \gamma^{N_{\text {iter }}-i} γNiter −i (后面的权重大于前面的),这些损失的总和用来训练G-Net与可学习的山采样模块;
这种迭代的策略有两个好处: (1)如果在某一次迭代过程中,某个像素点的匹配分数较高,那么深度假设空间的均值会向该像素的预测深度值聚拢且方差会减小,那么在下一次的迭代过程中会在上一次的最价值附近寻找深度假设空间,这样可以带来更高的匹配分数;(2)迭代更新还可以防止D-Net预测不准确时导致模型坍塌,比如某像素点的Ground True不再初始的深度假设空间的搜索范围 [ μ u , v − β σ u , v , μ u , v + β σ u , v ] [\mu_{u,v}-\beta \sigma_{u,v}, \mu_{u,v} + \beta \sigma_{u,v}] [μu,v−βσu,v,μu,v+βσu,v]内,没有任何一个候选的深度值可以得到很高的匹配分数,这种情况下G-Net会通过减小式2的NLL损失值来得到更大的方差值,在下一轮的迭代中可以在更宽的范围内寻找深度值;