NeRF:神经辐射场论文原理讲解

2023-11-12

一、新视角合成

       NeRF是开创了一种全新的视角合成方法。新视角合成任务指的是给定源图像(Source Image)及对应的源姿态(Source Pose)以及目标姿态(Target Pose),渲染生成目标姿态对应的图片(Target)。源姿态指的是从相机坐标转换为世界坐标的变换矩阵。 涉及2D和3D之间的坐标转换。

 

 如上图所示,一共有三个坐标系:世界坐标系[X,Y,Z]、相机坐标系[Xc,Yc,Zc]T和图像坐标系[x,y]T

(一)、相机坐标系与世界坐标系的转换

           相机坐标系和三维世界坐标系之间的转换关系如下:

叫做相机的外参矩阵,包含旋转信息:和平移信息:,用于从世界坐标转换到相机坐标。对于NeRF来说会提供从相机坐标系转换到世界坐标系的前述矩阵的逆矩阵。

(二)、图像坐标与相机坐标系的转换

      二维图像的坐标和相机坐标系中的坐标转换关系如下:

其中,矩阵指的是相机的内参,包含焦距以及图像中心点的坐标

坐标转换详细可见:新视角合成 (Novel View Synthesis) - (1) 任务定义 - 知乎

二、NeRF的作用

       NeRF即神经辐射场,就是将全连接神经网络(非卷积)引入到物体的3维场景表示中。只需要同一物体不同角度的若干张图片作为监督,神经网络可以隐式地对该物体进行三维场景建模,然后在新视角下通过体渲染(volume rendering)的方法渲染生成新的角度的二维图像。在3D重建,数据增强,AR/VR等领域有着广泛的应用。

三、NeRF的流程

       首先,是通过相机光线穿过场景,采样三维点集(x,y,z)。

       然后,将这些采样的三维点集和相关的2维视角(θ,Φ)作为输入,输入到神经网络(MLP)中,输出采样点对应的颜色(view-dependent)和体密度(volume density)。

       最后,用经典的体渲染方法将输出的颜色(c=(r,g,b))和体密度(σ)渲染成2维图片。

       通过最小化已知图片和通过渲染得到的图片之间的像素差值进行训练。方法的总体流程图如下所示:

 

 

四、NeRF的实施细节

(一)、场景表示

       NeRF将一个连续的场景表示为一个5D的向量函数,它的输入包括空间点3D坐标X=(x,y,z)以及2D的视角方向d = (θ,Φ)。输出是与位置相关的体素密度σ和视角相关的该3D点颜色c=(r,g,b)。

神经网络表示为:

1、输入坐标表示

       根据光线追踪的基本只是,一条射线可以用公式rt=o+td 表示,其中o表示原点的坐标,d是方向向量,t是参数,射线上的每个点都可以由(x,y,z,θ,Φ)表示,即三维空间坐标和视角。

        如上图所示,射线上的点可以用(x,y,z,theta,phi)来表示。详细可见        新视角合成 (Novel View Synthesis) - (2) Scene Representation - 知乎

2MLP网络结构

        在训练过程中通过优化神经网络权重Θ,使输入的5D坐标与输出体密度、方向相关的颜色对应起来。体素密度σ只和x相关,c和x、d均相关。网络结构如下图所示:

        

        首先将3D位置坐标x输入到8层全连接层中,每一层有256个通道,输出为一维的体素密度σ(通过(256,1)的全连接层实现),以及一个256维的特征向量。将256维的中间特征向量与视角串联起来,组成一个256+24位的特征向量,再通过一个(256+24,128)全连接层,以及一个(128,3)的全连接层输出RGB颜色值。在第5层有一个跳跃链接,将位置信息直接串联到第五层的特征向量上,再进行前向传播。黑色箭头表示用ReLU做为激活函数,橙色箭头表示没有激活函数,黑色虚线箭头表示用sigmoid作为激活函数(实际作者在代码中并没有使用这个激活函数)。

 

(二)、体渲染

        一条有近端(tn)和远端边界(tf)的相机光线rt=o+td的颜色为:

      

 其中,

 

