MVSNet-pytorch版本理解与使用

这篇具有很好参考价值的文章主要介绍了MVSNet-pytorch版本理解与使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

0 算法来源

        GitHub - xy-guo/MVSNet_pytorch: PyTorch Implementation of MVSNet

        小于8g的显存是跑不了的!!!连test都跑不了,过不了cost volume这一关。

1 算法理解

        1.1 宏观把握

        输入:一些已知相机内参、外参的图片(往往这时候已经用colmap等做过一遍sfm,从而获取到了相机的内参和外参)

        过程:1)把图片重新分组,1 reference image + N source image ,source image是为了与测reference image的,最终输出的深度图对应reference image;2)将source homograph(变换)到reference上(在不同深度下),理论上,对于某一个像素来说,如果深度正确(其中一个深度),不同图像(不同特征体)上的像素值是相同的  3)相当于就能看到同一点在不同图像上的像素坐标对应关系,从而解算出每一点的深度 

        理论上,如果深度正确,这两张图片应该是完全相同的?

        这句话正确吗???应该怎么理解homograph的目的。

        

        输出:图片的深度图,在rgb之外,还加入了第四维的depth信息。

        1.2 具体过程细节

           1.2.1 从论文的角度来理解算法

理解MVSnet_朽一的博客-CSDN博客尽管网络上有很多关于MVSnet的文章,但一些细节部分还是让人很难理解,在这里给出自己的理解,如有错误,敬请指正https://blog.csdn.net/qq_43027065/article/details/116641932

https://blog.csdn.net/weixin_43013761/article/details/102869562https://blog.csdn.net/weixin_43013761/article/details/102869562

MVSNet-pytorch版本理解与使用

MVSNet-pytorch版本理解与使用

          (1)Feature extraction

MVSNet-pytorch版本理解与使用

        输入:1+N张图像(图像尺寸相同)假设为W*H

        通过7层卷积,用stride=1保证粒度(提取不同级别的图片特征),用stride=2降低粒度,最终得到可以得到三个尺寸的特征图,原大小(3channel to 8 channel)、1/2原大小(8 channel to 16 channel),1/4原大小(16 channel to 32 channel)。在减小大小的同时扩大channel数。

        由于在这里图片尺寸变为了原来的1/4。那么相应的相机内参也应该缩小为1/4,变成K/4。图片等比例的改变大小,必须要同时调整内参,这样才能够保证相对应关系

        (2)Differentiable homography

