NeRF算法原理总结概述

简介

本文旨在对NeRF算法进行总结。论文翻译见博客:《NeRF算法论文解析与翻译》

参考链接:
神经网络辐射场NeRF、实时NeRF Baking、有向距离场SDF、占用网络Occupancy、NeRF 自动驾驶
NeRF详解
NeRF入门之体渲染 (Volume Rendering)
NeRF中的位置编码

1.算法概述

整体上NeRF干了这么一件事,输入一组静态场景的连续RGB图像和每帧图像对应的位姿,基于体渲染技术构建损失函数,通过借助一个全连接神经网络MLP得到关于新视角图像中每个像素对应3D点的体积密度RGB颜色信息。其中不包含3D场景重建,只是将场景隐式的通过一个函数进行表达。

算法整体的pipeline如下图所示:
在这里插入图片描述

其主要的工作在于:

  • 将连续场景表示为一个5D输入的神经辐射场,输入采样点的3D坐标和方向,可以得到其体积密度和颜色信息
  • 在寻找采样点时使用一种分层采样,”粗采样“计算相机射线上的点的分布,”细采样“获取概率分布较大处的点,避免过多选择"空"处的无效点,以及忽略"密集处"的好点
  • 对位置和方向坐标使用位置编码,以提高渲染的分辨率
  • 基于体渲染技术构建损失函数,并对位置和颜色进行分层训练

主要内容大概可以分为:数据预处理、分层体积采样、位置编码、MLP网络、损失函数

2.数据输入

2.1 数据信息说明

这里要区分一下NeRF的算法输入数据和MLP的神经网络输入。对于NeRF算法,输入只需要一组关于静态场景的RGB图像数据和每帧图像对应的位姿。然后,通过数据预处理模块会将RGB图像数据转换为MLP神经网络需要的5D坐标,包括xyz位置信息,和2D的旋转信息。

(1)xyz位置信息

背景:已经知道位于真实场景下的3D空间点[x,y,z]通过相机投影落在成像平面上会得到一个对应的像素[u,v],即连接真实世界中某个3D点和相机光心之间的连线,和相机成像平面相交于对应的像素位置。

在进行3D重建或是本文的新视角图像合成工作时,已知的是2D图像和对应的相机光心位置(位姿),需要很据这些信息反推出3D点的位置。对于3D重建工作可以通过视差或者深度滤波器来进行估计,在本文中是通过在这条射线上进行采样来得到深度学习网络的输入,也就是上面图像中左图中射线上的黑点。

根据相机投影原理,由像素坐标[u,v]可以得到3D采样点的[x,y]坐标,然后当采样点的位置确定后可以确定3D点的z坐标。
在这里插入图片描述

(2)旋转信息(θ,φ)

从相机光心出发,连接图像中的每个像素会得到一组射线,这里的旋转信息指的是每条相机射线的方向信息。3D空间中的方向可以由一个方向矢量表示,这个方向矢量由相机光心坐标和像素在焦距f处的3D坐标决定,然后通过相机位姿可以将该方向转换为世界坐标系下,并以方位角θ和仰角φ形式作为神经网络的输入。

2.2 分层体积采样

  • 首先,根据数据集中稀疏地图可以得到一个地图中点到光心的最大最小距离,称之为边界

  • 然后,在每条射线上的边界范围内,均匀选择N_c个采样点(如下面左图),使用coarse网络对其进行训练可以得到每条射线上点的体积密度和颜色信息

  • 然后,将coarse网络的预测结果(体积密度和颜色)带入到相关的体渲染函数中,可以得到关于该光线的概率密度分布函数( w ^ i \hat{w}_{i} w^i)
    在这里插入图片描述

在这里插入图片描述

  • 然后,根据估计出的分布进行第二次重要性采样,共计N_f个点(如下面右图橘色点)

  • 最后,将两次采样共N_c+N_f个点送到fine网络进行训练

此过程将更多样本分配给我们希望包含可见内容的区域(即采样点分布比较密集的区域)。这解决了与重要性采样类似的目标,但我们使用采样值作为整个积分域的非均匀离散化,而不是将每个样本视为整个积分的独立概率估计。
在这里插入图片描述

3.位置编码

