【NeRF】(一)NeRF论文学习笔记

news2025/1/19 14:34:34

文章目录

  • NeRF学习笔记
    • 1 实现过程
      • 1.1 相机参数:如何通过不同角度的照片得出输入数据
      • 1.2 MLP
      • 1.3 体积渲染及离散化
      • 1.4 优化点

NeRF学习笔记

概述:

  1. 重建:根据目前有的不同角度二维图片,重建三维物体。

    用 MLP 网络学 Scene Representation,以实现 输入源图像对应的三维空间坐标和相机视角 ( x , y , z , θ , ϕ ) (x,y,z,\theta,\phi) (x,y,z,θ,ϕ);输出 ( R , G , B , σ ) (R,G,B,\sigma) (R,G,B,σ) ,分别表示RGB 颜色值和体素密度 。

  2. 训练兼渲染:由 Volume Rendering 生成预测的 2D image。

    • 让摄像机光线穿过场景,生成一组采样的3D点
    • 利用这些点及其对应的二维观察方向作为神经网络的输入,产生一组颜色和密度的输出
    • 使用经典的体积渲染技术,将这些颜色和密度积累到一个二维图像中
    • 预测的 2D image 和 ground truth image 之间算 L2 loss,继而再对MLP进行优化。
    image-20230514134217989

总体过程如下:

img

1 实现过程

1.1 相机参数:如何通过不同角度的照片得出输入数据

流程总结:

  • 数据预处理

    • 给定一组图片,利用colmap软件得到外参内参

    • 之后将上面的colmap格式转化成llff格式,此时共有17个参数(12个外参、3个内参、2个范围表示)

  • 输入

    • 取成像平面中某一位置(对应的real像素值是已知的),与相机位置的连线构成一条射线,先得到在相机坐标系下的射线方向向量,之后利用外参逆矩阵(c2w)转换到世界坐标系下。
    • 在最近和最远距离内采样 n 个点,得到三维的位置参数,构成n个五维向量即为输入。

补充知识点:

  1. 齐次坐标系

    如果一个点在无穷远处,这个点的坐标将会 ( ∞ , ∞ ) (\infty,\infty) (,),在欧氏空间中,这就变得没有意义。如果使用齐次坐标,平行线在透视空间的无穷远处交于一点,这样就实现了对于无穷点的表示。

    简而言之,齐次坐标就是用N+1维来代表N维坐标

    我们可以在一个2D笛卡尔坐标末尾加上一个额外的变量w来形成 2D齐次坐标。因此,一个在笛卡尔坐标系下的点 ( X , Y ) (X, Y) (X,Y)在齐次坐标里面变成了 ( x , y , w ) (x,y,w) (x,y,w),并且有:
    X = x w ; Y = y w X=\frac{x}{w};Y=\frac{y}{w} X=wx;Y=wy
    例如笛卡尔坐标系下(1,2),在齐次坐标系中可以表示为(1,2,1),如果点(1,2)移动到无限远处,在笛卡尔坐标下它变为 ( ∞ , ∞ ) (\infty,\infty) (,),然后它的齐次坐标表示为(1,2,0)。注意这样的话,我们可以不用 ” ∞ \infty " 来表示一个无穷远处的点了。

    另外注意方向向量的齐次坐标第四维等于0,点坐标第四维等于1。

    参考:什么是齐次坐标系?为什么要用齐次坐标系? - 知乎 (zhihu.com)

  2. 相机坐标系:

    img

    为了建立3D空间点到相机平面的映射关系以及多个相机之间的相对关系,我们会对每一个相机定义一个局部的相机坐标系。下图为常见的坐标系定义习惯。

    img
  3. 相机的内外参数

    • 相机外参

      相机外参是一个4x4的矩阵 M,其作用是将世界坐标系的点 P w o r l d = [ x , y , z , 1 ] P_{world}=[x,y,z,1] Pworld=[x,y,z,1] 变换到相机坐标系 P c a m e r a = M P w o r l d P_{camera}=MP_{world} Pcamera=MPworld下。我们也把相机外参叫做world-to-camera (w2c)矩阵。而NeRF主要使用camera-to-world (c2w)矩阵,即相机外参的逆矩阵,其作用是把相机坐标系的点变换到世界坐标系。

      img

      c2w矩阵的值直接描述了相机坐标系的朝向和原点:

      img
    • 相机内参

      相机的内参矩阵将相机坐标系下的3D坐标映射到2D的图像平面,这里以针孔相机(Pinhole camera)为例介绍相机的内参矩阵K:

      img

      内参矩阵K包含4个值,其中fx和fy是相机的水平和垂直焦距(对于理想的针孔相机,fx=fy)。焦距的物理含义是相机中心到成像平面的距离,长度以像素为单位。cx和cy是图像原点相对于相机光心的水平和垂直偏移量。cx,cy有时候可以用图像宽和高的1/2近似,实际在使用中,内参只记录三个值 ( F , H , W ) (F,H,W) (F,H,W)

  4. 由colmap到llff:

    由imgs2poses.py来实现

  5. 3D空间射线怎么构造

    img

    首先3D像素点的x和y坐标是2D的图像坐标 (i, j)减去光心坐标 (cx,cy),然后z坐标其实就是焦距f (因为图像平面距离相机中心的距离就是焦距f)。所以我们就可以得到射线的方向向量是 ( i − c x , j − c y , f ) − ( 0 , 0 , 0 ) = ( i − c x , j − c y , f ) (i-c_x,j-c_y,f)-(0,0,0)=(i-c_x,j-c_y,f) (icx,jcy,f)(0,0,0)=(icx,jcy,f),因为是向量,我们可以把整个向量除以焦距f归一化z坐标,得到 ( i − c x f , j − c y f , 1 ) (\frac{i-c_x}{f},\frac{j-c_y}{f},1) (ficx,fjcy,1)

