论文阅读:NeRF Representing Scenes as Neural Radiance Fields for View Synthesis

news2024/9/29 18:10:10

论文阅读–NeRF Representing Scenes as Neural Radiance Fields for View Synthesis

这是 2020 ECCV 的一篇文章,记得好像还获得了最佳论文奖的提名,这篇文章相当于将自由视点生成这个方向开辟出了一个新的解决思路。

文章的作者们提出了一种可以对复杂场景进行新视点生成的方法,这个方法只需要少量的不同视角的输入,通过优化一个潜在的连续体场景函数,从而可以对复杂场景的新视角进行渲染,获得非常逼真的渲染效果。文章中的方法将场景用一个全连接的深度网络来表征,该网络的输入是单个的 5 维的连续坐标,包括 3 个空间坐标 x , y , z x, y, z x,y,z 以及两个方向坐标 θ , ϕ \theta, \phi θ,ϕ,深度网络的输出是体密度以及与视角相关的在某个空间位置上的辐射场。在合成新视角的时候,通过查询沿相机光线方向的 5 维坐标,然后再利用经典的体渲染技术将输出的颜色投射到输出图像上。因为体渲染本身是可微的,为了优化这个网络,唯一需要的输入就是已知相机位姿的一组图像。这篇文章相比以前的方法,能够对复杂场景的几何及纹理信息进行影像级的渲染。

首先,文章作者将一个静态场景用一个连续的 5 维函数来表征,这个 5 维的函数在空间中会输出任意位置 ( x , y , z ) (x,y,z) (x,y,z) 及任意方向的 ( θ , ϕ ) (\theta, \phi) (θ,ϕ) 辐照值,同时输出每个点处的一个密度值,表示环境的透光程度,这个密度值也是可微的,文章中的方法构建了一个全连接网络来表示这样一个 5 维函数,全连接网络的输入就是一个 5 维坐标 ( x , y , z , θ , ϕ ) (x,y,z,\theta,\phi) (x,y,z,θ,ϕ),输出就是一个单一的体密度值以及与视角相关的颜色值。为了能够沿着某个特定的方向进行 neural radiance field (NeRF) 的渲染,文章主要通过三个步骤,1)沿着相机的视角方向生成一组 3D 点,2) 利用这些点和对应的 2D 的视角方向输入神经网络中得到一组颜色和密度值,3) 利用经典的体渲染技术将这些颜色和密度值渲染得到一张 2D 图像。整个过程都是可微的,所以可以利用梯度下降进行优化,损失函数就是渲染得到的图像与真实图像的差值。

在这里插入图片描述

  • 插入图片 Fig.2

文章中也提到,这个基本的技术实现无法对复杂场景渲染得到高分辨率的图像,对相机的每根光线无法得到足够的采样点。为了解决这个问题,文章中将 5 维的坐标转换成一个位置编码,以使得全连接函数(MLP)可以表征更高频的函数,此外,文章作者提出层级采样的策略,以减少生成高频信息丰富的场景所需要的采样点数量。

Neural Radiance Field Scene Representation

文章中将一个场景用一个连续的 5 维函数来表征,这个函数的输入包括一个3维的空间坐标 x = ( x , y , z ) \mathbf{x}=(x,y,z) x=(x,y,z) 以及两个方向坐标 ( θ , ϕ ) (\theta, \phi) (θ,ϕ),函数的输出就是该点的颜色值 c = { r , g , b } \mathbf{c}=\{r,g,b\} c={r,g,b} 以及体密度 σ \sigma σ,实际实现的时候,文章中将方向坐标表示为 3 维的归一化的笛卡尔坐标 d \mathbf{d} d。这个连续的 5 维函数就是用一个 MLP 来近似,整个的输入输出就可以表示为如下所示:

F Θ : ( x , d ) → ( c , σ ) F_{\Theta}: (\mathbf{x}, \mathbf{d}) \to (\mathbf{c}, \sigma) FΘ:(x,d)(c,σ)