MVSNet-pytorch版本理解与使用

         可微分的单应性变换(为什么要可微分,因为要做到端到端的深度学习训练

        目标:将所有的source image都换到reference image图像的视角下。从而可以让这些同一视角下的特征图来计算视差。

        单应性矩阵描述了source image和 reference image对应点的像素变换关系

        输入:1+N个view下的1+N个特征图(W/4,H/4,C)(此时每张图片的视角是不同的)

        输出:通过单应性变换,生成同一锥形立体空间下的1+N个特征体(W/4,H/4,C,D)

        为什么还有个D,因为每个深度都会对应一个单应性矩阵。也就是假设图上的点可能在D个深度下,为什么D个深度就可以估计一个连续的空间呢,因为每个深度的概率是不一样的,所以加权之后就是一个连续的空间了

        这样一个特征图通过D个单应性变换,就会生成D个特征图,他们统一被称作一个特征体

        这样一个特征体在实际上是分布在一个视角下的锥形立体空间中的,但实际上每张图的像素尺寸都是一样的,所以从数据上看,是一个长方体

        这里还用到了双线性插值,对于找不到的对应点(对应点超出了特征图宽高边界),用插值填充。为了尽量减少找不到对应点的情况,图像的重叠度应该比较高,所以不可以用太多的source image,太多了对应点就不好找了

        对于reference image feature,其实就是复制D份。为后续的代价度量做准备。

        (3)Variance metric(方差计算)

MVSNet-pytorch版本理解与使用

         目标将1+N个特征体合并为一个特征体,这个特征体能够度量1+N个特征体之间的差异。进一步来说,就是度量一个特征图的所有点在D个深度上的相似度

        想法缘起

        如果假设深度接近实际深度值,那么找到的对应点更准确,所有特征图在同一位置的特征相似性高,反之相似性低。即特征的相似性度量可以判断深度假设接近实际深度值的程度。

        那么怎么衡量相似度呢?可以用方差。方差反映了一组数据的波动情况,即数据越相似,方差越小。

        MVSNet-pytorch版本理解与使用

        (4)cost volume regularization  代价空间正则化

        

MVSNet-pytorch版本理解与使用

         目标:从代价空间C得到概率空间P,也就是把channel这个维度压缩掉。变成(W/4,H/4,D)

        为什么要用这么一个U-NET一样的架构呢,因为他其实只是个最简单的编解码器,编解码能够实现什么效果?就是让信息从一种状态变成另一种状态。如果我们希望让数据换一种分布,或者产生出一种新信息(比如说逐点像素的类别概率——这就是最经典的unet分割算法)。通过skip connection(直接加起来)能够跨层传递信息,让解码的时候能够获得一些之前的信息,否则从小到大会有很多空白信息要预测,就很不准。还能够从一个大的感受野聚集相邻的信息

        总共做了三步:

        1)通过三维卷积对代价空间正则化,让深度的取值集中起来,变成单峰分布

        2)在三维卷积的最后一步是把channel=1(原来的channel是32),这个时候,在哪个D上的值最小(方差最小,就认为他是最可能属于这个深度)

        3)沿D方向做一个概率归一化(类似softmax),这样就得到了最终的概率空间P

        (5)深度图初始估计

        

MVSNet-pytorch版本理解与使用

         目标:从概率空间P中获取深度图(变成W,H,1)

        也就是沿D方向计算期望,就是D*概率,做一个加权。期望值就是该点的深度估计。

        MVSNet-pytorch版本理解与使用

        (6)获取概率图(对深度图进行过滤,滤去那些估计不准的点)

        MVSNet-pytorch版本理解与使用

        计算方式:对概率空间,沿深度维度计算每四个邻域的概率和,再沿深度维度取最大的概率和。(可能就是准则?)

        概率图上的点概率越高,越表示更单峰一些,那么就说明这个位置深度估计的有效性越高

        (7)深度图优化(主要是对边界处的深度预测更准一些)

        因为取了期望,所以边缘会比较平滑。

        所以把参考图像拿过来,加一些初始的残差进去,可能会克服边缘的过于平滑的问题,但似乎最终在其他实验上被证明是意义不大的。

        MVSNet-pytorch版本理解与使用

        原始图像和原始深度叠加在一起,然后过卷积层,转换一下特征空间,形成深度图的残差

        这时候再和初始深度图加一起,形成了最终的优化后深度图。

        此外,为了保证特定的深度尺度,初始深度的幅度被归一化到0-1,而在refine后被重新变换回来。

        深度尺度的问题?????????

        

        1.2.2 从代码的角度来理解算法

        【代码精读】开山之作MVSNet PyTorch版本超详细分析【三维深度学习】多视角立体视觉 MVSNet代码解读_hitrjj的博客-CSDN博客_mvsnet

        (1)数据输入与处理

        对于DTU数据集,输入图像会被减小32倍,包括了初始的下采样和构建特征图的下采样。
        首先将图像从1600x1200变为800x600,而后裁剪成640x512。(所以这时候才需要内参变成1/4)。

        参考视角上生成了256个深度[425mm:2mm:935mm].

        (n)深度图的后处理阶段

        在后处理阶段需要进行局外点滤波深度图融合得到最终的结果。

        利用了光度和几何的连续性来对局外点进行剔除。

        光度连续性在模型中概率小于0.8的点被视为局外点。

        几何连续性:通过重投影误差的计算,只有满足MVSNet-pytorch版本理解与使用才能满足连续性的要求,将大多数局外点剔除在最终的结果外,保证结果精度。

        MVSNet-pytorch版本理解与使用

        

