当前位置:   article > 正文

MVSNet(Pytorch)核心代码和算法讲解(三维重建)_mvsnet三维重建

mvsnet三维重建


视频在 B站

1.Data处理

这里以pytorch版MVSNet为例。
使用DTU training data(Fixed training cameras)

数据集共119个场景(Rectified文件夹中共119个文件,实际128个)
使用49个相机拍摄(Cameras/train文件夹中有49个记录参数的txt文件)
共7个仅光照不同的相同视角照片(Rectified/scan*_train文件夹中有49*7=343个文件)

通过train_dataset = MVSDataset()将上述信息记录在self.metas中,实际训练只使用79个场景,每个场景共7种光照信息和49组(每组10张)src视角,因次self.metas长度为 49 × 7 × 79 = 27097 49\times7\times79=27097 49×7×79=27097

通过enumerate(TrainImgLoader)加载图像和参数信息。

论文中traing使用3视角,因此view_ids长度为3

  1. 加载图片信息,与其他任务(目标检测,跟踪)不同,这里只做了归一化没有水平翻转等操作.
  2. 提取内参外参,并获得投影矩阵 P = K [ R ∣ t ] P=K[R|t] P=K[Rt].
  3. 根据ref_view提取深度值(根据最小深度、深度间隔、深度数量),掩码,和深度

2.特征提取

CNN 没什么好说的
维度由 [ b , 3 , 512 , 640 ] → [ b , 32 , 128 , 160 ] [b,3,512,640] \to [b,32,128,160] [b,3,512,640][b,32,128,160]

可微分的单应性,构建cost volume

All feature maps are warped into different frontoparallel planes of the reference camera to form N feature volumes V i {V_i} Vi

i = 1 i=1 i=1时为ref图像的 V 1 V_1 V1, 就是将ref特征复制 N = 192 N=192 N=192次。
i ≠ 1 i\neq1 i=1时为src图像的 V n V_n Vn,此时是已知 d , P 1 , P 2 d, P_1, P_2 d,P1,P2, 求 r e f f e a t u r e ref_{feature} reffeature投影在 s r c src src平面对应的 s r c f e a t u r e src_{feature} srcfeature,得到warped_src_fea。推导如下:
如图所示单应性变换
已知条件 d , s r c _ p r o j e c t , r e f _ p r o j e c t d, src\_project, ref\_project d,src_project,ref_project, 求ref每个位置投影到src坐标中的每个位置,如图所示将 x 1 → x 2 x_1\to x_2 x1x2 ,这两个点都对应sense中的 X X X
答:

  1. X r e f = d K r − 1 x 1 X_{ref}=dK_r^{-1}x_1 Xref=dKr1x1,如图中虚线表示。
  2. X w = [ R r ∣ t r ] − 1 X r e f X_w=[R_r | t_r]^{-1}X_{ref} Xw=[Rrtr]1Xref,上一步中得到的空间中的点是在ref坐标系中,为了转到src坐标系中,需要先到世界坐标系中做个过度。
  3. X s r c = [ R s ∣ t s ] X w X_{src} = [R_s | t_s]X_{w} Xsrc=[Rsts]Xw,过度完了,直接到src坐标系中。
  4. x 2 = K s X s r c x_2=K_sX_{src} x2=KsXsrc,相机坐标系到像素坐标系变换。
  5. 合并上述公式得到 x 2 = d K s [ R s ∣ t s ] [ R r ∣ t r ] − 1 K r − 1 x 1 x_2=dK_s[R_s|t_s][R_r | t_r]^{-1}K_r^{-1}x_1 x2=dKs[Rsts][Rrtr]1Kr1x1
  6. 其中 K s [ R s ∣ t s ] = s r c _ p r o j K_s[R_s|t_s]=src\_proj Ks[Rsts]=src_proj, [ R r ∣ t r ] − 1 K r − 1 = r e f _ p r o j − 1 [R_r | t_r]^{-1}K_r^{-1}=ref\_proj^{-1} [Rrtr]1Kr1=ref_proj1,这就是proj = torch.matmul(src_proj, torch.inverse(ref_proj)的由来。

代码中xyz = torch.stack((x, y, torch.ones_like(x)))代表上述的 x 1 x_1 x1.
proj_xyz = rot_depth_xyz + trans.view(batch, 3, 1, 1)代表了 x 2 = d K s [ R s ∣ t s ] [ R r ∣ t r ] − 1 K r − 1 x 1 x_2=dK_s[R_s|t_s][R_r | t_r]^{-1}K_r^{-1}x_1 x2=dKs[Rsts][Rrtr]1Kr1x1

使用F.grid_sample函数将 s r c _ f e t u r e src\_feture src_feture填充到 x 2 x_2 x2,就直接得到warp后的V(warped_src_fea)。
随后根据 w a r p e d _ v o l u m e warped\_volume warped_volume,生成 C o s t   v o l u m e Cost\ volume Cost volume,如公式2。

3.cost volume regularization

此步骤的目的是因为上一步生成的 C o s t   v o l u m e Cost\ volume Cost volume受到了噪音污染而且应结合平滑度约束来推断深度图。

正则化步骤是设计是精炼 C o s t   v o l u m e Cost\ volume Cost volume生成 P r o b a b i l i t y   v o l u m e , P Probability\ volume,P Probability volumeP,方式是 3 D   C N N + S o f t m a x 3D\ CNN + Softmax 3D CNN+Softmax,维度为 [ b , 192 , 128 , 160 ] [b,192,128,160] [b,192,128,160]

4.Depth Map Refinement

此步骤的目的是因为正则化步骤中大的感受野引起的过平滑,然而代码中这步没用。
depth计算如公式3。
P r o b a b i l i t y   v o l u m e , P Probability\ volume,P Probability volumeP在错误匹配的像素,它的分布是分散的,因此作者直接简单地取四个最接近深度假设的概率和来衡量估计质量。具体方法如代码所示,最后得到prob_volume_sum4, depth_index, photometric_confidence

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/883705
推荐阅读
相关标签
  

闽ICP备14008679号