当前位置: 首页 > news >正文

NeRF三维重建—神经辐射场Neural Radiance Field(二)体渲染相关

NeRF三维重建—神经辐射场Neural Radiance Field(二)体渲染相关

粒子采集部分

粒子采集的部分我们可以理解为,在已知粒子的情况下,对图片进行渲染的一个正向的过程

  • 空间坐标(x,y,z)
  • 发射的光线通过相机模型成为图片上的像素坐标(u,v)
  • 粒子颜色即为像素颜色
  • (u, v)与(x, y, z)的公式如下:也就是之前在相机模型中提到的一些有关坐标转化的部分知识。

在这里插入图片描述

内参+外参来进行的

相反我们的任务是给定一张图片,我们需要的是在许多张图片中推导出相机为位姿信息。

  • 可以看作是沿着某一条射线上的无数个发光点的“和”;
  • 利用相机模型,反推射线
  • 那么这个射线表示为:r(t)=o+td
  • O为射线原点,d为方向,t为距离
  • 极坐标表示

总结来说我们的这个过程就是相机模型的一个反向的过程表达。由像素(u,v)反推出像素的信息来。

在这里插入图片描述

在三维的空间中采样射线的信息。

这一部分就是我们有关的粒子采集的部分信息了。可以得到我们的原点和方向的信息。我们通过这两个信息就可以表示出这条射线了。

体渲染

我们最后得到的像素的颜色是无数个发光粒子在该射线长度上经过累计得到的和。(作为我们像素最终的颜色)。

我们在表示出的这条射线上采用一定的方法取发光粒子的值,最后通过积分就可以得出体渲染所得到的像素的位置坐标了。

r ( t ) = o + t d r(t)=o+td r(t)=o+td

在我们计算的时候这个t是离散化的,我们如何通过选择这个离散的t来进行计算呢?

  1. 方法1:设置near=2,far=6。在near和far之间均匀采样64个点
  • 通过图像和相机的位姿,来计算表示一条射线。
  • 在射线上均匀的采样了64个点
  • 训练时,一张图片取1024个像素,
  • 得到1024条射线,每条射线上采样64个粒子共1024*64个粒子

我们的输出就是粒子的密度和颜色值

对之前的模型的信息进行一定的补充:

γ ( p ) = ( sin ⁡ ( 2 0 π p ) , cos ⁡ ( 2 0 π p ) , … , sin ⁡ ( 2 L − 1 ) , cos ⁡ ( 2 L − 1 π p ) ) \gamma(p)=\left(\sin \left(2^{0} \pi p\right), \cos \left(2^{0} \pi p\right), \ldots, \sin \left(2^{L-1}\right), \cos \left(2^{L-1} \pi p\right)\right) γ(p)=(sin(20πp),cos(20πp),,sin(2L1),cos(2L1πp))

  1. p需要归一化到[-1,1]
  2. 对于空间坐标x,L=10,r(x)是60D
  3. 对于视角坐标d,L= 4,r(d)是24D
  4. 在代码中,加上初始值:r(x)是63D,r(d)是27D

LOSS

  1. GT是图片某一像素的RGB
  2. 将该像素对应光线上的粒子颜色进行求和
  3. 粒子的颜色和:该像素颜色的预测值
  4. 粒子的颜色和]与像素颜色做MSE(均方误差损失)