参考:NeRF代码解读-相机参数与坐标系变换 - 陈冠英的文章 - 知乎

1.2 MLP

( x , y , z , θ , ϕ ) (x,y,z,\theta,\phi) (x,y,z,θ,ϕ) ( R , G , B , σ ) (R,G,B,\sigma) (R,G,B,σ)由MLP来完成,结构如下:

image-20230514151206071

其中 ( θ , ϕ ) (\theta,\phi) (θ,ϕ)只会影响颜色值而不影响密度 σ \sigma σ,所以采用了这样的结构。

1.3 体积渲染及离散化

对于一张图片上的每一个像素点,我们首先根据相机位姿生成一条射线,之后在一条射线上 [ t n , t f ] [t_n,t_f] [tn,tf]之间等分成n份进行采样:
t i ∼ U [ t n + i − 1 N ( t f − t n ) , t n + i N ( t f − t n ) ] (1) t_i\sim\mathcal{U}\bigg[t_n+\frac{i-1}{N}(t_f-t_n),t_n+\frac{i}{N}(t_f-t_n)\bigg] \tag{1} tiU[tn+Ni1(tftn),tn+Ni(tftn)](1)
之后2D图片上对应位置的颜色可以离散化计算:
C ^ ( r ) = ∑ i = 1 N T i ( 1 − exp ⁡ ( − σ i δ i ) ) c i , where T i = exp ⁡ ( − ∑ j = 1 i − 1 σ j δ j ) (2) \hat{C}(\mathbf{r})=\sum\limits_{i=1}^N T_i(1-\exp(-\sigma_i\delta_i))\mathbf{c}_i,\text{where}T_i=\exp\left(-\sum\limits_{j=1}^{i-1}\sigma_j\delta_j\right) \tag{2} C^(r)=i=1NTi(1exp(σiδi))ci,whereTi=exp(j=1i1σjδj)(2)
这样我们就能得到图片上每个像素点的颜色。

详细过程可看:体渲染公式推导