2 算法实操

        2.1 环境配置

        (pytorch版本高了会有warning,问题不大)

        python3.6+pytorch1.10(cu113)+torchvision0.11.1(cu113)

        tensorboard + tensorboardX,直接pip install就好了,主要是为了可视化查看训练过程的。

        cv2(opencv-python)

        2.2 demo过程

        2.2.1 demo eval使用

        1)定位到dtu的测试集路径

- DTU_TEST
    - SCAN1 # 某个对象的倾斜摄影图像集
        - IMAGES # 存放n个view(49个)
        - CAM # 存放每个view的相机信息
        - pair # 存放source image和reference image的对应情况
    - SCAN2 # 第二个对象

        2)具体代码(可写成eval.sh,从而直接用bash运行)

DATASET_ROOT="/D/data/zt/3d/DTU_TESTING"  # dtu测试集的位置

CUDA_VISIBLE_DEVICES=0 python eval.py \
    --dataset=dtu_yao_eval \  # 定义加载数据的方法(比如说一张source对应几张reference)
    --batch_size=1 \
    --testpath=$DATASET_ROOT \
    --testlist="lists/dtu/test.txt" \  # 需要被测试的scan的名称
    --outdir="./outputs/baseline_0/" \  # 存放着重建得到的结果
    --loadckpt="./checkpoints/baseline/model_000000.ckpt" $@  

        3)过程问题与解决

        3.1)运行显示找不到深度图什么的。因为eval.py的逻辑就是,先把每个view的深度图都通过MVSNet生成完,然后再根据需求去融合深度图生成ply点云。

        所以需要先运行save_depth()这一步(想生成scan1的ply就得先把scan1每张图的深度图生成完毕)

        3.2) DataLoader worker (pid(s) 20472) exited unexpectedly

        主要是num_worker太大了,对于windows电脑而言,不能执行多线程,所以设置num_worker=0就可以了。但是对于ubuntu系统,可以设置num_worker=4。

        3.3)cuda out of memory

        在构建损失体cost volume的时候显存不够,这也是常有提到的问题(算法本身的弊端)。

        MVSNet本身对显存的占用太大了。

        尝试一下rtx3090的显卡,可以了。

        可以生成ply格式的点云模型了。

        4)结果

        scan009,scan015,scan023,scan024,scan029都是跟建筑相关的小场景。

        可以拿过来先跟colmap做个简单的对比。

        2.2.2 demo train使用

        可以跑的,只不过非常占显存。把batch_size调小一点就能跑了,

        也是直接运行train.sh

        2.3 自己的数据

        1)关键问题

        如何提供mvsnet所需格式的输入,可以用colmap来做

        【colmap】稀疏重建转为MVSNet格式输入 - 达可奈特_Darknet - 博客园 (cnblogs.com)

        2)文章来源地址https://www.toymoban.com/news/detail-418981.html