需要优化 MLP 的参数 Θ \Theta Θ, 使得每一个输入都能映射到对应的输出上。

作者也希望这个表征在多个视角之间是连续的,在具体实现上,体密度 σ \sigma σ 只由空间坐标 x \mathbf{x} x 决定,然后颜色值 c \mathbf{c} c 才由空间坐标与方向坐标一起决定。所以这个 MLP 在架构上首先是只输入空间坐标 x \mathbf{x} x,然后经过 8 个全连接层,每一层都是 256 个神经元,得到体密度 σ \sigma σ 值以及一个 256 维的特征向量,这个特征向量和方向坐标连接在一起,在经过一个全连接层,这个全连接层是 128 个神经元,输出颜色值。

Volume Rendering with Radiance Fields

如前面所述,MLP 只是估计环境中的辐射场,整个辐射场用色彩值以及体密度值表示,得到辐射场之后,需要利用经典的体渲染技术进行渲染,才能得到最终的 2D 图像。体密度 σ ( x ) \sigma(\mathbf{x}) σ(x) 可以表示为光线被一个无穷小粒子挡住的概率,光线 r ( t ) = o + t d \mathbf{r}(t)=\mathbf{o}+t\mathbf{d} r(t)=o+td 在一个范围内的色彩值可以表示为:

C ( r ) = ∫ t n t f T ( t ) σ ( r ( t ) ) c ( r ( t ) , d ) d t C(\mathbf{r}) = \int_{t_n}^{t_f} T(t)\sigma(\mathbf{r}(t))\mathbf{c}(\mathbf{r}(t),\mathbf{d})dt C(r)=tntfT(t)σ(r(t))c(r(t),d)dt

其中, T ( t ) = exp ⁡ ( − ∫ t n t f σ ( r ( s ) ) d s ) T(t) = \exp(-\int_{t_n}^{t_f}\sigma(\mathbf{r}(s))ds) T(t)=exp(tntfσ(r(s))ds) 表示光线沿着某一段路径的积分,也表示光线在这段路径中没有遇到任何遮挡的概率。从连续的神经辐射场中渲染一个视角,需要对每个像素发出的光线进行这样的积分运算。文章中将这样一个连续积分转化成了离散的求和,利用一个分层抽样的策略,将范围 [ t n , t f ] [t_n, t_f] [tn,tf] 均匀地分成 N 份,然后基于均匀分布的概率,每次从这 N 个点中随机抽取一个

t i ∼ U [ t n + i − 1 N ( t f − t n ) , t n + i N ( t f − t n ) ] t_i \sim \mathcal{U} \left[t_n + \frac{i-1}{N}(t_f - t_n), t_n + \frac{i}{N}(t_f - t_n) \right] tiU[tn+Ni1(tftn),tn+Ni(tftn)]

利用一组离散的采样来代替积分,进而可以得到:

C ( r ) ^ = ∑ i = 1 N T i ( 1 − exp ⁡ ( − σ i δ i ) ) c i \hat {C(\mathbf{r})} = \sum_{i=1}^{N} T_i(1 - \exp(-\sigma_{i}\delta_{i}))\mathbf{c}_i C(r)^=i=1NTi(1exp(σiδi))ci

其中, T i = exp ⁡ ( − ∑ j = 1 i − 1 σ j δ j ) T_{i} = \exp\left(-\sum_{j=1}^{i-1}\sigma_{j}\delta_{j} \right) Ti=exp(j=1i1σjδj), δ i = t i + 1 − t i \delta_{i} = t_{i+1} - t_i δi=ti+1ti 表示相邻两个采样的距离,通过这样的离散化,这个求和过程变得可微。

Optimizing a Neural Radiance Field

前面介绍了基本的技术思路,在实际测试的时候,发现对于复杂的场景,这样的渲染并不能得到令人满意的效果,所以文章作者接下来做了几点改进,一个是位置编码,一个是层级采样。

Positional encoding