1.4 优化点

  1. 位置编码
    γ ( p ) = ( sin ⁡ ( 2 0 π p ) , cos ⁡ ( 2 0 π p ) , ⋯   , sin ⁡ ( 2 L − 1 π p ) , cos ⁡ ( 2 L − 1 π p ) ) (3) \gamma(p)=\left(\sin\left(2^0\pi p\right),\cos\left(2^0\pi p\right),\cdots,\sin\left(2^{L-1}\pi p\right),\cos\left(2^{L-1}\pi p\right)\right)\tag{3} γ(p)=(sin(20πp),cos(20πp),,sin(2L1πp),cos(2L1πp))(3)
    把输入的值进行傅里叶级数分解,便于提取其中的高维特征,神经网络会达到更好的效果。

    其中, L = 10 L=10 L=10用于 ( x , y , z ) (x,y,z) (x,y,z)三个坐标值, L = 4 L=4 L=4用于方向向量 γ ( d ) \gamma(\mathbf{d}) γ(d)

  2. Hierarchical volume sampling

    进行两次采样(coarse和fine)

    • 第一次coarse均匀采样( N c N_c Nc = 64),用公式(3)来表示出颜色,稍微变化一下形式:
      C ^ c ( r ) = ∑ i = 1 N c w i c i , w i = T i ( 1 − exp ⁡ ( − σ i δ i ) ) (4) \hat{C}_c(\mathbf{r})=\sum\limits_{i=1}^{N_c}w_ic_i,w_i=T_i(1-\exp(-\sigma_i\delta_i))\tag{4} C^c(r)=i=1Ncwici,wi=Ti(1exp(σiδi))(4)
      这样就得出了每个采样点的权重。

      之后进行归一化: 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,这样就表示成了一个分段的常数概率密度函数PDF。

    • 第二次fine采样,在第一次采样得出的PDF上进行逆变换采样( N f = 128 N_f=128 Nf=128),之后用总的采样点( N c + N f N_c+N_f Nc+Nf)训练网络,得到 C ^ f ( r ) \hat{C}_f(\mathbf{r}) C^f(r)

    采样完成后进行训练,损失函数是:
    L = ∑ r ∈ R [ ∥ C ^ c ( r ) − C ( r ) ∥ 2 2 + ∥ C ^ f ( r ) − C ( r ) ∥ 2 2 ] \mathcal{L}=\sum\limits_{\mathbf{r}\in\mathcal{R}}\left[\left\|\hat{C}_c(\mathbf{r})-C(\mathbf{r})\right\|_2^2+\left\|\hat{C}_f(\mathbf{r})-C(\mathbf{r})\right\|_2^2\right] L=rR[ C^c(r)C(r) 22+ C^f(r)C(r) 22]
    虽然最终的渲染来自 C ^ f ( r ) \hat{C}_f(\mathbf{r}) C^f(r),但我们也最小化了 C ^ c ( r ) \hat{C}_c(\mathbf{r}) C^c(r)的损失,以便可以利用来自粗网络的权值分布在精细网络中分配样本。

参考文献和资料
[1]:NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis
[2]:NeRF代码解读-相机参数与坐标系变换 - 陈冠英的文章 - 知乎
[3]:“图形学小白”友好的NeRF原理透彻讲解

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

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

相关文章

《WEB安全漏洞30讲》(第5讲)任意文件上传漏洞

1.任意文件上传漏洞原理 文件上传漏洞,指攻击者利用程序缺陷绕过系统对文件的验证与处理策略将恶意程序上传到服务器并获得执行服务器端命令的能力。 这个漏洞其实非常简单,就是攻击者给服务器上传了恶意的木马程序,然后利用此木马程序执行操作系统命令,从而获得服务器权…

汇编实现点灯

循环亮灯 .text .global _start _start: bl LED1_INIT bl LED1_ON bl delay_1s bl LED1_OFF bl LED2_INIT bl LED2_ON bl delay_1s bl LED2_OFF bl LED3_INIT bl LED3_ON bl delay_1s bl LED3_OFF bl _start /**********LED1点灯PE10**************/ LED1_INIT: 1.通过RC…

UE5实现天际线分析效果

文章目录 1.实现目标2.实现过程2.1 后处理材质2.2 验证测试3.参考资料1.实现目标 UE5中使用CesiumForUnreal插件加载在线的地形影像与OSM建筑数据,再基于后处理材质实现天际线分析效果,GIF动图如下所示: 2.实现过程 依旧是通过边缘检测,得到天际线位置,再通过后处理材质将…

PointGPT 论文解读,点云的自回归生成预训练

PointGPT: Auto-regressively Generative Pre-training from Point Clouds 论文:https://arxiv.org/pdf/2305.11487.pdf 一种将GPT概念扩展到点云的方法,在多个3D点云下有任务中(点云分类,part分割等)上实现了最先进…

C++中set的用法

博主简介:Hello大家好呀,我是陈童学,一个与你一样正在慢慢前行的人。 博主主页:陈童学哦 所属专栏:CSTL 前言:Hello各位小伙伴们好!欢迎来到本专栏CSTL的学习,本专栏旨在帮助大家了解…

[SWPUCTF 2021 新生赛] (WEB一)

目录 gift_F12 jicao easy_md5​ caidao include easy_sql easyrce babyrce Do_you_know_http ez_unserialize gift_F12 1.开启环境 2.题目提示f12 ctrlf 搜索flag 得到flag "WLLMCTF{We1c0me_t0_WLLMCTF_Th1s_1s_th3_G1ft} jicao 1.开启环境 2.传参 jso…

MyBatis-Plus中AutoGenerator的详细使用案例

