2DGS: 2D Gaussian Splatting for Geometrically Accurate Radiance Fields 项目地址open in new window  
SIGGRAPH 2024
Fig. 1: Overview  Abstract 3D Gaussian Splatting (3DGS) 最近在辐射场重建领域取得了革命性进展,实现了高质量的新视角合成和快速渲染。然而,由于 3D 高斯的多视图不一致性,3DGS 无法准确表示表面。本文提出了 2D Gaussian Splatting (2DGS),这是一种从多视图图像中建模和重建几何精确辐射场的新方法。核心思想是将 3D 体积压缩成一组 2D 定向平面高斯盘 (2D oriented planar Gaussian disks) 。与 3D 高斯不同,2D 高斯在建模表面时内在地提供了视图一致的几何形状。为了准确恢复薄表面并实现稳定优化,本文介绍了利用光线泼溅交汇 (ray-splat intersection)  和光栅化实现透视准确的 2D splatting 过程。此外,还结合了深度失真 (depth distortion)  和法线一致性项,以进一步提高重建质量。证明了本文的可微渲染器在保持竞争性外观质量、快速训练速度和实时渲染的同时,能够实现无噪声且细节丰富的几何重建。
 Introduction 因为体积 3D 高斯模型模拟了完整角度的辐射,这与表面的薄性是冲突的。前人的工作已经证明了表面元素 (surfels)  是一个高效表示复杂几何的方法,因此本文用 2D 高斯基元,即定向椭圆盘 (oriented elliptical disk)  来表示 3D 场景。相较于 3D 高斯基元,2D 高斯基元可以准确地表示出物体的表面。如图 2 所示,本文采用显式 ray-splat intersection 的方法。3DGS 通过像素光线的相交处来估计高斯的属性,当视角不同时,会产生不同的交平面,最终会导致不一致性。而 ray-splat intersection 的方法能够实现交汇平面的一致性,最终实现透视正确的 splatting 效果。并且 2D 基元能够很方便地计算出法线。