表示射线从tnt这一段路径上的累积透明度,可以理解为这条射线从tnt一路上没有击中任何粒子的概率。在实际运用中不可能用NeRF去估计连续的3D信息,因此就需要数值近似的方法。作者提出了一种均匀随机采样方法,第i个采样点如下式所示:

       首先将射线需要积分的区域分为N份,然后在每一个小区域中进行均匀随机采样,这种方法可以保证采样位置的连续性。上式求颜色的积分公式可以简化为如下求和公式:

 

其中, 是邻近两个采样点之间的距离。

(三)、位置编码

       NeRF函数的输入为位置和角度信息,作者发现直接将位置和角度作为网络的输入得到的结果相对模糊,而用position encoding的方式将位置信息映射到高频则能有效提升清晰度效果。作者提出的位置编码函数如下:

 

 

       P代表需要编码的位置,在NeRF中指的是X=(x,y,z),d = (θ,Φ),其中对X编码时L=10,对d编码时L=4。故对一个采样点中有60个数,在nerf-pytorch-master项目中,在给视角编码时多加了一个维度,详见run_nerf.py 文件第44行,故中有24个数。

项目代码详见:

GitHub - yenchenlin/nerf-pytorch: A PyTorch implementation of NeRF (Neural Radiance Fields) that reproduces the results.

  

(四)、分层体素采样

       NeRF的渲染过程计算量很大,每条射线上都要采样很多点,但实际上一条射线上的大部分区域都是空区域,或者被遮挡,对最终颜色的影响不大。作者提出了用coarse和fine两个网络同时优化的方法。首先用体渲染这一节中提出的采样方法,采样较为稀疏的Nc个点,优化coarse网络,NeRF中Nc=64

得到颜色累加公式重新表述如下:

       然后对权重归一化如下:

 

       此处的可以看作是沿着射线的概率密度函数(PDF),如下图所示,通过这个概率密度函数,我们可以粗略地得到射线上的物体的分布情况。

 

接下来基于得到的概率密度函数来采样Nf个点,并用这Nf个点和前面的Nc个点共同计算优化fine网络,光线最终的渲染颜色为,采样点如下图所示:

 

       该采样算法的核心就是用coarse网络来生成概率密度函数,再基于概率密度函数采样更精细的点。具体可参考:【NeRF论文笔记】用于视图合成的神经辐射场技术 - 知乎

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NeRF:神经辐射场论文原理讲解 的相关文章

