§ 参考资料 共 4 条
在 3DGS 3. 体渲染 中,我们得到了论文中的体渲染方程:
$$ I_\lambda(\hat{\boldsymbol x})=\int_0^Lc_\lambda(\hat{\boldsymbol x},\xi)g(\hat{\boldsymbol x},\xi)e^{-\int_0^\xi g(\hat{\boldsymbol x},\mu)\mathrm d\mu}\mathrm d\xi $$Splatting 并不是 3DGS 作者提出来的,它来自于论文 Surface splatting,是一种用于点云渲染(Point-Based Rendering)的方法
Surface Splatting
点云本身是对三维场景采样的结果,我们如果要渲染它们,需要对采样点进行重建,得到一个连续的分布,然后再进行渲染
Surface Splatting 用某种连续核函数(如高斯核)去表示每个点的贡献,从而形成一个连续分布
假设我们有一个三维点云表示的场景 $S$,对于三维空间中的任意位置 $\boldsymbol x$,取与它非常相近的一些点 $\{\boldsymbol P_k\}\subset S$,每个点的属性值为 $w_k$,位置为 $\boldsymbol p_k$,核函数为 $r_k(\boldsymbol x)$,那么重建出的分布 $f(\boldsymbol x)$ 表示为:
$$ f(\boldsymbol x)=\sum_{k=0}^Kw_kr_k(\boldsymbol x-\boldsymbol p_k) $$其中,由于每个点都有一个“影响范围”,所以可以看成每个位置只受很相近的点影响,但理论上它受所有点影响
在论文中,由于它探讨的是纹理空间,所以进行了二维参数化,示意图如下:
在这个表面上进行重建,原理相似
Point-Based Rendering
3DGS 最终使用的也是类 Point-Based Rendering 的渲染方程
我们把颜色看成是离散的(很合理,如果把粒子看成单独个体的话,相邻粒子的颜色完全可以差距很大),而粒子的“密度”是连续的
这样我们根据 Surface Splatting 重建出密度场 $g$,令:
$$ g(\hat{\boldsymbol x},\xi)=\sum_{k=0}^Kg_kr_k(\hat{\boldsymbol x},\xi) $$具体参考 https://zhuanlan.zhihu.com/p/666465701 和 https://zhuanlan.zhihu.com/p/7833648056,代入得到:
$$ \begin{aligned} I_\lambda(\hat{\boldsymbol x})&=\int_0^Lc_\lambda(\hat{\boldsymbol x},\xi)g(\hat{\boldsymbol x},\xi)e^{-\int_0^\xi g(\hat{\boldsymbol x},\mu)\mathrm d\mu}\mathrm d\xi \\ &=\int_0^Lc_\lambda(\hat{\boldsymbol x},\xi)\left(\sum_{k=0}^Kg_kr_k(\hat{\boldsymbol x},\xi)\right)e^{-\int_0^\xi \left(\sum_{k=0}^Kg_kr_k(\hat{\boldsymbol x},\mu)\right)\mathrm d\mu}\mathrm d\xi \\ &=\sum_{k=0}^Kg_k\left(\int_0^Lc_\lambda(\hat{\boldsymbol x},\xi)r_k(\hat{\boldsymbol x},\xi)\prod_{k'=0}^K e^{-g_{k'}\int_0^\xi r_{k'}(\hat{\boldsymbol x},\mu)\mathrm d\mu}\mathrm d\xi\right) \\ &\approx\sum_{k=0}^Kg_k\left[\int_0^Lc_\lambda(\hat{\boldsymbol x},\xi)r_k(\hat{\boldsymbol x},\xi)\prod_{k'=0}^K\left(1-g_{k'}\int_0^\xi r_{k'}(\hat{\boldsymbol x},\mu)\mathrm d\mu\right)\mathrm d\xi\right] \\ &\approx\sum_{k=0}^Kg_k\left(\int_0^Lc_{\lambda k}(\hat{\boldsymbol x},\xi)r_k(\hat{\boldsymbol x},\xi)\mathrm d\xi\right)\prod_{k'=0}^K\left(1-g_{k'}\int_0^\xi r_{k'}(\hat{\boldsymbol x},\mu)\mathrm d\mu\right) \\ &=\sum_{k=0}^Kg_kc_{\lambda k}(\hat{\boldsymbol x})q_k(\hat{\boldsymbol x})\prod_{k'=0}^K\left(1-g_{k'}q_{k'}(\hat{\boldsymbol x})\right) \end{aligned} $$其中:
$$ q_k(\hat{\boldsymbol x})=\int_{-\infty}^{\infty}r_k(\hat{\boldsymbol x},\xi)\mathrm d\xi $$3D 高斯沿着某个轴做积分可以得到 2D 高斯,即:$\int_{-\infty}^{+\infty}\mathcal G_\boldsymbol\Sigma(\boldsymbol x-\boldsymbol\mu)\mathrm dx=\mathcal G_\hat{\boldsymbol\Sigma}(\hat{\boldsymbol x}-\hat{\boldsymbol\mu})$
如果把 3D 高斯作为核函数,那么 $q_k(\hat{\boldsymbol x})$ 就变成了一个二维高斯,$c_{\lambda k}$ 和 $g_k$ 分别对应球谐系数和不透明度
EWA 算法
要想渲染到一个二维图像中,我们需要将连续的函数进行采样
两个高斯卷积得到的还是一个高斯,即:$(\mathcal G_{\boldsymbol\Sigma_1}\otimes\mathcal G_{\boldsymbol\Sigma_2})(\boldsymbol x-\boldsymbol\mu)=\mathcal G_{\boldsymbol\Sigma_1+\boldsymbol\Sigma_2}(\boldsymbol x-\boldsymbol\mu)$
3D 高斯的仿射变换
从世界空间到相机空间的变换是仿射变换
在 3DGS 1. 高斯分布与高斯椭球 中,我们通过对 $n$ 元标准高斯分布进行推广得到 $n$ 元高斯分布,用了
$$ \boldsymbol Y=\boldsymbol A\boldsymbol X+\boldsymbol\mu $$这个变换,它就是仿射变换
所以,所有的高斯分布都可以看成是标准高斯分布经过仿射变换得到的,高斯分布经过仿射变换后仍然是高斯分布
假设我们有一个高斯分布:
$$ f(\boldsymbol x)=\frac{1}{(2\pi)^{n/2}\vert\boldsymbol\Sigma\vert^{1/2}}e^{-\frac{1}{2}(\boldsymbol x-\boldsymbol \mu)^T\boldsymbol \Sigma^{-1}(\boldsymbol x-\boldsymbol \mu)} $$经过仿射变换 $\boldsymbol y=\varphi(\boldsymbol x)=\boldsymbol A\boldsymbol x+\boldsymbol b$ 后,利用概率密度变换公式得到:
$$ \begin{aligned} f(\boldsymbol y)&=f(\varphi^{-1}(\boldsymbol y))\vert\boldsymbol J\vert \\ &=\frac{1}{(2\pi)^{n/2}\vert\boldsymbol\Sigma\vert^{1/2}}e^{-\frac{1}{2}\left[\boldsymbol A^{-1}(\boldsymbol y-\boldsymbol b)-\boldsymbol\mu\right]^T\boldsymbol\Sigma^{-1}\left[\boldsymbol A^{-1}(\boldsymbol y-\boldsymbol b)-\boldsymbol\mu\right]}\left\vert \boldsymbol A\right\vert^{-1} \\ &=\frac{1}{(2\pi)^{n/2}\vert\boldsymbol\Sigma\vert^{1/2}}e^{-\frac{1}{2}\left[\boldsymbol y-(\boldsymbol A\boldsymbol\mu+\boldsymbol b)\right]^T\boldsymbol(\boldsymbol A\boldsymbol \Sigma\boldsymbol A^T)^{-1}\left[\boldsymbol y-(\boldsymbol A\boldsymbol\mu+\boldsymbol b)\right]}\left\vert \boldsymbol A\right\vert^{-1} \\ &=\frac{1}{(2\pi)^{n/2}\vert\boldsymbol A\boldsymbol \Sigma\boldsymbol A^T\vert^{1/2}}e^{-\frac{1}{2}\left[\boldsymbol y-(\boldsymbol A\boldsymbol\mu+\boldsymbol b)\right]^T\boldsymbol(\boldsymbol A\boldsymbol \Sigma\boldsymbol A^T)^{-1}\left[\boldsymbol y-(\boldsymbol A\boldsymbol\mu+\boldsymbol b)\right]} \end{aligned} $$即:$\boldsymbol\mu'=\boldsymbol A\boldsymbol\mu+\boldsymbol b$,$\boldsymbol\Sigma'=\boldsymbol A\boldsymbol \Sigma\boldsymbol A^T$
3D 高斯的非仿射变换
从相机空间到射线空间的变换是非仿射变换
参考 3DGS 3. 体渲染,对于相机空间中的一个点 $\boldsymbol x$,投影变换函数可以写作:
$$ \phi(\boldsymbol x)=\begin{bmatrix} x_0/x_2 \\ x_1/x_2 \\ \Vert\boldsymbol x\Vert \end{bmatrix} $$我们在将高斯投影到射线空间时,是知道高斯的中心点 $\boldsymbol\mu$ 的,所以我们使用泰勒展开对这个变换进行近似:
$$ \phi(\boldsymbol x)=\phi(\boldsymbol\mu)+\boldsymbol J_{\boldsymbol\mu}(\boldsymbol x-\boldsymbol\mu)+o(\cdot) $$其中,$\boldsymbol J_{\boldsymbol\mu}$ 是 $\phi(\boldsymbol x)$ 对 $\boldsymbol x$ 的一阶导数对应的雅可比矩阵在 $\boldsymbol x=\boldsymbol\mu$ 处的取值,它可以表示成:
$$ \boldsymbol J_{\boldsymbol\mu}=\begin{bmatrix} \frac{\partial \phi_0}{\partial x_0} & \frac{\partial \phi_0}{\partial x_1} & \frac{\partial \phi_0}{\partial x_2} \\ \frac{\partial \phi_1}{\partial x_0} & \frac{\partial \phi_1}{\partial x_1} & \frac{\partial \phi_1}{\partial x_2} \\ \frac{\partial \phi_2}{\partial x_0} & \frac{\partial \phi_2}{\partial x_1} & \frac{\partial \phi_2}{\partial x_2} \end{bmatrix}_{\boldsymbol x=\boldsymbol\mu}=\begin{bmatrix} \frac{1}{x_2} & 0 & -\frac{x_0}{x_2^2} \\ 0 & \frac{1}{x_2} & -\frac{x_1}{x_2^2} \\ \frac{x_0}{\Vert\boldsymbol x\Vert} & \frac{x_1}{\Vert\boldsymbol x\Vert} & \frac{x_2}{\Vert\boldsymbol x\Vert} \end{bmatrix}_{\boldsymbol x=\boldsymbol\mu}=\begin{bmatrix} \frac{1}{\mu_2} & 0 & -\frac{\mu_0}{\mu_2^2} \\ 0 & \frac{1}{\mu_2} & -\frac{\mu_1}{\mu_2^2} \\ \frac{\mu_0}{\Vert\boldsymbol\mu\Vert} & \frac{\mu_1}{\Vert\boldsymbol\mu\Vert} & \frac{\mu_2}{\Vert\boldsymbol\mu\Vert} \end{bmatrix} $$参考 https://zhuanlan.zhihu.com/p/666465701,射线空间的第三维坐标除了取 $\Vert\boldsymbol x\Vert$,也可以取 $x_0$、$x_1$ 或 $x_2$,但是取 $\Vert\boldsymbol x\Vert$ 的效果最好
一阶泰勒展开之后就是仿射变换了,写成:
$$ \phi(\boldsymbol x)\approx\phi(\boldsymbol\mu)+\boldsymbol J_{\boldsymbol\mu}(\boldsymbol x-\boldsymbol\mu)=\boldsymbol J_{\boldsymbol\mu}\boldsymbol x+[\phi(\boldsymbol\mu)-\boldsymbol J_{\boldsymbol\mu}\boldsymbol\mu] $$所以我们可以直接写出:$\boldsymbol\mu'=\phi(\boldsymbol A\boldsymbol\mu+\boldsymbol b)$,$\boldsymbol\Sigma'=\boldsymbol J_{\boldsymbol\mu}\boldsymbol \Sigma\boldsymbol J_{\boldsymbol\mu}^T$
那么,从世界空间到射线空间的变换就是:
$$ \begin{aligned} \boldsymbol\mu'&=\phi(\boldsymbol\mu) \\ \boldsymbol\Sigma'&=\boldsymbol J_{\boldsymbol\mu}\boldsymbol A\boldsymbol \Sigma\boldsymbol A^T\boldsymbol J_{\boldsymbol\mu}^T \end{aligned} $$