【论文精读1】MVSNet架构各组织详解

news2024/12/24 8:54:13

在这里插入图片描述

一、训练流程

1. 特征提取

提取N个输入图像的深层特征用作深度匹配

与传统三维重建方法类似,第一步是提取图像特征(SIFT等特征子),不同点在于本文使用8层的卷积网络从图像当中提取更深层的图像特征表示,网络结构如下图所示:

输入:N张3通道的图像,宽高为W,H
输出:N组32通道图,每通道尺度为H/4,W/4

虽然特征提取后图像帧缩小,但每个剩余像素的原始相邻信息已经被编码到32通道像素描述符中,防止了密集匹配丢失有用的上下文信息。

【就是尺寸变小但是通道数增加,不同的通道可以保存更多有用的信息】

在计算机视觉中,图片的比例取W/4和H/4是因为在一些特定的任务和网络架构中,使用降低的尺寸可以提高计算效率,并且有助于提取更高级的特征。

通常,处理全尺寸图像可能会导致计算负荷过大和内存占用过高的问题。通过将图像尺寸缩小为原尺寸的1/4,可以显著减少计算和内存需求,加速模型的训练和推理过程。

此外,采用缩小尺寸的图片还有助于网络模型更好地感知和捕捉图像中的重要细节和特征。尺寸缩小会导致图像信息丢失,但同时也可以通过允许更大的**感受野( receptive field)**来提取更宽广的上下文信息,从而帮助网络学习到更具有区分性的特征。

2. 构建特征体(Feature Volume)

将提取的特征图和输入图建立一个3D成本体积(之前方法使用的体积或者点云重建,本文使用深度图重建)

2.1 单应性变换

实现端到端训练

单应性变换(Homography Transform)是指在平面几何中,将一个平面上的点集映射到另一个平面上的点集的线性变换。它是一种二维投影变换。

单应性变换简单来说,对于3D空间的点X,我们通过相机1拍照,得到照片1上的对应二维像素点P(x,y);在另一个位置用相机2拍照,得到照片2上的对应二维像素点P’(x’,y’)——通过一个正确的单应矩阵H(包含相机1,2的位置转换参数R,T、相机1到点X的距离d),可以实现P’ = HP(点到点的映射)。即在已经提前获取相机的内外参数前提下,因此只需要一个深度值变量,就可以找到参考图像上点P对应在源图像上点P’的位置。

在这里插入图片描述

若我们已知两个位姿的相机参数(相机1,2的位置转换参数),现在设置一个深度区间[d1,d2],并设置分辨率为Δd,由此得到D=(d2-d1)/Δd个平面,那么每个d都对应了一个单应变换矩阵h。
如果对一张图片上每个像素点,使用di对应的矩阵hi进行变换可以得到一张变换后的图片,意义为假设各个像素点真实深度都为d时,在另一位姿下各像素点的应有的对应特征值。
而我们假设了D个深度,也即将得到D幅变换后的图像,各图代表了其像素点真实深度为当前深度时变换对应的特征值,即可理解为上图中各层蓝色由深变浅的图层。

为什么是“锥形视锥”,因为当单应矩阵对应的真实深度不同时,由近大远小原理可知能被当前位置的相机看到的特征点数量随着深度减小而减小,因而出现锥形。(在下一步构建特征体时使用了双线性插值来保证所有深度的特征图尺寸一致)

2.2 特征体构建

在这里插入图片描述

在本文当中,我们通过特征提取得到的是N个特征图(1个参考图(估计图)、N-1个原图(辅助图)),每个特征图有32通道。
每个特征图可以理解为一本书,有32页,每页尺寸是HxW
那么,一本书(一个特征体)通过2.1中的单应变换就变成了一摞书,等于将原来第一页通过深度为[d1,d2]的矩阵[h1,h2]变换成n个深度下的第一页,将原来第二页变成n个深度下的第二页……
此时,一本书 = 某深度d
书的某页 = 某深度下某特征通道
书的某页上某字 = 某深度下某特征通道某点的特征

