CasMVSNet原理阐述及代码实战

2023-10-30


前言

Cascade Cost Volume for High-Resolution Multi-View Stereo and Stereo Matching

出自CVPR 2020,github链接casmvsnet
下图是我修正后的网络图,更好的帮助大家理解网络
上图是我修正后的网络图


一、论文先进之处

使用多阶段策略,由粗到细的推断深度图
DTU准确度提升了35%,GPU和运行时间降了50%

二、网络结构

1.引入特征金字塔fpn

本网络的输入为原图像与标定的相机位姿,其中位姿信息用于单应性变换原图像用于特征提取。特征提取网络包括两部分,特征金字塔和多尺度聚合模块。特征金字塔可视为一个编码解码结构,通过特征金字塔可以得到三个不同尺度的特征图,顶层特征图包含高层语义特征但缺乏底层的细节;高层的特征图虽然包含特征细节,但缺失足够的语义信息。因此从多个尺度上提取特征能够描述准确的图像特征。根据特征金字塔的上采样及下采样结构,输出的特征图有三个尺度,顶层的特征输出大小为W/4×H/4×32,其中W和H为原图像尺度;中间层尺度大小为W/2×H/2×16;最底层尺度为W×H×8。这三个尺度可成为3个阶段

2.多阶段推断深度图

每一阶段都类似MVSNet,不过第二三阶段估计的是残差深度图,第一阶段估计的是稀疏的深度图

3.多阶段刨析

通过特征提取以后得到了一张参考图像的特征和N-1张源图像的特征,再根据单应性变换,将每一张源图像投影到每一层深度上构成特征体,最后利用插值法使每张投影尺寸相同。理论上每一张参考图像会有N-1个对应的特征体,将这些特征体基于方差的形式构建一个代价体。由于在第一阶段生成的代价体尺度为W/4×H/4×32×48是稀疏的,因此使用的正则网络是3D CNN生成粗糙的深度图并且将场景的深度范围进行了一个估计。
第一阶段得到的深度图作为参考,进行第二阶段的深度图估计。使用中层特征图在剩余深度范围内进行采样深度平面构成剩余代价体,其尺度为W/2×H/2×16×32,使用3DCNN残差深度图,最终生成第二阶段深度图。值得一提的是,在构成剩余代价体时需要使用残差量的单应性变换,公式如下:
在这里插入图片描述
最终的深度图是依靠第二阶段估计的深度图用相同的方式构成剩余代价体,其尺度大小为W×H×8×8,生成最终的深度图。

4.一些问题

本网络获取残差深度图的方式为通过缩小剩余深度获取,这个范围是通过一个系数实现的
我在这里有详细阐述


三、代码刨析

