Gaussian Splatting-投影与Jacobian矩阵
投影矩阵
将3D协方差投影到2D, 获得一个2×2的协方差矩阵
\[\Sigma' = J W \Sigma W^T J^T\]其中变换矩阵$W$应该是将点云从世界坐标系变换到相机坐标系。J是一个Jacobian矩阵, 用来近似投影操作。
与传统的计算机视觉方法相比,可能会有疑惑:为什么不使用相机内参矩阵K来完成投影操作?
投影的非线性
透视投影过程本身是非线性的, 可以观察到, 因为$\frac{1}{Z_c}$项的存在,这也是透视投影能够“近大远小”的原因。
\[\begin{bmatrix} \mu \\ \nu \\ 1 \\ \end{bmatrix} = \frac{1}{Z_c}K \begin{bmatrix} X_c \\ Y_c \\ Z_c \\ \end{bmatrix}\]直觉上,既然每一个gaussian primitive代表的是一个3D的椭球, 那么利用三维空间的椭球公式在空间中采样一个椭球形状的点云, 经过$K[R | t]$的投影, 应该投影成一个 2D 椭圆。 |
但是,为什么 3D 高斯点的协方差矩阵不能直接用透视投影,而需要 Jacobian 近似?
或者说 协方差经过非线性的投影过程后会发生什么?
理解这个问题的核心是: 点云与概率分布的区别
更细一点, 非线性投影如何影响概率密度
如果我们有一个真实的 3D 椭球点云,例如: [ \frac{x^2}{a^2} + \frac{y^2}{b^2} + \frac{z^2}{c^2} = 1 ] 当我们把这个椭球投影到 2D 画面上:
- 每个点都 独立地 经过透视投影: [ u = \frac{f_x X_c}{Z_c} + c_x, \quad v = \frac{f_y Y_c}{Z_c} + c_y ]
- 投影后,点云的形状 自然地形成一个 2D 椭圆,因为透视变换只是影响了点的位置,并不会破坏整体的拓扑结构。
在 3DGS 中,每个高斯点是一个 连续的概率分布,由 均值 ( \mu ) 和协方差矩阵 ( \Sigma ) 定义: [ p(X) = \frac{1}{(2\pi)^{3/2} |\Sigma|^{1/2}} \exp\left(-\frac{1}{2} (X - \mu)^T \Sigma^{-1} (X - \mu)\right) ]
- 这个公式描述的是 3D 空间中一个连续的概率密度,而不是一组点。
- 协方差矩阵 ( \Sigma ) 控制的是点云的”扩散趋势”,而不是单独的点位置。
当高斯点被透视投影到 2D 时:
- 均值 ( \mu ) 经过投影矩阵转换,没问题。
- 但是协方差矩阵 ( \Sigma ) 不能直接用透视投影矩阵 ( P ) 变换,因为概率密度的变换和坐标变换不一样!
这就导致了 如果不使用 Jacobian 近似,透视投影可能会错误地改变高斯点的形状。
2. 非线性透视投影如何影响高斯点的协方差?
如果我们想要将高斯点从 3D 变换到 2D,直觉上可能会想: [ \Sigma_Y = P \Sigma_X P^T ] 其中 ( P ) 是投影矩阵,但这样计算是 错误的,原因是:
(1) 透视投影的非线性使得协方差无法直接变换
透视投影包含 ( \frac{1}{Z_c} ),它不是一个线性变换: [ u = \frac{f_x X_c}{Z_c} + c_x, \quad v = \frac{f_y Y_c}{Z_c} + c_y ] 如果用普通的矩阵乘法变换协方差: [ \Sigma_Y = P \Sigma_X P^T ]
- 这里 ( P ) 只适用于线性变换(如旋转、缩放、平移)。
- 但是透视投影的 ( 1/Z_c ) 是非线性的,它会影响协方差的形状。
直观影响:
- 如果我们错误地用 ( P ) 变换协方差,高斯点的 2D 形状可能会被错误地拉伸或压缩,不符合真实投影形态。
- 在 3DGS 训练过程中,这种错误变换会导致 错误的梯度计算,使得高斯点的位置和形状优化不稳定。
(2) 用 Jacobian 进行正确的协方差变换
正确的变换应该考虑透视投影的 局部线性近似,这正是 Jacobian 的作用: [ \Sigma_Y = J \Sigma_X J^T ] 其中 ( J ) 是 Jacobian 矩阵,描述透视投影的局部变化: [ J = \begin{bmatrix} \frac{\partial u}{\partial X_c} & \frac{\partial u}{\partial Y_c} & \frac{\partial u}{\partial Z_c}
\frac{\partial v}{\partial X_c} & \frac{\partial v}{\partial Y_c} & \frac{\partial v}{\partial Z_c} \end{bmatrix} ] 这个 Jacobian 计算出的变换: ✅ 正确考虑了透视投影的非线性,使得高斯点的形状在 2D 上正确变形。
✅ 不会错误拉伸,而是保持真实的近大远小效果。
✅ 保证了梯度计算正确,使得训练稳定。
3. 为什么 3D 椭球点云不会有问题,而高斯点需要 Jacobian?
| 问题 | 3D 椭球点云 | 高斯点协方差 | |———-|—————|—————-| | 数据表示 | 离散点集,每个点独立 | 概率密度分布,由协方差控制 | | 投影方式 | 每个点都独立投影 | 协方差需要整体变换 | | 投影后形状 | 形成自然的 2D 椭圆 | 可能被错误拉伸或压缩 | | 非线性影响 | 仅影响点的分布,不影响整体结构 | 可能错误改变高斯点的形状 | | 是否需要 Jacobian? | 不需要,因为点云点的位置独立投影即可 | 需要,否则协方差计算错误 |
4. 直观理解
- 3D 椭球点云的点是独立的,每个点都可以单独投影,最终形成合理的 2D 椭圆。
- 高斯分布是连续的,协方差矩阵决定了”点云扩散的趋势”。如果不考虑 Jacobian 近似,投影后的分布形状可能错误地扭曲,影响渲染。
换句话说,高斯点的协方差矩阵在 3D 空间中是一个”连续形状”,透视投影的非线性影响的是整个形状的分布,而不仅仅是单个点的位置。
这就是为什么 3DGS 需要 Jacobian 线性化投影,以保证高斯点的正确变换!
5. 结论
✅ 使用 Jacobian 近似投影过程,可以确保高斯点的 2D 形状正确变化,而不会被错误拉伸或压缩。
✅ 这保证了 3DGS 训练稳定,使得梯度计算正确,提高渲染质量。 🚀
投影: K与Jacobian
1
𝐽 is the Jacobian of the affine approximation of the projective transformation.
结论: 点的投影过程是一个非线性变换, 无法直接用于表示分布的协方差矩阵的投影。从物理的角度来说, 3D的信息变为了2D, 其实是损失了一个维度的信息, 我们使用深度图恢复点云的时候, 实际上是使用了每个2D像素点额外的1D深度信息。
假设[A, b]是一个线性变换, 那么空间中的高斯分布$(\mu, \Sigma)$经过变换后变为:
\[\mu_Y = A\mu + \mathbf{b}\] \[\Sigma_Y = A\Sigma A^T\]线性变换
- 加法封闭性
- 数乘封闭性
而使用内参矩阵K进行透视投影这个过程是非线性的,会使表示分布的协方差矩阵信息丢失。
因为$\frac{1}{Z_c}$这一非线性项会出现在$\mu$和$\nu$中, 因此使用内参矩阵$K$的投影过程是非线性的。而为了维持分布的特性,我们需要使用线性变换。这就是为什么需要使用Jacobian矩阵来近似线性变换。
Jacobian是如何近似的
我们前面提到了, 如果是线性变换, 那么协方差矩阵的变换形式是:
\[\Sigma_{new}=A\Sigma A^T\]能够维持分布,也就是说能够维持协方差矩阵的半正定性和对称性。
$f$本身是$\R^n\rightarrow\R^m$进行两个空间之间的映射, Jacobian是对这个映射$f$的拟合。
一般来说, $J$通常由下面的公式定义:
\[\mathbf{J} = \begin{bmatrix} \frac{\partial f}{\partial x_1} & \cdots & \frac{\partial f}{\partial x_n} \end{bmatrix} = \begin{bmatrix} \frac{\partial f_1}{\partial x_1} & \cdots & \frac{\partial f_1}{\partial x_n} \\ \vdots & \ddots & \vdots \\ \frac{\partial f_m}{\partial x_1} & \cdots & \frac{\partial f_m}{\partial x_n} \end{bmatrix}\]可以看到是每一维映射结果对变量各个维度分量的偏导数。
关于为什么是这个顺序, 可以参考该视频下的评论。
Q:为什么雅可比矩阵可以线性化非线性函数?
雅可比矩阵可以理解为一阶泰勒展开在向量上的拓展, 因为之前遇到的一阶泰勒展开要么是单变量函数, 要么是多变量函数。
\(f(x) \approx f(x_0)+f'(x_0)(x - x_0)\) 令变量$\mathbf{x}=(a,b), \mathbf{x_0}=(a_0, b_0)$ \(f(a) \approx f(a_0)+\frac{\partial f(a)}{\partial a}(a - a_0)\)
假设 \(f(x, y) = \begin{bmatrix} x^2 + y \\ x + y^2 \end{bmatrix}\)
可以写为
\[f(x, y) = \begin{bmatrix} f_{1}(x, y) \\ f_{2}(x, y) \end{bmatrix} = \begin{bmatrix} x^2 + y \\ x + y^2 \\ \end{bmatrix}\]根据雅可比矩阵的定义
\[J(x, y) = \begin{bmatrix} \frac{\partial f_1}{\partial x} & \frac{\partial f_1}{\partial y} \\ \frac{\partial f_2}{\partial x} & \frac{\partial f_2}{\partial y} \\ \end{bmatrix} = \begin{bmatrix} 2x & 1 \\ 1 & 2y \\ \end{bmatrix}\]$f$在$x_0$处的泰勒一阶展开
\[f(x) \approx f(x_0, y_0)+J(x_0, y_0)\begin{bmatrix} x - x_0 \\ y - y_0 \end{bmatrix}\]假设$x_0 = 1, y_0 = 2$, 且$\Delta x= x - x_0$, $\Delta y= y - y_0$
\[f(x) \approx \begin{bmatrix} 3 \\ 5 \end{bmatrix} + \begin{bmatrix} 2 & 1 \\ 1 & 4 \\ \end{bmatrix}\begin{bmatrix} \Delta x \\ \Delta y \end{bmatrix}\]至此, f(x, y)已经在$(x_0, y_0)$处实现了局部线性近似。