L = ∑ r ∈ R ∥ C ^ ( r ) − C ( r ) ∥ 2 2 R 是每个batch的射线(1024条)  \begin{array}{l} L=\sum_{r \in R}\|\hat{C}(r)-C(r)\|_{2}^{2}\\ R \text { 是每个batch的射线(1024条) } \end{array} L=rRC^(r)C(r)22R 是每个batch的射线(1024

体渲染连续积分

C ( s ) ^ = ∫ 0 + ∞ T ( s ) σ ( s ) C ( s ) d s T ( s ) = e − ∫ 0 s σ ( t ) d t \begin{array}{l} \hat{C(s)}=\int_{0}^{+\infty} T(s) \sigma(s) C(s) d s \\ T(s)=e^{-\int_{0}^{s} \sigma(t) d t} \end{array} C(s)^=0+T(s)σ(s)C(s)dsT(s)=e0sσ(t)dt

  • T(s):在s点之前,光线没有被阻碍的概率.
  • o(s):在s点处,光线碰击粒子(光线被粒子阻碍)的概率密度
  • C(s):在s点处,粒子光出的颜色
  • 各点的颜色和概率密度已知,要先求T(s)

每个点的体密度与颜色相乘在结合一下不透明度来进行说明。

理论推导部分说明:

在这里插入图片描述

  1. 我们对上面的公式进行推导首先推导T的公式

T ( s + d s ) = T ( s ) [ 1 − σ ( s ) d s ] T ( s + d s ) = T ( s ) − T ( s ) σ ( s ) d s T ( s + d s ) − T ( s ) = − T ( s ) σ ( s ) d s d T ( s ) = − T ( s ) σ ( s ) d s d T ( s ) T ( s ) = − σ ( s ) d s \begin{array}{l} T(s+d s)=T(s)[1-\sigma(s) d s] \\ T(s+d s)=T(s)-T(s) \sigma(s) d s \\ T(s+d s)-T(s)=-T(s) \sigma(s) d s \\ d T(s)=-T(s) \sigma(s) d s \\ \frac{d T(s)}{T(s)}=-\sigma(s) d s \end{array} T(s+ds)=T(s)[1σ(s)ds]T(s+ds)=T(s)T(s)σ(s)dsT(s+ds)T(s)=T(s)σ(s)dsdT(s)=T(s)σ(s)dsT(s)dT(s)=σ(s)ds

两边同时积分就可以得到:

∫ 0 t d T ( s ) T ( s ) = ∫ 0 t − σ ( s ) d s ∫ 0 t 1 T ( s ) d T ( s ) = ∫ 0 t − σ ( s ) d s ln ⁡ T ( s ) ∣ 0 t = ∫ 0 t − σ ( s ) d s ln ⁡ T ( t ) − ln ⁡ T ( 0 ) = ∫ 0 t − σ ( s ) d s ln ⁡ T ( t ) = ∫ 0 t − σ ( s ) d s T ( t ) = e ∫ 0 t − σ ( s ) d s \begin{aligned} \int_{0}^{t} \frac{d T(s)}{T(s)} & =\int_{0}^{t}-\sigma(s) d s \\ \int_{0}^{t} \frac{1}{T(s)} d T(s) & =\int_{0}^{t}-\sigma(s) d s \\ \left.\ln T(s)\right|_{0} ^{t} & =\int_{0}^{t}-\sigma(s) d s \\ \ln T(t)-\ln T(0) & =\int_{0}^{t}-\sigma(s) d s \\ \ln T(t) & =\int_{0}^{t}-\sigma(s) d s \\ T(t) & =e^{\int_{0}^{t}-\sigma(s) d s} \end{aligned} 0tT(s)dT(s)0tT(s)1dT(s)lnT(s)0tlnT(t)lnT(0)lnT(t)T(t)=0tσ(s)ds=0tσ(s)ds=0tσ(s)ds=0tσ(s)ds=0tσ(s)ds=e0tσ(s)ds

因为是离散的数据我们要将之前推导出来的连续形式进行离散化的处理。

  1. 计算机只能处理离散化数据
  2. 将光线[O,s]划分为N个等间距区间[Tn→ Tn+1]
  3. n=0,1,2,…,N
  4. 间隔长度为on

C ^ ( r ) = ∑ i = 1 N T i ( 1 − e − σ i δ i ) c i where  T i = e − ∑ j = 1 i − 1 σ j δ j \begin{array}{l} \hat{C}(r)=\sum_{i=1}^{N} T_{i}\left(1-e^{-\sigma_{i} \delta_{i}}\right) c_{i}\\ \text { where } T_{i}=e^{-\sum_{j=1}^{i-1} \sigma_{j} \delta_{j}} \end{array} C^(r)=i=1NTi(1eσiδi)ci where Ti=ej=1i1σjδj

下面我们补充我们的离散化公式的一个推导过程。

我们对每个光区贡献的光强进行累计操作。

C ^ = ∑ n = 0 N I ( T n → T n + 1 ) \hat{C}=\sum_{n=0}^{N} I\left(T_{n} \rightarrow T_{n+1}\right) C^=n=0NI(TnTn+1)

I ( T n → T n + 1 ) = ∫ t n t n + 1 T ( t ) σ n C n d t = σ n C n ∫ t n t n + 1 T ( t ) d t = σ n C n ∫ t n t n + 1 e − ∫ 0 t σ ( s ) d s d t = σ n C n ∫ t n t n + 1 e − ( ∫ 0 t n σ ( s ) d s + ∫ t n t σ ( s ) d s ) d t = σ n C n ∫ t n t n + 1 e − ∫ 0 t n σ ( s ) d s e − ∫ t n t σ ( s ) d s d t = σ n C n T ( 0 → t n ) ∫ t n t n + 1 e − ∫ t n t σ ( s ) d s d t \begin{aligned} I\left(T_{n} \rightarrow T_{n+1}\right) & =\int_{t_{n}}^{t_{n+1}} T(t) \sigma_{n} C_{n} d t \\ & =\sigma_{n} C_{n} \int_{t_{n}}^{t_{n+1}} T(t) d t \\ & =\sigma_{n} C_{n} \int_{t_{n}}^{t_{n+1}} e^{-\int_{0}^{t} \sigma(s) d s} d t \\ & =\sigma_{n} C_{n} \int_{t_{n}}^{t_{n+1}} e^{-\left(\int_{0}^{t_{n}} \sigma(s) d s+\int_{t_{n}}^{t} \sigma(s) d s\right)} d t \\ & =\sigma_{n} C_{n} \int_{t_{n}}^{t_{n+1}} e^{-\int_{0}^{t_{n}} \sigma(s) d s} e^{-\int_{t_{n}}^{t} \sigma(s) d s} d t \\ & =\sigma_{n} C_{n} T\left(0 \rightarrow t_{n}\right) \int_{t_{n}}^{t_{n+1}} e^{-\int_{t_{n}}^{t} \sigma(s) d s} d t \end{aligned} I(TnTn+1)=tntn+1T(t)σnCndt=σnCntntn+1T(t)dt=σnCntntn+1e0tσ(s)dsdt=σnCntntn+1e(0tnσ(s)ds+tntσ(s)ds)dt=σnCntntn+1e0tnσ(s)dsetntσ(s)dsdt=σnCnT(0tn)tntn+1etntσ(s)dsdt

经过化简就可以得到最后的公式的形式:

I ( T n → T n + 1 ) = σ n C n T ( 0 → t n ) ∫ t n t n + 1 e − ∫ t n t σ n d s d t = σ n C n T ( 0 → t n ) ∫ t n t n + 1 e − σ n ( t − t n ) d t = σ n C n T ( 0 → t n ) [ − 1 σ n e − σ n ( t − t n ) ∣ t n t n + 1 ] = C n T ( 0 → t n ) ( 1 − e σ n δ n ) = C n e − ∑ i = 0 n − 1 σ i δ i ( 1 − e σ n δ n ) . \begin{aligned} I\left(T_{n} \rightarrow T_{n+1}\right) & =\sigma_{n} C_{n} T\left(0 \rightarrow t_{n}\right) \int_{t_{n}}^{t_{n+1}} e^{-\int_{t_{n}}^{t} \sigma_{n} d s} d t \\ & =\sigma_{n} C_{n} T\left(0 \rightarrow t_{n}\right) \int_{t_{n}}^{t_{n+1}} e^{-\sigma_{n}\left(t-t_{n}\right)} d t \\ & =\sigma_{n} C_{n} T\left(0 \rightarrow t_{n}\right)\left[-\left.\frac{1}{\sigma_{n}} e^{-\sigma_{n}\left(t-t_{n}\right)}\right|_{t_{n}} ^{t_{n+1}}\right] \\ & =C_{n} T\left(0 \rightarrow t_{n}\right)\left(1-e^{\sigma_{n} \delta_{n}}\right) \\ & =C_{n} e^{-\sum_{i=0}^{n-1} \sigma_{i} \delta_{i}}\left(1-e^{\sigma_{n} \delta_{n}}\right). \end{aligned} I(TnTn+1)=σnCnT(0tn)tntn+1etntσndsdt=σnCnT(0tn)tntn+1eσn(ttn)dt=σnCnT(0tn)[σn1eσn(ttn) tntn+1]=CnT(0tn)(1eσnδn)=Cnei=0n1σiδi(1eσnδn).

  • 粗模型:输入均匀采样粒子,输出密度
  • 细模型:根据密度,二次采样
  • 最后输出:采用模型2的输出
  • 粗模型和细模型结构相同

相关文章:

NeRF三维重建—神经辐射场Neural Radiance Field(二)体渲染相关

NeRF三维重建—神经辐射场Neural Radiance Field(二)体渲染相关 粒子采集部分 粒子采集的部分我们可以理解为,在已知粒子的情况下,对图片进行渲染的一个正向的过程。 空间坐标(x,y,z)发射的光线通过相机模型成为图片上…...

软件测试工程师:如何写出好的测试用例?

软件测试用例(Test Case)是软件测试过程中的一种详细文档或描述,用于描述在特定条件下,对软件系统或组件进行测试的步骤、输入数据、预期输出和预期行为。编写高质量的测试用例是确保软件质量的关键步骤之一。以下是一些编写优秀测试用例的建议&#xff…...

「图::连通」详解并查集并实现对应的功能 / 手撕数据结构(C++)

目录 概述 成员变量 创建销毁 根节点访问 路径压缩 启发式合并 复杂度 Code 概述 并查集,故名思议,能合并、能查询的集合,在图的连通性问题和许多算法优化上着广泛的使用。 这是一个什么数据结构呢? 一般来讲,并查集是…...

基于PSO粒子群优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) PSO优化过程: PSO优化前后,模型训练对比: 数据预测对比: 误差回归对比&a…...