将src(参考图)坐标系下的特征图投影到ref(估计图)坐标系,分别构建cost volume

需要注意的是,对于Ref的特征图则是直接在每个深度下复制,因为多个Src都是要变换到这个参考图下的

待估计的图像称为reference_image(ref),其余视角下的辅助图像称为source_image(src)

**Ref特征图(Ref Feature Map)**是一种用于图像超分辨率重建的中间表示。在图像超分辨率重建任务中,Ref特征图是通过神经网络从低分辨率输入图像中提取的一组特征图。

Ref特征图通常由多个通道组成,每个通道包含不同的特征信息。这些特征信息可以包括低级的边缘、纹理信息,以及更高级的语义信息。通过对这些特征进行处理和合成,可以提取出有关图像结构和内容的高级表示。

在图像超分辨率重建中,Ref特征图扮演着关键的角色。它被用来模拟低分辨率输入图像的高分辨率版本,并指导神经网络生成相应的重建图像。Ref特征图能够捕捉低分辨率图像中的细节、边缘和纹理信息,以及其与高分辨率图像之间的对应关系,从而帮助提升重建图像的质量和细节保持程度。

通过结合Ref特征图和其他网络模块,如超分辨率网络或生成对抗网络,可以实现图像超分辨率重建任务。Ref特征图的准确性和有效性对于最终的重建结果具有重要影响。因此,设计和提取有意义的Ref特征图是图像超分辨率重建算法中的关键挑战之一。

3. 生成代价体(Cost Volume)

在这里插入图片描述

经过上一步后我们得到了不同视角下的cost volume。由于我们不想固定src图像的数量(能够接受任意N个输入的原因),为了提高模型的泛化性,作者采用了基于方差的特征融合方法

适应任意数量的输入视图(选择了“方差”运算,因为“均值”运算本身没有提供关于特征差异的信息)

通过第2步我们得到了N摞书,现在竖着看每摞书的第一本,代表了假设深度为d1时,各特征图上各像素经过变换后的特征值——若某个像素真实深度接近d1的话,那变换后该列该处的特征值应该是近似的
基于这样的想法,对每一列书的每一页上的每个像素计算方差,代表了假设深度为di时,各图像特征图的各通道各特征点的差异情况,方差越小,越相似,该特征点真实深度就越可能是di。

该步得到了一摞书,每本书 = 一个深度
每页 = 某深度下特征图一个通道
页上的点 = 该深度下特征图某通道上点的相似程度,方差越小越相似

这里就是论文所说能够接受任意N个输入的原因,因为是取方差所以输入几个都一样。

代价体(Cost Function)也被称为损失函数(Loss Function)或目标函数(Objective Function)。它是用于衡量模型预测结果与真实值之间差异的一种函数。 在本节中指的就是对特征图的同一通道上的个点求的方差

4.代价体正则化(Cost Volume Regularization)

正则化步骤旨在细化上述成本体积C,以生成用于深度推断的概率体积P

受物体表面材质、物体遮挡等影响,上述融合后的cost volume可能包含噪声或在部分遮挡地区存在匹配错误的情况。作者利用了一个类似于3D-Unet的网络对cost volume在channel上进行归一化操作。这样,原先像素上每个depth上对应一个向量,经过归一化后对应了一个数。这个数的含义可以理解为:像素对应的深度为depth的概率

在第3步中得到了代价体,但论文说 “The raw cost volume computed from image features could be noise-contaminated” ,即这个代价体由于非朗伯面、遮挡等原因是包含噪声的,要通过正则化来得到一个概率体P(probability volume),具体采用了一个类似UNet的网络结构,对原代价体进行编码和解码,并最终将各通道数压缩为1,即将一摞书变成了一本书

在这里插入图片描述

此时书 = 概率体
每页 = 某深度
页上的点 = 该点在该深度的概率