虽然理论上来说,神经网络的拟合能力已经非常强大了,不过在这个问题上,文章作者发现网络对场景的高频信息拟合地并不是很好,网络倾向于拟合场景的低频信息,为了让网络更好地拟合高频信息,文章中将函数拆成两个部分, F Θ = F Θ ′ ∘ γ F_{\Theta} = F'_{\Theta} \circ \gamma FΘ=FΘγ,这两部分一部分需要学习,另外一部分不需要学习,通过这样的拆解,整个函数的拟合能力得到很大提升,函数 γ \gamma γ 是一个映射,从 R \mathcal{R} R R 2 L \mathcal{R}^{2L} R2L 的映射,具体的形式如下所示:

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

具体实现的时候,函数 γ \gamma γ 对空间位置坐标与方向坐标分别单独编码,对于位置编码,L=10,对于方向编码,L=4

Hierarchical volume sampling

进行体渲染的时候,文章作者发现对每根相机的光线等密度的进行采样并不合适,为了对不同的区域采用不同的采样方式,文章提出了一种层级采样的方式,一个 coarse 网络后面接一个 fine 网络,首先对需要渲染的区域进行采样,并利用 coarse 网络对这些区域进行评估,然后对需要更多采样的区域进行调整,为了实现这个设计,对之前的颜色值的渲染公式进行改写:

C ^ c ( r ) = ∑ i = 1 N c w i   c i , w i = T i ( 1 − exp ⁡ ( − σ i δ i ) ) \hat {C}_c(\mathbf{r})= \sum_{i=1}^{N_c} w_i\ c_i, \quad w_i = T_{i}(1 - \exp(-\sigma_{i}\delta_{i})) C^c(r)=i=1Ncwi ci,wi=Ti(1exp(σiδi))

对系数 w i w_i wi 进行归一化, w ^ i = w i / ∑ j = 1 N c w j \hat{w}_i = w_i / \sum_{j=1}^{N_c} w_j w^i=wi/j=1Ncwj,这样可以得到沿着光线的概率密度函数。然后,从这个分布中采样第二组,每根光线有 N f N_f Nf 个位置,最后将两次采样的光线都用 “fine” 网络进行评估,这个过程可以让想要显示的区域内容可以获得更多的采样点。

Implementation details

这篇文章在实现的时候,对每个场景,需要单独训练一个网络,每个场景的训练数据包括这个场景某些视角下的 RGB 图像以及这些图像对应的相机位姿以及相机内参,场景的范围。对于仿真数据,可以获得真实的 GT, 对于实际数据,可以用 COLMAP structure-from-motion package 估计。训练的时候,每次迭代,随机选择一定数量的光线,然后利用层级采样的策略,对于每根光线,从 coarse network 中获得 N c N_c Nc 个采样,从 fine network 中获得 N f + N c N_f + N_c Nf+Nc 个采样,然后再利用体渲染的技术,将这些采样渲染得到每根光线对应的色彩值。训练的损失函数就是简单的 L 2 L_2 L2 loss,同时考虑了 coarse network 和 fine network 的采样:

L = ∑ r ∈ R [ ∣ ∣ C ^ c ( r ) − C ( r ) ∣ ∣ 2 2 + ∣ ∣ C ^ f ( r ) − C ( r ) ∣ ∣ 2 2 ] \mathcal{L} = \sum_{r \in \mathcal{R}} \left[ || \hat{C}_c(r) - C(r) ||_{2}^{2} + || \hat{C}_f(r) - C(r) ||_{2}^{2} \right] L=rR[∣∣C^c(r)C(r)22+∣∣C^f(r)C(r)22]

其中, R \mathcal{R} R 表示每个 batch 的光线数量,$\hat{C}_c®, \hat{C}_f®,C® $ 分别表示 coarse network,fine network 以及真实的颜色值。

具体实现的时候,每个 batchsize = 4096,也就是采样 4096 条光线,然后每条光线,coarse network 生成 N c = 64 N_c = 64 Nc=64 个采样坐标,fine network 生成 N f = 128 N_f = 128 Nf=128 个采样坐标,利用 Adam 的训练策略,初始学习率为 5 e − 4 5e-4 5e4,对于每个场景,需要迭代 100-200 千次,大概需要 1-2 天的时间。

