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


视频在 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

  • 24
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyTorch是一个广泛应用于深度学习领域的开源机器学习框架,也被用于三维重建算法的实现。深度学习三维重建算法通常使用PyTorch进行开发和训练。 其中,推荐莫烦的PyTorch教程,可以在B站上搜索莫烦Python来学习PyTorch的基础知识和应用技巧。另外,还有一本书籍《深度学习框架PyTorch:入门与实践》也可以作为深度学习三维重建的参考资料。 在深度学习三维重建领域,一个著名的算法是MVSNet,其源码和PyTorch版实现可以在ECCV-2018的论文中找到。这个算法结合了多视角的图像信息,能够生成高质量的三维重建结果。 此外,关于基于深度学习的最新三维重建算法的综述论文也提供了对近几年相关工作的详细总结,包括网络结构、输入输出和数据集等方面的内容。在阅读具体论文之前,阅读这篇综述论文可以对所有的三维重建算法有一个大致的了解。该综述论文的链接为:https://arxiv.org/pdf/1906.06543v3.pdf。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [基于深度学习的单视图三维重建算法学习路线](https://blog.csdn.net/Yong_Qi2015/article/details/122505161)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [深度学习三维重建 MVSNet-ECCV-2018 (源码、pytorch版、原文、注释、译文、批注)](https://download.csdn.net/download/m0_51233386/88211116)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值