"3D Gaussian Splatting (3DGS) has recently revolutionized radiance field reconstruction, achieving high quality novel view synthesis and fast rendering speed without baking. However, 3DGS fails to accurately represent surfaces due to the multi-view inconsistent nature of 3D Gaussians. We present 2D Gaussian Splatting (2DGS), a novel approach to model and reconstruct geometrically accurate radiance fields from multi-view images. Our key idea is to collapse the 3D volume into a set of 2D oriented planar Gaussian disks. Unlike 3D Gaussians, 2D Gaussians provide view-consistent geometry while modeling surfaces intrinsically. To accurately recover thin surfaces and achieve stable optimization, we introduce a perspective-correct 2D splatting process utilizing ray-splat intersection and rasterization. Additionally, we incorporate depth distortion and normal consistency terms to further enhance the quality of the reconstructions. We demonstrate that our differentiable renderer allows for noise-free and detailed geometry reconstruction while maintaining competitive appearance quality, fast training speed, and real-time rendering."
- 病根一句话:不是"3DGS 训得不好",而是"图元本身是一团有厚度的雾"——雾没有正面所以给不出法线,雾有厚度所以同一块表面在不同视角下"哪一层算表面"的答案会变。
- 三件机制:射线-盘求交(像素视线直接戳到盘上,顺手把矩阵求逆消掉)、深度失真正则(把一条视线上的盘挤成一摞)、法线一致性正则(让盘面跟深度坡面平齐)。
- 两个口径要当心:表 1/表 3 的 PSNR 是训练集视角;论文宣称的"100 倍加速"是拿 15k 迭代比隐式方法(30k 档实为 66 倍);失真损失正文用 L1、附录用 NDC 后的 L2。
- 代价与边界:半透明表面(玻璃)与高光区域失效;稠密化偏爱纹理丰富区;Mip-NeRF360 户外外观三项全输 3DGS;T&T 的 F1 仍低于 Neuralangelo。
1视角一换,表面就晃:一句话说清这篇在治什么
视角一换,表面就晃:一句话说清这篇在治什么
训练完一个 3DGS 场景,来回拖视角看,你会发现一件别扭的事:画面本身很干净,可一切到法线图或深度图,那块墙面就开始泛毛边。同一个位置,"表面在哪"这个问题,换个相机角度就能给出不一样的答案。3DGS 把"看起来像"做到了极好,但它始终没把"表面在哪"说死。
这篇要治的就是这件事。
一句话把病根说出来:表面不是一个团,是一张盘。
3DGS 的每个图元是一团各向异性的雾(三维高斯)。雾在三个方向上都摊开,它描述的是"这一点往各个方向看过去会发出什么颜色":那是辐射,不是表面。一团雾没有正面,所以你没法问它"法线朝哪";一团雾有厚度,所以同一块表面在不同视角下,"哪一层算表面"的答案会跟着变。这两个毛病是同一个根:图元本身不是面。
2DGS 的办法朴素得有点粗暴:把这团雾在法线方向上压扁,压成一张零厚度的盘。盘有正面,法线就是盘的朝向,可以直接拿去约束;盘贴着表面,视线和它相交只有一个答案,深度就多视角一致。代价是盘只能表示面状的东西,这也正是它后面所有失效场景的来源,第 12 章会逐条算账。
这里值得先说清一件方法论上的事:这篇论文没有在渲染管线上打补丁,而是把图元本身换掉了。 这个选择看起来更"重",实际更省:三处缺陷里有三处都长在"图元是一团体积"这个根上,补丁只能各自盖住一处。后续所有机制(射线-盘求交、两个正则、深度口径)都是从"图元是盘"这一个决定往后推出来的,所以这篇的阅读顺序也应该是"先看懂盘,再看其他"。
另一件值得先交代的,是它和相邻工作的关系。2DGS 与 SuGaR 都在解决"3DGS 抽不出好网格",但走法不同:SuGaR 是用三维高斯去近似二维高斯,再额外做一轮网格细化;2DGS 直接就是二维高斯,不做后处理。原文 §2.4 把这个差别写得很清楚,也解释了各自的代价。另外,本篇是「BBSplat 精读」(篇目 07)的直接基座——BBSplat 明说自己是 2DGS 框架里的 drop-in 替换,先读本篇再看那一篇,"平面图元为什么能抽网格"这条线会顺很多。
接下来的路是这样走的。第 2 章先把 3DGS 的底座重推一遍,把三处结构性缺陷点出来;第 3 章换图元,看一张盘需要几个参数、法线从哪冒出来;第 4 章解决渲染的第一道坎:不用仿射近似,直接让射线戳到盘上算交点;第 5 章补上"盘侧过来缩成一条线"时的兜底;第 6、7 章是两个正则,一个管把视线上的盘挤成一摞,一个管让盘面跟深度坡面平齐;第 8 到 11 章是账本,把三张数据集上的查距离、F1、外观、消融逐格复算;第 12 章独立成节,列九个它扛不住的时刻。
读这篇需要的前置不多,但有三样最好先有:知道 3DGS 的图元是三维各向异性高斯、渲染靠分块光栅化与 alpha 合成;知道球谐(SH)用一组系数表示随视角变化的颜色;知道 TSDF 是把多张深度图融成网格的常规手段。三样都不需要推导细节,只要知道它们各自在干什么就行。本篇的重推会从 3DGS 的原始式子(公式 2-1 到 2-3)开始,所以即使没读过 3DGS 原文也能跟上。
读完之后能带走的是三样东西:一套"换图元"的思路(遇到表示能力的瓶颈时,先问是不是图元选错了型);一个可迁移的手法(把两两成对的 O(N²) 罚项改写成累计量的 O(N) 单趟前向,附录那段等号链可以直接搬到别的渲染器里);一份诚实的能力边界(第 12 章九条,知道什么时候不该用它)。
这一篇要记的只有一句话:盘有正面、雾没有——表面是一张盘,而不是一团雾。
2立体高斯为什么量不准:三处结构性缺陷
要看清病根,得先把 3DGS 的图元与渲染式子摆出来,只为指出这三个式子里哪一项是病灶,而不必介绍它本身。
3DGS 用三维高斯描述场景,第 k 个图元写成:
这个式子的关键是协方差 Σ 的因式分解:Σ = R S Sᵀ Rᵀ,把"一团的形状"拆成旋转 R(朝哪歪)与尺度 S(三个方向各摊多开)两部分,两者都可学。注意 S 是三维对角矩阵、三个对角元都是正的:三个方向都摊开,这就是"雾"的数学来源。
渲染时先把这团雾从世界坐标送到相机坐标,再做一个局部仿射近似投影到像平面:
W 是 world-to-camera 变换,J 是局部仿射近似的雅可比。然后把 Σ′ 的第三行第三列划掉,得到一张二维协方差的"投影后高斯"。最后按前到后做 alpha 合成:
把 3DGS 的可学量集中摆一遍,后面每章对照着看会方便很多:
| 符号 | 含义 | 维度/约束 |
|---|---|---|
| pk | 高斯中心位置 | 三维向量,可学 |
| R | 旋转矩阵(由四元数参数化) | 3×3,正交 |
| S | 尺度矩阵 | 3×3 对角,三个对角元都为正 |
| Σ | 协方差,等于 R S Sᵀ Rᵀ | 3×3,对称正定 |
| αk | 不透明度 | 标量,可学 |
| ck | 视相关外观 | 用球谐系数表示,可学 |
| W、J | world-to-camera 变换、局部仿射雅可比 | 渲染时给定,不学 |
这张表里最该记住的是 S 那一行:三个对角元都是正的。这是"雾"的数学定义,也是第 3 章要动的那一刀:把其中一个变成零,雾就成了盘。
还有一处细节顺手说清:公式 2-2 算出 Σ′ 之后,为什么能"划掉第三行第三列"就得到屏幕空间的高斯?因为 Σ′ 是相机坐标系下的协方差,第三维对应深度方向;把深度方向那一维丢掉,剩下 2×2 的块就是它在像平面上的形状。这个操作本身就是一次近似:深度方向的分布被彻底忽略了,而深度恰恰是几何最关心的量。第 4 章换求交方式,动的就是这里。
到这里三处缺陷可以逐个点名了。
缺陷一:体积辐射与"表面是薄的"冲突。 公式 2-1 的高斯在三个方向都有方差,它天生描述一块体积里的密度。可真实表面是零厚度的二维流形;用体积去逼近它,要么在图元内部留一层"半透明的壳",要么把尺度压到很小然后欠采样。这跟调参没关系,属于表示能力与目标形状不匹配。
缺陷二:没有原生法线。 公式 2-1 里根本没有描述朝向的量。Σ 的特征向量确实隐含了三个主轴方向,但那是密度的分布方向,不是表面法线;要用它当法线,得额外假设"最小方差方向就是法线",这个假设在薄表面上会退化。所以 3DGS 想做几何约束时,法线只能另学一套(后续工作如 GaussianShader、GS-IR 就是给三维高斯外挂法线属性),多一份参数、多一层误差。
缺陷三:光栅化的交平面随视角变。 这是这篇论文最要紧的一处。3DGS 的做法是"在像素射线与三维高斯的交点处取值",可是同一个像素在不同视角下,射线与高斯相交的那个平面是不同的。同一块表面,换一台相机,参与求值的那一片体积就换了。multi-view consistency(多视角一致性)在这里断了。
图 2-1 的左右对照,把缺陷三画得很直白。而公式 2-2 里的仿射近似还叠了一层误差:Zwicker 等人在 2004 年就指出,仿射投影只在盘心附近准确,离开中心误差会随着距离增长,即透视保真度不足(原文 §3 结尾、§4.2 开头两处都点了这件事)。
三处缺陷里,缺陷三是可以用"换个求交方式"补救的,缺陷一和缺陷二却指向同一件事:图元的形状选错了。所以这篇论文没有在渲染管线里打补丁,而是把图元本身换掉。
先看一眼不换图元的后果。原文 §3 的"Challenges in Surface Reconstruction"末尾有一句很直接的判断:以上问题常常导致噪声重建(noisy reconstructions),并指到 Figure 5。那张图是这样的:
这层絮从哪来?链条是:没有原生法线 → 深度图带噪 → 用带噪深度做 TSDF 融合 → 噪声被融进网格。第 7 章会拿图 7-1 把这条链的中间环节单独拍出来;第 11 章会用消融证明去掉法线一致性正则后,查距离确实从 0.83 掉到 1.24。
3把立体压成一张盘:2D 高斯怎么参数化
换图元要从参数表开始。一张盘需要几个数?答案是:一个中心、两个切向、两个尺度,外加颜色与不透明度:一共七个可学量,比三维高斯少一个,因为少了一个方向的尺度。
原文 §4.1 的建模逻辑是先定几何、再定取值。几何上,第 k 张盘由中心 pk、两个主切向量 tu 与 tv、以及控制方差的尺度向量 S = (su, sv) 决定。盘上任意一点用局部坐标 (u, v) 参数化,写成世界坐标就是:
这是一个"从盘面坐标到世界坐标"的映射:以中心为原点,沿两个切向各走 su u 与 sv v。写成齐次形式后,矩阵 H 就是全部几何:
H 是 4×4 齐次变换矩阵。这里有两个细节值得停下来看。
第一,第三列是零。 旋转矩阵按 R = [tu, tv, tw] 排三列,尺度矩阵 S 是 3×3 对角矩阵、最后一个对角元为 0。这一列零就是"压扁"这个动作的全部数学内容:盘在 tw 方向上没有尺度,体积被拍成了零厚度的面。
第二,法线是免费的。 法线就取两个切向的叉乘:tw = tu × tv。因为 tu、tv 都可学,法线就自动跟着更新;不需要额外的法线参数,也没有"把最小方差方向当法线"那个退化假设。这是整篇论文最省力也最要紧的一步:盘的朝向由几何定义直接给出,不必另学一套参数。
几何定好之后,盘上的密度取值沿用标准二维高斯(局部坐标下方差为单位阵):
这张盘在 (u, v) 平面上是一个各向同性的标准钟形;各向异性由公式 3-1 里的 su、sv 承担:先在单位圆盘上取标准高斯,再经 H 拉成椭圆。颜色与不透明度则沿用 3DGS 的做法:每张盘带一个不透明度 α,视相关外观 c 用球谐(SH)参数化。
前面提过"曲面元"(surfel)这条路线:Pfister 等人 2000 年的 Surfels、Yifan 等人 2019 年的可微表面溅射(DSS)。它们也用盘,但前提不一样:那些方法要么需要稠密点云,要么需要真值法线,要么需要已知光照。2DGS 的位置很清楚:只要一张稀疏标定点云和一组带位姿的图像,几何与外观一起从光度监督里学出来。这个差别决定了它能不能用在普通拍摄数据上。
把一张盘的全部可学量与约束列成表:
| 符号 | 含义 | 维度/约束 |
|---|---|---|
| pk | 盘心位置 | 三维向量,可学 |
| tu, tv | 两个主切向量 | 三维单位向量,可学(保持正交) |
| tw | 盘法线,等于 tu × tv | 由切向导出,不单独学 |
| su, sv | 两个方向的尺度 | 正标量,可学 |
| S | 尺度矩阵,末位对角元为 0 | 3×3 对角 |
| R | 旋转矩阵 [tu, tv, tw] | 3×3,正交 |
| H | 齐次几何矩阵 [R S, pk ; 0, 1] | 4×4 |
| α | 不透明度 | 标量,可学 |
| SH | 视相关外观系数 | 可学 |
对照第 2 章那张 3DGS 的表,差别只有一处:S 的第三个对角元从"正数"变成了 0,而法线从"要另学一套参数"变成了"两个切向的叉乘"。前者是表示能力的取舍,后者是白拿的收益。
这里有一个必须回答的疑问:盘的厚度是零,渲染时会不会算出零面积、什么都盖不住? 不会,原因有两层。第一层是几何上的:盘虽然零厚度,但它在屏幕上投影出来的是一块有面积的椭圆,覆盖多少像素由中心、切向、尺度共同决定,与厚度无关。第二层是实现上的:真正保证"覆盖足够像素"的是第 5 章那个低通兜底(公式 5-1),它给每张盘在屏幕空间垫了一个最小半径,斜视到退化时也不会消失。零厚度损的是"厚度方向的表达力",不是"渲染的可见性"。
顺带说清一个容易混的点:公式 3-3 里的 G(u) 是"标准"二维高斯,方差是单位阵,看起来每张盘都该是正圆。各向异性在哪?在公式 3-1 的映射里:先在单位圆盘上取标准高斯,再经 H 拉成椭圆,su 与 sv 就是两个轴的长度。先取标准形再变换,这个顺序让求导与求值都更省。
盘定完了,下一个问题立刻出现:渲染时,屏幕上某个像素的视线,打到这张盘的哪一点 (u, v)?这就是第 4 章要解决的求交问题。
4不用仿射近似:射线与盘怎么求交
渲染一张盘有两条路。一条是"把盘投影到屏幕上、再在屏幕上采样",这条路便宜,但只在盘心附近准;另一条是"让像素的视线直接和盘求交",这条路准,但要处理数值稳定性。2DGS 选了后者,理由值得完整讲一遍。
先看第一条路错在哪。原文 §4.2 引的是 Zwicker 等人 2001 年的做法:用透视投影的仿射近似把盘投到像平面。问题在 2004 年就被同一批作者指出过:这个投影只在盘心准确,越靠近盘的边缘,近似误差越大。落在几何上就是两件事:一是边缘处的透视畸变(本该收窄的地方没收窄),二是深度不准。原文附录 C 拿它做了对照实验,我们留到第 11 章算账。
另一条路(隐式方法)是把盘的二次曲面投影到屏幕空间,再在屏幕上判别像素是否落在投影椭圆内。听起来更省事,但它需要算逆变换 M = (WH)⁻¹。麻烦在于:当盘正好侧对着相机、在屏幕上退化成一条线段时,这个逆变换会数值失稳。传统表面溅射的做法是设一个阈值把这类病态变换直接丢掉,可在可微渲染里,"丢掉"是个不可导的硬判断——阈值一抖,梯度就断,优化会跟着不稳。
所以 2DGS 绕开求逆,改用一个显式的射线-盘求交(思路来自 Sigg 等人 2006 年为专用硬件设计的做法:三条不平行平面的交点)。整套推导可以分四步走完。
第零步,先明确要解的是什么。 把盘上一点 P(u, v) 送到屏幕空间,用齐次坐标写出来:
这个 x 同时承担两个身份:它代表从相机出发、穿过像素 (x, y) 的那条视线,而它的 z 分量就是这条视线与盘相交处的深度。要解的问题因此可以一句话说清:给定像素 (x, y),这条视线打在盘上的哪一点 (u, v)。
第一步,把像素写成"两条平面的交线"。 给定像平面上的坐标 x = (x, y),穿过这个像素的视线可以用两个正交平面来定义:一个平面法向为 (−1, 0, 0)、偏移为 x,另一个法向为 (0, −1, 0)、偏移为 y。写成四维齐次平面就是 hx = (−1, 0, 0, x)ᵀ 与 hy = (0, −1, 0, y)ᵀ,视线就是这两个平面的交线。
第二步,把这两个平面送进盘的局部坐标系。 这里用一条齐次坐标的经典性质(Blinn 1977):对平面上的点做变换 M,等价于对平面参数做反置变换 M⁻ᵀ。原文取 M = (WH)⁻¹,于是 M⁻ᵀ 正好等于 (WH)ᵀ:指数上的 −1 和转置上的 −1 相互抵消,求逆被彻底消掉:
第三步,解交点。 按公式 3-1,盘上的点写作 (u, v, 1, 1);交点必须同时落在变换后的两个平面上,于是两个点积都为零:
这是两个关于 u、v 的线性方程,直接解就是下面这个闭式解:
这个解的形式眼熟:分母是两条平面法向的叉积,分子是各自平面与目标方向的叉积,就是两条直线求交的标准写法。它保证解出来的 (u, v) 落在盘所在的那个参数平面上,不需要任何判别式或阈值。
其中 hu^i 表示四维平面 hu 的第 i 个分量。原文在图注式下方补了一句关键化简:按公式 3-2 的结构,hu 与 hv 的第三个分量恒为零(因为 H 的第三列是零),所以分母只涉及第 1、2 个分量,计算量进一步降下来。
拿到 (u, v) 之后,深度与取值就顺下来了:把 (u, v) 代回齐次投影式(公式 4-1)取 z 分量得到交点深度,再代进公式 3-3 得到该处的密度。整条链没有一步需要求逆,也没有一处不可导的阈值判断。
顺手把"为什么非要求逆不可"这件事说透,因为它解释了原文为什么要绕这么大一圈。隐式方法要判"像素是否落在投影椭圆内",等价于把椭圆的二次型搬到屏幕空间,而搬运的工具正是 (WH)⁻¹。当盘侧对相机、投影退化时,这个矩阵接近奇异(行列式趋零),数值上除以一个极小的数就会炸。传统做法设阈值跳过这类病态情形——可在训练里,"跳过的边界在哪"本身会随参数移动,参数一挪、边界一挪,损失函数就出现了台阶;优化器在台阶附近来回抖,梯度白算。显式求交的价值不在省了几次浮点运算,而在于它把一条不可导的路径换成了解析式。
还有一个值得对照的收益:3DGS 是在"像素射线与三维高斯相交的那个平面"上取值,这个平面随视角变;2DGS 是在盘上取值,盘不随视角变。同一个场景、同一个像素,前者的取值位置会动、后者不会。这就是图 2-1 画的那件事,也是"多视角一致"这四个字的具体所指。
把这一章的符号集中对一遍:
| 符号 | 含义 | 取值/约束 |
|---|---|---|
| x = (x, y) | 像平面像素坐标 | 整数格点 |
| W | world-to-screen 组合变换 | 4×4,由相机内外参合成 |
| H | 盘的齐次几何矩阵 | 4×4,见公式 3-2;第三列为零 |
| hx, hy | 像素视线的两个定义平面 | (−1,0,0,x)ᵀ、(0,−1,0,y)ᵀ |
| hu, hv | 变换到盘局部系的平面参数 | (WH)ᵀ hx、(WH)ᵀ hy |
| hu^i, hv^i | 平面参数的第 i 个分量 | h³ 恒为 0 |
| u(x), v(x) | 交点局部坐标 | 公式 4-3 |
一个容易看漏的收益:因为 (u, v) 是解析解而不是数值迭代,它的梯度可以直接反传回盘的参数(pk、tu、tv、su、sv)。第 6、7 章的两个正则之所以能把盘"推"到正确位置,靠的就是这条可导链。
5侧看退化成一条线:兜底滤波与光栅化
求交式子写完了,还有一个角落没扫:当一张盘几乎侧对着相机时,它在屏幕空间缩成一条线。这条线覆盖的像素极少,甚至一个整像素都盖不满,光栅化时它会被整块漏掉:梯度传不回去,那张盘的参数就再也得不到修正,训练会卡在一个错的姿态上。
原文的解法借的是 Botsch 等人 2005 年的"物体空间低通滤波":
其中 u(x) 是公式 4-3 解出的局部坐标,c 是盘心 pk 投影到屏幕上的位置。这个式子在讲两件事。
第一层意思是"下界"。 大括号里第二项是一个固定在屏幕空间的低通核,中心在盘心投影 c、半径 σ。取 max 意味着:无论盘被斜视到多细,屏幕上这个位置至少有一个 σ 半径的高斯在贡献,覆盖的像素数就有保证。原文取 σ = √2/2,理由是让渲染时"用到足够多的像素"。
第二层意思是"为什么是 max 而不是相加"。 如果写成两项相加,等于给每张盘强加了一份额外的能量,远视角下的权重分布会被整体抬高;而 max 只在"低通核比真实值更大"时才生效,也就是只在退化的那类盘上起作用,正常视角下完全不改变行为。这是一个只在需要时才出现的兜底,不是常态上的修改。 顺带的好处是它与主流做法(丢阈值)不同——它是连续的,梯度照样能过。
σ 取 √2 / 2 这个数不是随手写的,代进去看一眼就明白:√2 / 2 ≈ 0.707,而 G((x−c)/σ) 在 |x−c| = σ 处取值 exp(−1/2) ≈ 0.607,在 2σ ≈ 1.41 处降到 exp(−2) ≈ 0.135。换句话说这个下界核的"有效脚印"直径大约 2.8 个像素,足够让任何一张盘至少压住几个像素、参与一次可导的合成,又不会大到把邻近像素染脏。原文的措辞也正是"确保渲染时用到足够多的像素"。
把这一步与 3DGS 的光栅化摆在一起对照,差别只有一处:
| 环节 | 3DGS | 2DGS |
|---|---|---|
| 求值位置 | 像素射线与三维高斯的交平面 | 射线与盘的交点(解析解) |
| 求值函数 | 投影后的二维高斯 G2D | 二维高斯经低通下界 Ĝ(公式 5-1) |
| 退化处理 | 阈值丢弃病态变换 | 连续下界,不丢弃 |
| 排序键 | 高斯中心深度 | 盘心深度 |
| 分块与提前终止 | 相同 | 相同 |
表里最后两行"相同"是有意保留的:2DGS 没有重写整条光栅化管线,只换了"求值"这一件事,这也是它能作为 3DGS 框架 drop-in 替换、训练速度仍然接近的原因。
兜底接好之后,渲染循环本身沿用 3DGS 的分块光栅化,只把求值那一项从"投影后的二维高斯"换成公式 5-1 的 Ĝ:
把这一章的顺序写成伪码,前提条件先摆出来:
前提 1:盘已按盘心深度排序(与 3DGS 同)
前提 2:每张盘有屏幕空间包围盒,用于分 tile
前提 3:Ĝ 用公式 5-1,σ = √2/2
for tile in image:
for x in tile: # 逐像素
C = 0; T = 1 # 累积颜色、透射率
for disk in tile.disks_sorted: # 按深度前到后
g = G_hat(disk, x) # 公式 5-1:射线-盘求交 + 低通下界
w = disk.alpha * g
C += T * w * disk.color(x)
T *= (1 - w)
if T < 1e-4: break # 不透明度饱和,提前终止
image[x] = C
这段循环里有三处与本文前述内容对得上:G_hat 内部走的是公式 4-3 的解析求交;T < 1e-4 的提前终止是原文 §4.2 末尾说的"累积不透明度达到饱和即终止";而排序仍然按盘心深度,这是平面表示的一个便利,盘与盘之间不会互相穿插。
到这里渲染路径就闭环了:图元是盘(第 3 章)、交点是解析解(第 4 章)、退化有兜底(本章)。但只靠光度损失训出来的几何依然是"毛"的(第 2 章图 2-2 已经见过那层絮)。接下来两章是两个正则,专门管几何。
6让一条射线上的盘挤紧:深度失真正则
第一个正则治的病有点反直觉:一批盘在视线上散得很开,和它们贴成一摞,可以给出几乎一样的颜色和深度。
原因是体积渲染的机制。看公式 5-2:颜色是沿视线加权求和,权重是各盘的不透明度;深度也是沿视线加权平均出来的。沿视线摊开的盘只要权重配得合适,加权和照样能对上目标像素,渲染器看不出区别。可表面渲染里不是这样:一条视线打到表面上只交一次,深度只有一个值。体积渲染对"盘之间的距离"这件事完全无感,这就是失真的来源。
原文借 Mip-NeRF360 的思路补上这一维,让视线上的盘互相靠拢:
ωi 是第 i 个交点的混合权重(αi Ĝ_i 乘以前面积累的透射率),zi 是该交点的深度。式子在做的事很直白:任意两个交点之间都拉一根皮筋,把它们的深度差当作罚项。盘散得越开,罚得越狠;贴在同一个深度上,罚项归零。
这里有一个必须点出来的差别。Mip-NeRF360 的失真损失也在算"采样点之间的距离",但那里的 zi 是预先设定的采样位置,不参与优化,它只能改变权重分布来间接压紧。2DGS 的 zi 是求交算出来的交点深度,可反传。所以公式 6-1 的梯度会直接作用到盘的位置上,是"把盘往一起推",而不是"把权重重新分配"。原文在 §5 里明确写了这一层区别,也在附录 A 里补了一句:隐式方法里的采样点不可微,而这里额外把梯度反传穿过交点 m,从而直接鼓励高斯彼此靠拢。
公式 6-1 有一个直接的实现麻烦:双重求和是 O(N²),N 是一条视线上交点个数。这个代价具体多大,可以估一下量级:一条视线穿过几十张盘是常态,取 N = 50,两两成对就有 50 × 49 / 2 = 1225 对;而渲染时的像素数是百万量级(800×600 也有 48 万),乘起来就是十亿级的运算次数,而且这些运算发生在每一次前向与每一次反向传播里。一条线上挤着几十张盘的情况在稠密场景里很常见,所以这不是可以忽略的开销。原文附录 A 给了一个可以在单趟前向里算完的改写,这段改写值得逐步推一遍——它是本文把正则落进渲染循环的关键。
先做一次口径说明:附录里把交点深度 z 先做 NDC(归一化设备坐标)变换,记作 m = NDC(z),近远平面经验取值 0.2 与 1000;同时把 L1 换成 L2。这么做是为了给远处的盘降权:远离相机的盘深度差本来就大,不归一化会把远处的盘压得过狠。于是损失写成:
推导的落点是把"每一对"改写成"累计量"。把平方展开、交换求和次序:
这就是原文式 (17) 的等号链。它把"两两成对"变成了三个累计量随前到后的行进同步累加:走过第 i 张盘时,手上已经有 Ai−1、Di−1、D²_{i−1},当场就能算出到这一张为止的失真 Li,同时更新三个累计量,为下一张准备。复杂度从 O(N²) 降到 O(N),而梯度的反传则是从后往前扫一遍,同样线性。
原文附录还强调了做这件事的收益:因为 m 本身可微,梯度会穿过 m 回到盘上:这不是"只优化权重",而是真的把盘挪到一起。
最后把两处口径差异登记清楚,免得读者对不上号:其一,正文式 (13) 写的是 |zi − zj|(L1),附录式 (17) 用的是 (mi − mj)²(L2)且 m 为 NDC 后的深度;其二,近远平面 0.2 与 1000 是经验取值。这两点都属于"实现口径与正文表述不完全一致"的地方,第 12 章会把它作为一条需登记的事项再列一次。
7让盘的法线对上深度梯度:法线一致性
深度失真把视线上的盘挤成一摞,但挤紧之后还有一个自由度没管:这摞盘整体朝向哪边,渲染器并不在乎。
这句话值得停下来想一下。盘的朝向(也就是它的法线)不直接进入颜色计算:颜色靠的是求交点 (u, v) 处的取值,而盘转一整圈,只要盘面还覆盖那个像素,颜色照样对得上。所以单靠光度损失,盘可以摆出正确的颜色而朝向乱套。朝向一乱,第 9 章要做的 TSDF 融合就跟着乱:融出来的网格在平面上起伏、在边缘处出现凸起。
原文的办法是把盘的朝向和"深度图的坡面"绑在一起。先定义一个参考面:一条视线上的盘可能好几张半透明的,哪张才算表面?原文取的是累积不透明度到 0.5 的那个交点 ps:半个不透明意味着"走到这里,一半的光被挡掉了",这个位置当作表面比沿视线取平均更贴合直觉。然后要求所有盘的朝向别跟这个坡面拧着:
ni 是朝相机那一侧的盘法线,N 是参考面处的表面法线,ωi 仍是混合权重。整个式子是方向余弦的写法:两个单位向量同向时点积为 1、罚项为 0;垂直时点积为 0、罚项取最大 1。所以这一项在把每张盘的法线往表面法线的方向"掰"。
表面法线 N 从哪来?从深度图的有限差分来。这是整篇里很省的一步,因为深度图是渲染管线本来就有的输出,不需要额外的监督:
∇_x ps 与 ∇_y ps 是参考面位置沿像平面两个方向的有限差分,两者叉乘得到垂直方向,归一化后就是法线。注意这里没有用任何真值法线或真值深度:整条约束是被光度与深度自己闭合起来的,这也是它比"外挂一套法线参数"更省的原因。
把两个正则和重建损失合起来,就是训练总目标:
Lc 是 RGB 重建损失(L1 加 D-SSIM 项,沿用 3DGS 的写法),Ld、Ln 是两个正则。权重取值原文给了明确的两档:α = 1000(有界场景)/ 100(无界场景),β = 0.05(所有场景)。有界场景取大、无界场景取小,是因为无界场景的深度分布跨几个数量级,同样强度的深度罚项会把远处的盘压得过狠;而法线项与尺度无关,一套 0.05 就够。
从深度图到网格还差最后一段:深度怎么取。原文给了两个可选口径,附录 B 各写了一个式子。
期望深度(按权重加权平均,再做归一化):
其中 ωi = Ti αi Ĝ_i 是第 i 张盘的贡献,Ti = Πj<i(1 − αj Ĝ_j) 是它的可见度。原文特意强调分母要按累积不透明度归一化,否则一张盘在深度可视化里不会显示成一块平的圆盘。
中位深度(走到不透明度过半的那一层):
原文选了中位深度,理由有两条。一是不透明度的语义更硬:Ti > 0.5 意味着"到这里已经挡掉一半光",比加权平均更接近"表面在哪"。二是异常情形的处置更稳:当一条视线的累积不透明度压根没到 0.5,动态三维高斯那篇(Luiten 等 2024)的做法是给一个默认值 15,而这里退化为"取最后一张盘",后者显然更贴近真实深度,也更适合训练。第 11 章的消融表会把这两个口径的差距量出来:中位深度 0.80,换成期望深度是 0.94。
网格提取这步交代一下管线就够了:把训练视角的深度图渲染出来(用公式 7-5),送进截断符号距离融合(TSDF),库用 Open3D,体素大小 0.004、截断阈值 0.02。训练侧的实现细节原文也写得很具体,一并记下:梯度阈值 0.0002、每 3000 步清理一次不透明度低于 0.05 的盘、单卡 RTX 3090。另外有一处适配需要点名——盘没有"投影后的二维中心"的梯度,所以训练时把三维中心 pk 的梯度投到屏幕空间作近似。
到这里机制部分讲完了:图元是盘、交点是解析解、退化有兜底、几何有两个正则、深度口径选定中位。下面四章全部是账本。
8几何证据一:查距离与 F1
先交代实验设定,因为它决定后面每个数字的口径。数据集三个:DTU(15 个场景,原始 1600×1200,为效率降采样到 800×600)、Tanks and Temples、Mip-NeRF360。初始化统一用 Colmap 的稀疏点云。对照方法的训练过程与 3DGS、SuGaR 保持一致。硬件是单张 RTX 3090。
第一张表量的是网格精度,指标是查距离(Chamfer distance,越小越好),在 DTU 上跑:
| 方法 | 类别 | 查距离 ↓ | 训练时间 ↓ |
|---|---|---|---|
| NeRF | 隐式 | 1.49 | > 12 小时 |
| VolSDF | 隐式 | 0.86 | > 12 小时 |
| NeuS | 隐式 | 0.84 | > 12 小时 |
| 3DGS | 显式 | 1.96 | 11.2 分钟 |
| SuGaR | 显式 | 1.33 | 约 1 小时 |
| 2DGS-15k | 显式 | 0.83 | 5.5 分钟 |
| 2DGS-30k | 显式 | 0.80 | 10.9 分钟 |
数据来源:原文 Table 1(DTU)。逐项读下来有三件事。
其一,显式阵营自己的差距比想象中大。 3DGS 1.96 与 SuGaR 1.33 之间差了 0.63,而 2DGS 直接把这一档压到 0.80,比第二名 SuGaR 好 0.53。其二,它压过的不只是显式方法:0.80 优于 NeuS 的 0.84 与 VolSDF 的 0.86,也就是说一个显式、可实时渲染的表示,在网格精度上超过了当年最强的隐式表面方法。其三,代价是训练集视角的 PSNR 低一档(见下面第三张表),这一点第 10 章单独算。
时间那一列要单独说,因为原文表注写的是"相比 SDF 类基线提供了 100 倍加速",而这个"100 倍"要复算一下才对得上口径。隐式方法的 12 小时是一个下限(表里写的是 >12h),按下限算:12 小时 = 720 分钟;720 ÷ 5.5 ≈ 131 倍,720 ÷ 10.9 ≈ 66 倍。论文说的"约 100 倍"落在 66 与 131 之间,对应的显然是 15k 迭代那一档。 这不是错误,但读者若拿 30k 的数字去除,会得到 66 倍而不是 100 倍,口径差异先记下。
第二张表换到 Tanks and Temples,指标是 F1(越高越好),六列并排:
| 方法 | Barn | Caterpillar | Courthouse | Ignatius | Meetingroom | Truck | 均值 ↑ | 时间 ↓ |
|---|---|---|---|---|---|---|---|---|
| NeuS | 0.29 | 0.29 | 0.17 | 0.83 | 0.24 | 0.45 | 0.38 | > 24 小时 |
| Geo-Neus | 0.33 | 0.26 | 0.12 | 0.72 | 0.20 | 0.45 | 0.35 | > 24 小时 |
| Neuralangelo | 0.70 | 0.36 | 0.28 | 0.89 | 0.32 | 0.48 | 0.50 | > 24 小时 |
| SuGaR | 0.14 | 0.16 | 0.08 | 0.33 | 0.15 | 0.26 | 0.19 | > 1 小时 |
| 3DGS | 0.13 | 0.08 | 0.09 | 0.04 | 0.01 | 0.19 | 0.09 | 14.3 分钟 |
| 2DGS | 0.41 | 0.23 | 0.16 | 0.51 | 0.17 | 0.45 | 0.32 | 15.5 分钟 |
数据来源:原文 Table 2(Tanks and Temples)。这张表最值得看的是两栏的对比:在显式方法内部,2DGS 的 0.32 是 3DGS(0.09)的三倍半、SuGaR(0.19)的一倍半,优势很大;可一旦把隐式那三行拉进来,Neuralangelo 的 0.50 仍然稳在上面。原文的措辞是"与 SDF 模型(NeuS、Geo-Neus)取得有竞争力的结果,并显著优于显式重建方法"——注意它点名的对手是 NeuS 与 Geo-Neus(0.38 / 0.35),避开了 Neuralangelo。这个谨慎的措辞本身就是一条边界,第 12 章会再提一次。
第三张表回到 DTU,同时给出网格与存储:
| 方法 | 查距离 ↓ | PSNR ↑(训练集视角) | 时间 ↓ | 模型大小 ↓ |
|---|---|---|---|---|
| 3DGS | 1.96 | 35.76 | 11.2 分钟 | 113 MB |
| SuGaR | 1.33 | 34.57 | 约 1 小时 | 1247 MB |
| 2DGS-15k | 0.83 | 33.42 | 5.5 分钟 | 52 MB |
| 2DGS-30k | 0.80 | 34.52 | 10.9 分钟 | 52 MB |
数据来源:原文 Table 3(DTU)。这张表里有两个数字容易被误读,必须标出来。
第一,PSNR 那一列是训练集视角(training-set view),不是测试视角,原文表注写得很清楚。所以 34.52 不该拿去和 Mip-NeRF360 的测试视角数字比,也不该直接说"比 3DGS 低 1.24 就是外观更差";两者同口径可比的是"同一批训练视角上,2DGS 低 1.24"。第二,存储 52 MB 对 3DGS 的 113 MB 约是 2.2 倍缩减,对 SuGaR 的 1247 MB 是 24 倍;SuGaR 那个数字背后是它的网格与纹理资产,属于另一套表示,跨方法比存储要谨慎。
还有一处细节值得单独算一遍:从 15k 加到 30k 迭代,收益很小而代价翻倍。原文 Table 1 里查距离从 0.83 降到 0.80,只好了 0.03(3.6%);训练时间从 5.5 分钟涨到 10.9 分钟,接近两倍。原文 Table 3 里 PSNR 从 33.42 涨到 34.52,外观倒是好了 1.10。这说明两档迭代买的是不同的东西:多出来的算力主要补在外观细节上,网格精度在前 15k 就基本收敛了。对使用者来说这是一条实用的结论——只要几何、不在乎外观细节时,15k 档位的性价比高得多。
三张表合起来,几何这一档的结论是清楚的:网格精度全面领先,速度比隐式快两个数量级,存储比显式基线更省。真正要打的折扣在外观与适用面,那两笔账放在第 10、12 章。
9几何证据二:网格长什么样
表格给的是标量,这一章把标量换成看得见的表面:因为"查距离 0.80"这种数字,读者没法判断它对应的是什么样的错误。
先看 DTU 的全部 15 个扫描(scan24 到 scan122):
图 9-1 与原文 Table 1 的关系值得点一句:那个 0.80 与 1.96 就是这张图的数值化。查距离衡量的是重建表面与真值表面之间的双向距离均值,而"糊一层絮"这件事会同时抬高两个方向的距离:要么多了不该有的面(精度方向),要么缺了该有的面(完整度方向)。所以这张图不是"配图",它是那两个数字的来源。
具体到"絮"落在哪些结构上,可以按区域分三类看。一是大面积平面:3DGS 的那一排在器物侧面会出现缓慢起伏,像蒙了一层不平的布;这来自深度图上同区域的随机抖动。二是薄壁与细窄凹陷:这类区域只有几个像素宽,深度图上本来就容易取错层,融合后要么糊成一团、要么断开。三是边缘:物体轮廓附近的深度跳变被平滑掉之后,网格边缘会长出细小的毛刺。这三类都是同一个病根的不同表现——深度图不干净,而深度图不干净的源头在第 2 章:图元没有原生法线,几何约束只能靠正则,正则弱的地方就漏。
这也解释了为什么原文要在 §6.2 里花一整段讲"2DGS 对初始化不敏感"。隐式方法(SDF 那一类)需要预先给定一个球形初始化范围来定义重建域,这个范围选不好就重建失败;而这里是辐射场式的几何建模,不依赖这种预定义。换句话说,这一档比的除了精度还有"省心程度"。
再看一个更大的尺度。Tanks and Temples 的场景比 DTU 大得多,也是 2DGS 相对吃力的一档:
把两件事并起来看,会得到一个对读者更诚实的小结。在中尺度、以面状结构为主的场景(DTU 的器物)上,2DGS 是压倒性的:数值 0.80 最优,画面无絮。但在大尺度开放场景(T&T)上,它只是"比同类显式方法好",并没有拿下全场:0.32 的 F1 仍低于 Neuralangelo 的 0.50。图 9-2 给的五个场景里,Barn 与 Truck 这类以建筑平面与车体为主的场合表现最好(Barn 拿到 0.41,是本文最好的一格),而 MeetingRoom 这类杂物多的室内只有 0.17。原因不难推:大场景里既有大量面状结构,也有大量非面状的东西(树、栅栏、细碎杂物),后一类正是"一张零厚度的盘"最不擅长的形状。第 12 章会把这一类失效具体列出来。
还有一条口径要交代:Mip-NeRF360 没有真值几何,所以那条数据集上只做外观的定量比较,不进几何榜。原文 §6.2 明确写了这一点。这也是为什么第 8 章的两张几何表只出现在 DTU 与 T&T 上:跟论文的取舍无关,只是只有这两条有可比的真值几何。读别人的对比表时养成一个习惯:先看哪些格子是"没有数"而不是"数不好",两者含义完全不同。
到这里几何的账算完了。下一章换一个方向:几何赢到手之后,外观付了多少。
10外观证据:几何换来了什么、又付出了什么
外观的账在 Mip-NeRF360 上算,因为这条数据集有大量无界户外场景,是外观指标最难的一档。表按户外、室内两栏分开给:
| 方法 | 户外 PSNR ↑ | 户外 SSIM ↑ | 户外 LPIPS ↓ | 室内 PSNR ↑ | 室内 SSIM ↑ | 室内 LPIPS ↓ |
|---|---|---|---|---|---|---|
| NeRF | 21.46 | 0.458 | 0.515 | 26.84 | 0.790 | 0.370 |
| Instant NGP | 22.90 | 0.566 | 0.371 | 29.15 | 0.880 | 0.216 |
| BakedSDF | 22.47 | 0.585 | 0.349 | 27.06 | 0.836 | 0.258 |
| Mip-NeRF360 | 24.47 | 0.691 | 0.283 | 31.72 | 0.917 | 0.180 |
| SuGaR | 22.93 | 0.629 | 0.356 | 29.43 | 0.906 | 0.225 |
| 3DGS | 24.64 | 0.731 | 0.234 | 30.41 | 0.920 | 0.189 |
| 2DGS | 24.34 | 0.717 | 0.246 | 30.40 | 0.916 | 0.195 |
数据来源:原文 Table 4(Mip-NeRF360,基线数值取自各自论文,三行 3DGS/SuGaR/2DGS 用 30k 迭代)。这张表的读法要分开看两栏。
户外栏:2DGS 三项都略输 3DGS。 PSNR 24.34 对 24.64,差 0.30;SSIM 0.717 对 0.731,差 0.014;LPIPS 0.246 对 0.234,差 0.012。差距不大,但方向一致——这不是随机波动,是"把图元压成零厚度"在外观上的系统性代价。道理也不难推:户外场景大量存在非面状结构(树叶、草、栅栏),这些地方三维体积比零厚度平面更能拟合。
室内栏:基本打平。 PSNR 30.40 对 30.41(差 0.01),SSIM 0.916 对 0.920,LPIPS 0.195 对 0.189。室内以墙面、家具这些面状结构为主,正好是盘的舒适区。
把两栏合起来看,能推出一个比"输赢"更有用的判断:2DGS 的外观表现和场景里"面状结构占多少"高度相关。户外场景里树叶、草、灌木这类东西没有明确朝向,一张盘无论怎么摆都只能拟合它的一个切面;而三维高斯是一团体积,反倒能模糊地包住这种杂乱的结构。室内墙面、地板、家具立面都是面状,盘的表达力刚好够用,于是差距被抹平。这条相关性也预告了第 12 章的两条失效:玻璃(面不成立)与高光(面还在、但光度失效)。
还有一条读这类对比表的纪律要说明:原文 Table 4 里除 3DGS/SuGaR/2DGS 三行以外的基线数值,是直接取自各自论文的(原文表注写明 whenever available)。这带来两个后果:其一,不同方法的训练迭代数、分辨率、评测细节可能不一致,跨行比较要留余量;其二,同一条数据集上不同论文报告的 3DGS 数值本身会略有差异。所以"2DGS 输给 3DGS 0.30 个 PSNR"这个结论是稳的(同论文同口径),但"2DGS 比某篇论文里的某方法好 0.1"这种跨来源比较就要谨慎。
同时别漏掉另一个方向:和隐式方法比,2DGS 反而更好。户外 LPIPS 0.246 明显优于 Mip-NeRF360 的 0.283,室内 PSNR 30.40 也高于 31.72 之外的其余隐式方法。所以准确的说法应该是:2DGS 用一点点外观换来了大幅的几何,这点外观损失只让它落到 3DGS 之下,并没有掉出第一梯队;而"2DGS 外观差"这句判断并不成立。
这里要提醒一句读图纪律:图 10-1 是测试集视角的定性图,看着比 3DGS 更锐,但表里的 LPIPS 反而略低——这两件事并不矛盾。LPIPS 是整幅图的感知距离平均,锐利边缘上赢一点、非面状结构上输一些,平均下来就落在后面。定性图的选取本身就是有偏向的。看这类"定性赢、定量小输"的组合时,要以定量方向为准,把定性图当成"差异长什么样"的说明。至于"外观到底崩没崩",可以看下面前图之后再回头对表——图 10-2 把三个数据集的渲染结果并到一张图里,功能就是回答这个问题。
两张附录表补上另外两个数据集的账,它们说明一件事:外观的胜负是数据集依赖的。
| 数据集 | 指标 | SuGaR | 3DGS | 2DGS |
|---|---|---|---|---|
| Tanks and Temples(均值) | PSNR ↑ | 24.16 | 25.33 | 25.56 |
| Mip-NeRF360(9 场景均值) | PSNR ↑ | 25.82 | 27.20 | 27.03 |
| Mip-NeRF360(9 场景均值) | SSIM ↑ | 0.752 | 0.815 | 0.805 |
| Mip-NeRF360(9 场景均值) | LPIPS ↓ | 0.298 | 0.214 | 0.223 |
数据来源:原文 Table 8(TnT)与 Table 9(Mip-NeRF360 逐场景)。把这两行并排看会得到一个更细的结论:在 T&T 上 2DGS 的外观反超 3DGS(25.56 对 25.33),在 Mip-NeRF360 上则小输(27.03 对 27.20)。同样是"大场景",方向相反——所以"2DGS 外观比 3DGS 差"这句话是不成立的,准确说法是"在 Mip-NeRF360 的无界户外场景上差,在 T&T 上反而好"。
还有一张合成数据集的表值得一提(原文附录 D 的 Table 7):在不加两个正则的情况下,2DGS 在合成 NeRF 数据集上的均值 PSNR 是 33.07,3DGS 是 33.32、Mip-NeRF 33.09、Instant NGP-Base 33.18。也就是说正则是为几何服务的,不是为外观服务的——不加正则外观也就这个水平,加了正则主要改善的是表面质量。这句话是理解第 11 章消融的前提。
11每一块都在起作用:消融与网格提取
消融在 DTU 上做,15k 迭代,指标拆成精度、完整度、平均三项(均为查距离,越小越好):
| 配置 | 精度 ↓ | 完整度 ↓ | 平均 ↓ |
|---|---|---|---|
| A. 去掉法线一致性 | 1.35 | 1.13 | 1.24 |
| B. 去掉深度失真 | 0.89 | 0.87 | 0.88 |
| C. 用期望深度替换中位深度 | 0.88 | 1.01 | 0.94 |
| D. 用 SPSR 替换 TSDF | 1.25 | 0.89 | 1.07 |
| E. 完整模型 | 0.79 | 0.86 | 0.83 |
数据来源:原文 Table 5(DTU,15k 迭代)。四行对照的信息量不同,逐个看。
A 行是四个里掉得最狠的:平均从 0.83 涨到 1.24,涨了 49%;而且精度(1.35)与完整度(1.13)双双恶化:错误并非"多长一块"或"缺一块"这种单向偏差,而是整片表面都偏了。这印证了第 7 章的判断:朝向乱了,误差是全域的。B 行掉得温和一些(0.88),主要恶化在完整度(0.87 对 0.86 变化不大,但精度从 0.79 到 0.89)——盘在视线上散开,主要伤害的是"表面到底在哪"这个位置精度。C 行是口径选择的影响:换期望深度后精度几乎没变(0.88 对 0.79 其实变差了,但完整度从 0.86 掉到 1.01 更明显),说明期望深度对离群更敏感,融出来的面要么缺失、要么被拉偏。D 行换的是出网格的方式:SPSR(带筛选的泊松重建)只看盘心与法线,用不上不透明度与盘的大小这两个信息,精度掉到 1.25。
这四行合起来支撑一个结论:两个正则与两个实现选择(中位深度、TSDF)都在起作用,其中法线一致性是单项贡献最大的。下面那张图(图 11-1)就是这张表里 A、B 两行的画面版——数字上掉 0.41 与 0.05,画面上对应"朝向乱"与"表面糊"两种不同的坏法。
第二张消融表换了个角度:固定所有别的条件,只换"求交方式"与"出网格方式"的组合,把所有方法都拉到 30k 迭代:
| 配置 | 精度 ↓ | 完整度 ↓ | 平均 ↓ |
|---|---|---|---|
| SuGaR(原方案) | 1.48 | 1.17 | 1.33 |
| SuGaR + TSDF | 2.47 | 1.90 | 2.18 |
| 3DGS + SPSR(盘心) | 2.05 | 1.25 | 1.65 |
| 3DGS + TSDF(期望深度) | 1.93 | 1.99 | 1.96 |
| 2DGS + SPSR(盘心) | 1.25 | 0.89 | 1.07 |
| 2DGS(仿射近似)+ TSDF(期望深度) | 0.96 | 1.20 | 1.08 |
| 2DGS(本文光栅化)+ TSDF(期望深度) | 0.79 | 0.98 | 0.88 |
| 2DGS(本文光栅化)+ TSDF(中位深度) | 0.78 | 0.83 | 0.80 |
数据来源:原文 Table 6(DTU,全部 30k 迭代)。这张表的价值在于它把改进拆成了可以单独归因的两个旋钮。
旋钮一:求交方式。 看倒数第三行与倒数第二行——同样用 TSDF、同样用期望深度,把仿射近似换成射线-盘求交,平均从 1.08 降到 0.88,好 0.20。旋钮二:深度口径。 看最后两行——同样用本文光栅化与 TSDF,把期望深度换成中位深度,平均从 0.88 降到 0.80,好 0.08。两个旋钮合起来贡献 0.28,剩下的差距来自表示本身就不同(几何是盘而不是三维高斯)。
表里还有一行特别有意思:SuGaR + TSDF 是 2.18,比 SuGaR 原方案的 1.33 差了 0.85。原文附录 C 解释了原因——SuGaR 的深度图是从它那种"扁平高斯相交"里出来的,稀疏且不连续,把这样一张深度图喂进 TSDF,融出来的东西自然差。这说明"TSDF 更好"并不是普适结论,它依赖深度图本身的质量。换个说法:2DGS 的高分里,有一部分是"它的深度图配得上 TSDF"换来的,而这个前提正是第 4 章那套解析求交给的。
把两个旋钮的收益排个序,对以后自己动手很有用:法线一致性(−0.41)> 求交方式(−0.20)> 深度口径(−0.08)≈ 出网格方式(−0.27,但这是"用错方式"的代价不是"选对方式"的收益)。注意这个排序里有反直觉的地方——"求交方式"这种听起来很底层、很"实现细节"的改动,价值排在深度口径之前,仅次于法线正则。这提醒一件事:看论文里的贡献列表时,不要按"听起来高深"排序,要按消融表里的数字排序。
那还能从哪里再要精度?从表里能看出三条可能的方向。一是法线一致性的权重 β:它单项贡献最大,说明这个约束还没被用尽,调大 β 或设计更强的法线先验可能有空间。二是几何感知的稠密化(原文 Limitations 里自己提了):现在的稠密化按梯度走,会往纹理丰富区堆图元,改成按几何复杂度分配可能更省更准。三是深度口径之外的信息:现在只用了中位深度一张图,若能把"深度不确定性"也喂进融合,薄壁区域或许能更稳。这三条都是原文留下的话头,不是我的推测。
最后一行是全文最好的一格:0.80。它由四件事叠出来——盘这个表示、解析求交、法线一致性与深度失真正则、中位深度加 TSDF。把四件事里的任何一件换掉,这一格都会变差;这就是第 11 章想说的"每一块都在起作用"。
12边界与反例(独立成节,9 条)
前面十一章讲的都是它能做什么,这一章只讲它做不了什么。九条按"原文自述"与"读表读出来的"分开标注。
1. 半透明表面(原文自述)。 方法假设表面是全不透明的,并且靠多视角深度图做 TSDF 融合。玻璃这类半透明物体,光在里面透射、折射,深度图本身就说不清"表面在哪",于是重建失败。原文把它放在 Limitations 的第一条,配的是图 12-1 的 (A) 格。
2. 高光区域出现空洞(原文自述)。 高光处亮度饱和,光度监督在那里几乎没有梯度信息,方法会在这些区域"抠"出洞。对应图 12-1 的 (B) 格。
3. 稠密化偏爱纹理丰富区(原文自述)。 现有稠密化策略按梯度信号走,而梯度大的地方通常是纹理丰富处,不是几何复杂处。结果是细几何结构(细铁丝、薄片)分不到足够的图元,表示不准。原文承认这一点,并指出需要一个更好的稠密化策略。
4. 正则是权衡,可能过平滑(原文自述)。 两个正则在"图像质量"与"几何质量"之间做交换,某些区域会被正则压得过平,丢失真实细节。第 10 章那张表里户外 LPIPS 小输,就是这类权衡在指标上的投影。
5. 无界户外场景外观三项全输 3DGS(读表)。 Mip-NeRF360 户外:PSNR 差 0.30、SSIM 差 0.014、LPIPS 差 0.012;9 场景均值 PSNR 27.03 对 27.20。虽然 T&T 上反超(25.56 对 25.33),但"户外不占优"这条边界要写明。
6. 表里的 PSNR 是训练集视角(读表)。 原文 Table 1 与 Table 3 的 PSNR 明确标注为训练集视角,33.42/34.52 不能与测试视角数字混着比。这一条属于口径登记,但极易被误读,所以单独列出来。
7. T&T 的 F1 仍低于 Neuralangelo(读表)。 2DGS 0.32 对 Neuralangelo 0.50;原文自述的对手是 NeuS(0.38)与 Geo-Neus(0.35)。在大尺度开放场景上,"显式方法赢过隐式方法"这句话并不成立。
8. 网格质量依赖出网格的路线(读表)。 换期望深度掉到 0.94、换 SPSR 掉到 1.07、仿射近似掉到 1.08;连别人的表示换成 TSDF 也会掉(SuGaR + TSDF 2.18)。所以"查距离 0.80"是一个特定组合的成绩,不是"用盘就有的成绩"。
9. 失真损失的实现口径与正文表述不一致(口径登记)。 正文式 (13) 是 L1 形式 Σω_iω_j|zi − zj|;附录式 (17) 用 NDC 后的深度 m 并改成 L2 形式 Σω_iω_j(mi − mj)²,近远平面 0.2 与 1000 为经验取值。复现时按附录实现,引用结论时按正文表述,两者不是同一个式子。
把九条翻成一组"要不要用"的判断,会更实用。该用的场合:需要网格产物(渲染只是顺带)、场景以建筑与器物为主、反射是漫反射或弱镜面、能接受无界户外场景外观略逊 3DGS、并且算力能承受十几分钟到半小时一个场景。别用的场合:场景里有大面积玻璃或水面、有强烈的金属高光、主要由植被与细碎杂物构成(这类场景 3DGS 反而更合适),或者你只在乎照片级的 NVS 而不需要网格(那用 3DGS 或它的抗锯齿变体更划算)。换方法的成本不高——它本来就是 3DGS 框架里的替换件,两边的训练脚本与数据管线可以复用。
顺便说一句这篇论文值得学的地方:它把"能力边界"写得很具体。四条 Limitations 全是可验证的(半透明、高光、稠密化偏好、正则权衡),还各配了图或表;连"对手点谁不点谁"这种措辞上的边界都守着(F1 表里只跟 NeuS、Geo-Neus 比,不跟 Neuralangelo 比)。这种写法比"我们的方法也有一定局限"之类的模板句有用得多,因为它让后来者知道该往哪修。
九条归拢成一句话:这个方法把"面状、不透明、漫反射为主"的场景做到了当前最好,代价是放弃了非面状结构、半透明介质与高光区域。知道这条边在哪,比记住 0.80 这个数字有用。
13贡献块
- ① 一个透视正确的可微二维高斯渲染器:用二维表面建模、射线-盘求交与体积积分,把"透视保真"与"可微"这两件原本互斥的事同时做到——求逆被消掉,盘侧视退化的情形有连续兜底,梯度全程可过。
- ② 两个几何正则:深度失真把一条视线上的盘挤成一摞(并按累计量改写做到 O(N)),法线一致性把盘的朝向与深度坡面对齐;两者都不需要真值几何或真值法线,完全靠光度与深度自监督闭合。
- ③ 几何与外观双项可比:相对其他显式表示,在网格精度上取得最好结果(DTU 查距离 0.80,优于 NeuS 0.84),同时外观保持在第一梯队,并保住实时渲染与快速训练这两个 3DGS 系的优点。
- 把三条串起来是一条因果链:盘给几何(①)→ 正则把几何拧正(②)→ 两者合起来让显式方法第一次在网格精度上赢过隐式(③)。2DGS 不是给 3DGS 加功能,而是把它最基础的图元换掉了。
14原文出处块
- 标题
- 2D Gaussian Splatting for Geometrically Accurate Radiance Fields
- 作者
- Binbin Huang、Zehao Yu、Anpei Chen、Andreas Geiger、Shenghua Gao
- 机构
- ShanghaiTech University / University of Tübingen · Tübingen AI Center
- 发表
- SIGGRAPH Conference Papers '24(ACM TOG)· DOI 10.1145/3641519.3657428 · arXiv:2403.17888v3 [cs.CV],13 页 12 图
- PDF 链接
- arXiv:2403.17888 [cs.CV]
- 许可
- CC BY 4.0:arXiv 页面标注 Creative Commons Attribution 4.0;正式版由 ACM 出版(版权归作者所有)。本站站内托管 arXiv 版本并标注来源。