随机推荐

  • 数据结构与算法-基础排序算法及TopK问题(Python)

    排序 基础排序算法 冒泡排序 选择排序 插入排序 归并排序 快速排序 经典问题 TopK 堆排序 快速排序 基础排序算法 如果在面试中遇到排序算法 先问清楚数据的特点 结合具体的业务场景 多和面试官交流 先陈述思路 得到面试官肯定以后再编码
  • Java8方法引用

    内容简介 方法引用Demo详解 通过5种语法使用方法引用 方法引用使用总结 1 在Java8中方法引用Demo详解 1 1 方法引用出现的背景 在使用Lambda表达式的时候 我们实际上传递进去的代码就是一种解决方案 拿什么参数做什么操作
  • Spring MVC中如何限制Controller为POST或GET方式接收参数呢?

    转自 Spring MVC中如何限制Controller为POST或GET方式接收参数呢 在Web页面开发中 最常用的接收参数值方式有 GET和POST方式 那么SpringMVC中如何定义参数的接收方式呢 实现思路 只需在注解的时 使用m
  • mark_as_advanced

    Mark cmake cached variables as advanced mark as advanced CLEAR FORCE VAR VAR2 Mark the named cached variables as advance
  • 什么是子查询?

    当一个查询结果是另一个查询的条件的时候 那么就称为子查询 子查询是在SQL语句内的另外一条SELECT语句 在SELECT INSERT UPDATE或DELETE命令中只要是表达式的地方都可以包含子查询 子查询甚至可以包含在另外一个子查询
  • 自动化测试-Appium-Desired Capabilities参数详解

    分类 定义与说明 General Capabilities 通用功能 Update settings Android Only UIAutomator 1 UIAutomator2 Only Espresso Only iOS Only i
  • 数据仓库灵魂30问之如何建设数据中台?一幅图说清中台。

    什么是中台 什么是数据中台 数据仓库实现了企业数据模型的构建 大数据平台解决了海量 实时数据的计算和存储问题 数据中台要解决什么呢 数据如何安全的 快速的 最小权限的 且能够溯源的被探测和快速应用的问题 数据中台不应该被过度的承载平台的计算
  • 进程同步,信号量,互斥变量等说明

    0 前言 工作三年 敲了3年代码 PHP C Java C 等 开发过几种产品 非计算机科班出身 全部编程是自学最近闲来无事买了一本 计算机操作系统 第四版 学一下个人感觉对比较重要的章节 增加对编程的理解 1 进程的描述 1 1 进程的定
  • Python多元线性回归预测模型实验完整版

    多元线性回归预测模型 实验目的 通过多元线性回归预测模型 掌握预测模型的建立和应用方法 了解线性回归模型的基本原理 实验内容 多元线性回归预测模型 实验步骤和过程 1 第一步 学习多元线性回归预测模型相关知识 一元线性回归模型反映的是单个自
  • 在html中取消超链接的下划线

    在html的超链接a标签中取消下划线需要用到text decoration a text decoration none
  • AI部署之路

    作者 Oldpan 编辑 汽车人 点击下方卡片 关注 自动驾驶之心 公众号 ADAS巨卷干货 即可获取 点击进入 自动驾驶之心 模型部署 技术交流群 后台回复 模型部署工程 获取基于TensorRT的分类 检测任务的部署源码 好久没更文了
  • WSL2加载独立硬盘和设置固定IP

    最近发现了win10 包括win11 上的神器 Linux子系统 抱着玩一玩的态度安装了 琢磨了几天 逐步把Ubuntu完善起来了 发现完全可以当作WIN Linux双系统使用 还不用重启系统 作为生产力工具绰绰有余 总结了常用的工具软件和
  • CPU、GPU、DPU、TPU、NPU...傻傻分不清楚?实力扫盲——安排

    人工智能的发展离不开算力的支持 算力又是依附于各种硬件设备的 没有了算力设备的加持 就好比炼丹少了丹炉一样 可想而知 人工智能智能也就无用武之地了 以深度学习为主的人工智能方向的发展更是离不开强大的算力支持 随着深度学习的不断发展 各种各样
  • 登录验证,复杂验证

    效果如图
  • 程序员为什么要挤破头也要进大厂?别说是拧螺丝,递扳手我也愿意去!

    大家好 前段时间写了一篇关于程序员的年薪五十万指南 引起了一些共鸣 有些读者私信问我 现在不是大厂竞争很激烈吗 再说大厂的薪水待遇也没有比一些二线公司更好呀 既然如此 那为什么我们还要挤破脑袋进大厂呢 今天就和大家闲聊几句 以下说的仅代表我
  • K8S的卷、临时卷、持久卷、PV、PVC、SC

    博客 cbb777 fun 全平台账号 安妮的心动录 github https github com anneheartrecord 下文中我说的可能对 也可能不对 鉴于笔者水平有限 请君自辨 有问题欢迎大家找我讨论 为什么需要卷 容器中的
  • Maven项目添加mysql-connector-java依赖失败:dependency ‘mysql-connector-java‘not found

    在IDEA中搭建Scala项目 需要将处理过的数据存储到本地mysql数据库中 故需要在Maven的pom xml中添加mysql connector java依赖包 可能是我之前迁移AS项目时更改了在C盘User目录下的 m2 仓库文件
  • 对视觉目标检测的整体认知(基于目标检测综述)

    计算机视觉领域研究的绝大多数问题均存在诸多不确定性因素 因为图像理解是成像的逆过程 成像是从三维向二维投影的过程 在此过程中不仅会丢失深度信息 而且光照 材料特性 朝向 距离等信息都反映成唯一的测量值 即灰度或色彩 而要从这唯一的测量值中恢
  • 双向链表的实现

    定义一个双向链表 定义双向链表 typedef struct LinkNode int data 数据域 LinkNode next 下一个节点 LinkNode last 上一个节点 LinkNode 节点域 LinkList 头结点 初
  • NeRF:神经辐射场论文原理讲解

    一 新视角合成 NeRF是开创了一种全新的视角合成方法 新视角合成任务指的是给定源图像 Source Image 及对应的源姿态 Source Pose 以及目标姿态 Target Pose 渲染生成目标姿态对应的图片 Target 源姿态