如对(H,W)平面上的一点(x,y),若在深度d处值最大,该点深度为d

Softmax函数是一种常用的激活函数,常用于多类别分类任务中。它的基本原理是将输入的实数向量转换为一个概率分布向量,使得每个元素都表示对应类别的概率。

Softmax函数的计算公式如下:
softmax(x_i) = exp(x_i) / sum(exp(x_j))

其中,x_i是输入向量的第i个元素,exp表示自然指数函数,sum(exp(x_j))是计算所有输入元素的指数的和。

Softmax函数的基本思想是通过对每个元素进行指数转换,使得每个元素的值变得非负。然后,将这些转换后的值除以所有元素的和,以确保概率分布的归一化。

Softmax函数的作用是使得输入向量的每个元素的取值范围在0到1之间,并且所有元素的和等于1。这样可以表示每个元素对应类别的概率,用于多类别分类问题中的决策和预测。

把多个通道特征压缩成一个通道,直观想法是保留其中方差最小(最可能属于当前深度)的那个通道的特征,然后方差越小说明这个像素点的深度越可能是当前层深度;但文章说是出于噪声目的试用网络来正则化获得最终的概率体,不太理解为什么要用这个UNet网络。

我感觉实际上就是通过softmax回归来保留概率最大的那个通道的特征

CostRegNet网络:

class CostRegNet(nn.Module):
    def __init__(self):
        super(CostRegNet, self).__init__()
        self.conv0 = ConvBnReLU3D(32, 8)
		# 为了进一步减少计算量,在第一个3D卷积层之后,我们将32通道的开销体积减少到8通道,并将每个尺度内的卷积从3层改为2层
        self.conv1 = ConvBnReLU3D(8, 16, stride=2)
        self.conv2 = ConvBnReLU3D(16, 16)

        self.conv3 = ConvBnReLU3D(16, 32, stride=2)
        self.conv4 = ConvBnReLU3D(32, 32)

        self.conv5 = ConvBnReLU3D(32, 64, stride=2)
        self.conv6 = ConvBnReLU3D(64, 64)

        self.conv7 = nn.Sequential(
            nn.ConvTranspose3d(64, 32, kernel_size=3, padding=1, output_padding=1, stride=2, bias=False),
            nn.BatchNorm3d(32),
            nn.ReLU(inplace=True))

        self.conv9 = nn.Sequential(
            nn.ConvTranspose3d(32, 16, kernel_size=3, padding=1, output_padding=1, stride=2, bias=False),
            nn.BatchNorm3d(16),
            nn.ReLU(inplace=True))

        self.conv11 = nn.Sequential(
            nn.ConvTranspose3d(16, 8, kernel_size=3, padding=1, output_padding=1, stride=2, bias=False),
            nn.BatchNorm3d(8),
            nn.ReLU(inplace=True))
# 最后一个卷积层输出1通道体积
# in_channels=8,out_channels,kernel_size=3,stride=1,padding=1
        self.prob = nn.Conv3d(8, 1, 3, stride=1, padding=1)

    def forward(self, x):
        conv0 = self.conv0(x)
        conv2 = self.conv2(self.conv1(conv0))
        conv4 = self.conv4(self.conv3(conv2))
        x = self.conv6(self.conv5(conv4))
        x = conv4 + self.conv7(x)
        x = conv2 + self.conv9(x)
        x = conv0 + self.conv11(x)
        x = self.prob(x)
        return x

5. 深度图初始估计(Depth Map Initial Estimation)

在这里插入图片描述

利用第4步的概率体, 将深度估计的质量定义为地面实况深度在估计附近的小范围内的概率。 沿深度d方向(就是上一步中softmax概率最大的深度)求期望,就得到对应像素点的初始深度值;

对每个像素点求期望,即将概率体变成了一张概率图。

6. 深度图优化(Depth Map Refinement)

在这里插入图片描述