class CascadeMVSNet(nn.Module):  #返回各个阶段的输出深度图与置信度图(附件一个优化深度图)  2022/6/21
    def __init__(self, refine=False, ndepths=[48, 32, 8], depth_interals_ratio=[4, 2, 1], share_cr=False,
                 grad_method="detach", arch_mode="fpn", cr_base_chs=[8, 8, 8]):
        super(CascadeMVSNet, self).__init__()
        self.refine = refine
        self.share_cr = share_cr
        self.ndepths = ndepths
        self.depth_interals_ratio = depth_interals_ratio
        self.grad_method = grad_method
        self.arch_mode = arch_mode
        self.cr_base_chs = cr_base_chs
        self.num_stage = len(ndepths)
        print("**********netphs:{}, depth_intervals_ratio:{},  grad:{}, chs:{}************".format(ndepths,
              depth_interals_ratio, self.grad_method, self.cr_base_chs))

        assert len(ndepths) == len(depth_interals_ratio)

        self.stage_infos = {
   
            "stage1":{
   
                "scale": 4.0,
            },
            "stage2": {
   
                "scale": 2.0,
            },
            "stage3": {
   
                "scale": 1.0,
            }
        }

        self.feature = FeatureNet(base_channels=8, stride=4, num_stage=self.num_stage, arch_mode=self.arch_mode)
        if self.share_cr:
            self.cost_regularization = CostRegNet(in_channels=self.feature.out_channels, base_channels=8)
        else:
            self.cost_regularization = nn.ModuleList([CostRegNet(in_channels=self.feature.out_channels[i],
                                                                 base_channels=self.cr_base_chs[i])
                                                      for i in range(self.num_stage)])
        if self.refine:
            self.refine_network = RefineNet()
        self.DepthNet = DepthNet()

    def forward(self, imgs, proj_matrices, depth_values):
        depth_min = float(depth_values[0, 0].cpu().numpy())
        depth_max = float(depth_values[0, -1].cpu().numpy())
        depth_interval = (depth_max - depth_min) / depth_values.size(1)

        # step 1. feature extraction
        features = []
        for nview_idx in range(imgs.size(1)):  #imgs shape (B, N, C, H, W)
            img = imgs[:, nview_idx]
            features.append(self.feature(img))    #提取参考源图像特征 金字塔结构  2022/6/20

        outputs = {
   }  #各个阶段的输出深度图与置信度图(附件一个优化深度图)  2022/6/21
        depth, cur_depth = None, None
        for stage_idx in range(self.num_stage):  #step 2. 分几个阶段,循环执行多阶段 2022/6/20
            # print("*********************stage{}*********************".format(stage_idx + 1))
            #stage feature, proj_mats, scales
            features_stage = [feat["stage{}".format(stage_idx + 1)] for feat in features]  #feat是一个包含特征金字塔三个阶段的特征图列表,故此步得到所有图片第i层的特征图 2022/6/20
            proj_matrices_stage = proj_matrices["stage{}".format(stage_idx + 1)]
            stage_scale = self.stage_infos["stage{}".format(stage_idx + 1)]["scale"]

            if depth is not None:  #除了第一阶段 ,都会走这  2022/6/21
                if self.grad_method == "detach":  
                    cur_depth = depth.detach()
                else:
                    cur_depth = depth
                cur_depth = F.interpolate(cur_depth.unsqueeze(1),
                                                [img.shape[2], img.shape[3]], mode='bilinear',
                                                align_corners=Align_Corners_Range).squeeze(
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CasMVSNet原理阐述及代码实战 的相关文章

随机推荐

  • 修改linux命令行终端的显示区行数列数

    stty rows 50 columns 200
  • Bugkuctf web 前女友

    老规矩 有新东西就记上一记 题目链接 这个有点儿意思 打开源码 好了 代码意思比较简单 重点看圈住的代码就好 满足v1v2的值不等但是md5相等 且v3 flag才行 好了 新知识来了 首先是md5 函数漏洞 第一种 GET a GET b
  • Web自动化Selenium-获取页面元素的相关信息

    获取页面元素的信息主要有两个目的 一是执行完步骤后进行断言 二是获取前一步骤的响应结果 将其作为后续步骤的输入或判断条件 获取元素的基本信息 目的输出元素的大小 文本 标签名 关键字 tag name 输出元素的标签名 size 输出元素的
  • TCP/IP协议,HTTP协议--面试必备

    经常面试被问到什么是http协议 什么是TCP协议 而且每次都弄不清楚 是时候记录一下了 一 什么是http协议 如果读者对计算机网络的体系结构比较了解的话应该清楚 IP协议位于网络层 TCP UDP协议位于传输层 HTTP位于应用层 如下
  • 本地存储基础

    本地存储特性 1 数据存储在用户浏览器中 2 设置 读取方便 甚至页面刷新不丢失数据 3 容量较大 sessionStorage约5M localStorage约20M 4 只能存储字符串 可以将对象JSON stringify 编码后存储
  • 如何使用Navicat修改mysql用户密码?

    https jingyan baidu com article 455a995054d490a167277858 html 下面介绍如何使用Navicat修改mysql用户密码的具体操作方法 工具 原料 Navicat Premium 方法
  • calico网络策略

    关于优先级order 为了与 Kubernetes 兼容 Calico 网络策略执行遵循 Kubernetes pod 的标准约定 如果没有网络策略适用于 Pod 则允许所有进出该 Pod 的流量 如果一个或多个网络策略应用于类型为 ing
  • TypeError: write() argument must be str, not bytes解决方法

    使用 HTMLTestRunner 输出测试报告 报错 TypeError write argument must be str not bytes 如下 原因 实例化HTMLTestRunner的runner runner HTMLTes
  • tmux插件管理器

    参考 tmux插件管理器tpm Tmux Plugin Manager 安装要求 tmux version 1 9以上 git bash 下载插件管理器 git clone https github com tmux plugins tpm
  • 2023Web自动化测试的技术框架和工具有哪些?

    Web 自动化测试是一种自动化测试方式 旨在模拟人工操作对 Web 应用程序进行测试 这种测试方式可以提高测试效率和测试精度 减少人工测试的工作量和测试成本 在 Web 自动化测试中 技术框架和工具起着至关重要的作用 本文将介绍几种常见的
  • linux实现复制文件的两种方法

    分享在linux系统下拷贝文件的两种方法 方法1 使用系统调用的read和write实现文件拷贝 include
  • 读书笔记: DetNet: Design Backbone for Object Detection

    读书笔记 DetNet Design Backbone for Object Detection 之前咱们不是读了adaptive convolution嘛 赶紧学以致用告诉我们为什么要用AC Abstract 背景 CNN已经被广泛应用于
  • android socket java_Android中Socket通信的实现方法概述

    本文实例简述了Android中Socket通信的实现方法 具体内容如下 一 socket通信概述 通俗的来说套接字 socket 是通信的基石 是支持TCP IP协议的网络通信的基本操作单元 它是网络通信过程中端点的抽象表示 包含进行网络通
  • 程序设计模式(二)创建型模式

    一 一个MAZE的构造过程 Maze的UML diagram如图所示 可以发现MapSite是斜体表示抽象类 有Room Door Wall三个子类继承 这三个就是用继承封装了MapSite的多向性 然而一个Maze 就是Room的聚合 所
  • JVM垃圾收集器-对比Serial、Parallel、CMS和G1

    4个Java垃圾收集器 错误的选择会对性能影响很大 现在很多开发者仍然搞不清垃圾收集器 这一块在Java 8版本的改动也比较大 特别是去掉了PermGen永久代和带来一些新的让人激动的优化 提到垃圾收集 大多数人在每天的编程工作中都会用到并
  • 从键盘读入个数不确定的整数,并判断读入的正数和负数的个数,输入为0时结束程序。(题目类型:没有明确循环次数)

    import java util Scanner 从键盘读入个数不确定的整数 并判断读入的正数和负数的个数 输入 为0时结束程序 public class ForWhileTest public static void main Strin
  • 安卓手机免root本地运行青龙面板(ZeroTermux)

    安卓手机免root本地运行青龙面板 网盘下载 https www 123pan com s EZ6KVv J41Gd html提取码 4444 ZeroTermux https od ixcmstudio cn repository mai
  • Android进阶知识树——Android四大组件启动过程

    Android的四大钻无论对开发者或是用户都意义重大 对于用户来说应用就是Activity 用户所能看到的和交互的都发生在Activity中 对于开发者来说四大组件更是开发功能个展示功能的基础和媒介 对于初级开发者每天的工作都在和四大组件打
  • 【数据库CS751:事务处理Transaction Processing(2)】——严格二相锁、事务隔离级别以及现象

    一 严格二相锁 S2PL 二阶段锁 两相锁 事务在第一阶段依次获得锁 第二阶段保持锁 第三阶段依次释放锁 严格二相锁 事务在第一阶段依次获得锁 第二阶段保持锁 第三阶段同时释放所有锁 注意两段协议是为了保证事务的可串行性 保证串行事务的正确
  • CasMVSNet原理阐述及代码实战

    文章目录 前言 一 论文先进之处 二 网络结构 1 引入特征金字塔fpn 2 多阶段推断深度图 3 多阶段刨析 4 一些问题 三 代码刨析 四 网络实战 1 训练 2 测试 前言 Cascade Cost Volume for High R