经典文献阅读之--NeRF-SLAM(单目稠密重建)

news2024/12/29 7:42:14

0. 简介

最近几年随着深度学习的发展,现在通过深度学习去预估出景深的做法已经日渐成熟,所以随之而来的是本文的出现《Real-Time Dense Monocular SLAM with Neural Radiance Fields》。这篇文章是一个结合单目稠密SLAM和层次化体素神经辐射场的3D场景重建算法,能实时地用图像序列实现准确的辐射场构建,并且不需要位姿或深度输入。核心思想是,使用一个单目稠密SLAM方法来估计相机位姿和稠密深度图以及它们的不确定度,用上述信息作为监督信号来训练NeRF场景表征。代码已经在Github上完成了开源。

【搬】NeRF-SLAM:具有神经辐射场的实时密集单目 SLAM

1. 什么是NeRF

NeRF 是 2020 年 ECCV 上获得最佳论文荣誉提名的工作,其影响力是十分巨大的,不论是后续的学术论文还是商业落地,都引起了大量从业人员的关注。
NeRF 将隐式表达推上了一个新的高度,仅用 2D 的 posed images 作为监督,即可表示复杂的三维场景,在新视角合成这一任务上的表现是非常 impressive 的。当然 NeRF 在其他领域也逐渐开始展露头角,作为新兴的方向,势必也会和传统方法发生碰撞融合,产生新的火花。在B站中有比较详细的课程

NeRF系列公开课01 | 基于NeRF的三维内容生成

首先是一张框架图,梳理了这几篇工作各自的创新点和之间的关联关系,帮助大家有个宏观上的概念。[2][3][4][5]是和SLAM有关的工作,[6][8]和[7][9]分别是渲染加速和训练加速的工作,与SLAM无直接关系,但其加速的部分可能被SLAM用到。

在这里插入图片描述
我们先来熟悉一下NeRF具体含义。简单的来说,NeRF工作的过程可以分成两部分:三维重建和渲染。

  1. 三维重建部分本质上是一个2D到3D的建模过程,利用3D点的位置( x , y , z x,y,z x,y,z)及方位视角( θ , φ θ,φ θ,φ)作为输入,通过多层感知机(MLP)建模该点对应的颜色color( c c c)及体素密度volume density( σ σ σ),形成了3D场景的”隐式表示“。

在这里插入图片描述

我们可以看到上图有一个映射 F F F,这代表了从二维向三维场景的”隐式表示”。也就是所述的MLP网络,由于最终要得到的是一个三维结果,即任意角度观察生成的物体,所以对于体积密度(不透明度) σ σ σ和颜色 c c c有以下定义:

  • 体积密度(不透明度) σ 只与三维位置 x , y , z x,y,z x,y,z有关而与视角方向 d 无关。物体不同位置的密度应该和观察角度无关.可以理解为该像素体无论从哪个角度观察,其本身性质是不变的。
  • 颜色 c 与三维位置 x , y , z x,y,z x,y,z和视角方向 θ , φ θ,φ θ,φ都相关。由于光照等影响,各个角度观察同一个东西肯定颜色不同。

从上面可以得知网络训练出的参数中预测体积密度σ 的网络部分输入仅仅是输入位置 x x x,而预测颜色 c c c的网络输入是视角和方向 d d d
在这里插入图片描述

所以MLP的输入方式如下图所示,每个MLP 网络 F F F会使用 8 层的全连接层(使用 ReLU 激活函数,每层有 256 个通道),处理 3D 坐标 x , y , z x,y,z x,y,z,得到 σ σ σ和一个 256 维的特征向量,然后在用接着用4个全连接层处理,输出颜色 c = ( r , g , b ) c=(r,g,b) c=(r,g,b)
在这里插入图片描述