目前深度学习网络对低频的数据训练效果较好,因为现实场景中的变化在低频数据中的反映差距更明显(参考一下逆深度的概念),但是场景的3D点一般是高频数据,比如位置(237, 332, 198)和位置(237,332,199)这两个点作为MLP的输入,如果直接将原始数据送入到网络中进行训练,MLP可能对个位不够敏感,导致输出过平滑的问题,最终无法得到高分辨率的结果,具体表现为最终的渲染图片会出现模糊,如下图中第4张图像:
在这里插入图片描述

针对这一问题,作者选择对位置数据和方向信息进行位置编码,即将原始的数据送入到一个映射函数:
在这里插入图片描述

当然,也如公式所示,我们并不以单一的频率来表示位置编码,比如我们挨个用[1,2,4,8,16,32,64,128,256,512]这10种频率来表示编码位置(只需用公式r=sin(p*x),然后简单concat到一起)。这就完成了基本的位置编码。当然,我们还可以加入相位平移,把cos(p*x)的结果也concat到一起。

所以,对于一个位置p(x,y,z),我们用10种频率来编码,每种频率采用两种相位(sin和cos),那编码后的位置应该有3×10×2=60维来表示原始的三维坐标向量。

NeRF除了位置(x,y,z)输入外,还需要输入观测角度(θ,ϕ)。观测角度可以用ray direction来表示,通常采用三维向量。也需要进行编码,也可以统称为位置编码。我们用同样的方法,但可以少用一些频率,比如我们用[1,2,4,8]这四种频率来编码观测角度。编码后的维度也可计算出来:3x4x2=24
在这里插入图片描述

4.MLP网络

该MLP网络先使用8个全连接层处理三维位置(x,y,z),输出体素密度σ和256维特征向量(因此体素密度σ仅是关于三维位置(x,y,z)的函数);

然后将上面得到的256维特征向量与二维方位视角(θ,φ)concat,接着用1个全连接层处理,输出颜色c=(r,g,b)
在这里插入图片描述

5.损失函数

再次回顾一下NeRF的任务:即通过对一个3D场景进行学习,然后实现该场景新视角下的图像合成。只要知道每个像素对应的RGB信息即可以得到一张图像,NeRf通过将生成的每个光线对应像素的体积密度信息和颜色信息,带入到体渲染公式中可以得到一个基于NeRF的预测值,然后通过和对应图像的真值结果作差得到2范数的损失函数。

然后,综合上述coarse网络fine网络的预测结果可以得到最终的误差损失函数。

在这里插入图片描述

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

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

相关文章

C++力扣题目501--二叉搜索树中的众数

给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。 如果树中有不止一个众数,可以按 任意顺序 返回。 假定 BST 满足如下定义&#xf…

项目中Ant Design Pro业务问题解决方案

ProTable实现多选反显筛选项多级关联选择 import {forwardRef,useImperativeHandle,useEffect,useRef,useReducer, } from "react"; import { Drawer, Space, Button, message } from "antd"; import * as PC from "ant-design/pro-components";…

PHP项目添加分布式锁,这里是ThinkPHP8框架实现分布式锁

背景:公司旧项目,最初访问量不多,单机部署的。后来,访问量上来了,有阵子很卡,公司决定横向扩展,后端代码部署了三台服务器。部署调整后,有用户反馈,一个订单支付了三次。…

网络原理--http

目录 一、 DNS(应用层协议) 1、域名概念 2、维护ip地址和域名之间的映射(域名解析系统) 3、DNS系统(服务器) 4、如何解决DNS服务器高并发问题 二、HTTP(应用层协议) 1、htt…

win10安装ssh服务

前置条件: 远程虚拟机,防火墙关闭,本地主机与虚拟机互相可以ping通 虚拟机是win10专业版本 操作步骤: 1、搜索框搜索“Windows PowerShell”并以管理员身份运行 2、输入如下代码,检查本地是否有ssh服务&#xff0c…

【Docker】网络模式➕自定义网络

🥳🥳Welcome 的Huihuis Code World ! !🥳🥳 接下来看看由辉辉所写的关于Docker的相关操作吧 目录 🥳🥳Welcome 的Huihuis Code World ! !🥳🥳 一.Docker网络模式的介绍 二. 网桥模…