PyTorch 的 DataLoader 类介绍

DataLoader 类 功能与作用 PyTorch 是一个流行的开源机器学习库,它提供了一个名为 DataLoader 的类,用于加载数据集并将其封装成一个可迭代的对象。DataLoader 可以自动地将数据集划分为多个批次,并在训练过程中迭代地返回这些批次。是用于加…...

【设计模式系列】命令模式

目录 一、什么是命令模式 二、命令模式的角色 三、命令模式的典型应用场景 四、命令模式在Runnable中的应用 一、什么是命令模式 命令模式(Command Pattern)是一种行为设计模式,它将一个请求或简单操作封装为一个对象。这个模式提供了一种…...

uniapp中使用lottie实现JSON动画

uniapp中使用lottie实现JSON动画 不喜欢废话直接开干一、引入相关依赖二、在项目的目录新建目录结构三、操作步骤四、编写自定义组件代码五、组件的使用提一嘴更多lottie-web常用方法添加点击事件 不喜欢废话直接开干 一、引入相关依赖 npm install lottie-web # 如果有问题可…...

AcWing275

题目重述 这道题的核心是利用方格取数模型的思想,将两条路径的传递过程映射为同时出发的两条路径,避免重复格子的经过。题解通过以下步骤解题: 路径映射:从 (n, m) 回到 (1, 1) 的路径,可以转换成 (1, 1) 到 (n, m) …...

