"3D Gaussian Splatting (3DGS) has significantly advanced computer graphics by enabling high-quality 3D reconstruction and fast rendering speeds, inspiring numerous follow-up studies. However, 3DGS and its subsequent works are restricted to specific hardware setups, either on only low-cost or on only high-end configurations. Approaches aimed at reducing 3DGS memory usage enable rendering on low-cost GPU but compromise rendering quality, which fails to leverage the hardware capabilities in the case of higher-end GPU. Conversely, methods that enhance rendering quality require high-end GPU with large VRAM, making such methods impractical for lower-end devices with limited memory capacity. Consequently, 3DGS-based works generally assume a single hardware setup and lack the flexibility to adapt to varying hardware constraints.
To overcome this limitation, we propose Flexible Level of Detail (FLoD) for 3DGS. FLoD constructs a multi-level 3DGS representation through level-specific 3D scale constraints, where each level independently reconstructs the entire scene with varying detail and GPU memory usage. A level-by-level training strategy is introduced to ensure structural consistency across levels. Furthermore, the multi-level structure of FLoD allows selective rendering of image regions at different detail levels, providing additional memory-efficient rendering options. To our knowledge, among prior works which incorporate the concept of Level of Detail (LoD) with 3DGS, FLoD is the first to follow the core principle of LoD by offering adjustable options for a broad range of GPU settings.
Experiments demonstrate that FLoD provides various rendering options with trade-offs between quality and memory usage, enabling real-time rendering under diverse memory constraints. Furthermore, we show that FLoD generalizes to different 3DGS frameworks, indicating its potential for integration into future state-of-the-art developments."
- 缺口的形状很具体:不是画质不够,也不是速度不够,是「同一份模型换台机器就用不了」。 3DGS 靠大量高斯换画质与速度,于是它在显存受限的设备上直接不可用;而继续提画质的那一批(AbsGS、FreGS、Mip-Splatting)要比 3DGS 更多的高斯,更离不开高端卡[§1, p1]。
- 反方向那条路也不通。 LightGaussian、CompactGS 这类方法靠删冗余高斯把显存与存储压下来,但原文的判词是:内存的下降是以渲染质量为代价的[§1, p1]。两句话合起来定死了缺口:现有方法是「二选一」的,一端是高端设备、一端是低成本设备,中间没有档位。
- 本篇动手的位置是「表示」而不是「渲染」。 它不改高斯的属性、不改 α 混合、不改光栅化管线,而是让同一套训练产出多个可以独立使用的表示。所以它要解决的问题在另一半:「怎么让一份资产在多档硬件上都能用」,而不是「怎么渲得更好」。
- 核心概念直接借自图形学的 LoD。 低级别几何与纹理细节更少、显存与计算需求更低;高级别细节更多、需求更高;而且可以只对画面里重要的那块用高级别[§1, p1]。本篇把这两条(分档与挑着用)原样搬进 3DGS。
- 与最接近的三条前人工作,差别各是一句话。 Octree-GS 的「第 l 级」是把第 1 到第 l 级的表示聚合出来的,所以单级并不独立存在;Hierarchical-3DGS 干脆没有「用某一级渲染」这个概念,它是渲染时按目标粒度 τ 从层级里挑高斯;CityGaussian 能渲单级,但它按不同压缩率造级,也没有面向低端 GPU[§1, p1;§2.3, p3;§6.1.3, p5]。
- 正因为如此,本篇给出的判词是「第一次」。 原文写:在把 LoD 与 3DGS 结合的前人工作里,FLoD 是第一个遵循 LoD 核心原则、为宽范围 GPU 设置提供可调选项的[§1, p1]。这句自评要照引,但要读准:重点并不在「别人没做多级」,而在别人没有把「按硬件挑档」当成设计目标。
- 表示的定义一句话:
L_max级 3D 高斯,每一级都独立重建整个场景。 低级别用更少、更大的高斯重建粗结构,高级别用更多、更小的高斯捕捉细节[§4, p2–p3;§3, p2]。「独立」这个词是全篇的地基:第 7 章的单级渲染、第 9 章的选择性渲染,都靠它才成立。 - 分档的机制是一条「随级别变化的尺度下限」。 对每一级
l ∈ [1, L_max],把s_min^(l) = λ·ρ^(1-l)当作 3D 高斯的尺度下界(最高级s_min^(L_max) = 0,不加约束)(原文式 (3))[§4.1, p3]。高斯在级别 l 的实际尺度是s^(l) = e^{s_opt} + s_min^(l)(原文式 (4)),s_opt可学、s_min^(l)固定 ⇒s^(l) ≥ s_min^(l)恒成立(因为e^{s_opt} > 0)[§4.1, p3]。 - 「只有下限、没有上限」这一条要单独记住。 原文明确写:任何级别都不给高斯尺寸设上界,这样形状与外观简单的场景内容可以用更少、更大的高斯建模,避免在高级别里塞一堆小高斯去做冗余表达[§4.1, p3]。这一条与第 11 章「为什么不剪大高斯」是同一件事的两面。
- 逐级训练的关键落在「别在接缝处抖一下」这半句上,「接着训」只是骨架。 第 1 级照 3DGS 从 SfM 点起,之后每一级用上一级训完的克隆当初值;初始化时把尺度参数设成
s_opt = log(s^(l) − s_min^(l+1))(原文式 (5),式中s^(l)是上一级的实际尺度)[§4.2, p3]。这一步的用处是消掉尺度断层:使s^(l+1) = s^(l),否则新一级一开始就吃一个突发的损失跳变。真数s^(l) − s_min^(l+1)必须为正,这一点在第 13 章的公式重推里会算给它看。 - 重叠剪枝是一条「按尺度折算」的删点规则。 三个最近邻的平均距离
d_avg^(l)(原文式 (6))低于阈值d_OP^(l) = s_min^(l)/2的高斯被删掉[§4.3, p3]。判词是:防止远处的大高斯互相交叠出伪影,顺带把整体内存压下来。要写清它与尺度约束是配套的:阈值按s_min^(l)折算,所以第 12 章那条「去掉尺度约束」的消融里,重叠剪枝也一起被关掉了(原文自己说明了这一点)。 - 换主干的门槛很低,因为机制本来就在「表示层」。 把同一套「逐级降低的尺度约束 + 逐级训练」接到 Scaffold-GS(锚点式神经高斯)上,就得到 FLoD-Scaffold[§4.4, p3;§6.4, p8–p9]。这条主张的证据是表 6-1,读法是「两胜一负」,见下。
- 第一种用法:单级渲染。 从
{G^(l)}里任选一级来渲,依据是每一级都完整重建了场景[§5.1, p3]。原文给的类比是游戏或流媒体里的画质档:用户按自己的显存挑一档。 - 第二种用法:选择性渲染,判据是一条「投影后等于 γ 像素」的距离。 先从
[L_start, L_end]里挑出一个子集G_sel(原文式 (7) 是那个带d_proj^(l-1) > d_G^(l) ≥ d_proj^(l)的集合定义),而d_proj^(l) = (s_min^(l) / γ) × f(原文式 (8))[§5.2, p4]。它的来历是一条相似关系:s_min^(l) : γ = d_proj^(l) : f⇒d_proj^(l)就是「第 l 级的尺度下限投影到图像平面上正好等于 γ 像素」的那个距离;f是相机焦距[§5.2, p4]。 - 两端要按约定封边,否则场景会漏。 原文取
d_proj^(L_end) = 0与d_proj^(L_start−1) = ∞,保证整幅画面都被[L_start, L_end]这一段的高斯覆盖[§5.2, p4]。这不是细节:没有这两条,远处的像素会分不到任何高斯。 - 为什么这样挑比「逐高斯算投影」便宜。 因为
s_min^(l)对每一级是固定的 ⇒d_proj^(l)也是固定的,构造G_sel只需算每个高斯到相机的距离d_G^(l);而替代做法要在每一级上算每个高斯的 2D 投影、再与 γ 比较[§5.2, p4]。这一处「离线算一次、运行期只量距离」是本篇工程上最实的一手。 G_sel有两种造法,这一对取舍贯穿全篇。 predetermined:用全部训练相机的平均位置预先算好G_sel,渲染期间固定不变,省掉了每次换视角的重算,还能把子集单独存下来(比留着全部级别更省存储)[§5.2, p4]。per-view:用当前相机位置算,换视角就重算,为的是在长航迹、大范围场景里不塌[§5.2, p4]。- 两种造法的代价是明码的。 per-view 要把
[L_start, L_end]整段高斯留在显存里才能维持帧率,所以它比「只用L_end这一级」更费显存[§5.2, p4;§6.5, p9]。作者把这条写进了 §8 的局限,正文必须跟着写。 - LoD 表示本身站不站得住,要看逐级与 Octree-3DGS 的对照。 在 DL3DV-10K 上,FLoD 每级的
#G's / SSIM是 7K(0.7%)/0.56、18K(2%)/0.70、223K(22%)/0.88、475K(47%)/0.93、1015K(100%)/0.96;Octree-3DGS 是 25K(9%)/0.40、119K(17%)/0.56、276K(39%)/0.68、560K(78%)/0.83、713K(100%)/0.92 ⇒ 五级全胜,且低级别用的高斯更少[图 6-1, p6]。原因写在正文:Octree-3DGS 渲低级别时出细长高斯,破结构与锐利伪影随之而来。 - 选择性渲染那笔账要与 Hierarchical-3DGS 对读,而且读之前先要一次「公平化」。 作者把 Hierarchical-3DGS 的 τ_max 从默认的 15 抬到 200 再比:抬之前它的 PSNR 是 17.34/18.00/20.19,抬之后是 20.09/20.98/22.19[图 18-1, p14;§D, p14]。这一步要做,否则「我们比它好」不公平;同 PSNR 下 FLoD 显存更低这一点,是抬完之后仍然成立的。
- 「省」的来路是三笔不同的账,不能混。 少渲高斯省的是渲染时间(帧率上去);跨级挑着用省的是显存(
G_sel只留一段);换成低级别省的是两者。表 10-1 把这三笔分开摆:单级 5 是 27.75/103 fps/2189K,5+4+3 是 27.33/124 fps/1210K,单级 4 是 26.67/150 fps/1049K[表 10-1, p8]。 - 满级渲染那一面的判词是「有竞争力」,不是「全面领先」。 表 11-1(原文 Table 1)是三个数据集 × 三项指标的九格:FLoD-3DGS 27.75/0.815/0.224、31.99/0.937/0.107、24.41/0.850/0.186,九格里拿下五格;Mip-NeRF360 的 SSIM/LPIPS 归 Mip-Splatting(0.831/0.181),Tanks&Temples 的 SSIM 归 Octree-3DGS(0.865)、LPIPS 归 Hierarchical-3DGS(0.152)[表 11-1, p8]。原文用的词是
competitive,站内照原词的力度写。 - 「为什么远处画得更好」这一条要按两半写。 原版 3DGS 训练时会剪掉大高斯,导致天空与建筑这类远景被近处的小高斯错误渲染;只去掉这条剪枝能缓解,但不足以把高斯摆正(不同深度上尺寸不一的高斯仍会让几何不准);3D 尺度约束才是把高斯摆正的那一步[§6.3, p8;图 10-1, p8]。这两半缺一不可,原文把它们写成
Two key differences from vanilla 3DGS。 - 边界与反例(独立成节,共 5 条)。 ①per-view 的
G_sel更费显存(要留住整段高斯才能保持帧率),作者给的方向是 CPU↔GPU 的搬运调度[§8, p11];②γ 一大,级别交界处会出现可见接缝(图 19-1,附录 E): 判据固定在 1 像素,这是一处结构性代价;③重叠剪枝的降幅读数在原文内部对不上(正文 90% vs 表 6 的 −73.7%);④表 10-2 的表注写 7 个场景、表头列了 9 个场景名;⑤「90% 压缩」这类读数的口径要看清分母(表 12-5 的 93% 是存储降幅,不是显存)。 - 一条与系列前几篇都不同的许可事实:本篇是 CC BY-NC-ND 4.0。 判词是可站内托管、可原样引用,不得改作、不得商用 ⇒ 落点三件(含
paper.pdf),卡片 chip 不带 warn。ND 的直接后果是封面不得裁切(切图属于改动),所以本篇封面按原生比例等比缩放、不做 cover 裁切:这是全站第 31 个不裁切封面的先例之后的又一件。
13DGS 的短板不是画质,是它只认一种硬件
要看这篇论文盯的是什么,最省事的入口是它的 teaser:一张图里同时挤着两台机器、三种跑法、以及三格几乎一样的 PSNR[图 1-1]。左边写 RTX A5000 (24GB VRAM),右边写 GeForce MX250 (2GB VRAM);左侧的高端卡上 FLoD-3DGS 满级渲出 PSNR: 27.6,右侧那台笔记本上原版 3D Gaussian Splatting 的位置只留了一句 CUDA out of memory.;而同一台笔记本改用 FLoD 挑几级渲出来,是 PSNR: 27.1。
这三格数字的排法本身就是判据。 27.6 与 27.1 差不到 0.5,27.3 夹在中间:单看画质,这张 teaser 什么也没证明。它证明的是另一件事:这三次渲染分别发生在 24GB 与 2GB 两种显存上,而用的是同一份模型。所以这张图的题眼不是「谁更准」,而是「同一份资产能不能换台机器接着用」。
缺口的位置,原文交代得很清楚,而且是一条「主动换来的」限制。 3DGS 用一组稀疏的 3D 高斯建模辐射场,靠可微光栅化与 α 混合拿到当前最好水平的画质与实时帧率[§1, p1]。它换来这份效率的代价是高斯数量:要重建一个真实场景,动辄几十万到上百万个高斯,每个都要存位置、协方差(缩放与旋转)、不透明度与球谐系数。于是原文的第一句判词就落在显存上:正因为依赖大量的高斯基元,3DGS 在 GPU 内存受限的设备上无法实用[§1, p1]。
继续往「画质」那个方向走,只会把这道门关得更死。 原文点了三条后续工作:AbsGS、FreGS、Mip-Splatting,它们都进一步提升了画质,但代价是依赖数量相当、甚至更多的高斯来重建场景,因此被限制在更高端的设备上[§1, p1]。这句话值得停一下:它说明「提画质」与「降门槛」在这一族方法里不是两个可以同时优化的目标,而是同一根轴的两端。
反方向那条路也很诚实地写了自己的代价。 LightGaussian 与 CompactGS 这类方法通过删除冗余高斯来缓解内存压力,既减少了渲染内存、也减少了存储;但原文紧接着写:内存占用的下降是以渲染质量为代价的[§1, p1]。两句话合起来,就把缺口的形状定死了。
于是缺口的判词是一句「二选一」。 现有方法是基于高端设备或基于低成本设备各自发展出来的,因此缺乏灵活性:它们没法在不同 GPU 内存容量下都给出最优的渲染[§1, p1]。换成一句白话:这条线上没有「档位」这个概念,要么整份资产塞进 24GB,要么砍掉一半细节塞进 2GB,中间没有过渡。
本篇提出的是一个「分档」的表示,而不是一个「更省的」表示。 作者的做法是把图形学里最成熟的 Level of Detail(LoD) 概念整体搬进 3DGS[§1, p1]。原文对 LoD 的复述很短,但两个要点都点了出来:低级别的模型几何与纹理细节更少,因此内存与计算需求更低;高级别细节更多、需求更高;此外它还允许挑着用:只在对的地方用高级别、在不重要的区域用低级别,从而在保持观感的前提下提高资源效率[§1, p1]。
「挑着用」这条在本篇里与「挑一档」并列,同属主线,不是附赠功能。 前者是按硬件挑一档(单级渲染),后者是按画面区域挑不同档(选择性渲染)。两条用法各自占了一章(第 7 章),而它们的证据分别落在第 9 章与第 10 章。把这一层结构先记住,后面读表的时候就不容易把两笔账混起来。
最后要说清本篇动手的位置,因为它很容易被读偏。 本篇没有改高斯本身的属性(每一级用的仍然是 3DGS 那一套)、没有改 α 混合、也没有改光栅化管线。它改的是训练的目标:让同一套训练过程产出一组互相之间可以替换的表示。所以准确的说法是:这篇论文不解决「怎么渲得更好」,它解决「怎么让一份资产同时服务多档硬件」。
RTX A5000 (24GB VRAM),PSNR: 27.6),右侧粉框是低成本笔记本上的子集级渲染(GeForce MX250 (2GB VRAM),PSNR: 27.1),中间还标出一处原版 3DGS 在那台笔记本上的失败位置(CUDA out of memory.)。图内另有 FLoD-3DGS/3D Gaussian Splatting single level rendering/levels 1..5/Single level renderings/selective rendering/level 1..5 等标签,以及 PSNR: 27.3 那一格。②读法(怎么读):先看左右两台机器的显存、再看同一台机器上「原版」与「FLoD」两格:题眼是「同一份模型能不能换机器」,不是「谁的 PSNR 高」,三格 PSNR 是 27.6/27.3/27.1,差不到 0.5。不要把它读成本方法的画质胜利榜:这张图里没有任何一条基线被公平评测过。③对照:与图 2-1 连起来读,那一张把方法本身拆成「约束/剪枝/单级/选择性」四块;与图 8-1 连起来读,那一张把「笔记本上各档跑多少帧」逐档量出来;与表 10-1、表 10-2 连起来读,那两张分别是 Mip-NeRF360 上的档位取舍与笔记本上逐场景的 OOM 位置。④落点:这张图承载的是「适配多档硬件」这一条主张的第一眼证据,它的说服力来自同一台笔记本上「OOM ↔ 27.1」的对照,而这条对照的完整版要等第 10 章那两张表。图内标签之外不逐格读值。
来源:FLoD(ACM Trans. Graph. 44(4) · arXiv:2408.12894v2 · Yunji Seo et al.)· 图 1(p.0)· 未修改引用(原样引用,署名保留)
2前人三条路:提画质、压存储、做 LoD
上一章把缺口定在「二选一」上,这一章要把「为什么别人是二选一」讲清楚。原文的相关工作分了三节,实际摆出来的是三条互不重叠的路,它们各自解决了别的问题,也各自把门槛留在了原地。
第一条路是「提画质」,它把门槛抬得更高。 3DGS 之所以流行,是因为相对 NeRF 那类方法它渲染很快;后续的 FreGS 与 AbsGS 分别从损失函数与高斯密度控制策略入手继续提升画质[§2.1, p1–p2]。但原文的判词很直接:这些方法连 3DGS 一起都要求很高的渲染内存,因为它们依赖大量的高斯,因而不适合 GPU 内存受限的低成本设备[§2.1, p2]。这一条路的毛病出在方向上:它的优化目标里根本没有「显存」这一项。
第二条路是「压存储」,它把画质当成了要付的钱。 原文把这条线上的做法分了两类:剪枝类(LightGaussian、Compact3D)与量化嵌入类(EAGLES);以及一类更进一步、用神经先验降价的做法:RadSplat 与 Scaffold-GS 分别靠神经辐射场先验与神经高斯在压缩的同时保住画质[§2.1, p2]。判词也写得很平:尽管有这些进展,现有 3DGS 方法仍然缺乏灵活性,无法为不同的 GPU 设置提供多种渲染选项[§2.1, p2]。
这一句「无法提供多种渲染选项」是整个第 2 章里最该划下来的一句。 它点出的是形态上的差别,不是效果好坏的差别:这一族方法训练完给你一份压缩结果,你要么用、要么不用;而本篇训练完给你五份,你按机器挑。所以本篇与压缩那条线是互补关系而非竞争关系:这一点在第 12 章会兑现成一次实际的组合实验(表 12-5:把 LightGaussian 压到 FLoD 上)。
第三条路才是最近的:把 LoD 与 3DGS 结合,但结合的方式不一样。 原文点了三条工作,三处的差别各只需要一句话。
其一,Octree-GS:它的「第 l 级」不独立。 Octree-GS 从第 1 级一直聚合到第 l 级来定义「第 l 级」的表示,也就是说单个级别并不独立存在[§1, p1]。这句话推翻了「多级 = 可挑档」这个直觉:如果级别是累加出来的,那么「只渲第 1 级」在它那里只是一个退化情形,谈不上设计上的选项。
其二,Hierarchical-3DGS:它干脆没有「用某一级渲」这个概念。 它采用层级结构,渲染时按每个视角的目标粒度 τ 从不同层级里挑高斯出来用[§1, p1]。注意这里的动词是「挑高斯」而不是「挑级别」:τ 是一个画面级的粒度参数,调它改变的是「哪些高斯进入渲染」,而不是「用哪一层的表示」。所以本篇在 §6.2.1 做逐级对照时,必须把 Hierarchical-3DGS 排除在外(原文明确写了这一点,理由就是它没被设计成用特定级别渲染);到了附录 C,作者为了给读者一个交代,还是从它 22 个层级里挑了 1/6/11/16/22 五层渲了一组图(图 15-1)。
其三,CityGaussian:能渲单级,但门槛不在硬件这一侧。 它用不同压缩率造出多级表示,因此可以渲染单个级别;但原文的判词是:它同样没有解决在更低成本 GPU 上渲染的挑战[§2.3, p2–p3]。换句话说,它做到了本篇的第一半(可挑级),没做第二半(为低端设备兜底)。
把三条扫完,「第一次」这个自评的落点就清楚了。 原文写:在把 LoD 与 3DGS 结合的前人工作中,FLoD 是第一个遵循 LoD 核心原则、为宽范围 GPU 设置提供可调选项的[§1, p1]。注意这句话强调的重点落在「为宽范围 GPU 设置」上,「多级」那半句并不承重:别人做多级是为了更高效地渲高画质(例如在高端卡上按需取细节),本篇做多级是为了让同一份资产在低端卡上也能跑。目标不同,设计也就跟着不同:这句话是理解后面所有取舍(尤其是「为什么保留大高斯」)的总钥匙。
本章还要留一句伏笔,它在第 5 章兑现。 在第 2.3 节的末尾,原文把本篇与「多尺度表示」那一族做了对照:NeRF 系的 Mip-NeRF、Zip-NeRF 与 3DGS 系的 Mip-Splatting、MS-GS 都用了多尺度手段,但它们的主要目的是解决走样(aliasing)问题,并不考虑适配不同 GPU 设置这件事[§2.2, p1–p2]。也就是说:「多尺度」这个词在这一族里指的是抗锯齿,不是分档。分辨这两件事,是读懂本篇与它们分界的关键。
3主张:多级 3DGS,每一级都能单独渲出整个场景
第 2 章的结论是「别人的多级不是我们想要的那种多级」,这一章把本篇要的那种立起来。做法本身很短:用一组互相独立的表示,把同一个场景在五个细节档上各重建一遍。 短的背后有两处必须写清:一是「独立」这个词的重量,二是一条观察(不是定理)。
先把预备交代完,因为后面所有式子都建在这上面。 一个 3D 高斯由四个属性描述:位置 μ、不透明度 o、协方差矩阵 Σ、以及球谐系数;其中协方差矩阵分解成一个缩放矩阵 S 与一个旋转矩阵 R,写成
s_opt 驱动、旋转由四元数 q 驱动:这一处「解耦」是本篇全部机制的前提:后面每一次尺度操作都只动 S,旋转不受影响)(原文式 1)为了这两部分能各自独立优化,缩放由向量 s_opt 优化、旋转由四元数 q 优化[§3, p2]。这些高斯被投影到二维屏幕空间,某个像素 (x, y) 处的不透明度贡献写成
o 是该高斯的不透明度标量、𝛍′ 与 𝚺′ 是投影到二维屏幕空间之后的均值与协方差。原文对这一式只补了一句、但这一句是全篇的地基:图像是把投影后的高斯按深度顺序做 α 混合出来的:只要这条混合规则不变,「同一份模型」就绑死在一种高斯预算上)(原文式 2)其中 μ′ 与 Σ′ 是 3D 高斯投影后的二维均值与协方差;图像的合成方式是把投影后的高斯按深度顺序做 α 混合[§3, p2]。最后半句要划下来:它是本篇全部设计针对的那件事,只要还在按深度顺序做 α 混合,同一份模型就绑死在一种高斯预算上。
本体主张一句话说完:L_max 级 3D 高斯表示,每一级都独立重建整个场景。 低级别用更少、更大的高斯重建场景的粗结构,高级别用更多、更小的高斯捕捉细节;作者把这样得到的结构称为 FLoD-3DGS[§4, p2–p3;§3, p2]。这里的关键词是独立:不是「第 l 级是前 l 级的累加」(Octree-GS),也不是「渲染时按粒度挑」(Hierarchical-3DGS),而是每一级自己就是一份完整的表示。
「独立」这个词的重量,要到第 7 章才付清。 如果级别不独立,那么「只渲第 1 级」这个操作在语义上不成立;正因为每一级都是完整重建,后面的两件事才成为设计而不是巧合:单级渲染(任挑一级就能出图)与选择性渲染(把不同区域分给不同级别)。这两条用法共用同一个地基,所以第 7 章把它们放在一起讲。
这条主张在图上就是一块路线图。 图 2-1 把方法拆成四块。左半是训练期做的两件事:(a) 施加级别专属的 3D 尺度约束(对高斯设下限)、(b) 做重叠剪枝(压掉高斯之间的交叠);右半是训练完之后能做的两件事:(c) 单级渲染、(d) 选择性渲染[图 2-1]。这张图值得反复看:它把「训什么」与「怎么用」两侧分开,而后面 10 章的内容基本就是围着这四块转。
但作者真正依赖的立足点是一条观察,而非图。 原文在 §1 给了一个明确的措辞 key observation:即便是第 1、2、3 级这样的低级别,FLoD-3DGS 也能在背景上取得很高的感知画质;原因是低级别那种大尺寸的高斯在远处呈现出来的细节,与高级别小高斯在远处呈现的细节差不多[§6.2.1, p5–p6]。这条观察的分量要读准:它是一条经验性的、有条件的判断,不是一条定理。它的成立依赖于「远处物体在屏幕上占的像素本来就少」这个几何事实。
正因为它是观察而不是定理,它自带适用边界。 一旦相机走到级别分界处没被安排好的位置(第 12 章 Small City 那一节),或者把 γ 调大到让级别切换的距离判据失效(第 9 章那处反例),这条观察就会失效、接缝就会露出来。这两处要记成一条经验性观察的必然账单,「实验没做好」不足以解释它们,正文按这个力度写。
最后留一句给第 4 章的问句:既然尺度约束是「下限」,那它到底是靠什么把级别分开的? 直觉上「限制最小尺寸」听起来像是在做一件事(防止高斯太小),而不是在分级别。真正把它变成分档工具的,是那条下限随级别指数下降,以及最高级不设约束:下一章把这个机制算清楚。
s^(l) 作为下界,(b) 做重叠剪枝以缓解高斯交叠;每一级训完把高斯克隆并保存为该级的最终表示,逐级进行直到最高级 L_max,得到多级表示 FLoD-3DGS;图内另标出 (c) single level rendering(单级渲染)与 (d) selective rendering(选择性渲染)。图内可见 Initialization/3D scale constraint/Level training/Level up if l < L_max/Large overlap/minimum size/no minimum size/SfM points/Save/Choose level(s) 等标签,以及 (a)(b)(c)(d) 四块的角标。②读法(怎么读):先按左右分工看:左半回答「怎么训出多级」,右半回答「训出来怎么用」;再按 (a)(b) 两个小图看机制(a) 讲的是「同一片场景内容在第 l 级只许用不小于 s^(l) 的高斯去表达」,(b) 讲的是「三个最近邻平均距离太近的高斯被删掉」。③对照:与图 1-1 连起来读(一个给结论、一个给结构);与式 3-1…式 5-2 连起来读,那五条式子分别是这张图左半的形式化;与图 5-1 连起来读,那一张是 (c) 在真实场景上的结果;与图 3-1、图 4-1 连起来读,那两张是 (d) 的机制与两种造法。④落点:这张图是全篇的目录页,它本身不含任何读数;正文里没有从它读出数字,只借它交代结构与符号。图内标签之外不逐格读值。
来源:FLoD(ACM Trans. Graph. 44(4) · arXiv:2408.12894v2 · Yunji Seo et al.)· 图 2(p.2)· 未修改引用(原样引用,署名保留)
4级别怎么分开:一条随级别变化的 3D 尺度下限
第 3 章说「每一级都独立重建整个场景」,这一章回答那个关键的「凭什么」。答案只有一条式子加一条式子的组合:一条随级别指数下降的尺度下限,加上一条「实际尺度 = 可学量 + 下限」的定义。这两条式子很短,但它们把「分档」这件事从口号变成了可以验算的量。
先看下限本身。 对每一级 l ∈ [1, L_max],本篇给 3D 高斯的尺度设一个下界 s_min^(l):
λ 是第 1 级的初始尺度约束、ρ 是「每往下一级约束缩小多少倍」的比例因子(本篇取 λ = 0.2、ρ = 4)。指数 1−l 是负的 ⇒ 级别越高下限越小,第 1 级最大、第 5 级直接取 0;原文对此的解释是:最高级取 0 是为了在这一级不做任何限制地重建最细的细节。这条「低级粗、高级细、顶级放开」的形状,就是分档的全部来源)(原文式 3)即 s_min^(l) = λ·ρ^(1-l)(当 1 ≤ l < L_max),而在最高级 s_min^(L_max) = 0[§4.1, p3]。两个常数的含义在原文里写得很明确:λ 是第 1 级的初始 3D 尺度约束,ρ 是「每往下一级,尺度约束缩小多少倍」的比例因子[§4.1, p3]。实际取 λ = 0.2、ρ = 4(第 10 章的参数表会再列一次)[§6.1.4, p5]。
把这条式子的形状读出来,机制就清楚了。 指数 1-l 是负的,所以级别越高、ρ^(1-l) 越小、下限越小:第 1 级的下限是 λ(最大),第 2 级是 λ/ρ,第 3 级 λ/ρ²,依次递减,到最高级直接取 0:也就是「不设约束」[§4.1, p3]。原文对这一处特意加了一句解释:最高级取 0 是为了在这一级不做任何限制地重建最细的细节[§4.1, p3]。所以这条下限的形状是「低级粗、高级细、顶级放开」,它是分档的全部来源。
再看高斯在那个级别上的实际尺度。 级别 l 的高斯尺度定义为
s_opt 是可学的尺度参数,s_min^(l) 是固定的(由式 4-1 给定、不参与梯度)。这一式立刻给出一条不变式:因为 e^{s_opt} > 0,所以 s^(l) ≥ s_min^(l) 恒成立:下限是写进参数化里的,不靠罚项软约束,这正是它敢当下限用的原因)(原文式 4)即 s^(l) = e^{s_opt} + s_min^(l),其中 s_opt 是可学的尺度参数,而 s_min^(l) 是固定的(由式 4-1 给定,不参与梯度)[§4.1, p3]。这一式立刻给出一条不变式:因为 e^{s_opt} > 0,所以 s^(l) ≥ s_min^(l) 恒成立[§4.1, p3]。「恒成立」这三个字是本篇能把它当下限用的原因:下限写进参数化里,并非靠罚项软约束出来的:只要优化的是 s_opt,s^(l) 就永远越不过 s_min^(l) 这条线。
这里有一个容易读漏的点:只在第 l 级加下限,就足以让第 l 级的「细节上限」被压住。 直觉上「限制高斯不许太小」似乎只影响细节的下界,怎么会限制细节量?答案在第 3 章埋下的那条观察里:场景的细节由高斯的多寡与大小共同决定。当每一块内容都必须用不小于 s_min^(l) 的基元去表达时,能塞进场景的高斯数就被这条下限压住了:想知道细节,就得用小高斯,而小高斯在这个级别不被允许。第 12 章那一条消融把这层关系量了出来:去掉尺度约束后,第 2 级训完的细节已经跟满级差不多(原文给的读数是高斯数少了约 98.6%,图 12-1 里可见的四格是 246K/1085K/12K/1039K,两处口径对不齐的情况照录在台账里)[§6.6.1, p10]。
「只有下限、没有上限」这一条要单独记住,因为它是与 3DGS 的一处分道扬镳。 原文明确写:任何级别都不给高斯尺寸设上界,这样形状与外观简单的场景内容可以用更少、更大的高斯建模,避免在高级别里塞一堆小高斯去做冗余表达[§4.1, p3]。这句话有两层后果,第二层要到第 11 章才显形:第一层是效率(简单内容不该用复杂基元表达),第二层是训练流程的改动:原版 3DGS 在训练中会周期性地剪掉过大的高斯,而本篇因为不设上界,所以不做这件事[§6.1.4, p5]。第 11 章那处「为什么远景画得更好」的答案(图 10-1 的红框),根就在这里。
附录里还有一段很值得抄进来的对照,它回答的是「为什么不直接限制高斯数量」。 原文在附录 B.3 里写:另一种造多级表示的办法是直接限制高斯数量;但只限数量、不施加强度尺度约束,就无法让每一级的表示具备「受控的细节」:因为在只有渲染损失引导优化与数量控制的情况下,某些局部区域可能取得比别处更高的细节;这种区域间的不均匀,会让「把多个级别合起来做选择性渲染」在视觉上不一致,从而让这类渲染选项不可用[§B.3, p12]。反过来,FLoD 的 3D 尺度约束保证了每一级内部的细节是均匀的,而这种均匀性正是「视觉一致的选择性渲染」与「高效构造 G_sel」的前提(G_sel 只需计算每个高斯到相机的距离即可得出)[§B.3, p12]。这段话把「为什么是尺度、不是数量」这条设计选择讲透了:数量是一个全局预算,尺度是一条局部约束;分档要分的是「每一块地方能有多细」,而不是「总共多少个」。
把这两条式子与第 2 章那条分界线对上,本篇的设计逻辑就闭环了。 别人的多级是为了「更高效地渲高画质」,所以他们关心的是高级别能不能更精细;本篇的多级是为了「让同一份资产适配不同显存」,所以它关心的是低级别能不能用一个合理的显存预算独立出图。式 4-1 那条指数下降的下限与最高级放开的组合,正是为后一个问题设计的:它让第 1 级真正成为一档「少而大」的表示,而不是「高级别的一个不完整版本」。
本章留一个问题给下一章:下限定好了,怎么训? 一条下限本身不会自动带来「结构一致」:如果每一级都从零开始训,五级会各自收敛到五套互不相干的结构,那么「挑一级渲」与「挑几级混着渲」就都会在结构层面打架。第 5 章的逐级训练就是为这件事准备的。
5级别怎么接上:逐级训练与重叠剪枝
第 4 章把「级别怎么分开」量了出来,但它留下一个坑:一条下限只定义了每一级的约束,没有保证五级长成一套结构。 如果五级各训各的,它们会各自收敛到五个互不相干的解;那样一来,「挑一级渲」还能凑合,但「挑几级混着渲」就会在级别边界上打架。这一章的两件事就是补这个坑:逐级训练负责让结构接上,重叠剪枝负责把交叠出的伪影压掉。
先说逐级训练的骨架,它是一条由粗到细的链。 第 1 级的高斯照 3DGS 的做法从 SfM 点初始化,然后训练;训练完成后这一级被存成一份 checkpoint,同时把当时的高斯克隆一份,作为第 l 级的最终表示;接着用这份 checkpoint 去初始化第 l+1 级,继续训[§4.2, p3]。原文强调后续每一级的训练流程基本相同,差别只在约束参数与迭代配置上[§4.2, p3]。
这条链里真正需要设计的是「初值怎么给」,而且问题出在尺度上。 第 l+1 级的尺度下限比第 l 级更小(式 4-1 的指数关系),如果直接把上一级的高斯搬过来、却按新级别的参数化去解读它,那么两边的实际尺度就会对不上。原文的处理是:对第 l+1 级的初值,把可学的尺度参数设成
s^(l+1) = s^(l):也就是「新一级一开训时,每个高斯的尺度与上一级结束时完全相同」,从而消掉初值处的尺度断层、避免一开训就吃一个突发的损失跳变。式中的 s^(l) 是上一级的实际尺度(不是下限),这一点在第 13 章会重推)(原文式 5)即 s_opt = log(s^(l) − s_min^(l+1)),式中的 s^(l) 是上一级训练完成后高斯的实际尺度[§4.2, p3]。
这一式的用处只有一个,但它是逐级训练能不能用的关键:让初值处的尺度恰好不变。 代入式 4-2 立刻看出 s^(l+1) = e^{s_opt} + s_min^(l+1) = (s^(l) − s_min^(l+1)) + s_min^(l+1) = s^(l):新一级一开训时,每个高斯的尺度与上一级结束时完全相同。原文把这件事的判词写得很直接:这样避免了一个突发的初始损失,靠的是消掉尺度断层 s^(l+1) − s^(l)[§4.2, p3]。
这句话的分量要算一下才够。 训练是在固定约束下的优化,如果初值落在一个「约束刚换、尺度整体错位」的位置上,那么前若干次迭代的梯度几乎全部用来把尺度拉回合理范围,而不是用来提升画质;更糟的是,这一段「拉扯期」里高斯可能被密度控制(增密/剪枝)误处理,把结构改坏。式 5-1 做的就是让新一级从「上一级的解」出发,而不是从「一个尺度被重解释过的解」出发。 第 12 章那条逐级训练的消融(表 12-2)量的是这条链的整体收益:五级全部 w/ LT 更好(DL3DV-10K 上 L5 31.97 对 31.20、L4 30.73 对 29.05、L3 28.29 对 27.05、L2 24.01 对 23.41),而定性证据(图 13-1)指出的是没有逐级训练时中间级的结构误差会一路带到高级别。
这里有一处实现细节容易漏掉:式 5-1 的真数必须为正。 s^(l) − s_min^(l+1) 要取对数,就必须严格大于 0。它之所以总能成立,是因为 s^(l) ≥ s_min^(l) > s_min^(l+1)(式 4-1 是随级别递减的、式 4-2 保证了 s^(l) ≥ s_min^(l))[§4.1–4.2, p3]。这条不等式链不是装饰:它说明逐级训练的可行性是被尺度约束的设计保证的,而不是靠调参凑出来的。第 13 章的公式重推会把这三步连起来算一遍。
第二件事是重叠剪枝,它解决的问题是「大高斯在远处打架」。 原文的判词很短:为了防止渲染伪影,把交叠过大的高斯删掉;判据是「一个高斯的三个最近邻的平均距离低于预先给定的距离阈值 d_OP^(l)」[§4.3, p3]。三个最近邻的平均距离写成
d_ij 是第 i 个高斯到第 j 个近邻的距离。它是重叠剪枝的左侧输入:三个最近邻的平均距离低于阈值 d_OP^(l) = s_min^(l) / 2 的高斯被删掉:阈值取的是 3D 尺度下限的一半,所以判词是防止远处的大高斯互相交叠出伪影,顺带把整体内存压下来)(原文式 6)即 d_avg^(i) = (1/3) Σ_{j=1}^{3} d_ij,其中 d_ij 是该高斯到第 j 近邻的距离[§4.3, p3]。
阈值不是独立参数,它是从尺度约束折算出来的。 原文写:d_OP^(l) 取该训练级别 3D 尺度约束的一半,即 d_OP^(l) = s_min^(l) / 2[§4.3, p3]。这一处「折算」是全章最该记住的关系:重叠剪枝的强度跟着级别走,低级别的高斯本来就大、阈值也大,因此删得更狠;高级别的高斯小、阈值小,删得更轻;到最高级 s_min^(L_max) = 0,阈值也随之归零,等于不剪(原文在实现细节里确认了最高级不跑重叠剪枝)[§6.1.4, p5]。
把这条关系与式 5-1 放在一起看,就能看出「配套」这两个字指的是什么。 两者的参数都从 s_min^(l) 出发,所以第 12 章那条「去掉尺度约束」的消融必须连重叠剪枝一起关掉:原文自己说明了这一点,在没有尺度约束的那一组里,因为重叠剪枝的阈值是按尺度约束成比例调整的,所以那一组也不施加重叠剪枝[§6.6.1, p10]。这属于两个机制共享同一个参数的必然结果,谈不上实验设计上的便宜行事。读表 12-3 的时候要带着这条:那一张量的是「尺度约束 + 重叠剪枝」这一对机制在高斯数上的效果,不是单独一个。
重叠剪枝还有一笔顺带的收益:内存。 原文点了一句「这个方法同时也减少了整体内存占用」[§4.3, p3]。这句话在第 9 章与第 10 章的显存账里会再出现一次,但它在这里的语境更具体:低级别是给显存最紧的设备用的那一档,所以「低级别能删掉多少高斯」直接决定了这一档能不能落进 2GB。 表 12-3(原文 Table 6)给的正是各级的删减量(见第 12 章,那一张另有一处正文与表格对不上的读数,站内两个都写)。
把整条流水线落成伪代码,上面这些关系会更清楚。 原文在附录 B.1 给了一份 Algorithm 1(整体训练流程),站内按原样落成代码块、并逐行加中文旁注[§B.1, p12]。
ALGORITHM 1: Overall Training Algorithm for FLoD-3DGS
输入: L_max(最高级别)· λ(第 1 级的 3D 尺度约束)· ρ(缩放因子)
M ← SfM Points # 位置(由 SfM 点初始化)
S, R, C, A ← InitAttributes() # 缩放、旋转、颜色、不透明度
for l = 1 ... L_max do # 逐级训练:从第 1 级到最高级
if l < L_max then
s_min^(l) ← λ × ρ^(1-l) # 当前级别的 3D 尺度约束(原文式 3)
else
s_min^(l) ← 0 # 最高级别不加约束
end
i ← 0 # 迭代计数
while not converged do
S^(l) ← ApplyScaleConstraint(S_opt, s_min^(l)) # 施加尺度约束(原文式 4)
I ← Rasterize(M, S^(l), R, C, A) # 光栅化
L ← Loss(I, Î) # 损失(L1 + SSIM)
M, S_opt, R, C, A ← Adam(∇L) # 反向传播
if i < DensificationIteration then
if RefinementIteration(i, l) then
Densification() # 增密
Pruning() # 剪枝
OverlapPruning() # 重叠剪枝(原文式 6)
end
end
i ← i + 1
end
SaveClone(l, M, S^(l), R, C, A) # 保存该级的克隆,作为该级最终表示
if l ≠ L_max then
S_opt ← AdjustScale(S^(l)) # 为第 l+1 级调初值尺度(原文式 5)
end
end
这份伪代码里有三行对应着前面讲过的三件事,读的时候要对上号。 ApplyScaleConstraint(S_opt, s_min^(l)) 这一行就是式 4-2:每一级训练时都在施加下限,不是只在初始化时施一次;OverlapPruning() 落在 RefinementIteration(i, l) 的触发条件里,且在 i < DensificationIteration 的窗口内,这与第 10 章参数表里「密度控制只在前若干次迭代跑」是一致的;AdjustScale(S^(l)) 这一行就是式 5-1,它只在 l ≠ L_max 时执行:也就是说最后一级不需要为下一级准备初值,这条边界条件与式 4-1 里「最高级取 0」是同一处设计的两面。
本章最后留一个问句给第 6 章:这套机制是绑在 3DGS 上的吗? 从式 4-1 到式 5-2,全部操作都只作用在「高斯的尺度」这一件事上:而尺度的下限是表示层的属性,不是某个具体光栅化实现的性质。所以理论上它可以搬到任何一个「用尺度参数控制基元大小」的 3DGS 变体上。第 6 章把这句话兑现成一次实验。
6同一套机制换个主干:接到 Scaffold-GS 上
第 5 章末尾留的问题是「这套机制绑不绑主干」。这一章给出答案:不绑,而且换过去的动作只需要重述一次「逐级降低的尺度约束 + 逐级训练」。它在本篇里的位置略特殊:它是唯一一个用表格承载的机制类章节,而那张表的读法本身有一处必须写清的边界。
换主干的动作,原文只用三句话说完了。 本篇的方法是「简单」的:3D 尺度约束的设计直接、逐级训练的流水线清楚,因此容易与其他基于 3DGS 的技术整合[§4.4, p3]。作者选的验证对象是 Scaffold-GS:一个用锚点式神经高斯的 3DGS 变体;整合的做法是对它的神经高斯施加逐级递减的 3D 尺度约束,再走同一套逐级训练[§4.4, p3]。结果被称为 FLoD-Scaffold[§6.4, p8]。
先把这张表的骨架交代清楚,因为它的表头是多层的。 表 6-1(原文 Table 3)是三个数据集 × 两个指标的布局:列头第一行是数据集 Mip(即 Mip-NeRF360)、DL3DV(即 DL3DV-10K)、T&T(即 Tanks&Temples),每个数据集跨两列;第二行是 PSNR 与 mem.(显存,单位 GB);行是七条:FLoD-Scaffold 的五个级别,加上两条基线 Scaffold-GS 与 Octree-Scaffold[表 6-1, p9]。原文在正文里也把这张表的用途写明:为了展示 FLoD-Scaffold 在不同数据集上都能给出合适的逐级表示,作者在三个数据集上量了每一级的 PSNR 与渲染显存[§6.4, p9]。
表 6-1 逐级画质与显存:FLoD-Scaffold 对两条基线(原文 Table 3) (原文 Table 3, p.9 · 数值取原文文字层,逐格未改)
| Mip | DL3DV | T&T | ||||
|---|---|---|---|---|---|---|
| PSNR | mem. | PSNR | mem. | PSNR | mem. | |
| FLoD-Scaffold(lv1) | 20.1 | 0.5 | 22.2 | 0.3 | 17.1 | 0.2 |
| FLoD-Scaffold(lv2) | 22.1 | 0.5 | 25.2 | 0.3 | 19.3 | 0.3 |
| FLoD-Scaffold(lv3) | 24.7 | 0.6 | 28.5 | 0.4 | 21.8 | 0.4 |
| FLoD-Scaffold(lv4) | 26.6 | 0.8 | 30.1 | 0.6 | 23.6 | 0.7 |
| FLoD-Scaffold(lv5) | 27.4 | 1.0 | 31.1 | 0.7 | 24.1 | 1.0 |
| Scaffold-GS | 27.4 | 1.3 | 30.5 | 0.8 | 24.1 | 0.7 |
| Octree-Scaffold | 27.2 | 1.0 | 30.9 | 0.6 | 24.6 | 0.8 |
读这张表的第一条规矩是「竖着读五级,横着读三条线」。 竖着读 FLoD-Scaffold(lv1) 到 (lv5),看到的是一条随级别单调上升的画质曲线(Mip 上 20.1→27.4,DL3DV 上 22.2→31.1,T&T 上 17.1→24.1),同时显存从 0.5/0.3/0.2 GB 一路涨到 1.0/0.7/1.0 GB:画质与显存同向变化,这正是「档位」的定义。横着读最后三行,才是与基线的对照。
第二条规矩是「满级对满级」,而结论是两胜一负。 把 FLoD-Scaffold(lv5) 与两条基线对齐:对 Scaffold-GS,三格的 PSNR 是 27.4 对 27.4、31.1 对 30.5、24.1 对 24.1,而显存是 1.0 对 1.3、0.7 对 0.8、1.0 对 0.7:也就是说,在前两个数据集上它同 PSNR 少占显存,在 T&T 上反而多占(1.0 对 0.7)。对 Octree-Scaffold(同为 Scaffold-GS 主干)是 27.4 对 27.2(赢)、31.1 对 30.9(赢)、24.1 对 24.6(输)。所以这张表不能写成「全面超过基线」:原文自己的措辞也是分两句写的,在最高级上超过了 Scaffold-GS、并与 Octree-Scaffold 取得有竞争力的结果[§6.4, p9]。
第三条规矩是「别把这张表当成画质竞赛读」。 这张表要证明的是换主干之后 LoD 功能还在,而不是「FLoD-Scaffold 画质更高」:五级各自有合适的细节与显存、而且满级不掉画质。原文给的结论句是这个意思:FLoD 可以无缝整合进现有的 3DGS 系模型,在提供 LoD 功能的同时不降低渲染质量;作者还加了一句展望:预期 FLoD 也能与将来的 3DGS 系模型兼容[§6.4, p9]。「预期」这两个字要照引:它是一条基于机制层级的推断(第 5 章末尾那个论证),不是实验结论。
这一章还有一处口径要说明:表 6-1 的表头在原文里是一串被并起来的文字。 原文文字层在该行给出的是一整条 PSNRmem.PSNRmem.PSNRmem.:它其实是六个子表头格(三个数据集 × PSNR/mem.)在同一行里紧挨着写,格间空隙小到没被切开。站内按字符级的 x 位置把它拆回六格重排[表 6-1, p9]。这不是改写,是还原:原文的版面上那本来就是六个格。
本章末尾要交代「为什么换主干这件事能做」的机理,而不只是「做成了」。 回看第 3 章到第 5 章的全部操作:式 3-1、3-2 描述的是 3DGS 的表示与渲染;式 4-1 到 5-2 全部只操作高斯的尺度这一个量。只要一个主干把「基元大小」暴露成一个可学的尺度参数、并且渲染时按 α 混合累加,这套机制就能套上去:这正是原文说「方法的简单性来自尺度约束设计的直接与逐级训练流水线的清楚」那句判词的实际含义[§4.4, p3]。
7两种用法:选一级,或者跨级挑着用
前四章讲的都是「怎么训出一组多级表示」,从这一章开始讲「训出来怎么用」。用法有两种,它们共用同一个地基(每一级都独立完整),但判据完全不同:单级渲染的判据是「用户的显存」,选择性渲染的判据是「屏幕上的像素尺寸」。 这一章要把第二种用法的那条判据算清楚,它是全篇工程上最实的一手。
第一种用法短到一句话:任挑一级。 从多级高斯集合 {G^(l) | l = 1, …, L_max} 里任选单独一级去渲染,用来匹配用户的 GPU 内存能力[§5.1, p3]。之所以可行,原文给的理由就是第 3 章那条地基:因为每一级都被设计成能完整重建整个场景,所以任何单独一级独立渲染都是成立的;作者顺带给了一个类比:这就像游戏或流媒体让用户调画质档来适配自己的设备[§5.1, p3]。原文还写清了这条用法在两端的对应关系:高端硬件可以承受 L_max 级那种更小更多的高斯、拿到高画质;而当渲染大量高斯会超出普通设备的内存上限时,就选更低的级别去匹配内存约束[§5.1, p3]。这就是「单级渲染」的全部内容:它的价值不在技巧,而在「本来做不到」这件事被结构性地解决了。
第二种用法要复杂得多,因为它要先回答「哪块像素该用哪一级」。 原文的动机很直白:虽然挑一级就能匹配显存,但用多个级别可以在可控的内存下进一步提高观感;理由是远处物体或背景区域不需要用高级别的小高斯去渲:因为高低级别重建之间的感知差异,随着离视点的距离增加而变得不那么明显[§5.2, p3–p4]。于是策略是:远处用低级别、近处用高级别[§5.2, p4]。
要把「远处」写成一个可计算的量,需要一条距离判据。 做法是从多级集合里挑出一个子集 G_sel:
[L_start, L_end] 里挑出那些「到相机的距离落进第 l 级应当负责的那一段」的高斯。d_G^(l) 是高斯到相机的距离(第 7 章讲过:因为 s_min^(l) 对每一级都是固定的,d_proj^(l) 也固定,所以造 G_sel 只需要算距离,不必逐个做二维投影)。两端按约定封边:d_proj^(L_end) = 0、d_proj^(L_start−1) = ∞,保证整幅画面都被这一段高斯覆盖)(原文式 7)也就是让第 l 级的高斯 G^(l) 进入子集的条件是 d_proj^(l-1) > d_G^(l) ≥ d_proj^(l),其中 d_G^(l) 是该高斯到相机的距离,而 d_proj^(l) 是每一级各自的一个距离阈值[§5.2, p4]。式中的求和从 l = L_start 到 L_end,也就是说子集只从 [L_start, L_end] 这一段里取。
阈值本身由一条相似关系定出来:
f 是相机焦距、γ 是屏幕尺寸阈值。这一式是一条比例关系 s_min^(l) : γ = d_proj^(l) : f 的解,所以它的含义可以直接读出来:d_proj^(l) 就是「第 l 级的 3D 尺度下限投影到图像平面上正好等于 γ 个像素」的那个距离:超过这个距离的物体在屏幕上已经小到可以用第 l 级的粗高斯去表达。γ 调大 ⇒ 门槛更严格 ⇒ 必须走得更远才肯降级,所以 γ 是「允许降级的宽松度」而不是「降级的力度」)(原文式 8)即 d_proj^(l) = (s_min^(l) / γ) × f,其中 f 是相机焦距、γ 是屏幕尺寸阈值[§5.2, p4]。
这一式的来历值得单独讲,因为它是整章最巧的一步。 原文把它写成一条比例式:s_min^(l) : γ = d_proj^(l) : f,解出上面的式子[§5.2, p4]。它的几何含义是:d_proj^(l) 就是「第 l 级的尺度下限 s_min^(l) 投影到图像平面上正好等于 γ 个像素」的那个距离:换句话说,超过这个距离的物体,它在屏幕上已经小到用第 l 级的大高斯去表达也看不出差别[§5.2, p4]。γ 默认取 1.0(第 10 章的参数表),意思是「投影长度等于或小于 1 个像素」[§6.1.4, p6]。这条判据把「感知上够用」这件主观事,换成了一个可以离线算出来的长度。
两端还要按约定封边,否则画面会漏。 原文取 d_proj^(L_end) = 0 与 d_proj^(L_start−1) = ∞,用途是保证整个场景都被 [L_start, L_end] 这一段的高斯覆盖[§5.2, p4]。这两条要解释一下才不显得像补丁:d_proj^(L_end) = 0 意味着第 L_end 级的高斯在所有距离上都算「够远」,因此整幅画面里离相机最近的像素也会被这一级兜住;d_proj^(L_start−1) = ∞ 意味着第 L_start−1 级(也就是比起点更低的那一级)永远不参与,把子集的级别范围钉死在 [L_start, L_end] 内。没有这两条,远处的像素会分不到任何高斯。
这一处设计最实际的价值是「算一次、用很多次」。 原文给的判词是:因为 s_min^(l) 对每一级是固定的,所以 d_proj^(l) 也是固定的;因此构造 G_sel 只需要计算每个高斯到相机的距离 d_G^(l),相比于「在每一级上计算每个高斯的二维投影、再与屏幕尺寸阈值 γ 比较」的做法,计算上更高效[§5.2, p4]。这一段是全章最值得抄进工程笔记的一处:它把「按屏幕尺寸决定用哪一级」这件本来需要逐高斯逐级做投影的事,换成了一次除以焦距的离线预算 + 运行期的一次测距。
γ 与级别区间是两个可以调的旋钮,而它们的方向是相反的,这一点要写清。 原文写:阈值 γ 与级别区间 [L_start, L_end] 可以按具体的内存限制或目标帧率来调;更小的 γ 配更高的级别区间,意味着优先保细节、代价是内存与速度;更大的 γ 配低级别区间,则减少内存、加快渲染,代价是细节[§5.2, p4]。注意这里说的是「更小的 γ」:γ 小意味着「投影长度何时算够小」的门槛更严格,于是必须走到更远的距离才肯降级:换句话说,γ 是「允许降级的宽松度」,不是「降级的力度」,这个方向容易读反。
回到第 5 章埋下的那条取舍:子集怎么造? 原文给了两种造法,它们的差别不在判据、而在「算距离时用的是谁的位置」。predetermined 用全部训练相机的平均位置在渲染前算好 d_G^(l)、定下 G_sel,此后渲染期间固定不变;好处是换视角时不必重算,而且未被采样的高斯可以被排除在外、显著降低渲染期的内存,同时采样得到的 G_sel 还可以单独存起来,比留着全部级别更省存储[§5.2, p4]。per-view 则把 d_G^(l) 定义为该高斯与当前相机位置的距离,因此相机位置一变就重算 G_sel;它的动机是:在相机航迹跨越很大范围的场景里,相机会走进本来被分配了低级别高斯的区域,于是渲染质量会明显下降[§5.2, p4]。
两种造法的代价是明码标出来的,而且这一条会被作者写进局限。 per-view 为了维持帧率,必须把 [L_start, L_end] 区间内的全部高斯都留在 GPU 内存里;因此在付出更大渲染内存的前提下,per-view 的选择性渲染才能在长航迹上保持一致的渲染质量[§5.2, p4]。这句话翻译一下就是:G_sel 省下的显存,在 per-view 模式下又被「留住整段」抵消掉了。第 12 章会用 Small City 这一组实验把这件事量出来(表 12-1),而第 9 章的图 4-1 正是这两种造法的几何示意。
d_proj^(l) 如何为画面中的不同区域决定该用哪一级高斯;图注还写明这一个例子把第 3 级当作 L_start、第 5 级当作 L_end。图内可辨认的标签包括 image plane/screen size (γ = 1)/Level 3 L_start/Level 4/Level 5 L_max/(Gaussians region)/view/d_proj^(l)/s_min^(l) 等。②读法(怎么读):沿「从相机出发的一条视线」读:视线离开相机后先经过高级别的区域,走到某个距离时该处要用更粗的一级去表达:那个距离就是 d_proj^(l),它的定义是「s_min^(l) 投影到像平面上正好等于 γ 个像素」;γ 取 1 意味着判据是一个像素。不要把它读成「近处一定用高级别」:真正的判据是屏幕上的投影尺寸,而不是绝对距离。③对照:与式 7-1、式 7-2 连起来读(这一张是那两条式子的几何图解);与图 4-1 连起来读,那一张是同一套判据的两种落地方式;与图 19-1 连起来读,那一张给出 γ 调到 2、3 时的接缝(本判据的失效面);与表 10-1 连起来读,那一张量的是不同级别组合的实际画质与显存。④落点:这张图是第 7 章第 2 节的核心图示,也是「γ 是允许降级的宽松度」这句话的直观依据;它本身不含读数,正文里没有从它读出任何数字。图内标签之外不逐格读值。
来源:FLoD(ACM Trans. Graph. 44(4) · arXiv:2408.12894v2 · Yunji Seo et al.)· 图 3(p.4)· 未修改引用(原样引用,署名保留)
同一套判据,两种落地方式。
G_sel 与逐视角高斯集 G_sel 两种造法的对照:在 predetermined 版本里高斯集是固定的,而在 per-view 版本里每当相机位置改变,高斯集就动态更新;图注同样写明这一个例子用的是第 3 级当 L_start、第 5 级当 L_end。图内可辨认的标签包括 (a) predetermined/(b) per-view/view frustum/Level 3 L_start/Level 4/Level 5 L_max/(Gaussians region) 等。②读法(怎么读):左右对比的是「同一个判据配谁的位置」:(a) 侧的距离用的是全部训练相机的平均位置(因此画面上「哪里用高级别」在渲染前就定死了),(b) 侧用的是当前相机位置(因此「哪里用高级别」会跟着相机走)。③对照:与式 7-1、式 7-2 连起来读(这一张是那两条式子在两种模式下的落地);与图 3-1 连起来读,那一张给的是判据本身的几何;与图 11-1、表 12-1 连起来读,那两张是这两种造法在 Small City 上的定性对照与量化读数。④落点:这张图承载的是第 7 章末尾那对取舍:predetermined 省显存与重算,per-view 保长航迹上的一致性;它本身不含读数。值得注意的是 (b) 这一侧的代价:为了维持帧率必须留住整段高斯,会直接出现在 §8 的作者自陈局限里。图内标签之外不逐格读值。
来源:FLoD(ACM Trans. Graph. 44(4) · arXiv:2408.12894v2 · Yunji Seo et al.)· 图 4(p.4)· 未修改引用(原样引用,署名保留)
8多级表示本身站不站得住:逐级与 Octree-3DGS 比
第 7 章讲的是「怎么用」,这一章要回答一个更靠前的问题:低级别到底能不能看? 因为整套设计的地基(第 3 章那条观察)是「低级别也够用」,如果低级别一塌,那么再漂亮的档位设计也是空的。这一章用两张图把这个地基验一遍:一张看自己的五级长什么样、各占多少显存,一张看与最像的竞品逐级对照。
先看自己的五级。 图 5-1 把 FLoD-3DGS 与 FLoD-Scaffold 的五级并排渲出来,每位选手配一行显存读数:FLoD-3DGS 从 0.25 GB 一路到 2.06 GB,FLoD-Scaffold 从 0.24 GB 到 0.98 GB[图 5-1, p5]。这张图的读法落在「每一级的观感与它的显存读数是不是匹配」上;「哪一级最好看」那当然是满级,不必问。也就是说,看低级别那几格是否还留着主体结构与大致外观。
这张图还顺带兑现了第 6 章那条「换主干」的主张。 同一张图里两条线并排,FLoD-Scaffold 也给出了「每一级各有合适细节与显存」的表示[§6.4, p8–p9]。它的信息量在于「同一套机制在两种主干上产出同一种形态的曲线」,而不是哪条线更省。
FLoD-3DGS 的五格是 memory: 0.25GB/0.31GB/0.75GB/1.27GB/2.06GB,FLoD-Scaffold 的五格是 memory: 0.24GB/0.24GB/0.43GB/0.68GB/0.98GB;另标有 level 1…level 5 (Max)。②读法(怎么读):逐列读「画质 ↔ 显存」这一对:左起第一级显存最小、观感最粗,往右显存递增、细节递增:该确认的是低级别那几格是否还留着主体结构(这正是第 3 章那条 key observation 的图示依据:低级别的大高斯在远处给出的细节与高级别的小高斯差不多)。不要把它读成「五张图的画质排名」:它的用途是证明每一级各自成立,不是证明满级最好。③对照:与图 6-1 连起来读,那一张把「低级别够不够用」换成与 Octree-3DGS 的硬对照(带 #G's 占比与 SSIM);与表 6-1 连起来读,那一张把同样的两级结构量成 PSNR 与 GB;与表 10-1 连起来读,那一张给出单级与跨级的实际帧率与高斯数。④落点:这张图承载的是「每一级都独立可用」这条地基的第一处直接证据;它与表 6-1 是同一件事的定性面与定量面。图内标签之外不逐格读值。
来源:FLoD(ACM Trans. Graph. 44(4) · arXiv:2408.12894v2 · Yunji Seo et al.)· 图 5(p.5)· 未修改引用(原样引用,署名保留)
再看与最像的那条竞品逐级对照,这一张才是硬证据。 图 6-1 把 FLoD-3DGS 与 Octree-3DGS 在同一数据集(DL3DV-10K)上的每一级摆在一起,每一格同时给出高斯数与相对满级的百分比、以及 SSIM[图 6-1, p6]。原文给的读数是:FLoD-3DGS 五级为 7K(0.7%)/0.56、18K(2%)/0.70、223K(22%)/0.88、475K(47%)/0.93、1015K(100%)/0.96,Octree-3DGS 五级为 25K(9%)/0.40、119K(17%)/0.56、276K(39%)/0.68、560K(78%)/0.83、713K(100%)/0.92[§6.2.1, p6;图 6-1]。
这十个数字要按两条线读。 第一条是同一级上的 SSIM:五级全部是 FLoD 更高(0.56 对 0.40、0.70 对 0.56、0.88 对 0.68、0.93 对 0.83、0.96 对 0.92)。第二条是达到同一 SSIM 需要多少高斯:Octree-3DGS 第 4 级的 SSIM 是 0.83、用了 78% 的高斯;FLoD-3DGS 第 3 级就已经到 0.88、只用 22% 的高斯。第二条线比第一条更能说明问题:它说明本篇的低级别在同显存下画质更高,并非只是「凑合能用」。
Octree-3DGS 的低级别为什么塌,原文给了机制上的解释。 作者写:在较低级别(例如第 1、2、3 级)上,Octree-3DGS 会出现结构破碎(原文举的例子是亭子这种结构)以及由非常细长的高斯造成的锐利伪影;而 FLoD-3DGS 则在每一级上都保住了整体结构、并给出了与该级相称的细节[§6.2.1, p6]。「细长高斯」这个词要划下来:它正好是第 4 章那条尺度的反面,本篇用 s_min^(l) 把低级别的高斯撑得足够大,于是它们不会退化成薄片;而缺少这类限制的做法,在低级别上就只能拿细长的高斯去凑覆盖。
还有一个数字要单独说,因为它容易被误读。 作者指出 FLoD-3DGS 在第 1/2/3 级只用了满级高斯数的 0.7%/2%/22%,并据此说「能造出显存需求跨度很大的级别表示」[§6.2.1, p7]。这三个百分比的分母是「自己满级的高斯数」(1015K),不是对手的高斯数;同样地,图 6-1 里 Octree-3DGS 那一栏的 9%/17%/39% 也是它自己满级的比例(713K)。两套百分比不能直接比大小:要比就比绝对数(7K 对 25K、18K 对 119K、223K 对 276K)。站内正文按绝对数写。
这一章末尾要把一处「排除」写清楚,否则读者会以为作者漏了对手。 原文明确说:这次比较把 Hierarchical-3DGS 排除在外,因为它不是为「用特定级别渲染」设计的;对于想看的读者,作者在附录 C 里补了 Hierarchical-3DGS 与 Octree-3DGS 用单级高斯的渲染结果[§6.2.1, p7]。这条声明与第 2 章那句话(Hierarchical-3DGS 没有「单级渲」的概念)是同一件事的两处表述,站内要把它们对上。
#G's 指高斯数量,其后的百分比表示该级所用高斯数相对满级(第 5 级)的比例。图内可辨认的读数包括 FLoD-3DGS 一行的 #G's: 7K(0.7%) SSIM: 0.56/18K(2%) / 0.70/223K(22%) / 0.88/475K(47%) / 0.93/1015K(100%) / 0.96,以及 Octree-3DGS 一行的 25K(9%) / 0.40/119K(17%) / 0.56/276K(39%) / 0.68/560K(78%) / 0.83/713K(100%) / 0.92;另标有 level 1…level 5 (Max)。②读法(怎么读):按两条线读:一是同一级上的 SSIM(五级 FLoD 全高),二是达到同一 SSIM 需要多少高斯(Octree-3DGS 的第 4 级 SSIM 0.83 用 78% 的高斯,FLoD-3DGS 的第 3 级 SSIM 0.88 只用 22%): 第二条更能说明问题。百分比的分母是各自的满级(FLoD 是 1015K、Octree 是 713K),两套百分比不能直接比大小,要比就比绝对数。③对照:与图 5-1 连起来读,那一张是同一件事的定性面;与表 10-1 连起来读,那一张给出自己各级的高斯数与帧率;与图 15-1 连起来读,那一张补上 Hierarchical-3DGS 的单级渲染(本篇正文这次对照把它排除了,理由是它没有「用特定级别渲染」的设计)。④落点:这张图承载的是第 3 章那条观察的硬证据(低级别够用),也是第 9 章那笔效率账的前置:只有先证明低级别画质站得住,谈「跨级挑着用省显存」才有意义。图内标签之外不逐格读值。
来源:FLoD(ACM Trans. Graph. 44(4) · arXiv:2408.12894v2 · Yunji Seo et al.)· 图 6(p.6)· 未修改引用(原样引用,署名保留)
9选择性渲染的效率账与接缝
第 8 章证明了「低级别能用」,这一章要回答第二个问题:「跨级挑着用」比「降一级」划算吗? 这是一笔需要与竞品对读的账,而读之前还得先做一次「公平化」。这一章的五张图分成三组:一张与 Hierarchical-3DGS 的正面对照(图 7-1),两张把对照扩到更多数据集与更多档位(图 9-1 是曲线,图 16-1 换数据集),一张是公平化的前置(图 18-1),最后一张是反例(图 19-1)。
先说这笔账怎么量。 作者选的对手是 Hierarchical-3DGS,理由写得很明确:它的渲染方式是按目标粒度 τ 从层级里挑高斯,这与本篇按屏幕尺寸阈值 γ 在级别区间上挑高斯在形式上接近[§6.2.2, p7]。「形式接近」这四个字是选它的原因:只有挑一个机制上最像的对手,比较才有意义。
账本上要摆四行读数,其中两行是关键。 图 7-1 给出的是 Mip-NeRF360(garden 场景)上的显存–画质取舍,读数可以整理成两组:Hierarchical-3DGS 在 τ = 120/30/15/0 四档上是 3.53GB(79%) / PSNR 20.98、3.72GB(83%) / 23.47、4.19GB(93%) / 24.71、4.46GB(100%) / 26.03;FLoD-3DGS 在「3+2+1/4+3+2/5+4+3/单级 5」四档上是 0.73GB(29%) / 24.02、1.29GB(52%) / 26.23、1.40GB(57%) / 26.71、2.45GB(100%) / 27.64[图 7-1, p6]。
把这两组对齐读,结论有两层。 第一层是同 PSNR 下显存更低:FLoD-3DGS 用 1.40GB(57%) 拿到 26.71,而 Hierarchical-3DGS 用 4.46GB(100%) 只拿到 26.03:后者的满配还不如前者的中档。第二层更值得注意:Hierarchical-3DGS 把 τ 调大,显存几乎不降(从 100% 到 79%,只省了两成),而 FLoD-3DGS 从满配到最低档能压到 29%。原文给的解释很具体:在 Hierarchical-3DGS 里,τ 变大虽然让用于渲染的高斯变少,但显存没有明显下降:因为在作者按发布代码做评测的方式下,它把所有层级的全部高斯都加载进了 GPU[§D, p14]。这一句要读准:它指的是「对手的实现方式决定了 τ 省不了显存」,而不是「对手的方法差」:这也是为什么本篇要在 G_sel 上做文章(第 7 章那两种造法)。
画质那一侧也有数字要记。 原文在正文里举了两个例子:选择性使用第 5、4、3 级,相比只用第 5 级能把显存降到约一半,而 PSNR 下降不到 1;选择性使用第 3、2、1 级则把显存降到约 30%,PSNR 下降约 3.6[§6.2.2, p7]。这两个数与图 7-1 的读数是对得上的(1.40GB/2.45GB ≈ 57%,PSNR 27.64 → 26.71 = −0.93;0.73GB/2.45GB ≈ 30%,27.64 → 24.02 = −3.62)。所以「跨级挑着用」的账是:拿三成的显存,付三点六的画质;或者拿一半的显存,付不到一点画质。 站内直接按这两个区间写。
Hierarchical-3DGS 侧为 τ=120 memory:3.53GB(79%) PSNR: 20.98、τ=30 3.72GB(83%) / 23.47、τ=15 4.19GB(93%) / 24.71、τ=0 (Max) 4.46GB(100%) / 26.03;FLoD-3DGS 侧为 level{3,2,1} 0.73GB(29%) / 24.02、level{4,3,2} 1.29GB(52%) / 26.23、level{5,4,3} 1.40GB(57%) / 26.71、level5 (Max) 2.45GB(100%) / 27.64。②读法(怎么读):按「同一 PSNR 上谁的显存低」读:FLoD-3DGS 的中档(57%)拿到 26.71,而 Hierarchical-3DGS 的满档(100%)只有 26.03;另注意后者把 τ 调大时显存几乎不降(100%→79%),原因是按发布代码评测时它把全部层级都装进了 GPU。不要把它读成「对手的方法差」:这是实现方式带来的口径差,第 9 章的正文要把这一层说出来。③对照:与表 12-1 连起来读,那一张是同样的对照换到 Small City 场景(并引入 per-view);与图 9-1 连起来读,那一张把取舍画成两条曲线;与图 18-1 连起来读,那一张是本次公平比较的前置动作。④落点:这张图承载的是选择性渲染那条主线的核心读数,它同时给出「同 PSNR 省显存」与「降档省显存」两面;读它的时候要把百分比的分母记住:分母各自是自己的 Max 设置,不是同一个绝对值。图内标签之外不逐格读值。
来源:FLoD(ACM Trans. Graph. 44(4) · arXiv:2408.12894v2 · Yunji Seo et al.)· 图 7(p.6)· 未修改引用(原样引用,署名保留)
第二条证据是一条曲线,它把「档位」这件事画成了趋势。 图 9-1 在 Mip-NeRF360 上画了两条曲线:PSNR 对显存、以及 PSNR 对帧率;FLoD-3DGS 侧测的是「单级 5」与三组选择性渲染(5+4+3、4+3+2、3+2+1);Hierarchical-3DGS 侧则把它 τ = 0, 6, 15, 30, 60, 90, 120, 160, 200 九档全测了一遍[§6.2.2, p7;图 9-1]。
原文对这条曲线的读法写得很清楚,而且是一句「方向性」的判词。 结论是:在相同 PSNR 下比较时,FLoD-3DGS 一致地用更少的显存、并且拿到更高的 fps;更重要的是趋势的形状:随着 PSNR 下降,FLoD-3DGS 的显存下降得更陡、fps 上升得更多[§6.2.2, p7]。「更陡」这两个字是这条曲线相对图 7-1 的增量:图 7-1 只给了四个档位,这条曲线说明这种优势会随着降档而放大,不是某一档的巧合。站内按这个力度写:它是一条趋势判词,不是一条单点读数。
FLoD-3DGS 测「单级 5」与三组选择性渲染(5+4+3、4+3+2、3+2+1),Hierarchical-3DGS 测 τ = 0, 6, 15, 30, 60, 90, 120, 160, 200 九档。②读法(怎么读):按「同一 PSNR 竖着比」读:原文的判词是相同 PSNR 下 FLoD-3DGS 一致地用更少显存、拿到更高 fps;另外要看两条曲线的斜率差:原文说随着 PSNR 下降,FLoD-3DGS 的显存降得更陡、fps 升得更多。不要从这张图读出具体数值:曲线上的点是趋势,精确读数在表 12-1、表 10-1 那几张表里。③对照:与图 7-1 连起来读(那一张是同一数据集上的四档点值);与图 16-1 连起来读(同一套曲线换到 T&T 与 DL3DV-10K);与图 18-1 连起来读(公平化前置)。④落点:这张图承载的是「优势随降档而放大」这条趋势判词,它是选择性渲染那一侧最有说服力的一张;它不引入新读数,站内只引用趋势与原文的判词。图内标签之外不逐格读值。
来源:FLoD(ACM Trans. Graph. 44(4) · arXiv:2408.12894v2 · Yunji Seo et al.)· 图 9(p.7)· 未修改引用(原样引用,署名保留)
第三条证据是「换数据集再看一遍」,它回答的是覆盖面。 作者把同样的显存–画质取舍换到 Tanks&Temples 与 DL3DV-10K 上,做成了图 16-1(附录 D)[§D, p14]。它的用途与第 8 章那两张图的分工类似:正文给结论、附录给覆盖面。原文对这一处的判词是:图 16-1 的结果确认了 FLoD-3DGS 在各个数据集上都通过选择性渲染有效地平衡了显存与画质的取舍[§D, p14]。
第四条证据不在「结果」那一侧,而在「比较的公平性」那一侧,这一条最容易被漏读。 原文交代:为了让比较公平,作者在层级优化阶段把 Hierarchical-3DGS 的最大目标粒度 τ 扩到 200,目的是让它在大于默认设置的 τ 上也能有更好的渲染质量;并把这次调整的效果做成图 18-1[§6.2.2, p7;§D, p14]。图 18-1 给出的读数是:默认设置下三格的 PSNR 是 17.34/18.00/20.19,而把 τ_max 抬到 200 之后是 20.09/20.98/22.19[图 18-1, p14]。
为什么这一步必须写出来? 因为如果不做这次调整,本篇的对照就是拿自己调好的版本去比对手的默认设置:那样的「我们更好」没有意义。原文对这一处的定位也很清楚:这是一条为了公平比较而做的补强,补强之后本篇的优势仍然成立。站内要把这一层因果关系写出来,否则读者会以为对手本来就这么差。
Hierarchical-3DGS 用默认最大粒度 τ 训练与用 τ_max = 200 训练的对照,判词是用更大的 τ_max 训练能改善大 τ 值下的渲染质量。图内可辨认的读数:默认设置一组为 PSNR: 17.34/18.00/20.19,τ_max = 200 一组为 PSNR: 20.09/20.98/22.19(另外图内还有标为 max τ = 200 的一行标签与一处 PNSR: 18.00 的拼写笔误,照录不改)。②读法(怎么读):把它读成「前置动作」而不是「结果」:这一张要说明的是「作者在比较之前先补强了对手」,因此后续所有「我们更强」的读数都是在补强之后仍然成立的。不要把它读成本篇的收益:它量的是对手自己的进步。③对照:与图 7-1、图 9-1、图 16-1 连起来读(先看这一张再做比较);与 §D 的正文连起来读,那里交代了 τ_max 从默认的 15 抬到 200 的原因。④落点:这张图承载的是那条「公平比较」的口径;站内引用时要连原因一起写,不能只给数字。图内标签之外不逐格读值。
来源:FLoD(ACM Trans. Graph. 44(4) · arXiv:2408.12894v2 · Yunji Seo et al.)· 图 18(p.14)· 未修改引用(原样引用,署名保留)
最后一张是反例,它给的是本章那条判据的失效面。 前四张图都在说「判据好用」,图 19-1 给的是判据在什么条件下会露馅:它把 γ 调到 1、2、3 三档,在同一组级别(5、4、3)下,对 predetermined 与 per-view 两种 G_sel 造法各渲一组图[图 19-1, p14;§E, p14]。
这一张的读法要专门交代,因为它与前面四张的方向相反。 原文在附录 E 里给了机制解释:本篇选择性渲染的级别切换点在「下一级的二维投影尺度约束变成 1 个像素」的那个距离上(也就是默认的 γ = 1);而低级别的高斯可以被训得有很大的三维尺度,从而投出很大的二维 splat;这件事在某些距离上会发生,使得用更大 γ 时画面里出现可见的不一致[§E, p14]。翻译一下:判据是拿「一个像素」当地址的,而低级别高斯的实际投影尺寸并不总听这条判据的话:当投影出来的尺寸超过阈值所假设的量级时,切换就露缝。这是一处结构性代价,不是调参能消的:判据的形式(一条固定像素阈值)与低级别高斯的自由度(尺度无上界)之间本来就有张力。
有了图 19-1,第 7 章那条「γ 是允许降级的宽松度」就更清楚了。 γ 小的时候,判据要求「投影长度必须足够小才准降级」;一旦把 γ 放大(放宽降级条件),更多区域会提前降到低级别,而低级别大高斯的投影尺寸与阈值不匹配的地方就会显出来。所以「γ 调大省显存」这一侧的代价不是画质下降,而是『接缝』这种局部可见的错误。 原文把这一条放在附录 E 而不是正文,站内按「反例独立成节」放在下面。
γ 取 1、2、3 三档,并对 predetermined 与 per-view 两种 G_sel 造法各渲一组的对照;图内可辨认的行标签是 predetermined/per-view,列标签是 γ = 1/γ = 2/γ = 3,图中的红框标出的是「γ 变大之后不一致可见」的那块区域(这一条是图注原话)。②读法(怎么读):把它读成「失效面」而不是「成绩单」:它对照的是同一个方法的三个 γ 取值,看的是级别交界处是否出现可见的不一致。γ = 1 是原文的默认设置;γ 放大等于放宽降级条件,更多区域提前降到低级别,而低级别大高斯的二维投影尺寸与「1 像素」这条阈值不匹配的地方就露出来。不要在这一张上找胜负:它不参与与基线的比较。③对照:与第 7 章「γ 是允许降级的宽松度」连起来读(那里讲的是收益侧:γ 大 ⇒ 更省显存);与本章上面的图 7-1、图 9-1、图 16-1 连起来读(那三张是判据好用的证据,这一张是它的代价);与下面第一条局限连起来读(两条合起来才是选择性渲染的完整代价清单)。④落点:这张图承载的是那条「判据有失效面」的判词;站内按定性引用,只点红框所指的现象,不从中读数值。图内标签之外不逐格读值。
来源:FLoD(ACM Trans. Graph. 44(4) · arXiv:2408.12894v2 · Yunji Seo et al.)· 图 19(p.14)· 未修改引用(原样引用,署名保留)
边界与反例(五条)
第一条:per-view 的 G_sel 比单级渲染更费显存。 这一条是作者自己列进 §8 的:在长相机航迹的场景里,为了在选择性渲染期间维持一致的渲染质量,必须用 per-view 的高斯集;但这个做法有一个限制:[L_start, L_end] 区间内的全部高斯都得留在 GPU 内存里,才能保持快速的渲染;因此它比「只用区间端点 L_end 那一级」的单级渲染需要更多的内存[§8, p11]。作者给的方向是「从 CPU 往 GPU 搬高斯」的调度策略,并把它列为未来工作[§8, p11]。这一条要按原力度写:它不是实验里的一点噪声,而是 per-view 模式的固有代价。
第二条:γ 一大,级别交界处会出现可见接缝。 见上文图 19-1 与附录 E。判据固定在 1 像素,而低级别高斯的投影尺寸不受这个数字约束:这是一处结构性代价。
第三条:重叠剪枝的降幅,原文正文与表 6 对不上。 §6.6.3 的正文写「在第 1、2、3 级上分别减少 90%、34%、10%」[§6.6.3, p10],而表 12-3(原文 Table 6)给的三格是第 1 级 38K → 10K、第 2 级 49K → 31K、第 3 级 439K → 390K[表 12-3, p11]。按表算,降幅分别是 −73.7%/−36.7%/−11.2%:第 2、3 级与正文基本吻合,第 1 级对不上。站内两个读数都写出来并标明「原文正文与表 6 不一致」。
第四条:表 10-2 的表注写「7 scenes」,表头却列了 9 个场景名。 表注原文是 for 7 scenes from the Mip-NeRF360 dataset[表 10-2 的注, p15],而表头实际列出 bicycle/flowers/garden/stump/treehill(Outdoor)与 room/counter/kitchen/bonsai(Indoor)共 9 个。站内照录表注原文并点一句。
第五条:「93%」这类读数的口径要看清分母。 表 12-5 里的 93% 是存储盘占用的降幅(518 MB → 31.7 MB),不是显存;而表 12-4 里逐级比的是渲染显存(GB)。两个量在原文里分得很清,站内不能混写。同理,图 7-1、图 12-1 里的百分比,分母都是各自的「Max」设置,不是同一个绝对刻度。
10渲染选项全景:从 24GB 服务器到 2GB 笔记本
第 9 章量的是「跨级挑着用」相对「降一级」的账,这一章把镜头拉开,把全部档位摆在一张桌面上,并且把它们放到两台真实机器上去跑。这一章同时承担四件套里的两件:参数表(实现细节一次性列清)与伪代码(训练流程原样落块,见第 5 章末)。
先把三个概念分开,否则这一章的数字会糊在一起。 级别(level 1–5)决定「用哪一档表示」;渲染方式(单级/选择性)决定「只取一级还是取几级」;屏幕尺寸阈值 γ 决定「选择性渲染在什么距离上降级」。三个旋钮的作用域不同:级别动的是模型,方式与 γ 动的是运行期策略。
第一张表量的是三个旋钮里的两个:级别与方式。 表 10-1(原文 Table 2)是 Mip-NeRF360 上的取舍:行是六种设置(单级 5、5+4+3、单级 4、4+3+2、单级 3、3+2+1),列是 PSNR/SSIM/LPIPS/FPS/#G's[表 10-1, p8]。这张表有一处排版要说明:它的「Level」是五个子列(1..5),每一行用勾号标出用到哪几级:站内逐勾落位、不把这个勾号解释成等级区间[表 10-1, p8]。
表 10-1 单级与选择性渲染的取舍(原文 Table 2) (原文 Table 2, p.8 · 数值取原文文字层,逐格未改)
| Level | |||||||||
|---|---|---|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | PSNR | SSIM | LPIPS | FPS | #G’s |
| √ | 27.75 | 0.815 | 0.224 | 103 | 2189K | ||||
| √ | √ | √ | 27.33 | 0.801 | 0.245 | 124 | 1210K | ||
| √ | 26.67 | 0.764 | 0.292 | 150 | 1049K | ||||
| √ | √ | √ | 26.48 | 0.759 | 0.298 | 160 | 856K | ||
| √ | 24.11 | 0.634 | 0.440 | 202 | 443K | ||||
| √ | √ | √ | 24.07 | 0.632 | 0.442 | 208 | 414K |
这张表最该读出的一句话是:跨级挑着用比降一级更划算。 把六行按「用了几级」分成三对:单级 5(2189K/103 fps/27.75)对 5+4+3(1210K/124 fps/27.33):高斯数少了约 45%、帧率高了约 20%,而 PSNR 只掉 0.42;单级 4(1049K/150 fps/26.67)对 4+3+2(856K/160 fps/26.48):高斯再少 18%、帧率再高 7%,PSNR 掉 0.19;单级 3(443K/202 fps/24.11)对 3+2+1(414K/208 fps/24.07):几乎持平(PSNR 掉 0.04)。三对的方向一致:给定显存预算,「高级别打底 + 低级别兜远处」比「整体降一级」更省画质。这与第 3 章那条观察是同一件事的另一种表述。
第二张表把机器换掉,量的是「档位到不了的地方」。 图 8-1 是一位服务器(RTX A5000)与一台笔记本(MX250,2GB 显存)的逐档对照,六个档位的读数可以整理成三行:FPS(A5000/MX250)依次是 304/28.7、274/17.9、218/13.2、178/10.6、150/8.4、113/OOM;PSNR 依次是 22.9、23.0、25.5、25.8、26.4、26.9;显存依次是 0.61/0.76/0.81/1.27/1.21/2.06 GB[图 8-1, p7]。档位顺序是「单级 1/2/3/4/(5+4+3)/单级 5」。
这张图里最值钱的一格是那个 OOM。 原文交代:只用第 4 级渲染、或者用 5、4、3 级做选择性渲染,能取得与只用第 5 级相当的视觉质量,同时把显存降低约 40%;这一下降恰好避开了低成本 GPU(比如 MX250)在只用第 5 级渲染时会出现的 OOM 错误;此外用更低的级别做单级或选择性渲染还能提高帧率,从而在低成本设备上实现接近实时的渲染[§6.2.3, p8]。注意「相当的视觉质量」与「约 40%」这两个说法:它们把「降档」从一个妥协变成了一笔划算的交易,而这一笔交易能够成立,前提仍然是第 8 章那两张图(低级别够用)。
FPS: 304(A5000) 28.7(MX250)/274 / 17.9/218 / 13.2/178 / 10.6/150 / 8.4/113 / OOM(MX250),对应的 PSNR: 22.9/23.0/25.5/25.8/26.4/26.9 与 memory: 0.61GB/0.76GB/0.81GB/1.27GB/1.21GB/2.06GB;另标有 level 1…level 5、level {5,4,3}、FPS: 113(A5000) OOM(MX250) 等。②读法(怎么读):先找那个 OOM(只在笔记本、只在单级 5),再往左看:降一档或改成 5+4+3 都能跑起来,而 PSNR 从 26.9 只掉到 26.4 或 25.8:这一格是本篇全部主张的落点。不要把它读成「笔记本也能跑满级」:满级在笔记本上就是跑不了。③对照:与图 1-1 连起来读(teaser 是结论、这一张是分档明细);与表 10-1 连起来读(那一张给高斯数);与表 10-2 连起来读(那一张给笔记本上逐场景的 OOM 位置);与图 12-1、图 13-1、图 14-1 连起来读,那三张是消融。④落点:这张图承载的是「同一份模型横跨 24GB 到 2GB」这条主张的直接证据;占比、绝对值都要读,但注意这是单个数据集的读数(Mip-NeRF360 的场景)。图内标签之外不逐格读值。
来源:FLoD(ACM Trans. Graph. 44(4) · arXiv:2408.12894v2 · Yunji Seo et al.)· 图 8(p.7)· 未修改引用(原样引用,署名保留)
第三张表把 OOM 展开成逐场景的位置,它是这张章最实用的一张。 表 10-2(原文 Table 7,附录 G)是笔记本上 Mip-NeRF360 各场景的 FPS:行是六种级别设置,列是九个场景,格子里是帧率、叉号表示 OOM 无法测到帧率[表 10-2, p15]。
表 10-2 笔记本上的逐场景帧率(原文 Table 7,附录 G) (原文 Table 7, p.15 · 数值取原文文字层,逐格未改 · 叉号为原文的 OOM 标记 · 表注原文写 for 7 scenes,而表头实为 9 个场景,照录不改)
| Level | Outdoor | Indoor | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | bicycle | flowers | garden | stump | treehill | room | counter | kitchen | bonsai |
| √ | × | 6.52 | × | × | 5.77 | 5.54 | 6.00 | 3.99 | 7.48 | ||||
| √ | √ | √ | 5.10 | 8.81 | 6.92 | 8.48 | 8.33 | 6.27 | 6.58 | 4.20 | 8.69 | ||
| √ | 7.71 | 10.25 | 7.27 | 10.41 | 9.87 | 8.35 | 8.71 | 5.67 | 9.16 | ||||
| √ | √ | √ | 8.53 | 11.38 | 7.98 | 13.20 | 11.39 | 8.42 | 8.79 | 5.73 | 9.31 | ||
| √ | 9.21 | 15.00 | 13.54 | 18.19 | 12.97 | 9.67 | 11.65 | 10.44 | 11.68 | ||||
| √ | √ | √ | 9.34 | 15.60 | 13.98 | 20.92 | 13.77 | 9.72 | 11.73 | 10.49 | 11.85 |
这张表要按「找叉号」来读。 第一行(只用第 5 级)里有 三个叉号:bicycle、garden、stump 三个场景在 2GB 显存上直接跑不起来。原文对这一处的判词是:只用第 5 级做单级渲染会在某些场景(例如 stump)导致 OOM 错误;而改用 5、4、3 级的选择性渲染、或者换到更低的单级,就能解决这些错误;另外在某些场景(例如 bonsai)上,FLoD 能实现实时渲染[§G, p15]。「实时」这个说法要对着表核:bonsai 那一列最低一档是 11.85 fps,第一档是 7.48 fps:7–12 fps 这个量级在正文里被原文称作"实时",站内照录这一栏数字、把量级留给读者判断,不替原文改词。
按叉号往下看,还能读出一条不太显眼的信息:OOM 与场景类型有关。 三处 OOM 出现在 Outdoor 组(bicycle/garden/stump),而 Indoor 组的四个场景一档都没崩(最低 3.99 fps)。这与场景规模是吻合的:室外无界场景的高斯数更多。这一条是站内的读法,不是原文的论断,正文按「从表里能看出」的力度写。
这一章还要把「省」的来路拆成三笔账,因为它们经常被混成一句「更快更省」。 第一笔是少渲高斯:省的是渲染时间(表 10-2 里同一场景从上往下走,帧率单调上升,而级别在降低);第二笔是跨级挑着用:省的是显存(表 10-1 与图 7-1 里 #G's 与 GB 双降);第三笔是换成低级别:两者都省。三笔账的代价也不同:第一笔付的是画质(同一档里跨场景不可比,但同一场景降级要付 PSNR),第二笔付的是切换接缝的风险(第 9 章那条反例),第三笔付的是画质大幅下降(单级 3 相对单级 5 掉 3.64)。
实现细节(四件套 · 参数表)
把这套方法复现出来需要的常数,原文交代得很细,值得一次列清。 下列全部出自 §6.1.4[§6.1.4, p5–p6]。
| 项 | 取值 |
|---|---|
| 主干预设 | FLoD-3DGS 建立在 3DGS 框架之上;硬件为单卡 NVIDIA RTX A5000 24GB |
| 级别数 | L_max = 5(原文说明:L_max 可按目标调整,对渲染质量影响很小) |
| 各级训练迭代数 | 第 1–5 级分别为 10,000 / 15,000 / 20,000 / 25,000 / 30,000(最高级与主干一致,低级别因收敛更快而更少) |
| 密度控制窗口 | 第 1–5 级分别为 5,000 / 6,000 / 8,000 / 10,000 / 15,000 次迭代(含增密、剪枝、重叠剪枝、不透明度重置) |
| 增密间隔 | 第 1–5 级分别为 2,000 / 1,000 / 500 / 500 / 200 次迭代(主干取 100;本篇取更长,为的是让高斯在被增删之前有更多优化时间) |
| 重叠剪枝频率 | 每 1,000 次迭代跑一次,所有级别都跑,唯独最高级不跑 |
| 尺度约束常数 | 初始约束 λ = 0.2、缩放因子 ρ = 4(原文说明:该组合在多数场景上能有效区分五个级别的细节;场景更小或低级别需要更高细节时,λ 可以进一步减小) |
| 大高斯处理 | 不做原版 3DGS 那种「周期性移除过大高斯或投影尺寸过大的高斯」(因为本篇不设尺寸上界) |
| 损失 | L1 + SSIM,各级一致,与主干相同 |
| 选择性渲染默认 | 默认使用 predetermined 高斯集;屏幕尺寸阈值 γ = 1.0 |
| 数据集 | 共 15 个真实场景:Tanks&Temples 2 个、Mip-NeRF360 7 个、DL3DV-10K 6 个 |
这张表里有两处值得单独点出来。 第一处是「增密间隔比主干长」这件事:主干取 100、本篇最低取 200、最高取 2,000,原文给的理由是让高斯在新高斯加入或现有高斯被移除之前有更多优化时间[§6.1.4, p5]。这一处与「不设尺寸上界」是配套的:因为允许大高斯存在,密度控制就不能太频繁,否则刚长出来的大结构会被反复打断。第二处是 λ 的可调性:原文明确说更小的场景或需要在低级别保留更多细节时,λ 可以进一步减小[§6.1.4, p5]。这是一个诚实的旋钮说明:它承认这套参数需要按场景量级微调,谈不上万能。
这一章末尾要给一张「怎么挑档」的对照,这才是读者真正要的东西。 把全部读数收拢:只想最高画质,用单级 5(在 2GB 设备上会 OOM);显存紧一档,用 5+4+3(显存约一半、PSNR 掉不到 1);要跑在笔记本上,用单级 4 或 5+4+3(避 OOM、帧率 8–11 fps);要接近实时,用 3+2+1 或更低(帧率 9–21 fps,代价是 PSNR 掉到 24 附近)。这张对照是站内按原文读数整理的,原文里没有这张表:四档的每一个数都能在上述图表里找到出处。
11满级渲染:与基线摆在同一张表里
第 10 章讲的是「同一份资产横跨多档硬件」,这一章要回答一个更朴素的问题:如果只用一个档,就是最高档,它够不够与别人比? 因为一份表示如果只在低档上有优势、满档却打不过别人,那它的定位就只能是「一个降级方案」,而不是「一个可以替代的表示」。这一章用四张图表回答这一条。
先看表,它的结构要先交代清楚。 表 11-1(原文 Table 1)是三个数据集 × 三项指标的九格布局:列头第一行是数据集 Mip-NeRF360/DL3DV-10K/Tanks&Temples(各跨三列),第二行是 PSNR↑/SSIM↑/LPIPS↓;行是五条方法:3DGS、Mip-Splatting、Octree-3DGS、Hierarchical-3DGS 与 FLoD-3DGS[表 11-1, p8]。表注里还有一条口径:FLoD-3DGS 与 Hierarchical-3DGS 用的是能产生最好画质的渲染设置,而最优结果用粗体标出[表 11-1 的注, p8]。
表 11-1 满级(第 5 级)与五条基线的九格对照(原文 Table 1) (原文 Table 1, p.8 · 数值取原文文字层,逐格未改 · 表注:粗体为最优结果)
| Mip-NeRF360 | DL3DV-10K | Tanks&Temples | |||||||
|---|---|---|---|---|---|---|---|---|---|
| PSNR↑ | SSIM↑ | LPIPS↓ | PSNR↑ | SSIM↑ | LPIPS↓ | PSNR↑ | SSIM↑ | LPIPS↓ | |
| 3DGS | 27.36 | 0.812 | 0.217 | 28.00 | 0.908 | 0.142 | 23.58 | 0.848 | 0.177 |
| Mip-Splatting | 27.59 | 0.831 | 0.181 | 28.64 | 0.917 | 0.125 | 23.62 | 0.855 | 0.157 |
| Octree-3DGS | 27.29 | 0.815 | 0.214 | 29.14 | 0.915 | 0.128 | 24.19 | 0.865 | 0.154 |
| Hierarchical-3DGS | 27.10 | 0.797 | 0.219 | 30.45 | 0.922 | 0.115 | 24.03 | 0.861 | 0.152 |
| FLoD-3DGS | 27.75 | 0.815 | 0.224 | 31.99 | 0.937 | 0.107 | 24.41 | 0.850 | 0.186 |
读这张表的第一条规矩:先数「九格拿下几格」。 按每一格的最优值来数:Mip-NeRF360 的 PSNR 归 FLoD-3DGS(27.75),SSIM 归 Mip-Splatting(0.831),LPIPS 归 Mip-Splatting(0.181);DL3DV-10K 三项:PSNR 31.99、SSIM 0.937、LPIPS 0.107:全部归 FLoD-3DGS;Tanks&Temples 的 PSNR 归 FLoD-3DGS(24.41),SSIM 归 Octree-3DGS(0.865),LPIPS 归 Hierarchical-3DGS(0.152)。合计五格。 原文自己的措辞也正好落在这个力度上:FLoD-3DGS 在 Mip-NeRF360 与 Tanks&Temples 上表现得有竞争力,而在 DL3DV-10K 上在所有重建指标上都超过了全部基线[§6.3, p8]。
站内必须把另外四格写出来,否则「有竞争力」会被读成「全面领先」。 具体是:Mip-NeRF360 这一列的 SSIM 与 LPIPS 上,Mip-Splatting 是双料最好(0.831/0.181),而 FLoD-3DGS 的 LPIPS 是 0.224:不仅不如 Mip-Splatting,还略差于 3DGS 的 0.217 与 Octree-3DGS 的 0.214;Tanks&Temples 那一列的 SSIM(0.865)与 LPIPS(0.152)分别归 Octree-3DGS 与 Hierarchical-3DGS,而 FLoD-3DGS 的 LPIPS 是 0.186,是这一列里最差的。这一处不能含糊:一篇讲「适配多档硬件」的论文,其满级的观感指标(LPIPS)在三个数据集里有两个不是最好,这是读数本身的形状,正文要照实写。
第二条规矩:同一方法不要跨数据集横比。 三个数据集的难度差异极大(Tanks&Temples 是真实室内外、Mip-NeRF360 含无界场景、DL3DV-10K 有大量远景物体),所以合法比较是「同一列里往下看」。表 11-1 里最醒目的跨列现象:DL3DV-10K 那一列的 PSNR 普遍高于另外两列(30.45/31.99 对 27 上下),反映的是数据集难度,不是方法变好了。
第三条规矩:这张表里 FLoD-3DGS 只用了一档,而基线用的是各自最好的那一档。 表注写明这一点[表 11-1 的注, p8]。这条口径很要紧:本篇的满级只是五档里的一个,而对手(例如 Hierarchical-3DGS)用的是它最贵的设置;所以这一表对本篇是「以一对多」的不对称比较,而结论仍然只有「有竞争力」,这个力度是恰当的。
为什么远景区画得更好:这一条要按「两半」写。 原文在 §6.3 里专门开了一节 Discussion on rendering quality improvement,并写了:FLoD-3DGS 在渲染高质量远景区域上特别强,这带来了 DL3DV-10K 上的高 PSNR,因为那个数据集含大量远景物体;推动这一改善的,是与原始 3DGS 的两处关键差别:去掉了「剪掉大高斯」这一步,以及引入了 3D 尺度约束[§6.3, p8]。
这两半缺一不可,原文对第二半的解释尤其值得抄下来。 第一半:原版 3DGS 在训练期间会剪掉大高斯,这一剪让远处的背景(例如天空与建筑)被错误地用近处的小高斯渲出来,从而破坏场景结构;仅去掉这一剪就能缓解问题、提高画质[§6.3, p8]。第二半:但只去掉剪枝不足以保证高斯被放对位置,不同深度上的高斯尺寸不一,会让几何不准;而 3D 尺度约束解决的就是这一件事:它先把高斯约束得比较大,于是位置放错的高斯会承担更大的损失,从而被纠正或剪掉;训练过程中增密会在已有高斯附近加入新高斯,于是几何随训练推进被保住[§6.3, p8]。这两段解释的是同一件事的两层:去掉一个错误的操作(剪大高斯),再加一条正确的约束(尺度下限)。
3DGS/3DGS w/o large G pruning/FLoD-3DGS。②读法(怎么读):它是一张三列递进的图,要按列读而不是按行读:第一列是原版 3DGS(红框里的远景被小高斯错渲)→ 第二列只去掉大高斯剪枝(问题缓解但几何仍不准,即蓝框)→ 第三列本篇(放正)。不要把它读成「本篇只需少做一件事」:两处差别缺一不可,正文要把两层原因分开写。③对照:与表 11-1 连起来读(那一张给出「在 DL3DV-10K 上三项全胜」的读数,这一张给出机制);与图 5-1、图 6-1 连起来读(低级别的画质);与图 12-1 连起来读(尺度约束的消融);与图 14-1 连起来读(重叠剪枝的消融)。④落点:这张图承载的是「为什么在远景区更强」这条机制主张;它是表 11-1 里 DL3DV-10K 那一列的解释,也是第 4 章那条「只有下限、没有上限」的兑现处。图内标签之外不逐格读值。
来源:FLoD(ACM Trans. Graph. 44(4) · arXiv:2408.12894v2 · Yunji Seo et al.)· 图 10(p.8)· 未修改引用(原样引用,署名保留)
第二个证据是定向对照:与两条 LoD 竞品的单级渲染正面比一次。 图 15-1(原文 Fig. 15,附录 C)把 Octree-3DGS 与 Hierarchical-3DGS 用「某一层高斯」渲出来的结果放在一起[图 15-1, p13]。这张图的来路要交代清楚:正文在 §6.2.1 做逐级对照时明确把 Hierarchical-3DGS 排除在外(它的设计里没有「用特定级别渲」这件事),但作者在附录 C 里补了一组:从它的 22 个层级中挑出五个级别(1/6/11/16/22)来渲[§C, p14]。所以这一张的读法是「补白」而不是「正面对照」:它回答的是「如果硬要让它按级别渲,会是什么样」。
Hierarchical-3DGS 不支持用单个层级的高斯渲染(这一点与 FLoD-3DGS、Octree-GS 不同),因此在 §6.2.1 的单级对照里被排除;为了补充信息,作者从它 22 个层级中挑了 1/6/11/16/22 五个层级来渲,结果放在这一张的下排。②读法(怎么读):把它当「补白」读,不是当选手的正面比较读:Hierarchical-3DGS 在这里被强行按级别渲,渲出来的东西不代表它在自己设计用途下的表现。③对照:与图 6-1 连起来读(那一张才是正文的正面对照,对手是 Octree-3DGS);与第 2 章那条「Hierarchical 没有单级渲的概念」连起来读。④落点:这张图承载的是「本次对照把谁排除、为什么排除、以及补了什么」这条口径;站内引用时要把排除理由一并写出。图内标签之外不逐格读值。
来源:FLoD(ACM Trans. Graph. 44(4) · arXiv:2408.12894v2 · Yunji Seo et al.)· 图 15(p.13)· 未修改引用(原样引用,署名保留)
第三个证据是覆盖面:三个数据集上的定性对照。 图 17-1(原文 Fig. 17,附录 F)把 FLoD-3DGS 与基线在三个真实数据集上的渲染结果并排给出,图注写明红框用来强调关键差别、并请读者放大看[图 17-1, p14]。原文在附录 F 里的判词有两条,第二条比第一条更有信息量:FLoD-3DGS 更准确地重建了薄结构(thin details)与远景物体,或者至少与基线相当;而且:虽然 Hierarchical-3DGS 也能处理好远景物体,但它是从一个外部模型获取深度信息的,而 FLoD-3DGS 是在没有额外监督的情况下训练的[§F, p15]。后半句是一处很实的对照:它说明同样的「远景画得好」在两条路线上来源不同,一条靠外部深度先验,一条靠表示本身。
Hierarchical-3DGS 的远景能力来自外部模型的深度信息,而本篇没有额外监督。③对照:与表 11-1 连起来读(那一张给三个数据集的读数,这一张给观感);与图 15-1 连起来读(附录 C 的单级补白);与图 5-1、图 6-1 连起来读(低级别的画质)。④落点:这张图承载的是「满级在更多场景上也站得住」这条判词;它是表 11-1 的观感侧补充。图内标签之外不逐格读值。
来源:FLoD(ACM Trans. Graph. 44(4) · arXiv:2408.12894v2 · Yunji Seo et al.)· 图 17(p.14)· 未修改引用(原样引用,署名保留)
这一章的数据复核要留一处显式的复算,因为它是全篇最容易被读成「全面领先」的地方。 站内按九格逐格核了一遍:FLoD-3DGS 拿下 5/9 格;把「与最好值的差」算出来,Mip-NeRF360 的 LPIPS 差 0.043(0.224 对 0.181)、Tanks&Temples 的 LPIPS 差 0.034(0.186 对 0.152)、Tanks&Temples 的 SSIM 差 0.015(0.850 对 0.865)、Mip-NeRF360 的 SSIM 差 0.016(0.815 对 0.831)。四处差距都不大,但方向都是落后,正文按「四处小幅落后、五处领先」写。
12城市大场景、压缩对照、消融与局限
第 11 章证明了满级站得住,这一章把剩下的三块补齐:在难场景上会怎样(城市大场景与 per-view 的代价)、与其他压缩方法摆在一起是什么关系、以及三个机制各自的贡献(消融)。最后是作者自陈的局限,它同时也是本章的收口。
第一块:城市大场景,它把第 7 章那条取舍变成了可看的画面。 作者在 Small City 这个场景上做了评测(它来自 Hierarchical-3DGS 为评测收集的场景)[§6.5, p9]。问题出在 predetermined 的 G_sel 上,原文的解释很具体:predetermined 的高斯集会把更高级别的高斯分配在训练相机的平均位置附近、把低级别分配给更远的区域;于是当相机移动到这些外围区域时,画质就下降,因为低级别的高斯被光栅化在了近处[§6.5, p9]。
图 11-1 把这一点做成了左右对照。 图注写明:红框区域里,per-view 方法即便远离场景中心也维持了更好的渲染质量,而 predetermined 方法出现了画质下降[图 11-1, p9]。原文给的两句判词分别是:predetermined 的 G_sel 在相机远离中心位置时无法维持渲染质量;而用 per-view 的 G_sel 做选择性渲染能维持一致的渲染质量[§6.5, p9]。
predetermined/per-view/Furthest from center/Nearest to center。②读法(怎么读):按上下两行(离场景中心的远近)对照左右两列:predetermined 在「远离中心」那一行的表现是这张图要暴露的对象;per-view 的代价不在这张图上(它在显存与帧率上,见表 12-1)。③对照:与表 12-1 连起来读(那一张给出四行读数:PSNR/FPS/显存/高斯数);与图 4-1 连起来读(那一张是两种造法的几何示意);与 §8 的局限连起来读(per-view 必须留住整段高斯)。④落点:这张图承载的是「predetermined 有适用边界」这条判词,也是 per-view 这个方法存在的理由;站内要把它与表 12-1 的代价一起写。图内标签之外不逐格读值。
来源:FLoD(ACM Trans. Graph. 44(4) · arXiv:2408.12894v2 · Yunji Seo et al.)· 图 11(p.9)· 未修改引用(原样引用,署名保留)
而这次切换的代价,表 12-1 量得很齐。 表 12-1(原文 Table 4)给出五行四列:FLoD-3DGS (per-view)、FLoD-3DGS (predetermined)、Hierarchical-3DGS (τ=30)、FLoD-3DGS (max level)、Hierarchical-3DGS (τ=0),列是 PSNR↑/FPS↑/mem.↓/#G's↓[表 12-1, p9]。
表 12-1 Small City 上的四项读数(原文 Table 4) (原文 Table 4, p.9 · 数值取原文文字层,逐格未改)
| PSNR↑ | FPS↑ | mem.↓ | #G’s↓ | |
|---|---|---|---|---|
| FLoD-3DGS(per-view) | 25.49 | 221 | 1.03GB | 601K |
| FLoD-3DGS(predetermined) | 24.69 | 286 | 0.41GB | 589K |
| Hierarchcial-3DGS(𝜏=30) | 24.69 | 55 | 5.36GB | 610K |
| FLoD-3DGS(maxlevel) | 26.37 | 181 | 0.86GB | 1308K |
| Hierarchcial-3DGS(𝜏=0) | 26.69 | 17 | 7.81GB | 4892K |
这张表要分三段读,因为它其实装着两次比较。 第一段是自己两种造法的纵向比较:per-view 相对 predetermined,PSNR 从 24.69 涨到 25.49(+0.80),代价是 FPS 从 286 掉到 221、显存从 0.41GB 涨到 1.03GB(涨了 2.5 倍)。原文对这一段的判词是:相比使用 predetermined 的 G_sel,per-view 把 PSNR 提高了 0.8,但渲染更慢、显存需求更高;而变慢的原因是对每个视角都多了一步构造 G_sel 的处理[§6.5, p9]。+0.80 这个数与表里的 25.49 − 24.69 = 0.80 完全对上,是站内做数据复核时最容易核的一处。
第二段是与 Hierarchical-3DGS (τ=30) 的横向比较,而原文特意交代了比较的前提。 表注写明:上半部分是在各方法使用相近高斯数的条件下比较 FLoD-3DGS 的选择性渲染方法与 Hierarchical-3DGS (τ=30);并且本篇 per-view 与 Hierarchical-3DGS 的 #G's 取的是「高斯数最多的那个视角」,因为这个数在不同视角之间会变[表 12-1 的注, p9]。在这个前提下:PSNR 25.49 对 24.69、FPS 221 对 55、mem. 1.03GB 对 5.36GB、#G's 601K 对 610K:三项全胜,第四项(高斯数)基本持平。原文的结论句与此一致:两者都是为每一个视角构造 G_sel,但本篇取得了更快的 FPS、用了更少的渲染内存[§6.5, p9]。
第三段是「满配对满配」,这一段的结论是诚实的让步。 FLoD-3DGS (max level) 与 Hierarchical-3DGS (τ=0):PSNR 26.37 对 26.69(落后 0.32),FPS 181 对 17(快十倍以上),显存 0.86GB 对 7.81GB(约九分之一),#G's 1308K 对 4892K(约四分之一)。所以在纯画质的最高档上,本篇是输的;它换来的是十倍以上的帧率与近九分之一的显存。这一段要照实写:本篇的定位从来不是「满档画质最高」,而是「同一份资产能横跨多档」。
第三段的让步之外,原文还给了一句对 per-view 代价的总评,这句要照引。 原文写:尽管有这样的缺点(更慢、更费显存),per-view 的 G_sel 选择性渲染所换来的取舍被认为是合理的:因为它让渲染质量变得一致,并且比满级渲染更快[§6.5, p9]。作者还补了一句关于性能的说明:为了减轻渲染速度的下降,[L_start, L_end] 区间内的全部高斯都被留在 GPU 内存中[§6.5, p9–p10]。这两句合起来正是 §8 那条局限的推导过程:留在显存里是为了速度而付出的显存,这是一次有意为之的交换,而不是一个疏忽。
第二块:与压缩方法的关系是互补,不是竞争。 作者在附录 H 里把 FLoD 与 LightGaussian、CompactGS 摆在一起,并把它们的关系讲得很清楚:这两条方法也解决内存问题,但它们的主要目标是「做出一份存储体积小的压缩 3DGS」;而本篇是构造多级 LoD 表示,以便在渲染时适配不同的 GPU 内存容量;因为目的不同,正文里没有把它们直接放进主对照表[§H, p15]。
表 12-4 就是那次附录对照。 表 12-4(原文 Table 8)把 FLoD-3DGS 的第 5/4/3 级与 LightGS、CompactGS 摆在三个数据集上,列是 PSNR 与 mem.(GB)[表 12-4, p15]。
表 12-4 与两条压缩方法的对照(原文 Table 8,附录 H) (原文 Table 8, p.15 · 数值取原文文字层,逐格未改)
| Mip | DL3DV | T&T | ||||
|---|---|---|---|---|---|---|
| PSNR | mem. | PSNR | mem. | PSNR | mem. | |
| FLoD-3DGS(lv5) | 27.8 | 1.8 | 31.9 | 1.0 | 24.4 | 1.1 |
| FLoD-3DGS(lv4) | 26.6 | 1.2 | 30.7 | 0.6 | 23.8 | 0.6 |
| FLoD-3DGS(lv3) | 24.1 | 0.8 | 28.3 | 0.5 | 21.7 | 0.5 |
| LightGS | 26.6 | 1.2 | 27.2 | 0.7 | 23.3 | 0.6 |
| CompactGS | 26.8 | 1.1 | 27.8 | 0.5 | 22.8 | 0.8 |
这张表最该读出的一条是「档数」。 原文的判词是:FLoD-3DGS 以相近的 GPU 显存占用取得了更高的 PSNR;而且:与 LightGaussian 和 CompactGS 不同,FLoD-3DGS 支持多种显存占用设置,这说明它能适配一系列 GPU 配置[§H, p15]。看表可以核这句话:LightGS 与 CompactGS 各只有一行,而 FLoD-3DGS 有三行;且逐行比,FLoD-3DGS(lv4)(26.6/1.2/30.7/0.6/23.8/0.6)与 LightGS(26.6/1.2/27.2/0.7/23.3/0.6)在 Mip 那一格同 PSNR 同显存,但在 DL3DV 上是 30.7 对 27.2(大幅领先)、在 T&T 上是 23.8 对 23.3(小幅领先)。
第二张附录表做的是「把压缩方法接上来」,它才是这两条线真正的关系。 表 12-5(原文 Table 9,附录 I)是把 LightGaussian 的压缩方法应用到 FLoD-3DGS 上的结果:FPS/Size(MB)/PSNR/SSIM/LPIPS[表 12-5, p15]。原文对动机的交代是:FLoD-3DGS 能按需存储与渲染特定级别,但如果要保留「用全部级别渲染」这个选项,就需要相当多的存储盘空间;为此作者把 LightGaussian 的压缩方法整合进 FLoD-3DGS 来降低盘占用[§I, p15]。
表 12-5 把 LightGaussian 压到 FLoD-3DGS 上(原文 Table 9,附录 I) (原文 Table 9, p.15 · 数值取原文文字层,逐格未改)
| FPS | Size(MB) | PSNR | SSIM | LPIPS | |
|---|---|---|---|---|---|
| FLoD-3DGS | 103 | 518 | 27.8 | 0.815 | 0.224 |
| FLoD-3DGS+LightGS | 144 | 31.7 | 27.1 | 0.799 | 0.250 |
这一张的复算很干净,值得显式算一遍。 存储:518 MB → 31.7 MB,降幅 (518 − 31.7)/518 = 93.9%:与原文正文那句「把存储盘占用降低了 93%,并且提升了渲染速度」对得上(FPS 103 → 144);画质侧:PSNR 27.8 → 27.1(−0.7)、SSIM 0.815 → 0.799、LPIPS 0.224 → 0.250。原文对这一处代价的判词也很平:这个压缩带来了重建质量指标的下降,与原版 FLoD-3DGS 相比有损失,这与 LightGaussian 相对其基线 3DGS 表现出更低的重建质量是类似的[§I, p15]。这一句是本章「互补而非竞争」这条判词的兑现处:压缩方法的作用本来就落在存储那一侧,把它接上来会付画质,而它带来的 93% 存储降幅是本篇自己没有的能力。
第三块:三个机制的消融。 原文在 §6.6 里做了三组,每一组对应第 4、5 章的一条机制。
消融一:3D 尺度约束。 做法是训一组不施加尺度约束的:高斯不做任何尺寸限制地优化;并且这一组也不施加重叠剪枝:原文解释了原因,重叠剪枝的阈值 d_OP^(l) 是按尺度约束成比例调整的[§6.6.1, p10]。所以这一组消融实际量的是「尺度约束 + 重叠剪枝」这一对机制。 结果写在图 12-1(原文 Fig. 12)里:图注写明它对照的是第 2 级与第 5 级训完后、有/无尺度约束两种情况的渲染结果与高斯数,数据集是 Mip-NeRF360[图 12-1, p10]。
After level 2 training/After level 5 training/w/o scale constraint/w/ scale constraint;四格 #G's 读数为 246K/1085K/12K/1039K。②读法(怎么读):横着读「第 2 级对第 5 级」,竖着读「无约束对有约束」:要确认的是无约束那一组在第 2 级就已经把细节做满(因此第 2 级到第 5 级几乎没有区别),而有约束那一组两级之间有明显差别:这正说明尺度约束是把细节分到不同级别去的那只手。不要把这四格数字直接当成降幅:正文给的读数是「约少 98.6% 的高斯」,与这四格的对应关系站内照录在台账里(两处口径对不齐)。③对照:与图 10-1 连起来读(那一张解释尺度约束在几何摆放上的作用);与表 12-3 连起来读(那一张给逐级的高斯数);与表 12-2 连起来读(另一条机制:逐级训练)。④落点:这张图承载的是「尺度约束是分档的那只手」这条判词;它的证据形式是「两级之间的差别有无」,而不是单点数值。图内标签之外不逐格读值。
来源:FLoD(ACM Trans. Graph. 44(4) · arXiv:2408.12894v2 · Yunji Seo et al.)· 图 12(p.10)· 未修改引用(原样引用,署名保留)
这一组消融的读数,原文给了两句,第二句是全部消融里最醒目的一个数。 第一句:没有尺度约束时,第 2 级训完所恢复的细节量已经与满级相当;而施加尺度约束后,两级之间的细节差异变得清楚[§6.6.1, p10]。第二句:有尺度约束的那一组比无约束的那一组大约少用了 98.6% 的高斯[§6.6.1, p10]。98.6% 这个数要点出来看:它说明无约束那一组为了表达同样的细节而膨胀出了数量级更多的高斯:也就是说,尺度约束不只是「分档」,它同时是一道很强的正则。
消融二:逐级训练。 对照组的做法是:把每一级「专属优化」的那段迭代替换成含有额外增密与剪枝的迭代[§6.6.2, p10]。也就是说,对照组的每一级都在全程做密度控制,而不是像本篇那样先增密、再专门优化。结果见表 12-2(原文 Table 5)与图 13-1(原文 Fig. 13)。
表 12-2 逐级训练的消融:逐级画质(原文 Table 5) (原文 Table 5, p.10 · 数值取原文文字层,逐格未改 · LT 即 level-by-level training)
| Level | Training | PSNR↑ | SSIM↑ | LPIPS↓ |
|---|---|---|---|---|
| 5 | w/oLT | 31.20 | 0.930 | 0.158 |
| w/LT | 31.97 | 0.936 | 0.105 | |
| 4 | w/oLT | 29.05 | 0.896 | 0.161 |
| w/LT | 30.73 | 0.917 | 0.133 | |
| 3 | w/oLT | 27.05 | 0.850 | 0.224 |
| w/LT | 28.29 | 0.869 | 0.200 | |
| 2 | w/oLT | 23.41 | 0.734 | 0.376 |
| w/LT | 24.01 | 0.750 | 0.355 | |
| 1 | w/oLT | 20.41 | 0.637 | 0.485 |
| w/LT | 20.81 | 0.646 | 0.475 |
这张表要按「五级全胜、降幅递减」读。 五级的 PSNR 增益依次是 +0.77(第 5 级)、+1.68(第 4 级)、+1.24(第 3 级)、+0.60(第 2 级)、+0.40(第 1 级);SSIM 与 LPIPS 也全部往好的方向走。降幅的分布本身就是一条信息:增益在第 4 级最大、往低级别递减,这与第 5 章的解释吻合(初值处的尺度断层在「两级的尺度差最大」的地方影响最明显)。原文的结论句是:有逐级训练的那一组在 PSNR、SSIM 与 LPIPS 三项上跨所有级别都胜过无逐级训练的那一组;因此逐级训练对提升所有级别的重建质量都很重要[§6.6.2, p10]。
图 13-1 给的是这条消融的定性证据,而且它的判词指向一个具体的位置:中间级别。 图注写明这是在 DL3DV-10K 上、有/无逐级训练时各渲染图像的背景区域对照(图像被放大并裁切以突出差别)[图 13-1, p10]。原文的解释是:缺少逐级训练会在中间级别上造成重建结构的不准确,而这种不准确会被带到更高级别;反之,有逐级训练的那一组在第 3 级的结构重建更准确,从而带来第 4、5 级的重建质量改善[§6.6.2, p10]。「中间级别的误差会被带上去」是这条消融真正的机制:逐级训练是一条链,链上的每一环都用上一环的结果做初值,所以上一环的错会被继承。
w/o LT/w/ LT/level 1…level 5。②读法(怎么读):横向按级别扫一遍:要确认的是无逐级训练那一行在中间级别就已经不准(而不是只在某一级坏),因为它的结构误差会沿链传给高级别。不要只盯满级那一格:这条消融的核心证据在中间那两三级。③对照:与表 12-2 连起来读(那一张给出五级三指标的读数,与这一张一一对应);与图 12-1 连起来读(另一条机制:尺度约束);与第 5 章的式 5-1 连起来读(那一式就是「误差不往上传」的技术手段)。④落点:这张图承载的是「逐级训练保结构一致」这条判词,也是第 5 章那一步「消掉初值尺度断层」的动机所在。图内标签之外不逐格读值。
来源:FLoD(ACM Trans. Graph. 44(4) · arXiv:2408.12894v2 · Yunji Seo et al.)· 图 13(p.10)· 未修改引用(原样引用,署名保留)
消融三:重叠剪枝。 这一组的对照是在所有级别上训练,有无重叠剪枝[§6.6.3, p10]。定性证据是图 14-1(原文 Fig. 14),图注写明它是在 DL3DV-10K 上、第 5 级有无重叠剪枝的渲染对照,并说明放大的图像用来强调关键差别[图 14-1, p10]。原文的判词是:去掉重叠剪枝会让场景结构变差、渲染质量下降,而且这个问题在有远景物体的场景里尤其明显;作者对机制的判断是:重叠剪枝通过阻止远处大高斯之间的交叠,降低了产生伪影的可能[§6.6.3, p10]。
这一组还有一张表,而它正是那条「正文与表对不上」的读数所在。 表 12-3(原文 Table 6)给的是 Mip-NeRF360 上逐级的高斯数,有/无重叠剪枝各一行[表 12-3, p11]。
表 12-3 逐级高斯数:有/无重叠剪枝(原文 Table 6) (原文 Table 6, p.11 · 数值取原文文字层,逐格未改 · OP 即 overlap pruning · 注意:原文正文给出的降幅与这张表算出来的对不上)
| Level | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|
| w/oOP | 38K | 49K | 439K | 1001K | 2058K |
| w/OP | 10K | 31K | 390K | 970K | 2048K |
这张表要做的第一件事是复算降幅,而算出来的结果与原文正文不一致。 逐级算:第 1 级 38K → 10K,降幅 (38 − 10)/38 = 73.7%;第 2 级 49K → 31K,降幅 36.7%;第 3 级 439K → 390K,降幅 11.2%;第 4 级 1001K → 970K,降幅 3.1%;第 5 级 2058K → 2048K,降幅 0.5%。而原文正文写的是:重叠剪枝减少了高斯数量,尤其在低级别上,在第 1、2、3 级上分别减少 90%、34%、10%[§6.6.3, p10]。把两组对齐:第 2 级(36.7% 对 34%)与第 3 级(11.2% 对 10%)基本吻合,第 1 级对不上(表算 73.7%、正文说 90%)。站内的处理是:两个读数都写出来,标明「原文正文与表 6 不一致」,不替作者选一个,也不替读者圆场。
第 5 级那一格值得单独说,因为它是一条设计上的确认。 2058K → 2048K,降幅 0.5%:几乎没变。这与实现细节里的那条「重叠剪枝每 1,000 次迭代跑一次,唯独最高级不跑」完全吻合[§6.1.4, p5]。所以这一格要说成「高级别本来就没跑重叠剪枝」,谈不上「重叠剪枝在高级别没用」。 原文在正文里也点明了这个减少对低端设备的意义:这种减少对于「用低级别表示在低成本、低内存设备上渲染」时压缩内存占用尤其重要[§6.6.3, p10]。
w/ overlap pruning/w/o overlap pruning。②读法(怎么读):盯远处:原文说去掉重叠剪枝会让场景结构变差、渲染质量下降,而且在有远景物体的场景里尤其明显(DL3DV-10K 恰好以远景物体多为特点)。注意这一组消融的级别是第 5 级,而第 5 级在实现上并不跑重叠剪枝:也就是说,这一组比较的是「低级别跑重叠剪枝所带来的差异如何影响最终的满级表示」。③对照:与表 12-3 连起来读(那一张给逐级高斯数,并含那处正文与表格对不上的读数);与图 12-1 连起来读(另一条机制);与图 10-1 连起来读(大高斯在远景上的作用)。④落点:这张图承载的是「重叠剪枝压掉远处的高斯交叠伪影」这条判词;站内引用时要把「第 5 级本身不跑重叠剪枝」这条实现事实一并写出。图内标签之外不逐格读值。
来源:FLoD(ACM Trans. Graph. 44(4) · arXiv:2408.12894v2 · Yunji Seo et al.)· 图 14(p.10)· 未修改引用(原样引用,署名保留)
第四块:作者自陈的局限,这一条要照原文写、不许替它加。 原文的 §8 只有一段,讲的是同一件事:在相机航迹很长的场景里,为了在选择性渲染期间保持一致的渲染质量,必须用 per-view 的高斯集;但这个做法有一个限制:[L_start, L_end] 区间内的全部高斯都得留在 GPU 内存里,才能维持快速的渲染速率(原文指明这一条在第 6.5 节里讨论过);因此这个方法比「从区间里只取 L_end 那一级做单级渲染」需要更多的内存容量;作者给的未来方向是「从 CPU 往 GPU 搬运高斯」的策略规划与执行,用来在保住选择性渲染优势的同时减轻内存负担[§8, p11]。
这段局限的分量要读准:它不是「实验没做完」,而是「一处有意为之的交换」。 回看第 7 章:per-view 之所以更费显存,是因为为了速度而选择把整段留在显存里(表 12-1 里 per-view 的显存 1.03GB 对 predetermined 的 0.41GB);而这笔钱换来的是长航迹上的一致画质(25.49 对 24.69)与比 Hierarchical-3DGS 快四倍的帧率(221 对 55)。所以这一条局限的正确写法是:per-view 模式在「显存」与「一致性」之间选了后者,作者把这个选择记成了一处待解的问题。 站内按这个力度写,不把它润色成「略有不足」。
13贡献块
读到这里,方法、用法、账目都摆完了。这一章把原文在 §1 里列的三条贡献按「一条主张 + 一处机制 + 一串配套」重排一遍,并回答一个读论文时该问自己的问题:这三条里,哪一条是真的难?
第一条是主张:第一次按 LoD 的核心原则,为宽范围 GPU 设置提供可调选项。 原文的写法是:在把 LoD 与 3DGS 结合的前人工作中,FLoD 是第一个遵循 LoD 核心原则、为宽范围 GPU 设置提供可调选项的[§1, p1]。这句话的要害不在「多级」,而在两处限定:一是「核心原则」,也就是第 2 章复述过的那两条(按资源挑档、按区域挑档),而不是「顺手做了个金字塔」;二是「宽范围」,从 24GB 服务器到 2GB 笔记本,而不是在同一档硬件上做得更高效。第 2 章摆过的三条前人工作,各自缺的正是这两处限定里的一处:Octree-GS 的级别不独立(缺「可按档独立使用」),Hierarchical-3DGS 没有「用某一级渲」(缺「档」这个概念本身),CityGaussian 能挑级但没面向低端设备(缺「宽范围」)。
第二条是机制:三条都不复杂,但缺一不可。 它们分别是:级别专属的 3D 尺度下限(式 4-1、4-2,负责把细节分到不同级别)、逐级训练(式 5-1,负责让五级长成同一套结构)、重叠剪枝(式 5-2,负责压掉交叠伪影)。原文说这套方法「简单」,这句话是诚实的:三条机制各自都只有一两行式子,没有复杂的推导,也没有需要专门训练的模块[§4.4, p3]。但简单不等于可以省:第 12 章的消融逐条量过,去掉尺度约束,第 2 级就把细节做满(并连带关掉重叠剪枝);去掉逐级训练,中间级的结构误差会一路带到高级别;去掉重叠剪枝,远景结构变差。三条机制分别管「分档」「接上」「干净」,各司其职。
第三条是配套:两种用法、可换主干、能接压缩。 两种用法是单级渲染与选择性渲染(第 7 章、第 9 章、第 10 章);可换主干是把同一套机制接到 Scaffold-GS 上得到 FLoD-Scaffold(第 6 章);能接压缩是把 LightGaussian 压到 FLoD-3DGS 上,拿到 93% 的存储降幅(第 12 章)。这三件配套在原文的贡献列表里是一句话,但它们各自都有独立的证据:表 6-1 对应主干兼容,图 7-1、图 9-1 对应选择性渲染,表 12-4、表 12-5 对应压缩。
现在回答那个问题:哪一条最硬? 站内的判断是第一条,理由是它排在另外两条前面:机制那三条本身都不难(第二、三章摆过的那几族工作里,随手能做多级表示的不在少数),难的是「按硬件挑档」这件事本身没有被当成设计目标。原文用一段相当直接的论证说明了这处差别:直接限制高斯数量而不施加强度尺度约束,无法让每一级的表示具备受控的细节:因为局部区域可能取得比别处更高的细节,这种区域间的不均匀会让「把多个级别合起来做选择性渲染」在视觉上不一致、从而让这类渲染选项不可用;而尺度约束保证了每一级内部细节的均匀性,这正是视觉一致的选择性渲染与高效构造 G_sel 的前提[§B.3, p12]。
这段论证的价值在于它把「档」这个词的技术含义说清了。 一个「档」不是「高斯总数的多少」,而是「画面每一块地方能有多细」。数量是一个全局预算,压数量只能压总量、压不匀;尺度是局部约束,它才能保证同一档里近处与远处的细节比例是稳定的:而没有这种稳定性,「挑几级混着渲」这件事在画面上就站不住。这也是本篇与「压缩类」方法的根本分界:压缩关心的是「总共能存多小」,本篇关心的是「每一块地方细到什么程度、以及这件事能不能按硬件切换」。
---
14出处块
出处(四处互证)。 原文刊于 ACM Transactions on Graphics(TOG)第 44 卷第 4 期(August 2025),DOI 10.1145/3731430。站内据以引用的是 arXiv:2408.12894v2([cs.CV],2025-06-11 更新)。四处证据互相印证:PDF 首页印有 © 2025 Copyright held by the owner/author(s)./ACM 1557-7368/2025/8-ART/https://doi.org/10.1145/3731430;PDF 页脚逐页印 ACM Trans. Graph., Vol. 44, No. 4, Article . Publication date: August 2025.;摘要页的 Journal reference 与 Related DOI 给出同一卷期与同一 DOI;arXiv API 返回的 doi 字段与 alternate/related doi 链接也指向 10.1145/3731430。
两处原文侧的排印缺失照录不改。 页脚印的是 ACM Trans. Graph., Vol. 44, No. 4, Article . Publication date: August 2025.:Article 后面的文章号是空的(只剩一个点);首页的 ACM 1557-7368/2025/8-ART 同样在 ART 后缺号。这两处不是站内省略的,原文两处都是空的(这与本系列前一篇 ACM TOG 44(4) 的预印本情形一致,应是同一套模板在处理预印本时的固定行为)。站内不替原文补号,出处块按「Vol. 44, No. 4(August 2025)· DOI 10.1145/3731430」标注,并把这两处缺失照录在此。
许可:CC BY-NC-ND 4.0,判词是「可托管、可引用,不可改作、不可商用」。 两处证据互相印证:PDF 首页的权利块印着 This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License.;arXiv 摘要页的许可链接指向 http://creativecommons.org/licenses/by-nc-nd/4.0/。因此本篇的落点是三件(详情页 + 封面 + 原文 PDF 站内托管),卡片上的许可标为 CC BY-NC-ND 4.0、不带风险提示。
原文全文:站内托管 PDF(36.8 MB) · arXiv:2408.12894(canonical 版本) · DOI 10.1145/3731430(ACM 正式版)
ND 这一条有一个具体后果要写在明处:封面不得裁切。 本篇的封面取自原文的一幅渲染图块,站内按原生比例等比缩放、不做 cover 裁切:理由是切图属于对作品的改动,而 ND 的宽容只到「为行使许可所必需的技术性修改」、不含内容裁剪。这条是全站不裁切做法的一部分:站内的卡片容器本身是「纸面承托」(object-fit: contain),所以裁切只可能发生在生成封面文件的那一步,而这一步本篇显式地不做。
图与表:19 张图逐图署名、9 张表逐表说明,全部原样零加工引用。 19 张图一律按实测包围盒从原文 PDF 区域渲染导出,未裁切拼接、未加标注、未施滤镜,图注体例是原文的 Fig. N.;9 张表不以截图呈现,而是按原文文字层逐格取值后以 HTML 重排(每一张的数字 token 多重集都与原文一致,见台账),原始裁图只作核对凭据。两处排印现象在此说明:表 6-1 与表 12-4 的表头有一行在原文里被写成一串(PSNRmem.PSNRmem.PSNRmem.),实为六个子表头格,站内按字符级位置拆回;表 10-1 与表 10-2 的「Level」是五个子列,每行用勾号标出用到哪几级,站内逐勾落位、不解释成等级区间。
附图索引(9 个附录)。 原文的附录比本系列常见的前几篇都多,逐条列一下:A(数据集细节:A.1 Tanks&Temples/A.2 Mip-NeRF360/A.3 DL3DV-10K,p11–p12)|B(方法细节:B.1 训练算法即 Algorithm 1/B.2 3D 与 2D 尺度约束之别/B.3 尺度约束与数量约束之别,本站第 4 章、第 5 章引过其中两处,p12)|C(与竞品的单级渲染对照,即图 15-1,p12–p14)|D(选择性渲染对照,含图 16-1 与图 18-1,p14)|E(选择性渲染的不一致,即图 19-1,本站第 9 章那条反例,p14)|F(满级渲染的定性结果,即图 17-1,p15)|G(低配设备渲染,即表 10-2,p15)|H(与压缩方法的对照,即表 12-4,p15)|I(把 LightGaussian 压到 FLoD-3DGS 上,即表 12-5,p15)。
怎么读这篇。 如果只有十分钟,读三处即可:表 11-1(看满级够不够与基线比)+表 10-1(看跨级挑着用比降一级划算多少)+图 8-1(看那个 OOM 与它的邻居)。如果有一个小时,按第 3 → 4 → 5 → 7 章的顺序把机制读通:这四章一共只有八条式子,而每一条都只做一件事:定表示(式 3-1、3-2)、分档(式 4-1、4-2)、接上(式 5-1)、剪干净(式 5-2)、挑子集(式 7-1、7-2)。如果要做复现,先看第 10 章末的参数表,再看第 5 章末的伪代码,最后回第 4 章确认「只有下限、没有上限」这条,复现时最容易出错的地方是给高斯加上了尺寸上界,而这篇论文的全部收益有一半建立在「不设上界」之上。