“显示表示”:3D场景包括Mesh,Point Cloud,Voxel,Volume等,它能够对场景进行显式建模,但是因为其是离散表示的,导致了不够精细化会造成重叠等伪影,更重要的是,它存储的三维场景表达信息数据量极大,对内存的消耗限制了高分辨率场景的应用。
”隐式表示“:3D场景通常用一个函数来描述场景几何,可以理解为将复杂的三维场景表达信息存储在函数的参数中。因为往往是学习一种3D场景的描述函数,因此在表达大分辨率场景的时候它的参数量相对于“显示表示”是较少的,并且”隐式表示“函数是种连续化的表达,对于场景的表达会更为精细。

  1. 渲染部分本质上是一个3D到2D的建模过程,渲染部分利用重建部分得到的3D点的颜色及不透明度沿着光线进行整合得到最终的2D图像像素值。
    在这里插入图片描述
    这部分最重要的就是:可见光的颜色 RGB 就是不同频率的光辐射作用于相机的结果。因此在 NeRF 中认为辐射场就是对于颜色的近似建模。
    在这里插入图片描述
    C ( r ) = ∫ t n t f T ( t ) σ ( r ( t ) ) c ( r ( t ) , d ) d t , w h e r e T ( t ) = ∫ t n t σ ( r ( s ) ) d s C(r)=\int_{t_n}^{t_f}T(t)σ(r(t))c(r(t), d)dt,whereT(t)=\int_{t_n}^{t}σ(r(s))ds C(r)=tntfT(t)σ(r(t))c(r(t),d)dt,whereT(t)=tntσ(r(s))ds
    上面的是式子包含了我们第一部分提到的 σ ( r ( t ) ) σ(r(t)) σ(r(t)) c ( r ( t ) , d ) c(r(t), d) c(r(t),d),其中函数T(t)表示射线从tn到t沿射线累积透射率,即射线从tn到t不碰到任何粒子的概率; r ( t ) = o + t d r(t)=o+td r(t)=o+td,具体含义为视角 o o o发出的方向为 t t t时刻到达点,表达的是位置信息。

由于在计算机中不能连续积分,于是我们采用连续积分,通过采用分层采样的方式对 [ t n , t f ] [t_n,t_f] [tn,tf]划分成均匀分布的小区间,对每个区间均匀采样,并能还原一个连续的场景(类似重要性采样,对整个积分域进行非均匀离散化,较能还原原本的积分分布)。

C ^ ( r ) = ∑ i = 1 N T i ( 1 − e x p ( − σ i δ i ) ) c i , w h e r e T i = e x p ( − ∑ j = 1 i − 1 σ j δ j ) \hat{C}(r)=\sum_{i=1}NT_i(1-exp(-\sigma_i\delta_i))c_i,whereT_i=exp(-\sum_{j=1}^{i-1}\sigma_j\delta_j) C^(r)=i=1NTi(1exp(σiδi))ci,whereTi=exp(j=1i1σjδj)

  1. 在训练的时候,利用渲染部分得到的2D图像,通过与Ground Truth做L2损失函数(L2 Loss)进行网络优化。(即下图的红框部分)
    在这里插入图片描述
    总体来说就是通过输入位姿以及2维图像(用于计算损失),得到3D的体素和不同方向的RGB。但是仍然存在训练细节不够精细,渲染在表示颜色和几何形状方面的高频变化方面表现不佳,训练速度慢等原因,为了进一步提升重建的精度和速度,引入了如下两个策略:
  • 位置编码(Positional Encoding):使得MLP学习到的函数nerf能更好的表示高频信息,使用高频函数将输入映射到更高维度的空间,可以更好地拟合包含高频变化的数据。该高频编码函数为:
    γ ( p ) = ( s i n ( 2 0 π p ) , c o s ( 2 0 π p ) , … , s i n ( 2 L − 1 π p ) , c o s ( 2 L − 1 π p ) ) \gamma(p)=(sin(2^0\pi p),cos(2^0\pi p),…,sin(2^{L-1}\pi p),cos(2^{L-1}\pi p)) γ(p)=(sin(20πp),cos(20πp),,sin(2L1πp),cos(2L1πp))

  • 金字塔采样方案(Hierarchical Sampling Procedure):该部分指出在Volume Rendering中是在每条相机光线上的N个查询点密集地评估神经辐射场网络,这是低效的(仍然重复采样与渲染图像无关的自由空间和遮挡区域),于是提出一种分层体积采样的做法,同时优化一个“粗糙”的网络和一个“精细”的网络。通过这一策略,能使训练过程更高效地采样高频信息,该方法对于颜色贡献大的点附近采样密集,贡献小的点附近采样稀疏,从而由粗到细的分层采样方案。

这里训练使用颜色作为残差项,Loss是“粗糙”网络和“精细”网络渲染结果和真实像素颜色之间的总平方误差。 C c ( r ) C_c(r) Cc(r)为“粗糙”网络输出, C f ( r ) C_f(r) Cf(r)为“精细”网络的输出。

L o s s = ∑ r ∈ R [ ∣ ∣ C ^ c ( t ) − C ( r ) ∣ ∣ 2 2 + ∣ ∣ C ^ f ( t ) − C ( r ) ∣ ∣ 2 2 ] Loss=\sum_{r\in R}[||\hat C_c(t)-C(r)||_2^2+||\hat C_f(t)-C(r)||_2^2] Loss=rR[∣∣C^c(t)C(r)22+∣∣C^f(t)C(r)22]
在这里插入图片描述