到了这里,关于MVSNet-pytorch版本理解与使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【图像分类】【深度学习】【轻量级网络】【Pytorch版本】ShuffleNet_V1模型算法详解

    ShuffleNet_V1是由旷视科技的Zhang, Xiangyu等人在《ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices【CVPR-2018】》【论文地址】一文中提出的模型,是一种采用了逐点组卷积和通道混洗的轻量级CNN网络,在保持精度的同时大大降低了计算成本。 一般的卷积是全通道卷

    2024年01月20日
    浏览(37)
  • 图像分类】【深度学习】【轻量级网络】【Pytorch版本】EfficientNet_V2模型算法详解

    EfficientNet_V2是由谷歌公司的Tan, Mingxing等人《EfficientNetV2: Smaller Models and Faster Training【 ICML-2021】》【论文地址】一文中提出的改进模型,在EfficientNet_V1的基础上,引入渐进式学习策略、自适应正则强度调整机制使得训练更快,进一步关注模型的推理速度与训练速度。 随着模型

    2024年01月25日
    浏览(42)
  • 解决DCNv2不能使用高版本pytorch编译的问题

    可变形卷积网络GitHub - CharlesShang/DCNv2: Deformable Convolutional Networks v2 with Pytorch代码已经出来好几年了,虽然声称\\\"Now the master branch is for pytorch 1.x\\\",实际上由于pytorch自1.11版开始发生了很大变化,原来基于C实现的THC封装实现的调用cuda、cudnn和cublas的API(只能用NVIDIA的GPU)被基于C++实

    2024年02月09日
    浏览(27)
  • Mac电脑配置李沐深度学习环境[pytorch版本]使用vscode

    Mac打开终端(Mac电脑如何启动终端?打开启动台,搜索终端即可) 安装包管理工具Homebrew 如果遇到报错 则需要运行一下如下指令,然后再安装Homebrew。原因是被墙,需要配置一下端口。 安装Homebrew成功后,重启终端(Mac电脑如何启动终端?打开启动台,搜索终端即可)直接安

    2024年02月06日
    浏览(37)
  • 如何查看自己使用的Python、CUDA、Pytorch、TensorFlow的版本(Windows)

    1、查看python版本 1)键盘 windows+R键,弹出如下:2、  2)点击确定,弹出如下:  3)输入python,便可输出python版本 2、查看cuda版本 1)打开pycharm编辑器 2)输入: 3)运行后输出:   3、查看pytorch版本 1)打开pycharm编辑器 2)输入: 3)运行后输出:     4、查看tensorflow版本

    2024年02月08日
    浏览(40)
  • 为什么分类问题不能使用mse损失函数,更容易理解版本

    分类问题通常不适合使用均方误差(Mean Squared Error,MSE)损失函数,原因如下: 输出差异的度量不同:MSE损失函数是基于预测值和真实值之间的差异的平方和进行计算的,适用于回归问题(建立一个模型来预测连续数值输出的问题, eg: 房价预测;股票价格预测…),其中

    2024年04月26日
    浏览(26)
  • ubuntu22.04下使用conda安装pytorch(cpu及gpu版本)

    本文介绍了conda下安装cpu、gpu版本的pytorch;并介绍了如何设置镜像源 系统:ubuntu22.04 显卡:RTX 3050 依赖工具:miniconda 注意:默认conda安装pytorch的是cpu版本,如需要安装GPU版本的,注意直接看后面 创建一个新conda环境 新创建的环境不包含任何依赖可以使用 conda list 查看一下

    2024年02月20日
    浏览(29)
  • Win10使用Anaconda搭建Pytorch1.6.0(CPU指定版本)虚拟环境

    近期在阅读一篇关于跨域推荐中用户冷启动问题的论文《Cross-Domain Recommendation to Cold-Start Users via Variational Information Bottleneck》。 在死磕文章算法的时候发现自己属于“懂-不懂-懂-不懂…”的无限循环中,突发奇想“是否可以通过代码辅助理解文章算法?”于是开始琢磨起了论

    2024年02月04日
    浏览(45)
  • 在Anaconda下安装并使用Pytorch,pillow,numpy等库及Python版本的匹配

    目录 1.在Anaconda Prompt创建新环境 2.去pytorch官网上查找环境中Python所对应的pytorch版本并下载相关包 查询电脑独立NVIDIA显卡所适配的CUDA版本 CUDA版本查询 3.部分库版本的安装与修改  本人在Anaconda下创建的新环境为 python 3.7.0 pytorch 1.8.0 pillow 9.5.0 numpy 1.21.5 能够正常运行 如果我这

    2024年02月15日
    浏览(29)
  • 使用Pytorch实现强化学习——DQN算法

    目录 一、强化学习的主要构成 二、基于python的强化学习框架 三、gym 四、DQN算法 1.DQN算法两个特点 (1)经验回放 (2)目标网络 2.DQN算法的流程 五、使用pytorch实现DQN算法 1.replay memory 2.神经网络部分 3.Agent 4.模型训练函数 5.训练模型 6.实验结果 六、补充说明 强化学习主要由

    2023年04月20日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包