3DGS前向渲染(0)前置知识
<摘要>
高斯泼溅是基于 Splatting 和机器学习的三维重建方法。根据多视角图像,从 SfM 生成的点云和相机参数矩阵出发,将点膨胀成带有位置、形状、颜色和不透明度参数的高斯椭球,并以此为基本单位来表示场景。为了实现对三维场景的高质量表达,高斯泼溅通过深度学习的方式优化高斯椭球的参数。具体来说,是将用高斯椭球表示的三维场景按照给定的视角投影到二维平面得到渲染图像,渲染图像与真值图像作 loss,反向传播到各个可学习参数上完成优化。整个流程归纳为下图,本文也会围绕此图,记录其中的原理和实现细节。(注,本文提到的高斯泼溅,均指在 SIGGRAPH 2023 上发表的原版 3DGS,以下统称高斯泼溅)
SfM
从多视角图像生成三维点云的方法主要分为 SfM + MVS 的几何方法和基于 VGGT 架构的 transformer 方法,高斯泼溅用到的是几何方法中 SfM 生成的稀疏点云和相机参数。SfM(Structure from Motion,运动恢复结构)是一种从多视角图像中恢复三维结构和相机运动的计算机视觉技术,通过特征点匹配和对极约束的纯几何方法,估计每张图像对应的相机位姿和各个特征点在三维中的位置,并进行全局的多视图几何优化,最终得到稀疏点云和相机的内外参。
SfM 并不是高斯泼溅中研究的内容,高斯泼溅中直接使用 COLMAP 这个 SfM 工具,调用 COLMAP 的命令完成特征提取、特征匹配、稀疏重建和图像去畸变四个步骤,获得场景的稀疏点云和相机内外参。对 COLMAP 提供的读取函数进行重构,并根据后续算法需要,将需要的数据加工组织如下:
- Intrinsics:焦距在两轴方向像素坐标下的表示、两轴主点偏移、图像的宽度和高度
- Extrinsics:旋转四元数、平移向量
- Viewpoints:两轴向的视场角、世界坐标系到相机坐标系的转换矩阵(numpy array 和 torch tensor)、投影矩阵(torch tensor)、变换矩阵(torch tensor)、相机位置(torch tensor)
- ImageInfos:图像文件名、图像宽度和高度、图像本身(PIL image 和 torch tensor)
- SceneInfo:稀疏点云的位置和颜色、所有相机位置的中心到最远相机的距离
视锥
视锥(view frustum)是计算机图形学中用于描述虚拟相机的可见区域的几何体,只有在视锥中的点才可能被投影到图像平面上(这里隐含了裁剪的操作,即只有视锥内的部分才会参与后续的渲染);视锥定义为一个截头的四棱锥体,锥的顶点为相机光心,由近平面和远平面两个平行平面截切四棱锥体,得到的四棱台就称为视锥。
视锥包含的范围由近平面和远平面深度(znear 和 zfar)以及两轴的视场角确定,其中近平面和远平面分别界定了虚拟相机最近和最远的可见深度。高斯泼溅中相机坐标系为右手系,即以相机光心为原点,向右为 x 轴方向,向上为 y 轴方向,向前为-z 轴方向建立坐标系,再假设近平面矩形上下边的 y 值和左右的 x 值分别设为\(t、b、l、r\)(top、bottom、left、right),有如下计算关系
\[\begin{aligned} t &= \tan\frac{\text{fovy}}{2} \cdot \text{znear}\\ b &= -t = -\tan\frac{\text{fovy}}{2} \cdot \text{znear}\\ r &= \tan\frac{\text{fovx}}{2} \cdot \text{znear}\\ l &= -r = -\tan\frac{\text{fovx}}{2} \cdot \text{znear}\\ \end{aligned}\]仿射变换
仿射变换是将一个向量空间进行一次线性变换加一次平移变换(这里的线性变换指线性代数定义上的线性变换,即满足对加和数乘封闭的变换),从而变换到另一个向量空间的操作。仿射变换具有一定的保持性:变换前后点还是点、线还是线、面还是面;平行线和平行面依然平行;图形间的比例关系不变。仿射变换包含的操作类型有伸缩、旋转、剪切、镜像和平移;其中平移通过向量加法实现,另外四种操作通过矩阵乘法实现。
设原始图像中的坐标为\((u, v)\),变换后图像坐标为\((x, y)\);将坐标表示为行向量,对行向量应用变换使用矩阵右乘。(注:在 numpy 这样具有向量化的乘法矩阵算子库中,使用行向量表示坐标以及相应地使用右乘矩阵,可以不必再对坐标矩阵调整通道并 reshape,因此一些资料中会使用行向量来表示坐标)。仿射变换通式用矩阵表达如下,将\((u, v)\)表示为\([u, v, 1]\)是为了将平移操作统一纳入矩阵乘法减少运算次数,从而用一次矩阵乘法实现仿射变换通式;有时也会将变换矩阵凑成方阵而将\((x, y)\)也表示为齐次坐标。通过多组点求解超定方程组的最小二乘解即可得出仿射变换矩阵(求解过程可见参考资料)。
\[\begin{aligned} &\begin{bmatrix} x & y \end{bmatrix} = \begin{bmatrix} u & v & 1 \end{bmatrix} \begin{bmatrix} t_{11} & t_{12} \\ t_{21} & t_{22} \\ t_{31} & t_{32} \end{bmatrix} \\ &\begin{bmatrix} x & y & 1 \end{bmatrix} = \begin{bmatrix} u & v & 1 \end{bmatrix} \begin{bmatrix} t_{11} & t_{12} & 0 \\ t_{21} & t_{22} & 0 \\ t_{31} & t_{32} & 1 \end{bmatrix} \end{aligned}\]透视投影
计算机图形学中的投影分为正交投影和透视投影,人眼和相机成像的规律都符合透视投影,以下的介绍也针对透视投影。用相机进行拍摄时,认为三维空间中的物体都投影在一个二维平面上,如下图中的红色平面。将这个平面定义为\(z=1\)的平面,称为归一化投影平面。设\((x, y, 1)\)为二维图像上点\((x, y)\)在三维的坐标。对这个三维坐标乘以系数\(\alpha\),令\((X, Y, Z) = \alpha (x, y, 1)\),\(\alpha\)改变的过程,就是点在红色虚线上移动的过程。
对于归一化投影平面而言,所谓的透视投影,就是将点从\((X, Y, Z)\)变换到\((x,y, 1)\)的过程。显然,对点\((X, Y, Z)\)除以\(Z\)分量就可以得到在归一化投影平面上的坐标\((x, y)\),即\((x, y) = (\frac{X}{Z}, \frac{Y}{Z})\)。设原始图像中的坐标为\((u, v)\),变换后图像坐标为\((x, y)\);由于投影是空间中的变换,因此将原始图像上的点表示为齐次坐标\((u, v, w)\),透视投影变换通式用矩阵表达如下。与仿射变化矩阵类似,通过多组点求解超定方程组的最小二乘解即可得出透视投影变换矩阵(求解过程可见参考资料)。
\[\begin{aligned} \begin{bmatrix} x & y & 1 \end{bmatrix} = \begin{bmatrix} u & v & w \end{bmatrix} \begin{bmatrix} t_{11} & t_{12} & t_{13} \\ t_{21} & t_{22} & t_{23} \\ t_{31} & t_{32} & 1 \\ \end{bmatrix} \end{aligned}\]真实相机的成像平面可能不是归一化投影平面,透视投影需要由齐次坐标通过内参矩阵计算,得到像素平面上的坐标为
\[\begin{aligned} x = f_x\frac{u}{w} + c_x\\ y = f_y\frac{v}{w} + c_y\\ \end{aligned}\]无论是哪种,透视投影含有对\(Z\)的除法,因此是非线性变换。总体而言,透视投影是将图片通过投影矩阵投影到新的视平面的过程。矩形经过透视投影之后可能变成任意四边形,但直线仍然保持为直线。
相机模型
相机模型是计算机视觉中描述物理相机成型过程的数学模型,用于建立三维坐标点到二维成像平面的几何映射关系;将这个映射过程中涉及的参数提取出来代表相机在成像中的作用,就是相机模型。相机模型中的参数分为内参和外参,为了使用线性代数的工具完成映射过程中的坐标变换,将参数组织成矩阵的形式,即内参矩阵和外参矩阵。
不同种类相机的内参数量和形式是不同的,最简单的针孔相机内参包含两个轴向的焦距和主点偏移。除了针孔相机,其它相机模型如鱼眼相机、全向相机的内参还有各种畸变参数等。高斯泼溅中使用的相机模型为针孔相机,故本文也以针孔相机为前提介绍后续内容。
\[\begin{aligned} 内参矩阵: \mathbf{K}= \begin{bmatrix} f_x&0&c_x\\ 0&f_y&c_y\\ 0&0&1 \end{bmatrix} \end{aligned}\]几何光学中的物理焦距是光心到图像平面的距离,相机的镜头一般认为是各向同性的,成像平面也只有一个,因此物理焦距\(f\)是唯一的,这里的\(f_x\)和\(f_y\)是指焦距在像素坐标系下的表示,它们与\(f\)的关系如下式,其中\(s_x\)和\(s_y\)分别表示像素在 x 和 y 方向上的物理尺寸,由于制造工艺的缺陷,像素可能并不是标准的正方形,因此\(s_x\)可能并不等于\(s_y\),也就产生了所谓的\(f_x\)和\(f_y\)。计算机视觉中的焦距一般指这个像素坐标系下的表示,即\(f_x\)和\(f_y\)(代码中命名为 focal x 和 focal y),而非几何光学中的物理焦距\(f\)。
\[\begin{aligned} f_x = \frac{f}{s_x}\\ f_y = \frac{f}{s_y}\\ \end{aligned}\]由两轴焦距和图像的宽度和高度,可以计算得出两个方向上的视场角(field of view,简称 fov);视场角定义为相机在某一方向上可见的角度范围
\[\begin{aligned} \text{fovx} = 2\arctan\frac{\text{width}}{2 f_x}\\ \text{fovy} = 2\arctan\frac{\text{height}}{2 f_y}\\ \end{aligned}\]主点偏移是光轴投影到像素坐标系中的坐标。光轴投影(忽略深度)的结果是图像坐标系中的表示,图像坐标系的原点在图像正中心,而像素坐标系的原点在图像的最左上角,即左上角像素的左上角,因此两个二维坐标系之间有一个\((\frac{w}{2}, \frac{h}{2})\)的偏移(w 和 h 分别表示图像的宽度和高度),这就是所谓的主点偏移。
外参具有统一的形式,即相机的位置和姿态。
\[\begin{aligned} 外参矩阵&: \mathbf{T}= \begin{bmatrix} \mathbf{R} & \mathbf{t} \\ \mathbf{0} & 1 \end{bmatrix}= \begin{bmatrix} \mathbf{I} & \mathbf{t} \\ \mathbf{0} & 1 \end{bmatrix} \times \begin{bmatrix} \mathbf{R} & \mathbf{0} \\ \mathbf{0} & 1 \end{bmatrix}= \begin{bmatrix} 1 & 0 & 0 & t_x \\ 0 & 1 & 0 & t_y \\ 0 & 0 & 1 & t_z \\ 0 & 0 & 0 & 1 \end{bmatrix} \times \begin{bmatrix} r_{xx} & r_{xy} & r_{xz} & 0 \\ r_{yx} & r_{yy} & r_{yz} & 0 \\ r_{zx} & r_{zy} & r_{zz} & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}\\ \end{aligned}\]整个成像的过程可以拆解成一系列坐标系之间的转化:世界坐标系–>相机坐标系–>归一化设备坐标系–>像素坐标系。
足迹渲染
足迹渲染(footprint)的概念源于纹理映射,即像素平面和纹理空间的对应关系,通俗理解就是给纯色的几何体上贴图的过程。由于此处并不研究纹理相关的内容,故不作过多介绍。高斯泼溅在渲染过程中用到的渲染足迹概念,来自 EWA Volume Splatting,是指三维体素投影到二维平面上对应的这块区域。为了进一步介绍,还需要明确一些前置概念。
kernel 定义为一个局部加权函数,用于决定邻域的贡献大小,简单来说就是影响范围+权重函数。体素在三维空间中就是一个 3D kernel,投影到屏幕空间后得到的 footprint 就是一个 2D kernel,投影变换直接决定了 footprint 的形状。
EWA filtering 指出,纹理映射时存在固有的混叠问题,一个屏幕像素可能覆盖纹理空间中的多个纹理像素,如果只使用最近点采样或双线性插值,会出现锯齿、闪烁或马赛克等视觉伪影。抗混叠的关键是对这片纹理区域做平均而不是对单个点采样。这个区域的形状一般是一个平行四边形,经过近似后用一个椭圆来表示。在椭圆范围内使用高斯滤波在椭圆内进行平滑采样,即对纹理做加权平均,从而避免混叠。之所以用椭圆来近似是由于抗混叠的采样需要平滑的低通滤波,而平行四边形的硬边界会引入额外的频率成分。
EWA Volume Splatting 中沿用了这一思想并将其推广到体素中,由于任意体素投影得到的 footprint 形状复杂,直接处理的计算开销较大;且出于上述抗混叠的考虑,用椭圆 kernel 来近似投影得到的 footprint,衡量三维 kernel 对图像平面上每个点的贡献。而高斯泼溅沿用了 EWA Volume Splatting 的方法,同样用椭圆表示 footprint。