2. NeRF-SLAM特点

本工作提出了的场景重建方法结合了单目稠密SLAM和层次化体素神经辐射场的优点,使用Droid-SLAM,稠密的光流估计,从而估计出了深度的不确定度。把深度图,深度的不确定度和相机位姿输入到NeRF网络里进行监督(残差引入了深度)。一个线程用来跟踪,另一个线程用来监督和渲染。具体如下。
在这里插入图片描述
算法包含跟踪和建图两个并行的线程,跟踪模块使用单目稠密(dense monocular)SLAM估计稠密深度图(dense depth maps)和相机位姿,同时会输出对深度和位姿的不确定度估计,后端建图使用前端的输出信息作为监督,训练一个辐射场(radiance field),其损失函数是颜色误差和带权重的深度误差,权重值由先前的不确定度得到。

…详情请参照古月居

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

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

相关文章

【自学Docker 】Docker管理命令大全(下)

文章目录Docker kill命令Docker kill命令概述Docker kill命令语法Docker kill命令参数案例使用容器 ID 杀掉容器使用容器名杀掉容器Docker kill命令总结Docker rm命令Docker rm命令概述Docker rm命令语法Docker rm命令参数案例删除已停止的容器删除正在运行的容器Docker rm命令…

13.拷贝控制

文章目录拷贝控制13.1拷贝、赋值与销毁13.1.1拷贝构造函数合成拷贝构造函数拷贝初始化参数和返回值编译器可以绕过拷贝构造函数13.1.2拷贝赋值运算符重载赋值运算符合成拷贝赋值运算符13.1.3析构函数析构函数完成什么工作什么时候会调用析构函数合成析构函数13.1.4三/五法则需要…

寒假题练——day(4)

题目 1 一个数组中只有两个数字是出现一次&#xff0c;其他所有数字都出现了两次。 编写一个函数找出这两个只出现一次的数字。 #include<stdio.h> int main() {int arr[] { 1, 3, 8, 1, 3, 8, 4, 6 };int num 0;int sz sizeof(arr) / sizeof(arr[0]);int i 0;int…

【Linux】六、Linux 基础IO(二)|重定向|如何理解 Linux一切皆文件|缓冲区

目录 五、重定向 5.1 什么是重定向 5.2 系统调用 dup2 5.3 三种重定向测试 5.3.1 输出重定向(>) 5.3.2 追加重定向(>>) 5.3.3 输入重定向(<) 5.4 父子进程拷贝问题 六、如何理解 Linux一切皆文件 七、缓冲区 7.1 认识缓冲区 7.2 缓冲区的刷新策略 …

连续系统PID的Simulink仿真-2

仍以二阶线性传递函数为被控对象&#xff0c;进行模拟PID 控制。被控对象形式为,其中b为在[103,163]范围内随机变化&#xff0c;a为在[15,35]范围内随机变化&#xff0c;则被控对象的描述方式可转换为&#xff1a;S函数是Simulink一项重要的功能&#xff0c;采用S函数可实现在S…

Pandas 数据清洗

Pandas 数据清洗数据清洗是对一些没有用的数据进行处理的过程。很多数据集存在数据缺失、数据格式错误、错误数据或重复数据的情况&#xff0c;如果要对使数据分析更加准确&#xff0c;就需要对这些没有用的数据进行处理。在这个教程中&#xff0c;我们将利用 Pandas包来进行数…

微软ATP带你看| 爆火的ChatGPT是什么?

&#xff08;本文阅读时间&#xff1a;7分钟&#xff09;OpenAI最新聊天机器人ChatGPT火爆全网&#xff01;能写代码、编剧本&#xff0c;马斯克都盛赞它“好得吓人”&#xff01;ChatGPT是什么GPT(Generative Pre-trained Transformer)系列是由OpenAI提出的非常强大的预训练语…

MaxCompute SQL示例解析

MaxCompute SQL示例解析 介绍MaxCompute SQL常见使用场景&#xff0c;掌握SQL的写法。 准备数据集 本文以emp表和dept表为示例数据集。您可以自行在MaxCompute项目上创建表并上传数据。 emp.csv中数据如下 7369,SMITH,CLERK,7902,1980-12-17 00:00:00,800,20 7499,ALLEN,SALES…

aws codebuild 使用和配置codebuild测试报告

参考资料 使用 Amazon CodeBuild 中的测试报告在 CodeBuild 使用AWS CLI样本中创建测试报告aws-codebuild-samples 在codebuild构建过程中获取有关在构建期间运行的测试的详细信息。 codebuild测试报告 通过在buildspec.yaml中配置报告组&#xff0c;运行构建项目时系统将运…