应用了深度残差学习网络 (ResNet) 就是将输入直接连到后面的层,使得后面的层可以直接学习残差。

初始深度图和调整大小的参考图像(将其缩小1/4)被连接为4通道输入,然后通过三个32通道2D卷积层,然后通过一个1通道卷积层来学习深度残差。然后将初始深度图添加回以生成细化的深度图。最后一层不包含BN层和ReLU单元,以便学习负残差。此外,为了防止在某个深度尺度上产生偏差,我们将初始深度幅度预先缩放到[0,1]范围,并在细化后将其转换回 。

?为什么融合以后就成4通道了

参考图-》src

感受野(Receptive Field)是指在神经网络模型中,一个特定层的输出值受输入图像区域的影响范围。它代表了一个特定位置的输出值对输入图像上不同位置的感受程度。

在卷积神经网络(Convolutional Neural Network, CNN)中,每一层都由多个卷积核或滤波器组成,这些滤波器对输入数据进行卷积操作,以提取特征。每个滤波器对应一个感受野。

感受野的大小取决于网络的结构和每一层的设计。通常,感受野的大小由卷积核的大小和网络层数决定。在较低层,感受野相对较小,只能捕捉到少量的局部特征。随着网络的深层化,感受野逐渐增大,可以捕捉到更大范围的特征和上下文信息。

感受野的概念有助于理解和解释神经网络的输出是如何受到输入图像的局部和全局信息影响的。通过增加网络的深度和扩大感受野的范围,网络可以更好地理解和解析输入图像中的语义信息,提取更高级的特征。

在一些任务中,特别是目标检测和图像分割等任务中,感受野大小的合理选择对于捕捉目标的上下文信息和边界特征至关重要。较小的感受野可能导致模型在处理大物体或全局上下文时失去一些细节和全局信息,而较大的感受野可能对于捕捉局部细节和小目标不够敏感。因此,在网络设计中需要根据任务和数据的特点合理选择感受野的大小。

7. 损失计算

使用地面实况深度图和估计深度图之间的平均绝对差作为我们的训练损失

只考虑那些具有有效地面实况标签的像素

在这里插入图片描述

loss1:

在这里插入图片描述

二、后处理

论文在摘要中提到*“With simple post-processing”*之后模型效果很好,这个post-processing主要包括深度图滤波和深度图融合两部分-》 即在将结果转换为密集点云之前,有必要过滤掉这些背景和遮挡区域的异常值

1. 深度图滤波(Depth Map Filter)

在这里插入图片描述

1.1 光度约束

光度一致性衡量匹配质量

光度约束,其实是在通过概率体得到初始深度图的同时计算了一个概率图

在这里插入图片描述

各像素点的深度越集中在某个深度附近,则该点深度判断的准确概率越高,最后过滤掉概率小于0.8的点。

1.2 几何约束

几何约束度量多个视图之间的深度一致性

首先几何约束比较简单,就是说将参考点p1通过其估计深度d1投影至源视角pi点,再将pi点通过其深度估计di重投影至参考视角preproj点,这个重投影后的preproj点深度估计为dreproj,若满足

∣ p r e p r e j − p 1 ∣ < 1 ∣ d r e p r o j − d 1 ∣ d 1 < 0.01 | p _ { r e p r e j } - p _ { 1 } | < 1 \quad\frac { | d _ { r e p r o j } - d _ { 1 } | } { d _ { 1 } } < 0 . 0 1 preprejp1<1d1dreprojd1<0.01

则说是满足几何约束的( 我们说p1的深度估计d1是两视图一致的 ),论文里保证三视图满足该几何约束一致性。

2. 深度图融合(Depth Map Fusion)

在这里插入图片描述

即在多个视角下推测深度图,并采取特定融合算法融合;其中每个深度图的像素深度选择是使用了几何约束时计算的重投影的均值作为最终深度估计。

