NeRF原理学习

news2024/12/26 22:23:02

一个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.coloradmin.cn/o/2098432.html

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

相关文章

80.动态申请内存

目录 一.malloc函数 二.其他注意事项 三.视频教程 在定义变量的时候会在内存中申请空间。除了在定义变量的时候申请内存空间,也可以使用库函数动态申请内存, 一.malloc函数 作用:动态申请一块连续的任意尺寸的内存空间。 函数原型&…

【前端9】手风琴v1.0版本:使用插槽实现动态内容插入的Vue组件

【前端9】手风琴:使用插槽实现动态内容插入的Vue组件 写在最前面一、插槽的基本概念1.默认插槽2.具名插槽 二、实现一个折叠面板组件0.关键点和注意事项1.父组件 App.vue2.子组件 Collapse.vue总结 3.详细解读(可以略过)父组件子组件 三、小结…

通用后台管理系统实战演示(Vue3 + element-plus)汇总篇三

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

Python任务编排和工作流管理库之prefect使用详解

概要 在数据工程和科学的世界中,任务编排和工作流管理变得越来越重要。随着数据处理任务的复杂性增加,开发人员需要一种可靠且易于使用的工具来设计、监控和管理这些任务。Prefect 是一个用于构建、监控和管理数据管道的 Python 库,它简化了工作流的创建和执行,同时提供了…

028、架构_高可用_主从原理

MySQL半同步复制概览 MySQL主从复制是一个异步的复制过程,主库发送更新事件到从库,从库读取更新记录,并执行更新记录,使得从库的内容与主库保持一致。主从复制的基本过程如下图所示: 主从复制的完成通过以下三个进程实现的主库 binary log dump 线程:当从库连接主库时,…

22. K8S及DevOps

22. K8S及DevOps 一. 章节简介二. DevOps1. 简介2. CICD三. Kubernetes1. [官网](https://kubernetes.io/zh-cn/)--------------------------------------------------------------------------------------------------------一. 章节简介 二. DevOps 1. 简介 2. CICD

【科研新手必备】如何高效、高质量、科学的科研?

文献下载网站—英文写作小工具—SCI选刊 1、文献下载网站 中国知网 sci-hub 大木虫学术导航 学术资源搜索 2、英文写作小工具 DeepL 学术短语库 SCI写作辅导材料 赛特新思 3、SCI选刊 Journal Finder SPRINGER NATURE

除了黑神话,探索3A游戏大作:不可错过的经典与录屏软件推荐

在游戏的天地里,3A 大作凭借其美轮美奂的画面、丰富多彩的内容以及意蕴深邃的剧情,俘获了无数玩家的倾心。除了广受瞩目的《黑神话:悟空》,还有诸多其他的 3A 游戏大作值得您去尝试。此类游戏不但在视觉与技术方面臻至行业的巅峰水…

Linux中如何查看一个进程?如何杀死一个进程?如何查看某个端口有没有被占用?

在Linux中 如何查看一个进程? 使用 ps 命令 ps aux这会显示所有正在运行的进程,可以使用 grep 来过滤特定的进程 ps aux | grep process_name使用 top 命令 top这个命令会实时的显示系统重正在运行的进程 如何杀死一个进程? 使用 kill …

C++ | 泛型编程:模板初阶与函数模板深度解析

文章目录 C 泛型编程:模板初阶与函数模板深度解析1. 泛型编程:实现代码的通用性2. 函数模板:代码的模具2.1 什么是函数模板?2.2 函数模板的格式2.3 函数模板的原理2.4 函数模板的实例化2.5 模板参数的匹配原则 3. 类模板&#xff…

【maven】阿里云和apache仓库配置

阿里云公共仓库的配置看起来有多种类型的仓库: 配置指南 我的maven是idea 自带的:D:\Program Files\JetBrains\IntelliJ IDEA 2022.3.1\plugins\maven\lib\maven3\</

校园跑腿系统小程序开发需求分析

校园跑腿系统小程序的开发需求分析是一个综合性的过程&#xff0c;旨在确保系统能够满足校园内用户的实际需求&#xff0c;并具备良好的用户体验。以下是对校园跑腿系统小程序开发需求分析的详细阐述&#xff1a; 一、功能需求分析 注册与登录&#xff1a;支持多种注册方式&am…

WebSphereMQ中间件监控指标解读

监控易是一款功能全面的IT监控系统&#xff0c;能够实时监控各种IT设施的性能和状态&#xff0c;帮助企业及时发现并解决潜在问题。在本次解读中&#xff0c;我们将聚焦于WebSphereMQ&#xff08;现更名为IBM MQ&#xff09;中间件的监控指标&#xff0c;深入剖析其含义和作用。…

[Linux] 权限

标题&#xff1a;[Linux] 权限 水墨不写bug 目录 一、Linux下对用户的分类 二、Linux的文件访问者的分类 三、修改文件的属性 1.修改文件的权限 &#xff08;只有拥有者和root可以修改某一个文件的权限&#xff09; 2.修改文件的拥有者 3.修改文件的所属组 四、文件创建…

Pytorch中不同的Norm归一化详细讲解

在做项目或者看论文时&#xff0c;总是能看到Norm这个关键的Layer&#xff0c;但是不同的Norm Layer具有不同的作用&#xff0c;准备好接招了吗&#xff1f;&#xff08;本文结论全部根据pytorch官方文档得出&#xff0c;请放心食用&#xff09; 一. LayerNorm LayerNorm的公…

统计学第5天

要观察性别和在线上买不买生鲜食品有没有关系&#xff0c;在现实生活中&#xff0c;女性通常去菜市场买菜的比较多&#xff0c;那么在线下是不是也是这样呢&#xff1f; 卡方统计量 如果研究的是两个类别变量&#xff0c;每个变量有多个类别&#xff0c;通常将两个变量多个类别…

ant design vue+vue3+ts+xlsx实现表格导出问excel文件(带自定义表头)~

1、首先默认你已安装ant design vue、xlsx 库、及file-saver。 2、导入&#xff1a; import * as XLSX from xlsx; import { saveAs } from file-saver; 注&#xff1a;这里的xlsx导入不能这么写&#xff0c;否则会报错&#xff0c;原因是版本不一致&#xff0c;语法向上兼容…

【多线程】线程间通信 之虚假唤醒和中断

两个线程&#xff0c;可以操作初始值为0的一个变量&#xff0c;实现一个线程对该变量1&#xff0c;一个线程对该变量-1&#xff0c;实现交替&#xff0c;来10轮&#xff0c;变量初始值为0&#xff0c;以实现此问题作为引入&#xff0c;简化我们的理解 文章目录 一、两个线程syn…

EasyExcel实现复杂Excel的导入

最近项目中遇到一个复杂的Excel的导入&#xff0c;并且数据量较大。因为数据不规则&#xff0c;所以只能使用POI进行自定义读取&#xff0c;但是发现数据量大之后&#xff0c;读取数据非常耗时。后面换成EasyExcel&#xff0c;性能起飞。 1. Excel样板 如上图&#xff0c;需要…

leetcode 12. 整数转罗马数字

解题思路 1.首先&#xff0c;将值与对应字符用字典来表示&#xff0c;然后将符号对应的值按有序顺序存储至列表中sums 2.将要转换的整数转换成列表形式&#xff0c;遍历列表&#xff0c;每次遍历&#xff1a; 将值取出来算出对应所在位置的实际值 如 32 对应列表 [3,2] 则 3实…