NeRF原理学习

一个2020年的工作我现在才来学习并总结它的原理,颇有种“时过境迁”的感觉。这篇总结是基于NeRF原文 NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis 阅读理解后写的,作用是以后如果记不太清了可以回忆。

目的&应用

先说一下NeRF这个架构的功能是什么。它的主要功能是进行新视角的合成:给定若干张不同视角的同一物体或场景的图片(已知相机参数和位姿),训练一个神经网络来隐式地学习物体的三维表征,然后对于新的视角进行图片合成。因为它是隐式的表示,所以并不能直接重建为三维模型,后面也有一些工作是研究怎么去进行显示三维重建的。

原理

NeRF的意思是 Neural Radiance Fields,可以翻译成“神经辐射场”,辐射场在物理上的意义是去描述空间中光照强度的分布,也就是空间中某一点在某一方向发射或接受的光强;在数学上的形式一般是一个五维空间上的函数 f : R 5 → R n f:R^5 \rightarrow R^n f:R5Rn ,5维包括了空间中的位置(3维)和空间中的方向(2维)。而Neural顾名思义就是表示神经网络,所以NeRF从名字来解释就是用神经网络去拟合一个辐射场函数
f : ( x , y , z , θ , ϕ ) → ( r , g , b , σ ) 或   f : ( x , d ) → ( c , σ ) f:(x,y,z,\theta,\phi)\rightarrow (r,g,b,\sigma) \ \ 或 \ \ f:(\mathbf{x},\mathbf{d})\rightarrow (\mathbf{c},\sigma) f:(x,y,z,θ,ϕ)(r,g,b,σ)    f:(x,d)(c,σ)
这个神经网络的输入是空间中某一点的坐标以及视角方向,输出是颜色和密度。输入很好理解,就不详细说了,主要比较难理解的概念是这个密度。从物理角度来说,密度可以表示物质的集中程度或稠密程度,可以用来描述空间中物质或内容的分布情况,高密度的部分表示有物质存在,比如物体表面或内部,意味着该部分对光线的吸收或散射较强;而低密度的部分则相反,光线可以更自由地通过。

体渲染的角度来说,密度会影响体渲染积分的过程。

普通渲染管线大致流程是:顶点投影、光栅化、片段处理,当然还包括深度测试、alpha混合等,这都是很熟悉的概念了。光线追踪是从相机射出一条光线,模拟光线的反射折射等,对路径上碰到的颜色进行混合。这两种渲染方式主要常用于Mesh这种矢量形式的场景。而对于体积数据则更适合用体渲染:从相机出发向每个像素点发射光线,对光线路径上的颜色和密度进行积分
C ( r ) = ∫ t n t f T ( t ) ⋅ σ ( r ( t ) ) ⋅ c ( r ( t ) ) d t C(\mathbf{r})=\int_{t_n}^{t_f}T(t)\cdot\sigma(\mathbf{r}(t))\cdot\mathbf{c}(\mathbf{r}(t)) dt C(r)=tntfT(t)σ(r(t))c(r(t))dt
其中 T ( t ) T(t) T(t)是累积的透射率, σ \sigma σ c \textbf{c} c是密度和颜色,其中累积的透射率通过以下公式计算
T ( t ) = exp ⁡ ( − ∫ t n t σ ( r ( s ) ) d s ) T(t)=\exp(-\int_{t_n}^t\sigma(\mathbf{r}(s))ds) T(t)=exp(tntσ(r(s))ds)
这个体渲染的公式其实很好理解,对于光线路径上的点,它的密度越大,且光线在这点的透射率越大,这一点的颜色对最终颜色(积分)的贡献就越大;而这一点的光线透射率,就是 e − ( 在这一点之前的密度积分 ) ∈ ( 0 , 1 ) e^{-(在这一点之前的密度积分)}\in(0,1) e(在这一点之前的密度积分)(0,1),之前的密度积分越大,透射率越小。

因此NeRF实际上就是学习一个神经网络去对空间每个点和方向预测一个颜色和密度,然后对于新的视角,也就是新的观测点或者相机,用体渲染来计算每个像素的颜色值,以此得到新视角的合成图片。

神经网络结构

image-20240902152746202

NeRF的神经网络结构就是简单的MLP模型,每一层之间都是全连接层+ReLU,并添加了一个残差连接。其中有几个要注意的点:

空间中每个点的密度 σ \sigma σ应该是场景固有属性,与光照、视角这些变量无关,因此MLP一开始的输入只有坐标,在预测完密度之后,才拼接视角进行后面颜色的预测。

神经网络偏向于学习低频信息,或者说,网络很难学习到低维域的高频信息,因此论文将输入映射到高维空间后再输入MLP

image-20240902163339187

对于每个分量先正则化到[-1, 1]后再使用上述公式。其实这个映射是傅里叶特征(Fourier Features)的一种特殊形式,参考 Fourier Features Let Networks Learn High Frequency Functions in Low Dimensional Domains。通过将低维输入映射到高维空间来更好地学习高频信息,一般针对的是基于点输入的神经网络,像NeRF或者DeepSDF这种就很适用。