Windows系统部署redis自启动服务【亲测可用】

文章目录 引言I redis以本地服务运行(Windows service)使用MSI安装包配置文件,配置端口和密码II redis服务以终端命令启动缺点运行redis-server并指定端口和密码III 知识扩展确认redis-server可用性Installing the Service引言 服务器是Windows系统,所以使用Windows不是re…...

深入了解机器学习 (Descending into ML):线性回归

人们早就知晓,相比凉爽的天气,蟋蟀在较为炎热的天气里鸣叫更为频繁。数十年来,专业和业余昆虫学者已将每分钟的鸣叫声和温度方面的数据编入目录。Ruth 阿姨将她喜爱的蟋蟀数据库作为生日礼物送给您,并邀请您自己利用该数据库训练一…...

每日OJ题_牛客_集合_排序_C++_Java

目录 牛客_集合_排序 题目解析 C代码 Java代码 牛客_集合_排序 集合_牛客题霸_牛客网 (nowcoder.com) 题目解析 笔试题可直接用set排序&#xff0c;面试可询问是否要手写排序函数&#xff0c;如果要手写排序&#xff0c;推荐写快排。 C代码 #include <iostream> …...

鸿蒙网络编程系列27-HTTPS服务端证书的四种校验方式示例

1. 服务端数字证书验证的问题 在鸿蒙客户端对服务端发起HTTPS请求时&#xff0c;如果使用HttpRequest的request发起请求&#xff0c;那么就存在服务端数字证书的验证问题&#xff0c;你只有两个选择&#xff0c;一个是使用系统的CA&#xff0c;一个是使用自己选定的CA&#xf…...

