NeRF学习笔记(含公式、图解和过程)

2023-11-19

NeRF学习笔记

关注公众号,不定期分享NeRF相关文献。
在这里插入图片描述

引言

NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis作为2020年ECCV的一篇论文,在用深度学习完成图形学中非常重要的渲染任务上作出了很重要的贡献。此学习笔记主要分为以下几个部分:

1.问题的提出

2.NeRF工作的Pipeline

3.NeRF详细工作的解析

  ①Neural Radiance Field Scene Representation

  ②Volume Rendering with Radiance Fields

  ③Positional encoding

  ④Hierarchical volume sampling

  ⑤Implementation details

4.参考文献

1.问题的提出

视角合成方法通常使用一个中间3D场景表征作为中介来生成高质量的虚拟视角,如何对这个中间3D场景进行表征,分为了“显示表示“和”隐式表示“,然后再对这个中间3D场景进行渲染,生成照片级的视角。

“显示表示”3D场景包括Mesh,Point Cloud,Voxel,Volume等,它能够对场景进行显式建模,但是因为其是离散表示的,导致了不够精细化会造成重叠等伪影,更重要的是,它存储的三维场景表达信息数据量极大,对内存的消耗限制了高分辨率场景的应用。

”隐式表示“3D场景通常用一个函数来描述场景几何,可以理解为将复杂的三维场景表达信息存储在函数的参数中。因为往往是学习一种3D场景的描述函数,因此在表达大分辨率场景的时候它的参数量相对于“显示表示”是较少的,并且”隐式表示“函数是种连续化的表达,对于场景的表达会更为精细。

NeRF做到了利用”隐式表示“实现了照片级的视角合成效果,它选择了Volume作为中间3D场景表征,然后再通过Volume rendering实现了特定视角照片合成效果。可以说NeRF实现了从离散的照片集中学习出了一种隐式的Volume表达,然后在某个特定视角,利用该隐式Volume表达和体渲染得到该视角下的照片。

2.NeRF工作的Pipeline

简单的来说,NeRF工作的过程可以分成两部分:三维重建渲染

Ⅰ、三维重建部分本质上是一个2D到3D的建模过程,利用3D点的位置(x,y,z)及方位视角(θ,φ)作为输入,通过多层感知机(MLP)建模该点对应的颜色color(c)及体素密度volume density(σ),形成了3D场景的”隐式表示“。(详情看①Neural Radiance Field Scene Representation部分,即下图的红框部分)
在这里插入图片描述

Ⅱ、渲染部分本质上是一个3D到2D的建模过程,渲染部分利用重建部分得到的3D点的颜色及不透明度沿着光线进行整合得到最终的2D图像像素值。(详情看②Volume Rendering with Radiance Fields部分,即下图的红框部分)
在这里插入图片描述

Ⅲ、在训练的时候,利用渲染部分得到的2D图像,通过与Ground Truth做L2损失函数(L2 Loss)进行网络优化。(即下图的红框部分)
在这里插入图片描述

3.NeRF详细工作的解析

①Neural Radiance Field Scene Representation

该部分的输入是三维位置(x,y,z)和二维方位视角(θ,φ),输出是颜色c=(r,g,b)和体素密度σ,即利用一个MLP网络近似地表示这种映射F:(x,d) -> (c,σ),这个映射F就是一种3D场景的”隐式表示“。

该MLP网络先使用8个全连接层处理三维位置(x,y,z),输出体素密度σ和256维特征向量(因此体素密度σ仅是关于三维位置(x,y,z)的函数);然后将上面得到的256维特征向量与二维方位视角(θ,φ)concat,接着用4个全连接层处理,输出颜色c=(r,g,b)。(当然,这里预处理需要使用高频位置编码,详细信息看③Positional encoding部分)

该部分即下图红框部分:
在这里插入图片描述

②Volume Rendering with Radiance Fields

该部分使用经典体渲染(Volume Rendering)的原理渲染通过场景的任何光线的颜色,即下面这条式子:
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
其中函数T(t)表示射线从tn到t沿射线累积透射率,即射线从tn到t不碰到任何粒子的概率。从①中建模的Neural Radiance Field中绘制视图,需要估计通过所需虚拟相机的每个像素跟踪的相机光线的积分C®,然而①中建模后选取了Volumn作为3D中间表示,势必会使用到离散求积法对这个连续积分进行数值估计,这会极大地限制表示的分辨率,因此可通过分层抽样方法(详细信息看④Hierarchical volume sampling部分)的方法,使得即使使用离散的样本估计积分,但是能够较好地表示一个连续的场景(类似重要性采样,对整个积分域进行非均匀离散化,较能还原原本的积分分布)。

其中离散化式子为:
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)
该部分即下图红框部分:
在这里插入图片描述

③Positional encoding

