【三维】NeRF神经辐射场构建三维模型

news/2024/11/30 10:30:46/

 

论文地址:paper

代码地址:code

视频地址:油管

目录

0.🌈🌈摘要

1.🌈🌈nerf主要原理

2.🌈🌈网络结构

2.1📌渲染

2.2📌消融实验

3.🌈🌈NeRF网络的创新点

3.1📌位置编码

3.2📌两阶段层次化采样

4.🌈🌈结果


        NeRF的研究目的是合成同一场景不同视角下的图像。方法很简单,根据给定一个场景的若干张图片,重构出这个场景的3D表示,然后推理的时候输入不同视角就可以合成(渲染)这个视角下的图像了。

        「3D表示」有很多种形式,NeRF使用的是辐射场,然后用「体渲染」(Volume Rendering)技术,给定一个相机视角,把辐射场渲染成一张图像。选用辐射场+体渲染的原因很简单,全程可微分。这个过程很有意思,可以理解为把一个空间朝一个方向上拍扁,空间中的颜色加权求和得到平面上的颜色。

0.🌎🌎摘要

        我们提出了一种用于通过使用稀疏输入集优化底层连续体积场景函数来合成复杂场景的新颖视角方法,并达到SOTA结果。我们的算法使用全连接(非卷积)深度网络表示场景,其输入是单个连续 5D 坐标(空间位置 (x, y, z) 和观看方向 (θ, φ)),其输出是体积密度和与视图相关空间位置的发射辐射率。通过查询 5D 坐标来合成视图,沿着相机光线并使用经典的体积渲染技术进行投影,将输出颜色和密度转化为图像。 因为体积渲染是自然可微的,优化我们的表示所需的唯一输入是一组具有已知相机姿势的图像。 我们描述如何有效优化神经辐射场,呈现逼真具有复杂几何和外观的场景视图,并展示了优于神经渲染和视图先前工作的结果合成。 查看合成结果最好以视频形式查看,因此我们强烈建议读者可以观看我们的补充视频以进行令人信服的比较。


  • 这盛世如你所愿,视频地址:油管
  • 部分截图如下:

        建立 Nerf 神经辐射场的三维模型的原理是通过使用神经网络来重建三维场景。具体步骤如下:

        1. 数据采集:使用一个摄像头或者深度相机,在不同角度和位置下,对所需场景进行拍摄或采集深度图像。

        2. 数据预处理:对采集到的图像数据进行预处理,包括去除噪声、图像校正等操作。如果使用深度相机,可能还需要进行相机标定操作。

        3. 网络训练:使用现有的神经网络架构(如 NeRF),将预处理后的图像数据作为输入,经过训练来建立场景的三维模型。网络将学习如何从图像中推断出场景的几何结构和表面属性。

        4. 模型融合:在训练完成后,可以将多个角度和位置下的网络模型融合在一起,以获得更完整和精确的三维场景模型。


1.🌈🌈nerf主要原理

       Nerf(Neural Radiance Fields)即 神经辐射场,我们可以把它看做是一个函数:如果我们从一个角度向一个静态空间发射一条射线,我们可以查询到这条射线在空间中每个点的密度 ,以及该位置在射线角度下呈现出来的颜色。其中密度是用来计算权重的,对点上的颜色做加权求和就可以呈现像素颜色

       

        具体计算方式为:首先知道相机的焦点,焦点和像素的连线可以连出来一条射线,我们可以对这条射线经过空间上的每个点的密度(只和空间坐标相关)和颜色(同时依赖空间坐标和入射角)进行积分就可以得到每个像素的颜色。当每个像素的颜色都计算出来,那么这个视角下的图像就被渲染出来了。

        因为神经网络是可微分的,选取的体渲染方法是可微分;体渲染得到的图片和原图计算MSE Loss。整个过程可端到端地用梯度回传来优化非常漂亮。


2.🌈🌈网络结构

        Nerf的关键思想是使用神经网络来表示场景的辐射场(radiance field)。辐射场是指在场景中每个点上沿不同方向传播的光线的强度和颜色。具体来说,Nerf使用了一种名为"隐式表示"的方法来建模辐射场。传统方法通常使用显式的表示方法,比如点云、网格或参数化的模型,这些方法需要较高的存储和计算复杂度。而Nerf将辐射场看作一个黑盒函数,通过神经网络来对该函数进行建模。给个图理解下。

2.1📌渲染

        此部分主要讲解如何沿着射线对空间中的颜色进行积分?

         如果从焦点到一个像素上连的射线为:,其中 o 是原点,t是时间。时间起点(near bound)和时间终点(far bound)为 tn 和 tf。我们有沿着这条射线积分得到像素颜色的公式如下:

可以直观得到这个积分要满足的两个条件:

  1. 一个点的密度越高,射线通过它之后变得越弱,密度和透光度呈反比
  2. 一个点的密度越高,这点在这个射线下的颜色反应在像素上的权重越大

        实际渲染过程,我们只能把射线平均分成N个小区间,每个区间随机采样一个点,对采样得到的点的颜色进行某种加权求和: 