具体的网络结构如下所示:

在这里插入图片描述

  • 插入图片 Fig.7

可以看到,网络的输入是一个 60 维的向量,因为前面提到网络对空间坐标(3 维的向量)进行了编码,用的是三角函数, L = 10 L=10 L=10,每每一维的空间坐标编码成了一个 20 维的向量,3 维的空间坐标最终编码成了一个 60 维的向量。方向坐标也是如此, L = 4 L=4 L=4,每一维的方向坐标编码成了一个 8 维的向量,3 维的方向坐标最终编码成了一个 24 维的向量。从前面的介绍知道,文章用了两个网络,一个是 coarse 网络,一个是 fine 网络,我理解这两个网络结构应该是一样的,而且输入也是一样的,只是输出的采样坐标数量不同,所以文章中的损失函数也包括了两部分,一部分用于训练 coarse 网络,一部分用于训练 fine 网络。

End

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

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

相关文章

数据结构与算法——1.数据结构概述

从这篇文章开始,我们来讲一下数据结构与算法的相关内容 1.数据结构概述 什么是数据结构? 官方解释: 数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及他们之间的关系和操作等相关问题的学科。 大白话&#xff1…

nodejs+vue+elementui,毕业生导师双选系统 vscode双向选择

为了直观显示系统的功能,运用用例图这样的工具显示分析的结果。分析的导师功能如下。导师管理导师选择信息,管理项目,管理项目提交并对学员提交的项目进行指导。 为了直观显示系统的功能,运用用例图这样的工具显示分析的结果。分析…

XpdfViewer ActiveX 4.0.3 Retail

XpdfViewer 库/ActiveX 控件提供了一个用于 Windows 应用程序的 PDF 文件查看器组件。XpdfViewer 使任何 Windows 开发人员都可以将 PDF 查看功能添加到他们的应用程序中。它为开发人员提供了对 PDF 查看器的完全控制——XpdfViewer 适合您的GUI。 XpdfViewer 功能包括&#xf…

Elasticsearch:索引数据是如何完成的

在我在之前的文章 “Elasticsearch:彻底理解 Elasticsearch 数据操作” 文章中,我详细地描述了如何索引数据到 Elasticsearch 中。在今天的文章中,我想更进一步来描述这个流程。 Elasticsearch 是一个非常强大和灵活的分布式数据系统&#x…

layui框架学习(10:时间线)

时间线,英文timeline,也叫时光轴、时间轴,是指以时间为记录方式的一种网络布局形式,其形式之一为下图所示(示例图来自参考文献5)。   Layui官网教程中的更新日志页面也用了时间线样式,如下图…

【经典蓝牙】 蓝牙HFP层协议分析

HFP 概述 HFP概念介绍 HFP(Hands-Free Profile), 是蓝牙免提协议, 可以让蓝牙设备对对端蓝牙设备的通话进行控制,例如蓝牙耳机控制手机通话的接听、 挂断、 拒接、 语音拨号等。HFP中蓝牙两端的数据交互是通过定义好的AT指令来通讯的。 &am…

C语言指针易错点—字符数组与字符指针

C语言指针易错点—字符数组与字符指针字符数组与字符指针的区别字符数组与字符指针的区别举例字符指针必须先赋值,后引用字符数组与字符指针的区别 因为字符数组与字符指针都可以表示字符串,但他们不是等价的。下面就来讲讲他们的区别。 char sa[ ] &…

信号类型(雷达)——脉冲雷达(三)

系列文章目录 《信号类型(雷达通信)》 《信号类型(雷达)——雷达波形认识(一)》 《信号类型(雷达)——连续波雷达(二)》 文章目录 前言 一、相参雷达 1…

第一章 计算机视觉概述