三、总结

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1148901.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ProEssentials pro v9 历史更新列表--注册版

ProEssentials标准版和专业版之间的唯一区别是可以渲染的数据点和注释的数量。标准版与专业版一样拥有所有的功能和接口。所有版本包括WPF、WinForm、WebForm、ActiveX、VCL和DLL接口。标准版仅限于8000个数据点和800个图表注释。此限制适用于每个控件实例。你可以运行多个控件…

《数字图像处理-OpenCV/Python》连载(33)使用掩模图像控制处理区域

**本书京东优惠购书链接&#xff1a;https://item.jd.com/14098452.html** **本书CSDN独家连载专栏&#xff1a;https://blog.csdn.net/youcans/category_12418787.html** 第 5 章 图像的算术运算 在OpenCV中&#xff0c;图像是以Numpy数组格式存储的&#xff0c;图像的算术运…

抓包分析DSCP字段在FTP/RSTP协议中的应用

抓包分析DSCP字段在FTP协议中的应用 简介 本文介绍DSCP字段的作用&#xff0c;以及抓包分析DSCP字段在FTP协议中的应用。最后通过实验证明有可能DSCP字段实际上对普通用户没啥用&#xff0c;原因是运营商可能会将用户设置的DSCP字段重置。 DSCP IP报文中有个TOS字段 &#…

C语言选择排序

1.选择排序(Selection sort) 选择排序是简单直观的排序算法。 基本思想&#xff1a;从首元素开始&#xff0c;首元素与它后面的所有元素进行比较&#xff0c;找到数列中最小的元素&#xff0c;与首元素值交换。然后下一个元素与它后面的元素比较&#xff0c;得到第二小的元素…

Zynq UltraScale+ XCZU5EV 纯VHDL解码 IMX214 MIPI 视频,2路视频拼接输出,提供vivado工程源码和技术支持

目录 1、前言免责声明 2、我这里已有的 MIPI 编解码方案3、本 MIPI CSI2 模块性能及其优越性4、详细设计方案设计原理框图IMX214 摄像头及其配置D-PHY 模块CSI-2-RX 模块Bayer转RGB模块伽马矫正模块VDMA图像缓存Video Scaler 图像缓存DP 输出 5、vivado工程详解PL端FPGA硬件设计…

C语言实现输入 n 个字符串,把其中以字母 A 打头的字符串输出

完整代码&#xff1a; // 输入 n 个字符串&#xff0c;把其中以字母 A 打头的字符串输出。 #include<stdio.h> #include<stdlib.h> //字符串的最大长度 #define N 20int main(){int n;printf("请输入字符串个数n:");scanf("%d",&n);//读取…

使用OBS Browser+访问华为云OBS存储【Windows】

背景 项目中使用华为云 S3 存储,java 代码中通过华为云 OBS 提供的esdk-obs-java 来访问文件。 但是,通过 JAVA SDK 方式不太方便运维,所以我们需要一款可视化的客户端软件。 华为云 OBS 自身也提供了一款客户端软件,名为 OBS Browser+。 OBS Browser+简介 OBS Browse…

【洛谷算法题】P5709-Apples Prologue / 苹果和虫子【入门2分支结构】

&#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5709-Apples Prologue / 苹果和虫子【入门2分支结构】&#x1f30f;题目描述&am…

深入理解指针3

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 1. 字符指针变量 2. 数组指针变量 2.1 数组指针变量是什么&#xff1f; 2.2 数组指针变量怎么初始化 3. 二维数组传参的本质 4. 函数指针变量 4.1 函数指针变量的创…

比亚迪应届生爆料,真实的工作状态!

一位比亚迪的应届生发帖子称&#xff0c;校招入职比亚迪一个月&#xff0c;爱上了这里的工作文化&#xff0c;不怎么加班&#xff0c;工作日常就是开会对问题&#xff0c;顺便吵架扯皮&#xff0c;不用写令人头疼的代码&#xff0c;但是却拿着高工资&#xff0c;感觉现在的生活…