体渲染

前面提到了体渲染在光线路径上的积分公式,以及有了一个输入输出适用于体渲染的神经网络,直接计算积分很难,需要转化为离散的求积公式,也就是对光线离散点求和来近似积分:
C ( r ) = ∑ i = 1 N T i ( 1 − exp ⁡ ( − σ i δ i ) ) c i , where  T i = exp ⁡ ( − ∑ j = 1 i − 1 σ j δ j ) C(\mathbf{r})=\sum_{i=1}^N T_i(1-\exp(-\sigma_i\delta_i))\mathbf{c}_i, \ \ \text{where} \ T_i=\exp(-\sum_{j=1}^{i-1}\sigma_j\delta_j) C(r)=i=1NTi(1exp(σiδi))ci,  where Ti=exp(j=1i1σjδj)
其中 δ i = t i + 1 − t i \delta_i=t_{i+1}-t_i δi=ti+1ti,表示相邻采样点之间的距离。实际上透射率 T i + 1 = T i ⋅ exp ⁡ ( − σ i δ i ) T_{i+1}=T_i \cdot \exp(-\sigma_i\delta_i) Ti+1=Tiexp(σiδi),表示每经过一小节透射率都要乘一个透射系数 exp ⁡ ( − σ i δ i ) \exp(-\sigma_i\delta_i) exp(σiδi),这个透射系数中当密度为0时透射系数为1,表示光线完全通过,当密度趋于无穷时投射系数趋于0,而 σ i δ i \sigma_i\delta_i σiδi就是近似的一小节的密度,被称为光学厚度。

因此公式里的 T i T_i Ti表示到第i小节时剩余的光线强度, ( 1 − exp ⁡ ( − σ i δ i ) ) (1-\exp(-\sigma_i\delta_i)) (1exp(σiδi))表示该小节的颜色贡献,可以理解为 exp ⁡ ( − σ i δ i ) \exp(-\sigma_i\delta_i) exp(σiδi)这一比例的光透射过去了,剩下的比例变成颜色贡献,物理意义就是散射。其实从连续形式的积分去离散化应该是能直接推出来的,但我不会推,只会解释结果的每一部分有什么意义。

另外,整个体渲染的计算过程都可以形式化的书写出来,是可微分的。

还有一个问题就是该如何在光线上进行采样,如果按照数量N平均采样,可能很多空的地方都是对训练没有用的,因此论文使用了一种“粗+细”的方式,即使用两个相同的网络,先用粗网络平均采样之后,根据每个点的 ( 1 − exp ⁡ ( − σ i δ i ) ) (1-\exp(-\sigma_i\delta_i)) (1exp(σiδi))划分权重,在细网络中对权重大的部分进行细分,以此提高训练效率。

训练

数据集就是对同一个场景的多视角图片,并且有相机位姿和参数。把所有像素点放在一起作为训练集,每个batch选若干个像素点参与训练,粗细网络的结果都参与梯度下降的优化过程,Loss为

image-20240902182616403

训练完之后的新视角合成只用细网络。

根据论文的描述, N c = 64 , N f = 128 N_c=64,N_f=128 Nc=64,Nf=128,batch_size为4096,100-300k个迭代数量,在一块V100上大概需要1-2天的训练时间。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java项目:128 基于Spring Boot的装饰工程管理系统

作者主页:源码空间codegym 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 本系统包含管理员、员工和客户角色 管理员权限操作的功能包括管理合同信息,管理合同报价,管理立项项目,管…

[米联客-XILINX-H3_CZ08_7100] FPGA程序设计基础实验连载-24 TPG图像测试数据发生器设计

软件版本:VIVADO2021.1 操作系统:WIN10 64bit 硬件平台:适用 XILINX A7/K7/Z7/ZU/KU 系列 FPGA 实验平台:米联客-MLK-H3-CZ08-7100开发板 板卡获取平台:https://milianke.tmall.com/ 登录“米联客”FPGA社区 http…

【python因果推断库3】使用 CausalPy 进行贝叶斯geolift 分析

目录 导入数据 丹麦的销售额是否有地理提升(GeoLift)? 结果 本笔记本介绍如何使用 CausalPy 的贝叶斯{术语}合成控制功能来评估“地理提升”(GeoLift)。我们的假设情景如下: 你是一家在欧洲运营的公司的…

图文解析保姆级教程: IDEA里面创建SpringBoot工程、SpringBoot项目的运行和测试、实现浏览器返回字符串