该部分中指出尽管神经网络是通用的函数近似器,但是他们发现,让①中的MLP网络(F:(x,d) -> (c,σ))直接操作 (x,y,z,θ,φ)输入会导致渲染在表示颜色和几何形状方面的高频变化方面表现不佳,表明深度网络偏向于学习低频函数。因此在将(x,y,z,θ,φ)输入传递给网络之前,使用高频函数将输入映射到更高维度的空间,可以更好地拟合包含高频变化的数据。该高频编码函数为:
γ ( 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))
这个高频编码函数有点类似傅里叶级数的方式,其中p就是(x,y,z,θ,φ)输入,并且输入均归一化于[-1,1],在实验中针对于(x,y,z)输入取L=10,针对于(θ,φ)输入取L=4,即:
γ ( ( x , y , z ) ) = ( s i n ( 2 0 π ( x , y , z ) ) , c o s ( 2 0 π ( x , y , z ) ) , . . . , s i n ( 2 9 π ( x , y , z ) ) , c o s ( 2 9 π ( x , y , z ) ) ) \gamma((x,y,z))=(sin(2^0\pi (x,y,z)),cos(2^0\pi (x,y,z)),...,sin(2^{9}\pi (x,y,z)),cos(2^{9}\pi (x,y,z))) γ((x,y,z))=(sin(20π(x,y,z)),cos(20π(x,y,z)),...,sin(29π(x,y,z)),cos(29π(x,y,z)))

γ ( ( θ , φ ) ) = ( s i n ( 2 0 π θ , φ ) , c o s ( 2 0 π θ , φ ) , . . . , s i n ( 2 3 π θ , φ ) , c o s ( 2 3 π θ , φ ) ) \gamma((θ,φ))=(sin(2^0\pi θ,φ),cos(2^0\pi θ,φ),...,sin(2^{3}\pi θ,φ),cos(2^{3}\pi θ,φ)) γ((θφ))=(sin(20πθφ),cos(20πθφ),...,sin(23πθφ),cos(23πθφ))
在这里插入图片描述

④Hierarchical volume sampling

该部分指出在Volume Rendering中是在每条相机光线上的N个查询点密集地评估神经辐射场网络,这是低效的(仍然重复采样与渲染图像无关的自由空间和遮挡区域),于是提出一种分层体积采样的做法,同时优化一个“粗糙”的网络和一个“精细”的网络。

做法是:首先使用分层抽样对第一组Nc位置进行采样,并在这些位置评估“粗糙”网络。给出这个“粗糙”网络的输出,然后我们对每条射线上的点进行更明智的采样,即利用反变换采样从这个分布中采样第二组Nf位置,然后将Nc+Nf采样得到的数据输入“精细”网络,并计算最终渲染的光线颜色C®。

核心操作即先通过第一次采样把大概的分布采出来,然后第二次采样利用反变换采样(用的是概率论中的拒绝采样),对第一次采到的大概的分布再采一次,达到了重要性采样的目的。

⑤Implementation details
Ⅰ、关于Loss

Loss是④中提到的“粗糙”网络和“精细”网络渲染结果和真实像素颜色之间的总平方误差。
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]
其中Cc®为“粗糙”网络输出,Cf®为“精细”网络的输出。

Ⅱ、关于一些超参数

Batchsize为4096条射线(Ray)。

每条射线在粗体积中Nc=64坐标下采样,在细体积中Nf=128额外坐标下采样。

使用Adam优化器,学习速率从5e-4,并在优化过程中指数衰减到5e-5。

优化一个场景通常需要10 - 30万次迭代,集中在一个NVIDIA V100 GPU上(大约1-2天)。

4.参考文献

[1] NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis

[2] NeRF的数学推导

[3] NeRF及其发展

[4] 图形学新高潮? NeRF 笔记

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NeRF学习笔记(含公式、图解和过程) 的相关文章