【代码随想录】96.不同的二叉搜索树

96.不同的二叉搜索树 思路 n为1的时候有一棵树&#xff0c;n为2有两棵树&#xff0c;这个是很直观的。 n为3的时候&#xff0c;有哪几种情况。 当1为头结点的时候&#xff0c;其右子树有两个节点&#xff0c;看这两个节点的布局&#xff0c;是不是和 n 为2的时候两棵树的布…

控价公司可以帮我们做什么?什么时候需要找第三方控价公司?

如果&#xff0c;我们品牌的销售渠道遭遇了低价乱价、窜货、侵权、假冒等问题&#xff0c;扰乱了我们品牌的渠道秩序&#xff0c;或者是我们在品牌发展的过程中&#xff0c;想通过对行业和竞品的了解来明确发展方向和策略&#xff0c;而自己又分身乏术或无从下手&#xff0c;这…

车辆信息查询

要想查一辆汽车的信息&#xff0c;除了去各个汽车平台上查询&#xff0c;比如汽车之家、易车网、懂车帝等&#xff0c;还可以使用“汽车公告查询”。 通过常规网页百度搜索引擎&#xff0c;输入关键字“汽车公告查询”&#xff0c;就会获取到相关搜索结果&#xff0c;汽车公告查…

C进阶_内存库函数

目录 memcpy 模拟实现memcpy memmove 模拟实现memmove memcmp memcpy 它的函数原型为&#xff1a; void * memcpy ( void * destination, const void * source, size_t num ); 函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。 这个函数…

104、【树与二叉树】leetcode ——98. 验证二叉搜索树:递归法[先序+中序+后序]+迭代法(C++版本)

题目描述 原题链接&#xff1a;98. 验证二叉搜索树 解题思路 BST的特点是&#xff1a;当前结点的值&#xff0c;比左子树中的全部结点都大&#xff0c;比右子树中全部结点都小。在代码实现中&#xff0c;要注意不要对比的是某一结点和某一侧的全部值之间的关系&#xff0c;不…

【论文阅读】CenterNet

论文题目&#xff1a;Objects as Points&#xff08;CVPR2019&#xff09; 论文地址&#xff1a;https://arxiv.org/pdf/1904.07850.pdf 发布时间&#xff1a;2019.4.16 机构&#xff1a;UT Austin&#xff0c;UC Berkeley 代码&#xff1a;https://github.com/xingyizhou/…

小程序事件基础

小程序事件--基础小程序事件事件简介小程序事件—事件传参事件对象属性target和currentTarget事件对象属性获取和设置data数据获取&设置data获取和设置data数据—进阶小程序的渲染层与逻辑层小程序事件 事件简介 事件是视图层到逻辑层的通讯方式。负责将用户对于的页面的操…

云上的米开朗基罗:在不确定时代,寻找建筑般的确定性

文艺复兴三杰之一的米开朗基罗&#xff0c;被称为“天才建筑师”。其实他一生留下的建筑并不多&#xff0c;仅仅有美第奇礼拜堂、卡比多广场、圣彼得大教堂穹顶等寥寥几座。但米开朗基罗却凭借对建筑层次与结构的精妙把握&#xff0c;影响了此后数百年的建筑风格。很多人认为&a…

【代码随想录】动态规划:关于01背包问题,你该了解这些!(滚动数组)

01 背包 有n件物品和一个最多能背重量为w的背包 第i件物品的重量是weight[i]&#xff0c; 得到的价值是value[i] &#xff0c; 每件物品只能用一次&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 每一件物品其实只有两个状态&#xff0c;取或者不取&#xff0c;所以…

win下编译opencv+libjpeg-turbo

文章目录前言编译环境下载opencv和jpeg-turbo源码编译jpeg-turbo编译opencv失败&#xff1f;那就直接调用jpeg-turbo库进行编解码前言 opencv默认自带第三方jpeg编解码库&#xff0c;但其性能一般&#xff0c;对高性能需求的程序来说是不适合的&#xff0c;因此我们可以把jpeg…

设计模式学习(八):Proxy代理模式

一、什么是Proxy模式 Proxy是“代理人”的意思&#xff0c;它指的是代替别人进行工作的人。当不一定需要本人亲自进行工作时&#xff0c;就可以寻找代理人去完成工作。但代理人毕竟只是代理人&#xff0c;能代替本人做的事情终究是有限的。因此&#xff0c;当代理人遇到无法自己…