基于这些采样点,我们可以讲上述积分简化为求和的形式:

        Nerf的神经网络模型由一个编码器和一个解码器组成。编码器接收场景中的位置和方向信息,并将其映射到隐空间中的向量表示。解码器将隐空间中的向量表示解码为对应位置和方向上的辐射场属性,例如颜色和透射率。通过使用深度残差连接和多层感知机等技术,Nerf可以学习到复杂场景的非线性光照和几何变化。

        在训练过程中,Nerf使用多个位置和方向的图像数据来拟合神经网络模型的参数。通过最小化预测图像与真实图像之间的重建误差,模型逐渐学习到场景的几何结构和光照属性。

        当模型训练完成后,就可以使用该模型来生成新的视角下的图像。通过在体素中采样许多光线并沿其传播,Nerf可以估计每条光线在场景中的交互,从而生成高质量的合成图像。

        总而言之,Nerf通过神经网络的隐式表示来建模场景的辐射场,通过训练和采样来生成高质量的三维模型和图像。这种方法在真实感渲染、虚拟现实等领域具有广泛应用价值。

2.2📌消融实验


3.🌈🌈NeRF网络的创新点

3.1📌位置编码

        神经网络是通用的函数近似器,但是实验发现,如果直接输入微元位置和光线方向,那么模型最终渲染得到的图片比较模糊,也就是说,深度网络偏向于学习低频函数。为了提高模型对图像纹理细节的表现能力,NeRF在将5D输入传递给网络之前,使用傅里叶变换将输入映射到更高维度的空间,可以更好地拟合包含高频变化的数据。也就是额外嵌入了一层确定性的位置编码函数降低模型学习难度。类似于MLP,把坐标和视角用更高维度的表示作为网络输入,来解决渲染图像比较糊的问题:

3.2📌两阶段层次化采样

        NeRF的任务就是将一系列的采样点输入网络,计算器体密度和颜色,那么如何采样就成为一个关键的问题。采样点过多开销过大,采样点过少近似误差有太大。直观的一个想法是,最好尽可能的避免在空缺部分以及被遮挡了的部分进行过多的采样,因为这些部分对最好的颜色贡献是很少的,基于这一想法 NeRF 提出两阶段层次化采样 (Hierarchical volume sampling) 的方式,即先按照均匀随机采样进行一次粗采样,将粗采样的输出的结果转化为分布,再根据分布进行一次精采样,最后NeRF训练的损失也是粗采样和精采样结果相加的结果,这样就实现了一个自动化Coarse-To-Fine的训练过程。 


4.🌈🌈结果

整理不易,欢迎一键三连!!!


送你们一条美丽的--分割线--

🌷🌷🍀🍀🌾🌾🍓🍓🍂🍂🙋🙋🐸🐸🙋🙋💖💖🍌🍌🔔🔔🍉🍉🍭🍭🍋🍋🍇🍇🏆🏆📸📸⛵⛵⭐⭐🍎🍎👍👍🌷🌷


http://www.ppmy.cn/news/1102149.html

相关文章

No5.9:多边形内角和公式

#!/usr/bin/python # -*- coding: UTF-8 -*-#指定了编码,中文就能正常展示 # codingutf-8def calc_degree(n):#n代表边形的总数degree (n - 2) * 180#多边形内角和公式return degreeprint(calc_degree(3))#三角形的内角和 print(calc_degree(4))#四边形的内角和【小…

Sui Lutris:Sui核心的分布式系统协议

经过数个月的测试,Mysten Labs于 8月18日更新了Sui Lutris白皮书,确定了以下内容: 使用PTBs和5K TPS,Sui每秒可以处理140k至150k次操作,这表明Sui在主网峰值(约700 TPS)下的基准测试远低于其实…

「程序员必须掌握的算法」动态规划「上篇」

动态规划详解 动态规划 (Dynamic Programming) 是一种算法思想,用于解决一些复杂的问题。本文将介绍动态规划的分类、概念和经典例题讲解。 动态规划的分类 动态规划可以分为以下两种类型: 0/1背包问题:该问题是动态规划的一种基本类型。…

聊一下酱香拿铁,瑞幸与茅台强强联手

(点击即可收听) 这两天,酱香拿铁火爆朋友圈了的 为什么唯独酱香拿铁会火成这样,不知道有人思考过背后逻辑? 难道只是因为一个新出的拿铁咖啡吗? 奇葩咖啡那么多为什么都没有这个一出来就爆火。 联名本身就是…

第6章_瑞萨MCU零基础入门系列教程之串行通信接口(SCI)

本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写,需要的同学可以在这里获取: https://item.taobao.com/item.htm?id728461040949 配套资料获取:https://renesas-docs.100ask.net 瑞萨MCU零基础入门系列教程汇总: ht…

单片机C语言实例:13、看门狗

一、看门狗溢出测试 程序实例1&#xff1a; #include<reg52.h>sfr WDTRST 0xA6; sbit key P3^1; /*------------------------------------------------喂狗 ------------------------------------------------*/ void Rst_Watchdog( void ) {WDTRST 0x1E…

day55 补

392.判断子序列 力扣题目链接(opens new window) 给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些&#xff08;也可以不删除&#xff09;字符而不改变剩余字符相对位置形成的新字符串。&#xff08;例如&#xff0c;&quo…

docker 跨平台构建镜像

我们在开发环境构建的镜像在生产环境大多不可用&#xff0c;我们在开发中一般使用 Windows 或者 MAC 系统&#xff0c;部署多半是 linux 环境。那么这篇文章能帮到你。 文章目录 首先构建环境进阶 首先 首先你需要有一个 Dockerfile 文件。 举例&#xff1a;这里以一个 pytho…