文章目录 一、创建SpringBoot工程(需要联网)二、 定义请求处理类三、运行测试 此教程摘选自我的笔记:黑马JavaWeb开发笔记13——Springboot入门(创建、运行&测试项目)、Http协议(请求&响应协议&…

Json数据解析报错 -TAB

表现: n8n 解析服务器的数据 报错 json 解析错误 原理: tab键 在代码中为 string tab \t解决办法:tab键替换4个空格 string tab "\t" tab.replaceAll("\t", " ")问题: tab 键 和 空格 在普…

卷积公式的几何学理解

1、Required Knowledge 1.1、概率密度函数 用于描述连续型随机变量在不同取值上的概率密度,记作 f ( x ) f(x) f(x)。 如随机变量 X X X的分布为正态分布,则其概率密度函数为: f ( x ) 1 σ 2 π e − ( x − μ ) 2 2 σ 2 f(x)\frac{1}…

记忆化搜索【上】

509. 斐波那契数 题目链接:斐波那契数 递归(暴搜) 斐波那契数列,最传统的解法,采用递归: class Solution { public:int fib(int n){return dfs(n);}int dfs(int n){if(n 0 || n 1)return n;return d…

大数据-114 Flink DataStreamAPI 程序输入源 自定义输入源 Rich并行源 RichParallelSourceFunction

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…

linux 高级IO

IO等(要进行io是要有条件的,要有数据或者有空间)拷贝。高效体现在等待的时间所占比重越低越高效。 阻塞IO:数据没有就绪,read不返回。在内核将数据准备好之前, 系统调用会一直等待。所有的套接字, 默认都是阻塞方式。…

nginx容器映射配置文件后,启动一直报错提示:failed (13: Permission denied)的排查

问题现象: 使用harbor 的install.sh 创建docker-compose之后,出现nginx容器一直重启。 查看日志发现是:配置文件无权限。报错信息如下: Sep 2 16:43:13 172.28.0.1 nginx[1344]: 2024/09/02 08:43:13 [emerg] 1#0: open() “/e…

百度地图绘制电子围栏(包括移动端绘制操作)以及检测坐标是否在电子围栏内

由于本人在PC端仅使用了多边形绘制,但矩形跟多边形用法基本一样,圆形并未使用,如不符合读者需求也可以参考一下。 绘制后得到的数据可能不同,但绘制方法仅仅是传递的参数不同。 关于给坐标数组在地图绘制图形的效果在移动端部分包…

深度学习系列74:语音中的mel谱

1 mel谱介绍 一个人说一句话,其 waveform 可以很不一样,但是 spectrogram 基本上会相似,甚至有人可以通过 spectrogram 来判断说话的内容。语谱图的横坐标是时间,纵坐标是频率,坐标点值为语音数据能量。由于是采用二维…

# 利刃出鞘_Tomcat 核心原理解析(十一)-- WebSocket -- 1

利刃出鞘_Tomcat 核心原理解析(十一)-- Tomcat 附加功能 WebSocket – 1 一、Tomcat专题 - WebSocket - 介绍 1、Tomcat 附加功能:websocket 介绍 1)websocket :是 HTML5 新增的协议,它的目的是在浏览器…

动态规划法-资源分配问题

动态规划法 - 资源分配问题 问题描述 把4个份额的资源分配给3个工程,给定利润表如下表所示,写出资源的最优分配方案的求解过程。 4份资源分配给3个工程的利润表 步骤一:求各个阶段不同分配份额时的最大利润及分配份额 目标 我们的目标是…

53 mysql pid 文件的创建

前言 接上一篇文章 mysql 启动过程中常见的相关报错信息 在 mysql 中文我们在 “service mysql start”, “service mysql stop” 经常会碰到 mysql.pid 相关的错误信息 比如 “The server quit without updating PID file” 我们这里来看一下 mysql 中 mysql.pid 文件的…

微积分复习笔记 Calculus Volume 1 - 1.3Trigonometric Functions

1.3 Trigonometric Functions - Calculus Volume 1 | OpenStax

自己开发完整项目一、登录功能-05(动态权限控制)

一、上节回顾 在上一节中,我们介绍了如何通过数据库查询用户的权限,并对方法级别的接口使用注解的方式进行权限控制,之后通过用户携带的tocken进行解析权限,判断是否可以访问。 具体步骤: 1.在查询用户信息的时候将用户…

map和set的封装

目录 一、红黑树的改造 1.1节点的定义 二、红黑树的迭代器 2.1用节点封装迭代器 2.2迭代器的实现 2.3map和set的迭代器 三、insert的返回值 3.1insert返回值的用处 3.2operator[ ]的实现 四、key不能修改的问题 封装map和set一般分为六步: 封装map和set …

MFC生成dll的区别

主要分三种: A. 动态链接库(dll) B.具有导出项的(dll)动态链接库 C.MFC动态链接库 对比项目:可以根据需要选择哪种dll方便 添加自定义导出功能Demo 1. 添加导出实现接口: A. 导出需要具有:__declspec(dllexport) B. 按照C语言…

Javascript LeeCode选题(汉诺塔求解)

LeeCode选题 汉诺塔递归求解move移动函数hanoi函数main方法测试代码:代码实现 汉诺塔递归求解 汉诺塔介绍: 汉诺塔的的图形(从上到下1,2,3个)实现: 这里我们可以看到因为必须要将第n个移动到…