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的输出
  • 粗模型和细模型结构相同

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

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

相关文章

Jmeter性能测试之阶梯式场景、波浪式场景

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 1 阶梯式场景(负载测试)  该场景主要应用在负载测试里面,通过设定一定的并发线程数,给定加压规则,…

windows 上面交叉编译 适合arm架构上的linux内核系统的qt 版本,源码编译

1. 在机器上确认系统信息 cat /proc/cpuinfomodel name : ARMv7 Processor rev 5 (v7l) arm 32位 BogoMIPS : 57.14 Features : swp half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 CPU implementer : 0x41 CPU architecture: 7 …

实战华为AC6508无线控制器+华为无线AP上线配置(AirEngine5762S-12+AirEngine5760-10)+无线WIFI配置

一、适用场景 1、适用于企业环境、校园环境、大户型家庭多层楼环境。 2、对于无线网络需要集中管理和监测的环境,无线wifi覆盖范围面积大,适用本实例。 3、当无线WIFI需要从一个区域到另一个区域无缝漫游时,确保应用不掉线,可使用…

MS41929双通道超低噪声 256 细分微步进低压电机驱动

MS41929 是一款双通道 5V 低压步进电机驱动芯片,通过 具有电流细分的电压驱动方式以及扭矩纹波修正技术,实现了 超低噪声微步进驱动。 芯片另外内置一个直流电机驱动器,上下开关的电阻之和 低至 1.1Ω 。 MS41929 内置了晶振放大模…

WPF实现类似网易云音乐的菜单切换

这里是借助三方UI框架实现了,感兴趣的小伙伴可以看一下。 深色模式:​ 浅色模式: ​这里主要使用了以下三个包: MahApps.Metro:UI库,提供菜单导航和其它控件​​​​​​​ 实现步骤:1、使用B…

【KEIL那些事 4】CMSIS缺失!!!!导致不能编译!!!!软件自带芯片下载缓慢!!!!!!快速下载芯片包!!!!!

安装了keli发现emmm,CMSIS缺失!!!!不能编译,,,自带下载芯片缓慢,,,官网下载emmm,竟然不带动的!!!&…

打开游戏提示丢失(或找不到)XINPUT1_3.DLL的多种解决办法

xinput1_3.dll是一个动态链接库(DLL)文件,它在Windows操作系统中扮演着重要的角色。该文件作为系统库文件,通常存放于C:\Windows\System32目录下(对于32位系统)或C:\Windows\SysWOW64目录下(对于…

移动管家摩托车一键启动系统功能特点

移动管家摩托车一键启动系统具备智能解锁、启动、熄火及防盗等多功能 智能解锁与启动 无需原车钥匙,携带感应器走近摩托车即可自动解锁,按下一键启动按钮即可点火启动摩托车。智能熄火与防盗 摩托车熄火后,系统自动进入防盗模式,…

探索网页组件化:原生JavaScript动态加载HTML与iframe的使用与比较

在网页设计中,将内容作为组件动态加载到页面上是一种提高用户体验和页面性能的有效手段。本文将详细介绍两种实现动态内容加载的方法:使用原生JavaScript动态加载HTML和使用iframe,并对比它们的使用方式和优缺点。 原生JavaScript动态加载HTM…

落地 ZeroETL 轻量化架构,ByteHouse 推出“四个一体化”策略

在数字化转型的浪潮中,数据仓库作为企业的核心数据资产,其重要性日益凸显。随着业务范围扩大,企业也会使用不同的数据仓库来管理、维护相关数据。研发人员需要花费大量时间和精力,从中导出数据,然后进行手动整理、转换…

【SpringBoot】16 文件上传(Thymeleaf + MySQL)

Gitee仓库 https://gitee.com/Lin_DH/system 介绍 文件上传是指将本地的图片、视频、音频等文件上传到服务器,供其他用户浏览下载的过程,文件上传在日常项目中用的非常广泛。 实现代码 第一步:在配置文件新增如下配置 application.yml s…

渗透实战 JS文件怎么利用

1.前言 关于JS在渗透测试中的关键作用,想必不用过多强调,在互联网上也有许多从JS中找到敏感信息从而拿下关键系统的案例。大部分师傅喜欢使用findsomething之类的浏览器插件,也有使用诸如Unexpected.information以及APIFinder之类的Burp插件…

单片机输出方波

从P1.0上输出一个方波,高电平5ms,低电平10ms. #include〈reg51。h〉 unsigned char flag; sbit outP1^0; void main() { flag0; TMOD0X02; TH06; TL06; TR01; EA1; ET0…

【直播伴侣】抖音开播设置

可以使用obs作为虚拟摄像头,把加工的画面喂给直播伴侣,然后用直播伴侣开播推流:看起来蓝光画质也是1080p 下最大的8Mbps推荐是6Mbps。抖音伴侣的开播设置 测试自己的上行带宽 30Mbps 不知道为啥别人都那么大: 看起来蓝光画质,码率也只有6Mbps

【鸡翅Club】项目启动

一、项目背景 这是一个 C端的社区项目,有博客、交流,面试学习,练题等模块。 项目的背景主要是我们想要通过面试题的分类,难度,打标,来评估员工的技术能力。同时在我们公司招聘季的时候,极大的…

电商大数据获取渠道分享--官方接口、爬虫、第三方如何选择?

在当今大数据驱动的商业环境中,电商企业越来越依赖数据分析来洞察市场、优化运营和提升竞争力。本文将分享几种常见的电商大数据获取渠道,帮助电商从业者更有效地收集和利用数据资源。 一、电商平台官方接口 各大电商平台如淘宝、京东、拼多多等&#…

【网络协议栈】Tcp协议(上)结构的解析 和 Tcp中的滑动窗口(32位确认序号、32位序号、4位首部长度、6位标记位、16为窗口大小、16位紧急指针)

绪论​ “没有那么多天赋异禀,优秀的人总是努力翻山越岭。”本章主要讲到了再五层网络协议从上到下的第二层传输层中使用非常广泛的Tcp协议他的协议字段结构,通过这些字段去认识其Tcp协议运行的原理底层逻辑和基础。后面将会再写一篇Tcp到底是通过什么调…

JAVA-石头迷阵小游戏

采用企业式项目结构,接下来我将分享全部代码和结构,希望大家点点关注! 这是我的结构。首先使用IDE创建一个Module,命名stone-maze,接着把自带src下的main方法删除,接着在src下创建包,包名为com.wmuj,接着创建APP类代码如下: package com.wmuj;public class App {publ…

进程间通信大总结Linux

目录 进程间通信介绍 进程间通信目的 进程间通信发展 进程间通信分类 管道 System V IPC POSIX IPC 管道 什么是管道 匿名管道 用fork来共享管道原理 站在文件描述符角度-深度理解管道 管道读写规则 管道特点 命名管道 创建一个命名管道 匿名管道与命名管道的区…

RabbitMQ系列学习笔记(八)--发布订阅模式

文章目录 一、发布订阅模式原理二、发布订阅模式实战1、消费者代码2、生产者代码3、查看运行结果 本文参考: 尚硅谷RabbitMQ教程丨快速掌握MQ消息中间件rabbitmq RabbitMQ 详解 Centos7环境安装Erlang、RabbitMQ详细过程(配图) 一、发布订阅模式原理 在开发过程中&…