《计算机视觉开发实战 基于Python》 朱文伟,李建英 著 1.1 图像的基本概念 图像和图形 图像是输入设备捕捉的实际画面产生的数字图像,由像素点构成的位图。图形是用数学规则产生的或具有一定规则的团,由外部轮廓线条构成的矢量图,往往用一组…

有趣的Hack-A-Sat黑掉卫星挑战赛——卫星平台内存dump

国家太空安全是国家安全在空间领域的表现。随着太空技术在政治、经济、军事、文化等各个领域的应用不断增加,太空已经成为国家赖以生存与发展的命脉之一,凝聚着巨大的国家利益,太空安全的重要性日益凸显[1]。而在信息化时代,太空安…

AI_Papers周刊:第三期

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 2023.02.20—2023.02.26 文摘词云 Top Papers Subjects: cs.CL 1.LLaMA: Open and Efficient Foundation Language Models 标题:LLaMA:开放高效的基础语言模型 作者&#…

14、KL散度

KL 散度,是一个用来衡量两个概率分布的相似性的一个度量指标。 现实世界里的任何观察都可以看成表示成信息和数据,一般来说,我们无法获取数据的总体,我们只能拿到数据的部分样本,根据数据的部分样本,我们会…

5、算法MATLAB---矩阵的运算和索引

矩阵的运算和索引1、矩阵的运算1.1 获取矩阵的行列数1.2 矩阵转置、逆矩阵1.3 特征值和特征向量1.4 加减乘除乘方运算1.5 广播机制1.6 逻辑运算2、矩阵的索引1、矩阵的运算 1.1 获取矩阵的行列数 使用size函数 1.2 矩阵转置、逆矩阵 使用【】和inv函数 1.3 特征值和特征…

NLP中的对话机器人——预训练基准模型

引言 本文是七月在线《NLP中的对话机器人》的视频笔记,主要介绍FAQ问答型聊天机器人的实现。 场景二 上篇文章中我们解决了给定一个问题和一些回答,从中找到最佳回答的任务。 在场景二中,我们来实现: 给定新问题,从…

【华为OD机试模拟题】用 C++ 实现 - 匿名信(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 货币单位换算(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 选座位(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 停车场最大距离(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 重组字符串(2023.Q1) 【华为OD机试模…

全网最全——Java 数据类型

一、数据类型方法论 程序本质上是对数据的处理(逻辑运算),因此任何语言都需先解决如何表征【数据】这个核心概念。数据作为抽象的概念,天然的包含2个方面属性: 类型:类型决定了数据只能和同类型的数据进行…

18、MySQL8其它新特性

文章目录1 MySQL8新特性概述1.1 MySQL8.0 新增特性1.2 MySQL8.0移除的旧特性2 新特性1:窗口函数2.1 使用窗口函数前后对比2.2 窗口函数分类2.3 语法结构2.4 分类讲解1 序号函数2 分布函数3 前后函数4 首尾函数5 其他函数2.5 小 结3 新特性2:公用表表达式…

Objective-C 构造方法的定义和声明规范

总目录 iOS开发笔记目录 从一无所知到入门 文章目录源码中 NSArray 的构造方法与命名规律自定义类的构造方法命名截图代码输出源码中 NSArray 的构造方法与命名规律 interface NSArray<ObjectType> (NSArrayCreation) (instancetype)array;(instancetype)arrayWithObject…

Spring Cloud Alibaba全家桶(二)——微服务组件Nacos注册中心

前言 本文为微服务组件Nacos注册中心相关知识&#xff0c;下边将对什么是 Nacos&#xff0c;Nacos注册中心&#xff08;包括&#xff1a;注册中心演变及其设计思想、核心功能&#xff09;&#xff0c;Nacos Server部署&#xff08;包括&#xff1a;单机模式、集群模式&#xff…

常见的开发模型和测试模型

软件的生命周期软件开发阶段的生命周期需求分析->计划->设计->编码->测试->运维软件测试阶段的生命周期需求分期->测试计划->测试设计与开发->执行测试->测试评估开发模型瀑布模型可以看到,这个模型和我们上面的软件开发生命周期很相似采用的是线性…