随机推荐

  • 感应(异步)电机磁场定向控制电流环PI控制参数设计

    电机控制系列文章 感应 异步 电机磁场定向控制MATLAB Simulink建模 感应 异步 电机磁场定向控制速度环PI控制参数设计 目录 电机控制系列文章 前言 一 并联型PI与串联型PI 二 被控对象模型 三 电流环闭环传递函数 四 电
  • 【cc3.x】顶点着色器和片元着色器小记

    cc3 x cocos creator3 x 的着色器demo有点少 而且讲的不是很清晰 我这种业余自学小白学的真的很艰难 不过好赖算是啃的差不多了 所以有了这则小记 权当备忘录了 首先顶点着色器 上一段代码 CCProgram vs pr
  • js时间戳转成日期 需要解决各国时区问题的方法

    时间戳转日期格式 param Number timestamp 时间戳 export function formatterTimeYMDHM timestamp if timestamp return const localDate new
  • 永恒之蓝MS17010复现

    MS17010复现 靶机win7 192 168 41 150 攻击kali 192 168 41 147 扫描 通过auxiliary scanner smb smb ms17 010模块扫描虚拟机是否存在ms17010漏洞 存在 拿sh
  • 数学专题-算法-矩阵-拟合

    Author Mikeliu 2020 Date 2020 03 08 10 32 13 LastEditTime 2020 03 12 09 26 47 LastEditors Mikeliu 2020 Description usr b
  • java: 程序包XXX不存在

    今天新导入的maven项目 一启动idea报各种包不存在 各种符号不存在 我是使用以下方法解决的 你可以尝试看看 在File Settings Build Execution Deployment Build Tools Maven Run
  • 寒假集训——八

    寒假集训 七十六 字符串 1 创建字符串 2 字符集 3 字符串常用方法 4 json格式字符串 七十七 数字常用方法 Math对象 七十八 Date 1 new Date 2 时间对象常用方法 七十九 定时器 倒计时定时器 八十 BOM
  • epoll小结

    1 select和poll模型为什么会慢 假如有100w用户和一个进程保持tcp连接 而每一个时刻只有几十个活跃的连接 也就是说 每一个时刻进程只需要处理这100w连接中的一小部分 那么如何高效的处理 进程是否在每次询问操作系统收集有事件发
  • docker部署实操二:tomcat部署

    首先我们要去下载Tomcat的镜像 因为镜像本身就是一个简化的操作系统 一般来说你下一个镜像不用去里面设置环境变量 所谓的开箱即用 搜索tomcat镜像 首先第一步搜索镜像 docker search tomcat 下载指定版本的tomca
  • 白盒测试(单元测试JUnit使用参数化测试@Parameters)

    目录 1 背景知识 2 例子 3 参数化流程 4 执行结果 5 练习题 1 背景知识 在测试过程中 我们可能会遇到这样的函数 它的参数有许多特殊值
  • Linux使用nvida-smi查看GPU类型

    nvida smi提供一个查看GPU信息的方法 然而这种方式不能查看GPU型号 型号被省略成了GeForce RTX 208 如果我们需要查看GPU的型号 只需要运行nvidia smi L即可 mrfive ubuntu nvidia s
  • STM32移植freemodbusRTU(hal库)从机

    MODBUS源码下载 freemodbus源码 github地址 一 移植准备 1 cubemx创建基础工程 配置串口和定时器以及时钟 2 拷贝freertos源码到工程目录 新建一个freemodbus文件夹 拷贝modbus文件夹 3
  • 编码 & 8421BCD 码的故事

    计算机编码中 我们都是先了解了二进制 其中分有符号数 无符号数 然后会接触到BCD码 那么BCD码是怎么产生的 为什么又要用四位二进制来表示呢 8421BCD 码的故事 一 BCD码 1 由来 2 8421BCD码 3 修正 二 底层验证修
  • 是面试官放水,还是公司实在是太缺人?这都没挂,华为原来这么容易进...

    华为是大企业 是不是很难进去啊 在华为做软件测试 能得到很好的发展吗 一进去就有9 5K 其实也没有想的那么难 直到现在 心情都还是无比激动 本人211非科班 之前在字节和腾讯实习过 这次其实没抱着什么特别大的希望投递 没想到华为可以再给我
  • 编译内核linux-2.6.38 出现error (2013-03-28 10:42)

    内核建议到官网下载 当然如果签名对的话也可以 解压后 保险起见 make mrproper 然后 make oldconfig 最后 make menuconfig 配置内核 然后再开始编译 在编译内核linux 2 6 38 出现以下问题
  • Android 透明状态栏

    转载 https blog csdn net fan7983377 article details 51604657 最近公司产品提出透明状态栏的要求 将一张背景填充满屏幕 自己记录一下 Android 透明状态栏 有两种 背景是图片还是纯
  • PHP 生成excel

    PHP 生成excel 好用强大的php excel类库 做Magento的订单导出Excel功能 找了这个php的excel类 PHPExcel PHPExcel是强大的 MS Office Excel 文档生成类库 基于Microsof
  • 课程笔记3

    一 以太坊 比特币被称为区块链1 0 以太坊被称为区块链2 0 以太坊的符号是ETH 以太币的符号是Ether 单位是Wei 比特币的符号是BTC 单位是Satoshi 以太坊做出的改进 在以太坊中出块时间减少到十几秒 比特币的mining
  • iOS实训笔记—调用系统相机与网络请求

    iOS开发实训第三周周报 总结 本周开始进行项目的开发 目前小组计划共同完成前端开发 我负责的部分为个人页面 其中涉及到加载个人信息时 需要从相册或相机获取图片 作为头像上传 并进行网络请求 获取资源 因此本周周报总结这部分的内容 学习知识
  • NeRF学习笔记(含公式、图解和过程)

    NeRF学习笔记 关注公众号 不定期分享NeRF相关文献 引言 NeRF Representing Scenes as Neural Radiance Fields for View Synthesis作为2020年ECCV的一篇论文 在用