1.引言
1.1.1. NeRF研究的背景
人们在拍照的时候,往往会中各个角度进行拍摄,以呈现出物体的全貌和美丽。下图的照片,拍摄的是一架楼梯,但是拍摄的角度完全不同:
我们可以看到这些图片都是楼梯的照片,但拍摄的角度不同。摄影师拍了三张照片,因为他们不确定只用一张照片就能捕捉到这么美丽的场景,担心会错过正确的视角。
于是,人们开始思考,是否存在一种方法,可以让摄影师从拍摄的有限图片中捕获整个3D场景?
通过这样的方法,人们就可以完整地看到摄影师所观察到的场景,而不只是照片所拍摄的视角的照片,可以与摄影师一起欣赏到各种各样的美景。
2020年,Ben Mildenhall、Pratul P. Srinivasan、Matthew Tancik等人撰写,并于2020年发表在ECCV上的《NeRF:以神经辐射场表示场景进行视图合成》一文中,对从图片到3D建模和渲染进行了深入的讨论。
通过论文描述的方法,我们给算法提供从不同角度拍摄的一盘热狗的照片,通过模型建模和计算,可以精确地生成整个3D场景。
神经辐射场(NeRF)将深度学习与计算机图形学结合在一起,为程序员使用2D照片生成3D效果提供巨大的帮助。
1.2.本文的主要内容
计算机图形学确实是现代技术的一大奇迹,它在多个领域中发挥着关键作用,从娱乐到科学研究。渲染逼真的3D场景不仅令人惊叹,而且在功能上也是至关重要的。NeRF,即神经辐射场,是深度学习在计算机图形学中的一个突破性应用,它允许我们以前所未有的方式理解和渲染复杂的3D场景。
本系列博文将深入探讨如何利用TensorFlow和Keras来实现NeRF技术。在这个系列的第一部分,我们将从基础开始,逐步构建对NeRF的理解。
第一部分:基础介绍
- 相机原理:了解相机如何捕捉3D世界中的图像。
- 数据集探索:熟悉我们将使用的特定数据集,这对于训练NeRF模型至关重要。
教程结构
- 世界坐标系:描述如何表示实际的三维物理世界。
- 相机坐标系:定义虚拟的三维相机空间,这是渲染过程中的关键。
- 坐标变换:学习如何将一个坐标系中的点映射到另一个坐标系。
- 投影变换:理解如何在二维平面上,也就是相机传感器上,形成图像。
- 数据集理解:深入了解NeRF数据集,为模型训练做准备。
实际应用场景
想象你带着相机去户外,发现了一朵引人注目的花。你想要捕捉这一刻,这就需要调整相机的角度、设置和参数,以获得最佳的照片。
2.正向成像模型
整个过程,即从3D世界场景到2D图像的转换,可以通过一个数学模型来描述,这个模型被称为正向成像模型。这个模型可以通过图示来更直观地理解,如图3所示。
通过本博文,读者将获得必要的知识和技能,以应用NeRF技术来渲染逼真的3D场景,并理解其背后的数学原理。这不仅有助于你在电影、游戏开发或虚拟现实等领域中应用这些技术,也为读者打开了探索计算机图形学更深层次奥秘的大门。
正向成像模型是一个复杂的数学过程,它描述了如何将3D世界中的点转换成2D图像上的像素。这个过程通常包括以下几个步骤:
-
世界坐标系:首先,我们考虑3D空间中的点P,它位于世界坐标系中。世界坐标系是一个全局参考框架,用于定义场景中所有物体的位置和形状。在这个坐标系中,每个点都有一个唯一的坐标,通常表示为 ( P(x, y, z) )。
-
坐标变换:接下来,我们需要将点P从世界坐标系转换到相机坐标系。这个转换通常涉及平移(移动点的位置)、旋转(改变点的方向)和缩放(改变点的大小)。这些操作可以通过一个变换矩阵来实现,该矩阵将世界坐标系中的点映射到相机坐标系中的相应点。
-
相机坐标系:相机坐标系是相对于相机的局部参考框架。在这个坐标系中,相机的位置通常被设置为原点,而相机的朝向决定了坐标系的方向。在相机坐标系中,点P的新位置可以表示为 ( P’(x’, y’, z’) )。
-
投影变换:一旦点P被转换到相机坐标系,下一步是将其投影到图像平面上。这个投影过程涉及到透视变换,它模拟了相机镜头的视角和焦距。透视变换将3D空间中的点投影到2D图像平面上,生成图像上的像素位置。
-
图像平面:最终,点P在图像平面上的位置决定了它在最终图像中的像素坐标。这个坐标通常表示为 ( (u, v) ),它对应于图像上的一个特定像素点。
通过这个过程,我们能够将3D世界中的点转换为2D图像上的像素,从而创建出逼真的图像。这种转换是计算机图形学中的一个基础概念,对于理解如何渲染3D场景至关重要。在NeRF技术中,这种正向成像模型被用来指导神经网络学习场景的3D结构和外观,从而实现高质量的3D场景渲染。
2.1.世界坐标系
在计算机图形学中,世界坐标系是一个非常重要的概念,因为它为我们提供了一种在三维空间中描述和定位物体的方式。以下是对世界坐标系的详细解释:
-
定义:世界坐标系是一个全局的参考框架,它定义了场景中所有物体的位置和方向。在这个坐标系中,每个点都有一个唯一的位置,通常由三个坐标值 ( x, y, z ) 来表示。
-
用途:世界坐标系允许我们以一种统一的方式描述场景中的物体,无论它们的大小、形状或相对于其他物体的位置如何。这种一致性对于场景的渲染和物体之间的交互至关重要。
-
点P:当我们提到图4中的点P时,我们指的是在3D空间中的一个具体位置。点P在世界坐标系中的位置可以通过三个坐标来精确描述,例如 ( P(x_1, y_1, z_1) )。
-
坐标系的重要性:世界坐标系为我们提供了一个基准,使得我们可以在不同的坐标系之间转换点的位置。例如,当我们需要将点P转换到相机坐标系时,我们首先需要知道它在世界坐标系中的位置。
-
转换到其他坐标系:在渲染过程中,点P可能需要从世界坐标系转换到其他坐标系,如相机坐标系或屏幕坐标系。这些转换涉及到数学上的变换,如旋转、平移和缩放,它们帮助我们模拟相机的视角和镜头特性。
-
场景构建:在构建3D场景时,世界坐标系是构建物体和场景的基础。设计师和开发者使用这个坐标系来放置物体、设置场景布局,并确保所有元素在空间中的正确位置。
-
与现实世界的联系:世界坐标系的概念与我们在现实世界中对空间的理解相呼应。它帮助我们以一种直观和逻辑的方式在计算机中模拟现实世界的三维空间。
通过理解世界坐标系,我们可以更好地掌握计算机图形学中的基本概念,并为进一步学习如相机坐标系、坐标变换和投影变换等高级主题打下坚实的基础。
在这里, x ^ w \hat{x}_{w} x^w、 y ^ w \hat{y}_{w} y^w 和 z ^ w \hat{z}_{w} z^w 表示世界坐标系中的三个轴。点P的位置通过向量 X w X_{w} Xw来表示。
X w = ∣ X w Y w Z w ∣ {X}_{w}= \begin{vmatrix} X_w \\ Y_w\\ Z_w\\ \end{vmatrix} Xw=
XwYwZw
2.2.相机坐标系
与世界坐标系类似,我们还有一个称为相机坐标系的参考框架,如图5所示。
相机坐标系是一个以相机为中心的参考框架,它与世界坐标系相比具有动态特性。这个坐标系的设计是为了模拟相机在空间中的位置和方向,允许我们根据相机的视角来定位和观察场景中的点。
以下是对相机坐标系的改写描述:
-
相机中心:相机坐标系的原点位于相机的中心,这是相机观察场景的起点。
-
动态性:与世界坐标系的静态性不同,相机坐标系是动态的。当相机移动或旋转时,坐标系也随之变化,以反映相机的新位置和方向。
-
点P的定位:在图6中,点P可以在相机坐标系中被重新定位。这意味着,当我们从相机的视角观察时,点P的位置会根据相机的移动而改变。
-
坐标变换:要将点P从世界坐标系转换到相机坐标系,我们需要应用一系列的数学变换,包括平移和旋转。这些变换确保点P在相机坐标系中的位置与其在世界坐标系中的位置相对应。
-
视角模拟:相机坐标系使我们能够模拟相机的视角,包括其视野范围和方向。这对于渲染场景和创建逼真的图像至关重要。
-
与图像平面的联系:在相机坐标系中定位点P之后,下一步是通过投影变换将其投影到图像平面上。这涉及到将3D空间中的点转换为2D图像上的像素。
-
场景渲染:在渲染3D场景时,相机坐标系是连接世界坐标系和最终图像的关键环节。它帮助我们确定哪些物体在相机的视野内,以及它们在图像中的位置。
通过理解相机坐标系的工作原理和它与世界坐标系的关系,我们可以更深入地掌握计算机图形学中的渲染过程,以及如何使用深度学习技术如NeRF来创建逼真的3D场景渲染。
现在,图4中的点P可以用这两个参考框架来定位,如图6所示。
X c = ∣ X c Y c Z c ∣ {X}_{c}= \begin{vmatrix} X_c \\ Y_c\\ Z_c\\ \end{vmatrix} Xc=
XcYcZc
2.3.坐标变换
我们已经确定了两个坐标系:世界坐标系和相机坐标系。现在,我们需要定义这两个坐标系之间的转换关系。
以图6中的点P为例,我们的目标是建立世界坐标 x ^ w \hat{x}_{w} x^w与相机坐标 x ^ c \hat{x}_{c} x^c之间的转换桥梁。
X c = R × ( X w − C w ) {X}_{c}=R\times(X_w-C_w) Xc=R×(Xw−Cw)
其中,R 表示相机坐标系相对于世界坐标系的旋转。这个旋转是由一个矩阵表示的。
R = ∣ r 11 r 12 r 13 r 21 r 22 r 23 r 31 r 32 r 33 ∣ R= \begin{vmatrix} r_{11}&r_{12}&r_{13} \\ r_{21}&r_{22}&r_{23} \\ r_{31}&r_{32}&r_{33} \\ \end{vmatrix} R=
r11r21r31r12r22r32r13r23r33
[ r 11 r 12 r 13 ] → \begin{bmatrix} r_{11} & r_{12} & r_{13} \end{bmatrix} → [r11r12r13]→在世界坐标系中, x c {x}_{c} xc轴的方向。
[ r 21 r 22 r 23 ] → \begin{bmatrix} r_{21} & r_{22} & r_{23} \end{bmatrix} → [r21r22r23]→ 在世界坐标系中, y c y_c yc轴的方向。
[ r 31 r 32 r 33 ] → \begin{bmatrix} r_{31} & r_{32} & r_{33} \end{bmatrix} → [