A surfel, that is, a point structure representing Euclidean xyz coordinates, together with normal coordinates, a RGBA color, a radius, a confidence value and the surface curvature estimate.
Fig. 2: Comparison of 3DGS and 2DGS 如果只是用图片求损失来优化效果并不是非常好,因此本文还引入了深度失真和法线一致性损失。深度失真损失将 2D 基元集中在沿光线分布的一个小范围内,解决了渲染过程中忽略高斯基元之间距离的问题;法线一致性损失能最大限度地减少渲染的法线贴图与渲染的深度梯度之间的差异,确保深度和法线定义的几何图形保持一致。
本文的贡献为:
提出了一种高效的可微分 2D 高斯渲染器,通过利用 2D 表面建模、ray-splat intersection 和体积积分,实现透视正确的 splatting。 引入了两种正则化损失,以改进无噪声表面重建。 与其他显式表示法相比,本文的方法实现了最先进的几何重建和新视角生成 (novel view synthesis, NVS)  结果。  Method  Modeling 如图 3 所示,2DGS 以点 p k \mathbf{p}_k p k  t u \mathbf{t}_u t u  t v \mathbf{t}_v t v  s = ( s u , s v ) \mathbf{s}=(s_u,s_v) s = ( s u  , s v  ) t w = t u × t v \mathbf{t}_w=\mathbf{t}_u\times\mathbf{t}_v t w  = t u  × t v  3 × 3 3\times3 3 × 3 R = [ t u , t v , t w ] \mathbf{R}=[\mathbf{t}_u,\mathbf{t}_v,\mathbf{t}_w] R = [ t u  , t v  , t w  ] 0 0 0 3 × 3 3\times3 3 × 3 S \mathbf{S} S 
Fig. 3: Illustration of 2D Gaussian Splatting 一个定义在局部切平面 (tangent plane)  的 2D 高斯在世界空间中的坐标如下:
P ( u , v ) = p k + s u t u u + s v t v v = H ( u , v , 1 , 1 ) T (1)  P(u, v)=\mathbf{p}_k+s_u \mathbf{t}_u u+s_v \mathbf{t}_v v=\mathbf{H}(u, v, 1,1)^{\mathrm{T}} \tag{1}  P ( u , v ) = p k  + s u  t u  u + s v  t v  v = H ( u , v , 1 , 1 ) T ( 1 ) 
where   H = [ s u t u s v t v 0 p k 0 0 0 1 ] = [ R S p k 0 1 ] (2)  \text{where} \ \ \mathbf{H}=\left[\begin{array}{cccc} s_u \mathbf{t}_u & s_v \mathbf{t}_v & \mathbf{0} & \mathbf{p}_k \\ 0 & 0 & 0 & 1 \end{array}\right]=\left[\begin{array}{cc} \mathbf{R S} & \mathbf{p}_k \\ \mathbf{0} & 1 \end{array}\right] \tag{2}  where     H = [ s u  t u  0  s v  t v  0  0 0  p k  1  ] = [ RS 0  p k  1  ] ( 2 ) 
H ∈ 4 × 4 \mathbf{H}\in4\times4 H ∈ 4 × 4 对于 uv 空间中的点 u = ( u , v ) \mathbf{u}=(u,v) u = ( u , v ) 
G ( u ) = exp  ( − u 2 + v 2 2 ) (3)  \mathcal{G}(\mathbf{u})=\exp \left(-\frac{u^2+v^2}{2}\right) \tag{3}  G ( u ) = exp ( − 2 u 2 + v 2  ) ( 3 ) 
类似于 3DGS,知道高斯的不透明度 α \alpha α G \mathcal{G} G α G ( u ) \alpha\mathcal{G}(\mathbf{u}) α G ( u ) t u \mathbf{t}_u t u  t v \mathbf{t}_v t v  G ( u ) \mathcal{G}(\mathbf{u}) G ( u ) H \mathbf{H} H u ( u , v ) \mathbf{u}(u,v) u ( u , v ) 
中心 p k \mathbf{p}_k p k  ( s u , s v ) (s_u,s_v) ( s u  , s v  ) ( t u , t v ) (\mathbf{t}_u, \mathbf{t}_v) ( t u  , t v  ) α \alpha α c c c 
 Splatting 渲染 2D 高斯的常用策略是利用透视投影的仿射变换近似地将 2D 高斯基元投影到屏幕空间,但是这种投影只有在高斯的中心处准确率高,离中心越远误差越大。本文采用基于齐次坐标的计算公式,将 2D splat 的投影过程表示为齐次坐标下一个统一的 2D-to-2D 的映射,简单来说就是直接用齐次变换矩阵将 2D 高斯基元从世界空间投影到屏幕空间。因此屏幕空间中的点可以通过下式进行计算:
x = ( x z , y z , z , 1 ) T = W P ( u , v ) = W H ( u , v , 1 , 1 ) T (4)  \mathbf{x}=(x z, y z, z, 1)^{\mathrm{T}}=\mathbf{W} P(u, v)=\mathbf{W H}(u, v, 1,1)^{\mathrm{T}} \tag{4}  x = ( x z , yz , z , 1 ) T = W P ( u , v ) = WH ( u , v , 1 , 1 ) T ( 4 ) 
x \mathbf{x} x ( x , y ) (x,y) ( x , y ) z z z 对 2D 高斯进行光栅化时,为了找到像素 ( x , y ) (x,y) ( x , y ) M = ( W H ) − 1 \mathbf{M}=(\mathbf{W}\mathbf{H})^{-1} M = ( WH ) − 1 u = M x \mathbf{u}=\mathbf{M}\mathbf{x} u = Mx 
通常来说屏幕空间应该用 uv 表示,但是在前文的局部切平面已经用 uv 表示了,所以本文用 xy 来表示屏幕空间。H \mathbf{H} H W \mathbf{W} W 
Ray-splat Intersection . Ray-splat Intersection 就是通过找 3 个非平行平面的交点来确定像素 ( x , y ) (x,y) ( x , y ) x = ( x , y ) \mathbf{x}=(x,y) x = ( x , y ) h x = ( − 1 , 0 , 0 , x ) T \mathbf{h}_x=(-1,0,0,x)^T h x  = ( − 1 , 0 , 0 , x ) T h y = ( 0 , − 1 , 0 , y ) T \mathbf{h}_y=(0,-1,0,y)^T h y  = ( 0 , − 1 , 0 , y ) T 
4D 齐次平面方程为 a x + b y + c z + d w = 0 ax+by+cz+dw=0 a x + b y + cz + d w = 0 ( x , y , z , w ) (x,y,z,w) ( x , y , z , w ) ( a , b , c , d ) (a,b,c,d) ( a , b , c , d ) h = ( a , b , c , d ) \mathbf{h}=(a,b,c,d) h = ( a , b , c , d ) x = x 0 x=x_0 x = x 0  ( x 0 , y , z , 1 ) (x_0,y,z,1) ( x 0  , y , z , 1 ) ( a , b , c , d ) (a,b,c,d) ( a , b , c , d ) a x 0 + b y + c z + d = 0 ax_0+by+cz+d=0 a x 0  + b y + cz + d = 0 ( − 1 , 0 , 0 , x 0 ) (-1,0,0,x_0) ( − 1 , 0 , 0 , x 0  ) 
然后就是要将这两个平面变换到 uv 空间。用变换矩阵 M \mathbf{M} M M − T \mathbf{M}^{-T} M − T ( W H ) T (\mathbf{WH})^T ( WH ) T ( x , y ) (x,y) ( x , y ) M = ( W H ) − 1 \mathbf{M}=(\mathbf{W}\mathbf{H})^{-1} M = ( WH ) − 1 
h u = ( W H ) T h x h v = ( W H ) T h y (5)  \mathbf{h}_u=(\mathbf{W H})^{\mathrm{T}} \mathbf{h}_x \quad \mathbf{h}_v=(\mathbf{W H})^{\mathrm{T}} \mathbf{h}_y \tag{5}  h u  = ( WH ) T h x  h v  = ( WH ) T h y  ( 5 ) 
这里只用到了 2 个平面,第三个平面就是 2D 高斯基元的平面。x-plane 和 y-plane 的交线表示的是从相机发出的穿过像素 ( x , y ) (x,y) ( x , y ) u = ( u , v ) \mathbf{u}=(u,v) u = ( u , v ) 
h u ⋅ ( u , v , 1 , 1 ) T = h v ⋅ ( u , v , 1 , 1 ) T = 0 (6)  \mathbf{h}_u\cdot(u,v,1,1)^\mathrm{T}=\mathbf{h}_v\cdot(u,v,1,1)^\mathrm{T}=0 \tag{6}  h u  ⋅ ( u , v , 1 , 1 ) T = h v  ⋅ ( u , v , 1 , 1 ) T = 0 ( 6 ) 
首先用齐次坐标 ( u , v , 1 , 1 ) (u,v,1,1) ( u , v , 1 , 1 ) 
通过公式 6 最终可以解出交点的 uv 坐标:
u ( x ) = h u 2 h v 4 − h u 4 h v 2 h u 1 h v 2 − h u 2 h v 1 v ( x ) = h u 4 h v 1 − h u 1 h v 4 h u 1 h v 2 − h u 2 h v 1 (7)  u(\mathbf{x})=\frac{\mathbf{h}_u^2 \mathbf{h}_v^4-\mathbf{h}_u^4 \mathbf{h}_v^2}{\mathbf{h}_u^1 \mathbf{h}_v^2-\mathbf{h}_u^2 \mathbf{h}_v^1} \quad v(\mathbf{x})=\frac{\mathbf{h}_u^4 \mathbf{h}_v^1-\mathbf{h}_u^1 \mathbf{h}_v^4}{\mathbf{h}_u^1 \mathbf{h}_v^2-\mathbf{h}_u^2 \mathbf{h}_v^1} \tag{7}  u ( x ) = h u 1  h v 2  − h u 2  h v 1  h u 2  h v 4  − h u 4  h v 2   v ( x ) = h u 1  h v 2  − h u 2  h v 1  h u 4  h v 1  − h u 1  h v 4   ( 7 ) 
h u i , h v i \mathbf{h}^i_u,\mathbf{h}^i_v h u i  , h v i  i i i 通过公式 4 可以得到深度 z z z 
总结一下 2DGS 的光栅化过程:屏幕空间中的一个像素 x = ( x , y ) \mathbf{x}=(x,y) x = ( x , y ) u ( x ) = ( u , v ) \mathbf{u}(\mathbf{x})=(u,v) u ( x ) = ( u , v ) P ( u , v ) = ( x , y , z ) P(u,v)=(x,y,z) P ( u , v ) = ( x , y , z ) 
Degenerate Solutions . 从一些很斜的角度看,2D 高斯会退化成一条线,在光栅化的过程中会消失。为了解决这个问题,本文使用 uv 空间的低通滤波:
G ( x ) ^ = max  { G ( u ( x ) ) , G ( x − c σ ) } (8)  \hat{\mathcal{G}(\mathbf{x})}=\max\left\{\mathcal{G}(\mathbf{u}(\mathbf{x})),\mathcal{G}\left(\frac{\mathbf{x}-\mathbf{c}}{\sigma}\right)\right\} \tag{8}  G ( x ) ^  = max { G ( u ( x )) , G ( σ x − c  ) } ( 8 ) 
u ( x ) \mathbf{u}(\mathbf{x}) u ( x ) c \mathbf{c} c p k \mathbf{p}_k p k  通俗地来说,当 2D 高斯在屏幕空间比半径为 σ \sigma σ σ \sigma σ σ = 2 / 2 \sigma=\sqrt{2}/2 σ = 2  /2 
Rasterization . 光栅化的过程和 3DGS 一样,也是用 alpha 混合的算法:
c ( x ) = ∑ i = 1 c i α i G ^ i ( u ( x ) ) ∏ j = 1 i − 1 ( 1 − α j G ^ j ( u ( x ) ) ) (9)  \mathbf{c}(\mathbf{x})=\sum_{i=1} \mathbf{c}_i \alpha_i \hat{\mathcal{G}}_i(\mathbf{u}(\mathbf{x})) \prod_{j=1}^{i-1}\left(1-\alpha_j \hat{\mathcal{G}}_j(\mathbf{u}(\mathbf{x}))\right) \tag{9}  c ( x ) = i = 1 ∑  c i  α i  G ^  i  ( u ( x )) j = 1 ∏ i − 1  ( 1 − α j  G ^  j  ( u ( x )) ) ( 9 ) 
 Training Depth Distortion . NeRF 是在光线上进行采样,因此会考虑采样点之间的距离,而 3DGS 的体渲染并没有考虑高斯基元之间的距离。在光线方向有重叠的高斯基元之间的距离不同,也可能会产生相似的渲染结果。并且和传统的表面渲染不同,表面渲染只需要渲染与光线相交的第一个表面即可,而体渲染需要对光线上所有的高斯基元进行累加。为了解决这个问题,本文使用了深度失真来最小化 ray-splat intersections 之间的距离来集中权重的分布:
L d = ∑ i , j ω i ω j ∣ z i − z j ∣ (10)  \mathcal{L}_d = \sum_{i,j} \omega_i \omega_j \left| z_i - z_j \right | \tag{10}  L d  = i , j ∑  ω i  ω j  ∣ z i  − z j  ∣ ( 10 ) 
ω i = α i G ^ i ( u ( x ) ) ∏ j = 1 i − 1 ( 1 − α j G ^ j ( u ( x ) ) ) \omega_i = \alpha_i \hat{\mathcal{G}}_i (\mathbf{u}(\mathbf{x})) \prod_{j=1}^{i-1} \left(1 - \alpha_j \hat{\mathcal{G}}_j (\mathbf{u}(\mathbf{x})) \right) ω i  = α i  G ^  i  ( u ( x )) ∏ j = 1 i − 1  ( 1 − α j  G ^  j  ( u ( x )) ) i i i z i z_i z i  从这个公式也能看出高斯基元的不透明度越高,权重也越高,所以这个公式可以理解为减少具有高不透明度基元之间的深度差异。并且这个正则项是通过 CUDA 实现的。
在补充材料中还有对公式 10 进行补充:
L = ∑ i = 0 N − 1 ∑ j = 0 i − 1 ω i ω j ( m i − m j ) 2 = ∑ i = 0 N − 1 ω i ( m i 2 ∑ j = 0 i − 1 ω j + ∑ j = 0 i − 1 ω j m j 2 − 2 m i ∑ j = 0 i − 1 ω j m j ) = ∑ i = 0 N − 1 ω i ( m i 2 A i − 1 + D i − 1 2 − 2 m i D i − 1 ) , (11)  \begin{aligned} \mathcal{L} & =\sum_{i=0}^{N-1} \sum_{j=0}^{i-1} \omega_i \omega_j\left(m_i-m_j\right)^2 \\ & =\sum_{i=0}^{N-1} \omega_i\left(m_i^2 \sum_{j=0}^{i-1} \omega_j+\sum_{j=0}^{i-1} \omega_j m_j^2-2 m_i \sum_{j=0}^{i-1} \omega_j m_j\right) \\ & =\sum_{i=0}^{N-1} \omega_i\left(m_i^2 A_{i-1}+D_{i-1}^2-2 m_i D_{i-1}\right), \end{aligned} \tag{11}  L  = i = 0 ∑ N − 1  j = 0 ∑ i − 1  ω i  ω j  ( m i  − m j  ) 2 = i = 0 ∑ N − 1  ω i  ( m i 2  j = 0 ∑ i − 1  ω j  + j = 0 ∑ i − 1  ω j  m j 2  − 2 m i  j = 0 ∑ i − 1  ω j  m j  ) = i = 0 ∑ N − 1  ω i  ( m i 2  A i − 1  + D i − 1 2  − 2 m i  D i − 1  ) ,  ( 11 ) 
m i m_i m i  i i i A i = ∑ j = 0 i ω j A_i=\sum_{j=0}^i \omega_j A i  = ∑ j = 0 i  ω j  i i i D i 2 = ∑ j = 0 i ω j m j 2 D_i^2=\sum_{j=0}^i \omega_j m_j^2 D i 2  = ∑ j = 0 i  ω j  m j 2  i i i D i = ∑ j = 0 i ω j m j D_i=\sum_{j=0}^i \omega_j m_j D i  = ∑ j = 0 i  ω j  m j  i i i 令 e i = m i 2 A i − 1 + D i − 1 2 − 2 m i D i − 1 e_i=m_i^2 A_{i-1}+D_{i-1}^2-2 m_i D_{i-1} e i  = m i 2  A i − 1  + D i − 1 2  − 2 m i  D i − 1  e i e_i e i  i i i L i = ∑ j = 0 i ω j e j \mathcal{L}_i=\sum^i_{j=0}\omega_je_j L i  = ∑ j = 0 i  ω j  e j  
Normal Consistency . 因为光线上可能存在很多半透明的点,因此把累积不透明度达到 0.5 0.5 0.5 p s \mathbf{p}_s p s  
L n = ∑ i ω i ( 1 − n i T N ) (12)  \mathcal{L}_n=\sum_i\omega_i(1-\mathbf{n}_i^T\mathbf{N}) \tag{12}  L n  = i ∑  ω i  ( 1 − n i T  N ) ( 12 ) 
ω i \omega_i ω i  n i \mathbf{n}_i n i  i i i N \mathbf{N} N N \mathbf{N} N 
N ( x , y ) = ∇ x p s × ∇ y p s ∣ ∇ x p s × ∇ y p s ∣ (13)  \mathbf{N}(x, y) = \frac{\nabla_x \mathbf{p}_s \times \nabla_y \mathbf{p}_s}{|\nabla_x \mathbf{p}_s \times \nabla_y \mathbf{p}_s|} \tag{13}  N ( x , y ) = ∣ ∇ x  p s  × ∇ y  p s  ∣ ∇ x  p s  × ∇ y  p s   ( 13 ) 
这样就可以使 2D 高斯基元尽可能分布在物体的表面上。
最终总的损失函数为:
L = L c + λ d L d + λ n L n (14)  \mathcal{L}=\mathcal{L}_c+\lambda_d\mathcal{L}_d+\lambda_n\mathcal{L}_n \tag{14}  L = L c  + λ d  L d  + λ n  L n  ( 14 ) 
L c \mathcal{L}_c L c  L 1 \mathcal{L}_1 L 1   Reference [1]2D Gaussian Splatting for Geometrically Accurate Radiance Fieldsopen in new window  
[2]2D Gaussian Splatting论文阅读笔记open in new window  
[3]新风向?——2DGS(2D高斯泼溅)横空出世open in new window  
[4][NeRF坑浮沉记]3DGS的升级?2DGS文献阅读笔记:Gaussian的光栅化open in new window  
[5]2DGS中的参数化open in new window  
[6]2DGS的非官方实现以及相关推导open in new window