Linux内核架构和工作原理详解(二)

Linux内核体系结构简析简析 图1 Linux系统层次结构 最上面是用户(或应用程序)空间。这是用户应用程序执行的地方。用户空间之下是内核空间,Linux 内核正是位于这里。GNU C Library (glibc)也在这里。它提供了连接内核…

【JVM】类的生命周期

目录 类的生命周期 加载阶段 连接阶段 初始化阶段 类的使用阶段 类的加载阶段 类的生命周期 加载阶段 在加载阶段,类加载器首先会通过一个类的全限定名来获取定义此类的二进制字节流。这个步骤主要是将整个Class 文件解析成二进制流。 (全限定名是…

海外代理IP怎么用?常见使用问题及解决方案

海外代理IP是指提供全球范围内的代理服务器,代理服务器充当IP与目标网站之间的中介,可以起到安全匿名、提高网速、突破网络壁垒的作用。在使用代理IP的过程中,用户可能会遇到各种挑战,如连接问题、速度慢等。理解这些问题的原因并…

HCIP第一次练习 -- RIP复习实验

要求: 需求:R1-R2-R3-R4-R5运行RIPV2 R6-R7运行RIPV1 1.使用合理地址规划网络,各自创建环回接口 2.R1创建环回172.16.1.1/24172.16.2.1/24 172.16.3.1/24 3.要求R3使用R2访问R1环回 4.减少路由条自数量,增加路由传递安全性 5.R5创建一个环回模拟运营商,不…

申泰勇教练的独家人物化身系列即将登陆 The Sandbox

申泰勇(Shin Tae-yong)教练是足球界的传奇人物,他来到 The Sandbox,推出了自己的专属人物化身系列。作为前 K 联赛中场球员和印尼队取得历史性成就的幕后教练,他的传奇经历现在已经影响到了虚拟世界。 向过去、现在和未…

基于ArcGIS的晕线制作

在借助ArcGIS进行制图时,我们有时需要为矢量边界添加晕线,今天就来探索一下基于ArcGIS的晕线制作操作。 软件版本:ArcMap10.4.1 方法一:制作多环缓冲区 工具路径:Analysis Tools-Proximity-Mutiple Ring Buffer 思…

前后端跨域问题

告别烦恼,彻底解决跨域问题的终极指南-chrome的安全进阶之路_chrom 强制跨域-CSDN博客

在linux安装LAStools

LAStools下载: https://github.com/LAStools/LAStools/releases 编译安装: # 设置安装路径 cmake -DCMAKE_INSTALL_PREFIX/home/vis/work/SourceCode/LAStools-2.0.2/build cmake . cmake --build . make install编译后的库:

【昕宝爸爸小模块】深入浅出之JDK21 中的虚拟线程到底是怎么回事(二)

➡️博客首页 https://blog.csdn.net/Java_Yangxiaoyuan 欢迎优秀的你👍点赞、🗂️收藏、加❤️关注哦。 本文章CSDN首发,欢迎转载,要注明出处哦! 先感谢优秀的你能认真的看完本文&…

node版本过高与node-sass不兼容问题

第一步:安装yarn 安装cnpm 第二步:yarn install 这一步可能会出现node版本过高报错 yarn config set ignore-engines true 执行 自动补充兼容命令 然后重新yarn install 出现报错: 第三步:使用cnpm 单独安装 cnpm install node-…

Acrel-1000安科瑞变电站综合自动化系统选型与应用

摘 要:变电站综合自动化系统是将变电站内的二次设备经过功能的组合和优化设计,利用先进的计算机技术、通信技术、信号处理技术,实现对全变电站的主要设备和输、配电线路的自动监视、测量、控制、保护、并与上级调度通信的综合性自动化功能。为…

【Docker】网络配置的三种方式

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《Docker实战》。🎯🎯 &…

【C++】- 类和对象(运算符重载!!const!!详解!!)

类和对象③ 介绍运算符重载赋值运算符重载运算符重载const 在学习C语言时,我们首先接触的就是变量,再深入学习,我们可以利用运算符对变量进行操作,当我们使用C编写程序时,经常会遇到一些需要对特殊的例如自定义数据类型…