详解类生到死的来龙去脉

类生命周期和加载过程 一个类在 JVM 里的生命周期有 7 个阶段&#xff0c;分别是加载&#xff08;Loading&#xff09;、校验&#xff08;Verification&#xff09;、准备&#xff08;Preparation&#xff09;、解析&#xff08;Resolution&#xff09;、初始化&#xff08;Ini…

C++ 内存

内存分区模型 代码区&#xff1a;存放函数体的二进制代码&#xff0c;由操作系统进行管理全局区&#xff1a;存放全局变量和静态变量以及常量栈区&#xff1a;由编译器自动分配释放&#xff0c;存放函数的参数值、局部变量等堆区&#xff1a;由程序员分配和释放&#xff0c;若…

C#,数值计算——分类与推理Svmlinkernel的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { public class Svmlinkernel : Svmgenkernel { public int n { get; set; } public double[] mu { get; set; } public Svmlinkernel(double[,] ddata, double[] yy) : base(yy, ddata) …

SSM游戏购物商城

摘 要 信息化爆炸的时代&#xff0c;互联网技术的指数型的增长&#xff0c;信息化程度的不断普及&#xff0c;社会节奏在加快&#xff0c;每天都有大量的信息扑面而来&#xff0c;人们正处于数字信息化世界。数字化的互联网具有便捷性&#xff0c;传递快&#xff0c;效率高&am…

二叉树问题——前/中/后/层遍历(递归与栈)

摘要 博文主要介绍二叉树的前/中/后/层遍历(递归与栈)方法 一、前/中/后/层遍历问题 144. 二叉树的前序遍历 145. 二叉树的后序遍历 94. 二叉树的中序遍历 102. 二叉树的层序遍历 二、二叉树遍历递归解析 // 前序遍历递归LC144_二叉树的前序遍历 class Solution {publi…

一键转换:将mp4视频批量转换为mov格式

在视频编辑和后期制作领域&#xff0c;不同的视频格式往往有着各自的优势和适用场景。其中&#xff0c;MP4和MOV是两种常见的视频格式&#xff0c;它们都具有广泛的应用。有时候&#xff0c;为了满足特定的需求或兼容性&#xff0c;我们需要将MP4视频批量转换为MOV格式。为了实…

力扣第738题 单调递增的数字 c++ 暴力超时 贪心优化

题目 738. 单调递增的数字 中等 相关标签 贪心 数学 当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时&#xff0c;我们称这个整数是单调递增的。 给定一个整数 n &#xff0c;返回 小于或等于 n 的最大数字&#xff0c;且数字呈 单调递增 。 示例 1: 输入: n 1…

在虚拟环境中,通过pip安装tensorflow

目录 激活python虚拟环境&#xff0c;更新pip 通过pip 安装tensorflow 确定python版本&#xff1a; ​编辑安装tensorflow: ​编辑 为什么使用pip安装tensorflow? 激活python虚拟环境&#xff0c;更新pip 命令为python -m pip install --upgrade pip 通过pip 安装tensorf…

WLAN的组网架构和工作原理

目录 WLAN的组网架构 FAT AP架构 AC FIT AP架构 敏捷分布式AP 下一代园区网络&#xff1a;智简园区&#xff08;大中型园区网络&#xff09; WLAN工作原理 WLAN工作流程 1.AP上线 &#xff08;1&#xff09;AP获取IP地址&#xff1b; &#xff08;2&#xff09;AP发…

网络协议--TCP的保活定时器

23.1 引言 许多TCP/IP的初学者会很惊奇地发现可以没有任何数据流通过一个空闲的TCP连接。也就是说&#xff0c;如果TCP连接的双方都没有向对方发送数据&#xff0c;则在两个TCP模块之间不交换任何信息。例如&#xff0c;没有可以在其他网络协议中发现的轮询。这意味着我们可以…