AutoGenerator是什么? AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Pojo、Mapper、 Mapper XML、Service、Controller 等各个模块的代码 AutoGenerator能干什么? 对于单表而言,几乎是一个全能…

调用百度API实现菜品识别

调用百度API实现菜品识别 1、作者介绍2、百度API菜品识别接口介绍2.1图像识别接口介绍2.2接口使用说明2.2.1请求示例2.2.2请求参数 3、调用百度API流程4、代码实现 1、作者介绍 李延,男,西安工程大学电子信息学院,2022级研究生 研究方向&…

如何禁用网络共享打印?

139端口是为“NetBIOS Session Service”提供的,主要用于提供Windows文件和打印机共享以及Unix中的Samba服务。在Windows中要在局域网中进行文件的共享,必须使用该服务。 开启139端口虽然可以提供共享服务,但是常常被攻击者所利用进行攻击&am…

chatgpt赋能Python-python_chi

Python Chi:掌握Python语言的关键 Python是一种面向对象、直译式计算机程序设计语言,被广泛应用于各种领域。无论是数据分析、人工智能、Web开发、网络爬虫还是科学计算,Python都扮演着重要的角色。而Python Chi则是Python语言中一个重要的方…

HQL函数--打地鼠游戏及WordCount案例分析及实现

1.打地鼠 uid,hit,m 1,1,0 1,2,1 1,3,1 1,4,1 1,5,0 1,6,0 1,7,1 2,1,1 2,2,1 2,3,1 2,4,1 2,5,1 3,1,1 3,2,1 3,3,1 3,4,0 3,5,0 3,6,1 3,7,0 3,8,1 create table tb_ds( uid int , -- 用户名 hit int , -- 第几次打地鼠 m int -- 是否命中 1命中 0 …

Request响应和Response对象

什么是Request响应和Response对象 实际上就是指Request对象和Response对象。 一个get或者post请求实际上就是一些有规律的字符串,Tomcat将这些字符串获取并且封装成一个可操作的对象。 通过Response对象可以设置响应数据,也就是Tomcat想要给浏览器发送…

Redis安全性详解

目录 ​编辑 Redis安全性详解 1.Redis的访问控制措施。 2.Redis的密码认证机制 3.Redis的绑定IP地址 4.Redis的网络ACL 5.Redis的防火墙或网络安全组 Redis安全性详解 Redis是一个快速、开源的内存数据库,被广泛用于缓存、消息传递和数据存储等场景。然而&a…

sql查询每组数据中时间最大的一条

sql查询每组数据中时间最大的一条 前言代码总结 前言 先来了解一下业务需求。博主好久没写过后端了,这一写就直接碰到我知识盲区了 我们简单还原一下,这里使用一个表模拟下 表的字段如下 表的内容如下,我们的需求就是取出相同name的数据中…

五、AOP(1)

一、AOP基本概念 1.什么是AOP 面向切面编程(方面),利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。不通过修改源代码方式添…

章节1:Burp Suite基本介绍

章节1:Burp Suite基本介绍 Burp [bɜ:p] Suite [swiːt] 01 Burp Suite基本介绍 官网介绍 https://portswigger.net/ 主要产品 Burp Suite培训和认证(Academy)研究院(Research)日报(Daily)…

win10下annoconda安装及更改镜像源,加速软件下载速度

1 annoconda下载 文件地址,选择版本下载https://repo.anaconda.com/archive/ 如下在win10版本: https://repo.anaconda.com/archive/Anaconda3-2023.03-1-Windows-x86_64.exe 完成后根据向导安装。 2 清空镜像源,回到初始状态…

QT之动态加载下拉框(QComboBox)

QT之动态加载下拉框(QComboBox) 简介效果原理分析实现 简介 这两天遇到一个需求,需要下拉选项中动态加载一些数据,实现之后感觉挺有意思,特此记录一下。 效果 还是先看下效果,源码也放在文末了 原理分…

图形学中的抗锯齿讨论以及在unity中的应用

抗锯齿(Anti-Aliasing)是图形学中,很重要的一个部分。本文旨在做一些分析总结,并对平时不理解的细节,做了调研总结,但毕竟不是做GPU行家,所以有不对的地方,欢迎拍砖^^。 1 什么是锯齿 下图,是…

Linux 防火墙 Firewalld

firewalld概述 firewalld防火墙是Centos7系统默认的防火墙管理工具,取代了之前的iptables防火墙,也是工作在网络层,属于包过滤防火墙。 firewalld和iptables都是用来管理防火墙的工具(属于用户态)来定义防火墙的各种规…