scala继承

Scala中继承的定义为在原有类的基础上定义一个新类&#xff0c;原有类称为父类&#xff0c;新类称为子类。 当子类从父类中继承的方法不能满足需要时&#xff0c;子类需要有自己的行为&#xff0c;怎么办&#xff1f; 此时使用override可以重写父类方法。 class Aniaml(){va…...

【Hive】2-Apache Hive概述、架构、组件、数据模型

Apache Hive概述 什么是Hive Apache Hive是一款建立在Hladoop之上的开源数据仓库系统&#xff0c;可以将存储在Hadoop文件中的结构化、半结构化数据文件映射为一张数据库表&#xff0c;基于表提供了一种类似SQL的查询模型&#xff0c;称为Hive查询语言(HQL)&#xff0c;用于访…...

关于目前面试八股文的一些心得体会

现在是2024年10月&#xff0c;自22年开始&#xff0c;明显感觉到整个计算机行业&#xff0c;越来越卷了。一方面&#xff0c;随着信息的传播&#xff0c;越来越多的新人涌入了这个赛道&#xff0c;另一方面&#xff0c;众所周知的原因&#xff0c;不管大厂还是小厂在经历寒冬之…...

大数据-178 Elasticsearch Query - Java API 索引操作 文档操作

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…...

PHP(一)从入门到放弃

参考文献&#xff1a;https://www.php.net/manual/zh/introduction.php PHP 是什么&#xff1f; PHP&#xff08;“PHP: Hypertext Preprocessor”&#xff0c;超文本预处理器的字母缩写&#xff09;是一种被广泛应用的开放源代码的多用途脚本语言&#xff0c;它可嵌入到 HTML…...

基于深度学习的生物启发的学习系统

基于深度学习的生物启发学习系统&#xff08;Biologically Inspired Learning Systems&#xff09;旨在借鉴生物大脑的结构和学习机制&#xff0c;设计出更高效、更灵活的人工智能系统。这类系统融合了生物神经科学的研究成果&#xff0c;通过模仿大脑中的学习模式、记忆过程和…...

10_实现readonly

在某些时候&#xff0c;我们希望定义一些数据是只读的&#xff0c;不允许被修改&#xff0c;从而实现对数据的保护&#xff0c;即为 readonly 只读本质上也是对数据对象的代理&#xff0c;我们同样可以基于之前实现的 createReactiveObject 函数来实现&#xff0c;可以为此函数…...

简单介绍$listeners

$listeners 它可以获取父组件传递过来的所有自定义函数&#xff0c;如下&#xff1a; // 父组件 <template><div class"a"><Child abab"handleAbab" acac"handleAcac"/></div> </template><script> impor…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

C++:多态机制详解

目录 一. 多态的概念 1.静态多态&#xff08;编译时多态&#xff09; 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1&#xff09;.协变 2&#xff09;.析构函数的重写 5.override 和 final关键字 1&#…...

怎么让Comfyui导出的图像不包含工作流信息,

为了数据安全&#xff0c;让Comfyui导出的图像不包含工作流信息&#xff0c;导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo&#xff08;推荐&#xff09;​​ 在 save_images 方法中&#xff0c;​​删除或注释掉所有与 metadata …...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案

在大数据时代&#xff0c;海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构&#xff0c;在处理大规模数据抓取任务时展现出强大的能力。然而&#xff0c;随着业务规模的不断扩大和数据抓取需求的日益复杂&#xff0c;传统…...

如何在Windows本机安装Python并确保与Python.NET兼容

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…...

高抗扰度汽车光耦合器的特性

晶台光电推出的125℃光耦合器系列产品&#xff08;包括KL357NU、KL3H7U和KL817U&#xff09;&#xff0c;专为高温环境下的汽车应用设计&#xff0c;具备以下核心优势和技术特点&#xff1a; 一、技术特性分析 高温稳定性 采用先进的LED技术和优化的IC设计&#xff0c;确保在…...