用户指南

第 4 章 — 辅助窗口

除了主窗口(3D 视口加 Inspector)之外,RadianceKit 还管理着另外六个窗口,它们都可以通过帮助菜单打开。该菜单共有八个条目,从上到下依次是:User Guide (⌘?)、Keyboard Shortcuts (⌘/)、Open Training Logs… (⇧⌘L)、Open Exports Folder…、Manage Storage…、Pareto Dashboard… (⇧⌘D)、Holdout Analysis… (⇧⌘H)、BayesOpt Console… (⇧⌘B)。这两个「Open …」条目并不会打开 App 窗口,而是打开 Finder;因此本章不再对它们做进一步说明。其中三个窗口 — Dashboard、Holdout、BayesOpt — 是 独立的分析工具:它们与主窗口无关地运行,并在磁盘上读写 JSON 文件。这三个窗口都是通过帮助菜单打开的,打开后你需要自己 在窗口中选择要分析的文件或文件夹 — 通过「Open Reports Folder…」、「Open transforms.json…」 或「Start」按钮进行选择。这三个窗口是唯一未做本地化的部分:它们的 按钮、滑块和列标题在每种语言版本中都保持英文原样。因此本章中提到的这些 标签,你在屏幕上看到的会是完全相同的文字。

三个简单窗口(User Guide、Keyboard Shortcuts、Manage Storage)以及两个文件夹菜单项(Open Training Logs / Open Exports Folder)每个控件都配有一条简短说明。三个分析窗口 的文档则更为详尽 — 每个都配有一段引言,说明你在窗口中会看到什么、 什么时候应该打开它,以及该如何解读所显示的图像。

本章末尾有一个交叉引用小节,涉及主窗口的 Inspector:在训练进行过程中,你可以从实时 Loss 图表和 Gaussian 计数显示中读出哪些有意义的信息。

用户指南 (W1–W4)

User-Guide-Fenster mit Sidebar links und gerendertem Markdown-Inhalt rechts
用户指南窗口,左侧为侧边栏,右侧为渲染后的 Markdown 内容

这是什么: 一个内置的帮助窗口,用于渲染随应用一起提供的 guide_<sprache>.md。语言来自设置(General 选项卡 → Language),若该处设置为「系统」,则从 macOS 的语言偏好中推导得出。布局采用经典方式:左侧为包含所有标题的侧边栏,右侧为正文内容。

当你需要快速回忆某个单一要点时 — 也就是作为速查笔记的替代品。详尽的参考资料是本手册;内置的帮助窗口是用于快速查阅的简明版本。它会随每次应用发布同步更新,但内容保持得较为简略。

W1NavigationSplitView(侧边栏 + 详情)

位置

Help → User Guide (⌘?)。

技术细节

双栏布局,包含一个用于内容树的窄侧边栏 (至少 180 pt 宽)和一个用于实际 Markdown 内容的可滚动详情区域。窗口的 最小尺寸为 700 × 500 pt。首次打开时,窗口会 从应用包中加载对应的 guide_<lang>.md(回退为 guide_en.md),将其解析为若干块记录(标题 H1–H4、 段落、列表、表格、分隔线),并单独提取 标题结构用于侧边栏。行内格式(粗体、 斜体、代码片段)通过内置的 Markdown 引擎渲染。 语言从应用设置中读取,特殊情况是 简体中文(zh-Hans)和巴西葡萄牙语(pt-BR),它们 会保留为完整的 Locale 标签,因为这两个变体与 zh 或 pt 有所不同。

W2List(标题侧边栏)

位置

用户指南窗口的左栏。

技术细节

列出当前 Markdown 文档的所有 H2 和 H3 标题的列表。H2 条目不带缩进,以中等字重显示; H3 条目左侧缩进 16 pt,前景样式减弱。所有其他层级 — 无论是 H1 还是 H4 及更深层级 — 都不会出现在侧边栏中,因为这样会 使其显得杂乱。锚点 ID 通过对 标题文本进行 slug 化生成(转小写 + 空格替换为连字符 + 仅保留字母/数字/连字符 — 与 GitHub 用于其 Markdown 锚点的算法相同,因此指向文档的外部 URL 也有可能落到同一个锚点上)。该列表采用 原生 macOS 风格。

W3Button(标题 → 锚点跳转)

位置

每一行侧边栏都对应一个按钮。

技术细节

每个侧边栏条目都是一个按钮,点击后会设置 当前锚点,但外观上看起来像一个普通的列表项。一个 观察变量随后会触发滚动跳转到对应的 锚点,并伴有 0.3 秒的平滑动画。跳转完成后, 锚点值会被重置,以便下一次点击同一个锚点时 能再次触发(否则观察者不会再次触发,因为 该值没有发生变化)。

W4ScrollView(详情内容)

位置

右栏。

技术细节

可滚动、垂直堆叠的内容区域, 采用惰性渲染,因为较长的指南很容易超过 200 个 Markdown 块 — 若采用非惰性方案,则会同时实例化所有内容。每个 块都有自己的 ID,要么是标题锚点(每个标题 都会获得一个锚点,与层级无关),要么是索引占位符。 最大宽度为 720 pt,内边距为水平 32 / 垂直 24, 以便长文本行保持良好的可读布局。表格 按单元格渲染,使用水平堆叠和分隔线;行内 代码则通过内置的 Markdown 引擎渲染。真正的代码块目前 会被当作普通段落处理 — 这是帮助窗口 的一个已知限制。

键盘快捷键 (W5–W6)

Keyboard Shortcuts Fenster — fünf Gruppen Navigation/Views/Capture/Editor/Training mit Hotkey-Spalte links und Beschreibung rechts
键盘快捷键窗口 — 五个分组 Navigation/Views/Capture/Editor/Training,左侧是快捷键列, 右侧是说明

分为五个部分的静态参考列表。 Navigation: 鼠标拖拽(Orbit/Fly)、 Shift+Drag/Right-Drag(Pan)、Scroll(缩放)、WASD(飞行穿越移动)、 Q/E(上/下)、F(切换 Orbit/Fly)、双击(重新居中)、 Cmd+Scroll(调整视场角)。Views: R(重置相机)、T (自动旋转)、P(相机回放)、B(背景循环)、0–9 (跳转到训练相机 1=10%/5=50%/0=最后一个)、Left/Right Arrow (上/下一个相机)。Capture: S(截图到桌面)、V (转台视频)、C(复制相机信息)。Editor: Tab (编辑模式)、点击/拖拽(画笔选择)、Option+Click(取消选择)、 X / Delete(删除选区)、Cmd-Z(撤销上次删除)、 [ / ](画笔缩小/放大)、Esc(取消选区)。 Training: Option+Space(暂停/继续训练)、Cmd+E (导出场景)。这里没有更多内容 — 开始、取消以及 延长训练要通过训练菜单进行(第 1 章)。

这是什么: 一份简单的静态总览,列出所有快捷键 — Navigation、Views、Capture、Editor、Training。内容是固定内建的, 不会从文件中动态加载。

当你想找到在 Viewport 中做某事最快的方法时。 WASD 飞行穿越、R 重置相机、B 背景循环 — 都列在这里。

W5ScrollView(内容区域)

位置

Help → Keyboard Shortcuts (⌘/)。

技术细节

一个简单的滚动区域,里面是一个 纵向列表。四周留白 20 pt,没有 侧边栏导航树(列表足够短)。内容分为 五个部分(Navigation、Views、Capture、Editor、Training)。 每个快捷键组合占一行,两列都是可翻译文本。 左侧列(按键代码)固定宽度为 180 pt,使 右侧的说明保持纵向对齐。除了滚动之外没有其他交互 — 点击某一行不会触发任何操作,快捷键 是菜单和 Viewport 上真实的键盘修饰键。

W6VStack(快捷键分组)

位置

位于 ScrollView 内部。

技术细节

左对齐堆叠的各分组,间距 16 pt。 在这五个分组内部,各自是标题 + 一系列行。 标题使用次级 Subheadline 样式 — 有意不使用 Title 格式,因为这些分组不需要可导航。内容 有意保持扁平(没有 Disclosure、没有 Search、没有 Filter), 以便该组件在每个 macOS 版本上都能保持不变运行, 且文件本身保持可读。

管理存储空间(W7–W12)

Manage Storage 窗口 — 标题栏显示「1,356 items · 55.1 GB total」,表格中列出按日期排序的导出 PLY 文件,每项包含图标 + 文件名 + 大小 + 日期
Manage Storage 窗口 — 标题栏显示「1,356 items · 55.1 GB total」,表格中列出按日期排序的导出 PLY 文件,每项包含 图标 + 文件名 + 大小 + 日期

这是 RadianceKit 管理的所有文件的表格视图。标题栏显示共 1,356 项,总大小 55.1 GB。上方工具栏: 「Show in Finder」+「Refresh」。每一行包含:导出图标、文件名(例如 training_20260718T194416Z.ply)、导出日期、大小(此处从 7.8 MB 到 2.24 GB 不等)、 放大镜图标(Reveal)和垃圾桶图标(Move to Trash)。排序首先按类别分组, 类别内部再按日期排序,最新的在最上面。这张截图中以 PLY 导出文件为主, 因为这个存储位置主要保存的是训练结果。

这是什么: 一个磁盘占用总览,涵盖 RadianceKit 存放在 ~/Documents/RadianceKit/ 下的所有内容 — 日志、导出文件、场景、 (来自 iOS 伴侣应用的)采集包、导入(输入图片的暂存副本)。每一项都显示 以字节为单位的大小,以及两个按钮:「在 Finder 中显示」和 「移到废纸篓」。这功能不是自动清理 — 应用本身不会删除任何东西; 你需要逐项自行决定。这个窗口已本地化:中文界面中标题为「管理存储空间」, 标题栏的两个按钮名为「在 Finder 中显示」和「刷新」,行内按钮名为 「在 Finder 中显示」和「移到废纸篓」。下方各条目中出现的英文名称 是英文版界面中的对应名称。

当磁盘空间快用完的时候。首先会堆积起来的通常是日志 (每次训练尝试对应一个 JSONL 文件,外加 _qualityMetrics.json); 导出文件当然也会累积(PLY 是 100% 原始数据,每次导出一个文件)。 在崩溃之后也很有用,此时导入暂存目录里可能还残留着输入图片的旧副本。

W7「Show in Finder」按钮

位置

存储浏览器窗口标题栏右上角。

技术细节

在 Finder 中打开 RadianceKit 的数据文件夹 — 也就是这个窗口所列内容对应的目录。这样你可以直接看到文件夹结构 (日志、导出、场景、采集、导入),也可以直接用 Finder 移动或复制 文件。此操作会打开一个新的 Finder 窗口;窗口中的列表本身不会因此 更新 — 这就是「Refresh」(W8)存在的原因。

W8「Refresh」按钮

位置

标题栏,紧邻 Finder 按钮。

技术细节

触发一次后台扫描,运行在用户发起的异步任务上, 以确保扫描大型目录树不会阻塞界面。实际的遍历过程会依次检查所有已知的 子文件夹(日志、导出、场景、采集、导入),并为每个直接子项生成一条 存储条目。每一条都会计算递归大小 — 优先使用实际磁盘占用量 (包含 APFS 硬链接共享),若不可用则回退到逻辑文件大小。

W9List(存储条目列表)

位置

标题栏下方的主要内容区域。

技术细节

列表中每一行的布局如下:类别专属的 SF Symbol 图标 (日志对应文档图标,导出对应上传箭头,场景对应立方体,采集包对应 iPhone 图标,导入对应托盘图标)、名称 + 副标题 (种类标签 + 格式化的修改日期)、右侧的字节数(右对齐,等宽字体)、 Reveal 按钮(放大镜图标)、Trash 按钮(垃圾桶图标)。排序规则: 首先按种类排序(场景在前,其次是导出、日志、采集、导入、其他), 其次按修改日期降序排列(最新的在上面)。如果扫描仍在进行, 该区域会改为显示「Scanning…」进度提示。如果没有找到任何内容, 会显示带托盘图标的空状态提示。

W10行按钮「Reveal in Finder」

位置

每行右侧的放大镜图标。

技术细节

打开 Finder 并选中该具体项目(文件或文件夹)。 与 W7 的区别:W7 打开的是根目录;W10 精确定位到这一个条目。 实用工作流程:先找出一个占用较大的条目,点击放大镜图标,然后可以 将其复制到例如外部存储卷。

W11行按钮「Move to Trash」

位置

每行放大镜图标右侧的垃圾桶图标。

技术细节

触发确认对话框(W12)。只有确认之后才会执行 macOS 标准的「移到废纸篓」操作(因此是可撤销的,不是直接删除)。 成功移入废纸篓后,该条目会从列表中移除,总字节数计数器也会随之更新。 出现错误时会弹出模态错误对话框。

W12ConfirmationDialog(删除确认)

位置

由 W11 触发,以 macOS 表单(sheet)形式呈现。

技术细节

标准确认对话框,带有动态标题「Delete <name>?」 以及一行提示文字,明确说明该条目会被放入废纸篓,并可以从那里恢复 (直到废纸篓被清空为止)。两个按钮:「Move to Trash」作为破坏性操作 (以红色显示)和「Cancel」,并自动绑定 Esc 键。该对话框是非模态的, 意义在于它只会阻塞这一个窗口,而不是整个应用 — 这是 macOS 对 可撤销删除操作的标准做法。

Pareto 仪表盘 (W13–W22)

Pareto Dashboard — leerer Zustand vor Report-Import
Pareto 仪表盘 — 导入报告前的空状态

空状态(首次打开后)— 带有「Open Reports Folder…」行动号召的空状态提示。 一旦加载了训练报告,数据点就会出现,参见下一个截图。

Pareto Dashboard mit 384 geladenen Benchmark-Reports — Gaussians vs PSNR mit Pareto-Front, Scene/Strategy/Mip-Filter
加载了 384 份基准测试报告的 Pareto 仪表盘 — Gaussians 与 PSNR 及 Pareto 前沿,带 Scene/Strategy/Mip 过滤器

顶部工具栏右侧显示「384 reports of 384」(所选文件夹中的所有报告均已成功解析); 「Open Reports Folder…」按钮左侧显示已加载文件夹的名称,此处为「Benchmarks」。 坐标轴:X 轴选择器设为 Gaussians,Y 轴选择器设为 PSNR (dB), 旁边是激活的「Show Pareto Front」勾选框。左上角图例:蓝色 = mcmc,绿色 = classic,橙色 = hybrid,另外还有 Mip-Splatting 开/关的符号形状。 虚线的 Pareto 前沿沿着最佳达成的 PSNR 值延伸,在约 30 万 Gaussians 处于 PSNR≈30 dB 附近趋于平台期; 点云一直延伸到超过 150 万 Gaussians。右侧过滤芯片:超过 30 个场景(包括 bicycle、bonsai、family、flowers、garden、kitchen、 stump、truck 以及带编号的 360、drone 和 photo 测试系列)、3 种策略(classic、hybrid、mcmc)、3 种 Mip-Splatting 选项(All、On、Off),当前激活「All」。当前没有设置 场景或策略过滤器,因此点集较为密集。

这是什么: 一个多次训练对比工具。你以前可能 训练过多个场景,或用不同预设训练同一个场景 — 每次训练运行的 基准测试评估都会生成一个 JSON 报告文件,其中包含最终 PSNR、 SSIM、LPIPS、Gaussian 数量和实际运行时间等信息。界面中没有专门为此评估提供 开关;仪表盘只是对所选文件夹中已有的报告进行评估。它 会同时读取一整个文件夹中的这类报告,并将它们绘制为可选坐标轴的 二维散点图。此外,Pareto 前沿(即非支配点的集合)会以虚线 形式绘制出来。

在你已经生成至少三到四个 训练报告之后。数据点太少时,前沿线没有意义。典型用例:你 尝试重建一个户外场景,依次尝试了 P3 Balanced (Classic)、P4 Quality (Classic)、P8 Quality (MCMC) 和 P9 Drone / Aerial — 现在你想知道哪种配置每秒训练时间提供 最佳 PSNR,或者哪种配置在给定 PSNR 下所需 Gaussians 最少。

两个坐标轴都可以自由选择(X 轴:Gaussians、 训练时间、PSNR、SSIM、LPIPS 等;Y 轴同理)。 Pareto 前沿计算对每个指标都知道是「越小越好」(LPIPS、Gaussians、Training Time、 BRISQUE)还是「越大 = 越好」(PSNR、SSIM、FSIM、MS-SSIM)— 因此该线根据坐标轴选择 从左下到右上,或从左上到右下延伸, 始终沿着已达到的最佳组合走。一个点是 Pareto 最优的,当且仅当没有其他点在两个维度上都至少 同样好(即没有其他点支配它)。Pareto 最优的点 位于线上,其他点则在其右侧/上方(视坐标轴方向而定)。 恰好位于线上的点是「最佳预设」的真正 候选;远离线的点则是浪费的训练时间。

你可以将选择限制在某个 特定场景上(例如你只想比较户外运行结果时),限制在某个特定策略上(classic、hybrid 或 mcmc), 或者限制在 Mip-Splatting 开/关上(Mip-Splatting 是一个面向 高级用户的可选设置,因此直接对比很有价值)。

你在一个报告文件夹中有「truck」场景的三份报告: Run A(P4 Quality (Classic),52.4 万 Gs,105 秒,PSNR 23.4)、Run B(P8 Quality (MCMC),15 万 Gs,693 秒,PSNR 24.6)、Run C(P5 Ultra Detail,125 万 Gs,312 秒,PSNR 25.8)。将 X 轴设为 Training Time,Y 轴设为 PSNR。Run B 位于右上方,Run C 更靠右上方,Run A 位于左下方。Pareto 前沿连接 A 和 C — 两者都是非支配点。Run B 「出局」(C 在 时间和 PSNR 两方面都更好)。结论:对于「truck」,MCMC 路线 不划算;要么快而够用(A),要么慢而非常好(C)。把 C 的配置 保存为独立预设(Inspector → I1 Save Preset)。

下一步操作: 将最佳配置保存为预设。 具体做法:查看 Pareto 点(悬停在工具提示中显示 PSNR/SSIM/LPIPS/Gs/Time),决定哪一个最符合你在 时间与质量权衡上的需求,打开对应的报告 (文件名包含运行时间戳),将其训练配置复制到 新的运行中,或者在下一次 训练会话后通过 Inspector 将其保存为预设。

W13「Open Reports Folder…」按钮

位置

左上方工具栏。

技术细节

打开一个文件夹选择对话框,提示 「Select a folder containing benchmark .json reports」。确认后 会运行一个后台任务,依次解析文件夹中所有 .json 文件。有问题的报告(损坏的 JSON、错误的 架构)会被收集,并在侧边栏底部显示为「N file failed to parse」— 不会崩溃。如果在第一次加载仍在进行时进行第二次点击, 之前的任务会被取消,以避免两个结果同时 写入状态。

所选文件夹不会被永久记住:通过 帮助 → Pareto Dashboard…(⇧⌘D) 再次打开窗口后,你需要在这里重新选择它。加载后的 文件夹名称会显示在按钮右侧。

W14「X-Axis」选择器

位置

图表上方,左侧。

技术细节

菜单选择器,包含仪表盘模块中所有可用的 度量坐标轴(PSNR、SSIM、LPIPS、Gaussian 数量、训练时间 等)。默认值为 Gaussian 数量。切换时 悬停的点会被重置,因为在坐标轴切换之前高亮的 位置在切换坐标系后已不再有意义。选择器宽度 限制为内容宽度,以免占满整行。

W15「Y-Axis」选择器

位置

图表上方,X-Axis 旁边。

技术细节

与 W14 相同,只是默认值为 PSNR。 坐标轴选择独立保存,因此用户也可以选择 无意义的组合(X=PSNR,Y=PSNR — 会将所有点都落在 一条对角线上)。这类组合不会被拦截;这是有意为之,因为「SSIM 对比 PSNR」这样的比较确实有意思,可以看看 这些指标之间的一致性如何。

W16「Show Pareto Front」开关

位置

坐标轴选择器右侧。

技术细节

一个勾选框,默认勾选。 Pareto 前沿会作为额外的线叠加在点云图上 — 虚线 样式(4–4 间隔),灰色半透明, 线宽 1.5 pt。注意: 在发布版本中 该勾选框对图表没有实际影响 — 无论是否勾选, 前沿线始终会绘制。每次切换坐标轴或每次改变过滤条件后 前沿都会重新计算。

W17「Scene」过滤芯片

位置

仪表盘窗口右侧边栏。

技术细节

针对已加载报告中出现的每个场景的 过滤芯片。使用自定义流式布局,一旦宽度用满, 芯片会自动换到多行排列。激活的芯片 使用强调色背景,未激活的使用中性的 标准材质背景。支持多选 (集合语义);如果没有芯片被选中,则视为所有场景都「通过」 过滤 — 即集合逻辑是「空选择 = 全部」, 而非「空选择 = 无」。

W18「Strategy」过滤芯片

位置

侧边栏中 Scene 过滤器下方。

技术细节

与 W17 完全一样,只是针对训练 策略 — 通常是「classic」、「hybrid」和「mcmc」这三个值, 来自基准测试报告 JSON 中的 Strategy 字段。当你混合了 多种策略的报告,只想查看某一种时(例如「只显示 MCMC 运行, 因为我已经排除了 Classic」),这会很有用。

W19「Mip-Splatting」过滤芯片

位置

侧边栏中 Strategy 过滤器下方。

技术细节

三值过滤器(不像 W17/W18 那样是集合): 「All」/「On」/「Off」。背景说明:Mip-Splatting 是一个 多尺度扩展,是否有帮助取决于场景 — 因此 它仍然是一个需要主动开启的设置,而非默认项。 当你想比较 Mip 开/关时,通常想非常清晰地区分。 因此设计了这个专用的三态过滤器,状态为「全部 通过」「仅 Mip 开」「仅 Mip 关」。只要加载的集合中包含 报告,侧边栏这一部分就会出现 — 也就是几乎 总是如此;只有在完全没有加载任何内容时才会消失。

W20ChipButton(过滤器切换开关,all/on/off)

位置

辅助组件,用于 W17/W18/W19 中。

技术细节

极简的按钮包装组件。内容:标签 文字,使用 Caption 字号,内边距水平 10 / 垂直 5。 背景条件式设置:如果激活 → 应用强调色配白色文字; 否则使用中性的标准材质背景,配普通 文字颜色(会自适应浅色和深色外观)。形状 为胶囊形(Capsule)。使用纯按钮样式,避免胶囊 材质被系统边框覆盖。

W21图表(Pareto 散点图)

位置

仪表盘中间区域。

技术细节

Swift Charts 图表,包含两个图层:1. 每份报告 一个点 — 位置由所选的 X 和 Y 指标决定,颜色 按 Strategy,符号按 Mip 状态区分。符号大小正常为 80, 高亮时为 200(当该 ID 对应当前悬停的报告时)。 2. Pareto 前沿的线(参见 W16 — 始终会绘制)。此外 当前悬停的点上方会显示一个小胶囊,展示 场景名称。

图表覆盖层:一个透明矩形捕捉鼠标移动;每帧 计算绘图坐标系中欧几里得距离最近的点位置, 如果距离在 24 px 以内则更新悬停的报告 (否则重置)。这样你无需点击即可获得工具提示 — 悬停即可。

W22工具提示(悬停详情)

位置

图表下方,悬停时显示。

技术细节

水平堆栈:场景名称(Headline 字号)、 Strategy 标签(Caption 字号)、分隔线,然后是 PSNR/SSIM/LPIPS/Gs/Time 各项指标,各自作为一个小的 垂直分组(标签 + 等宽字体数值)。如果启用了 Mip,还会额外显示一个「Mip」胶囊标签,使用 强调色。背景为半透明模糊,圆角矩形, 圆角半径 8 pt。仅在鼠标确实位于 某个点上时才显示。移开鼠标后自动消失。

保留分析(Holdout Analysis,W23–W29)

Holdout Analysis — leerer Zustand vor dem Laden einer transforms.json
保留分析 — 加载 transforms.json 之前的空状态

空状态,带有空态提示和「Open transforms.json…」的行动号召按钮。接受 NeRF-Studio 和 Instant-NGP 格式。相机 标记会在加载 transforms.json 后出现—见下图。

Holdout-Globe mit 86 Kameras, 5 Folds, Angular-Strategy aktiv
带有 86 个相机、5 个 Fold、Angular 策略激活的保留分析地球仪

顶部显示已加载的文件 (transforms.json)以及相机数量(「86 cameras」)。左侧边栏: 策略选择器,有两个选项—Angular (longitudinal) 处于激活状态 (按相机绕轨道的经度角排序,然后按轮转方式分配 到各 Fold)对比 Linear (round-robin) (同样的轮转分配方式,但按图像顺序而非视角排序)。k-Folds 滑块设为 5,测试 Fold 选择器设为 Fold 1。导出按钮生成一个 fold-assignment.json,供外部 评估工具进一步使用。中间面板: 所有 86 个相机的 3D 地球仪投影,分布在整个球面上— 绿色点 = 训练,红色点 = 当前测试 Fold(Fold 1,共 18 个相机)。右侧边栏(Angular Correlation):每个 Fold 的相机数量 + 最近角度平均值(Fold 1:18 个相机 / 8.5°,Fold 2:17 / 6.1°,Fold 3: 17 / 6.2°,Fold 4:17 / 6.7°,Fold 5:17 / 6.4°)—数值越小 意味着每个测试相机都有一个邻近的训练相机,测试 因此更容易。

这是什么: 一个带有交叉验证逻辑的相机布局 3D 可视化工具。你 加载一个 transforms.json(Nerfstudio / Instant-NGP 用于相机位姿的 标准格式),应用会读取所有相机,将它们的视线方向投影到一个 单位球面上,并在虚拟地球仪上以小球标记显示。然后 它按照选定的策略(angular 或 linear)将相机划分为 k 个 Fold,绿色标记训练部分, 红色标记测试部分(保留集),并按 Fold 计算一个 角度相关性分数,告诉你测试 Fold 在视角空间中 与训练 Fold 的距离有多远。

当你想做保留评估时—也就是说: 你的模型对未见过的视角泛化得如何?训练中的默认设置是「every-8th view 作为保留集」(Mip-NeRF360 惯例), 但这是一种非常线性的划分。举例来说,如果你的图像在时间上是聚簇的 (先拍物体的一面,再拍另一面),那么「every-8th」就不具代表性— 一个随机的序列位置落入测试集,但它的所有邻居都在 训练集中,这样测试就太简单了。用「angular」的话则是 在视角空间中分层:每个 Fold 都包含来自 轨道各个方向的相机,这样测试才能真正检验 泛化能力上的差距。

Angular 对比 Linear:- Angular(默认):将 所有相机按经度角(绕 Y 轴的 φ 坐标)排序, 然后按轮转方式分配到 k 个 Fold 中—环上的第一个相机 进入 Fold 1,第二个进入 Fold 2,经过 k 个相机之后 再从头开始轮转。优点:每个 Fold 都包含来自 轨道各个方向的相机,均匀分布在整个环上。适合 经典的轨道式拍摄,因为这样划分就不再取决于 拍摄顺序。- Linear (轮转法):同样的轮转分配方式,但依据的是图像位置 而不是角度(Fold 索引 = image_index 模 k)。这是简单的 「every-k-th」划分。如果图像顺序没有任何 空间偏差(例如随机排序的无人机航拍),这种方式效果很好。 如果图像在时间上有聚簇—那么相邻帧会落入不同的 Fold, 测试就会变得过于简单,这种方式效果就不好。

在 3D 地球仪中你可以立刻看到:绿色点(训练)和红色点 (测试)。如果红色点全部聚集在一角,那么保留集 质量就不好(无法作为良好的泛化测试)。如果它们 均匀分布在绿色点之间,那就是好的。右侧边栏中每个 Fold 的 角度相关性分数(以度为单位)还能告诉你:数值越小 = 测试集靠近训练集(每个测试相机都有一个邻近的训练相机,测试 较容易);数值越大 = 测试集远离训练集(泛化测试 更难)。

你用 251 张图像拍摄了 Truck 场景, 通过菜单项 M33(Export SfM transforms.json)导出了 一个 nerfstudio 文件。打开保留分析窗口(⇧⌘H),通过「Open transforms.json…」 加载 JSON,查看地球仪。k=5(默认)会给你 5 个 Fold。点击「Fold 3」—看看红色标记是否大致 均匀分布。如果是的话:「Export fold-assignment.json」。 导出的文件是给外部评估工具用的 (Nerfstudio、Instant-NGP);RadianceKit 本身不会重新读入 该文件,仍然会按照自己的保留标准「every-8th」 继续训练。因此这个窗口的作用是评估 你的相机集合是否能提供一个公平的测试。

W23「Open transforms.json…」按钮

位置

左上方工具栏。

技术细节

打开一个限定为 JSON 文件的文件选择对话框。确认后,保留分析模块会加载 该文件。加载器同时解析 nerfstudio 格式(相机内参 加上带有图像路径和变换矩阵的帧列表)以及 instant-ngp 格式(相同结构)。对每一帧,都会从变换矩阵中 提取视线方向(相机局部基的 z 轴)并 保存。如果解析失败,左侧边栏会出现一条提示信息— 不过仅当此前已经加载过一个场景时才会显示; 在最初的第一次尝试时,窗口会停留在空状态,不会有可见的提示。

加载的文件不会被永久记住:通过 帮助 → Holdout Analysis…(⇧⌘H) 再次打开该窗口后,你需要在此重新选择一次。文件名之后会 显示在按钮右侧。

W24"Strategy" 选择器(angular/linear)

位置

左侧边栏顶部。

技术细节

单选选择器,有两个选项:Angular 和 Linear。切换策略会自动触发 Fold 的重新计算。视线方向是球面上一系列 3D 单位向量的列表;Angular 策略按其 经度角 φ 对它们排序,然后按轮转方式分配到各 Fold, Linear 策略则通过帧索引进行相同的轮转分配 ,完全忽略几何信息。因此两种策略都会生成同样 大小的 Fold;它们的区别仅在于事先按什么进行排序。

W25"k Folds" 滑块

位置

左侧边栏中部。

技术细节

滑块范围为 3 到 10,步长为 1。发生 更改时会自动重新触发 Fold 计算,因此 Fold 列表、训练/测试索引以及每个 Fold 的分数会立即 重新计算。所选的值会以等宽数字文本 显示在标签右侧。

经验法则:k=5 是默认值(每个 Fold 给你 20% 的测试比例,这是 交叉验证的常见做法)。如果你有非常多的数据,需要更多 Fold 来获得统计意义,可以用 k=10。如果数据较少,可以用 k=3。

W26"Test Fold" 选择器

位置

左侧边栏,k 滑块下方。

技术细节

菜单选择器。它列出的条目数量正好等于 所设置的 Fold 数量,标注为「Fold 1」到「Fold N」。如果先前选择的索引 ≥ k(例如因为你把 k 从 10 降到了 5),它会自动重置为 0。所选的 测试 Fold 会在地球仪中显示为红色,其他所有 Fold 为绿色。

W27"Export fold-assignment.json" 按钮

位置

左侧边栏底部。

技术细节

打开一个保存对话框,默认 文件名为 fold-assignment.json。确认后,保留分析 模块会将当前的划分编码为一个 JSON 结构(按帧的 Fold 分配加上策略元数据块)。该文件是给外部 评估工具使用的—RadianceKit 不会将其重新读入。 只要没有加载相机文件,该按钮就会是灰显状态。 成功会显示为「Saved to (filename)」,写入错误则显示为 「Export failed: …」—两者都出现在 按钮下方同一位置,并且都是绿色文字,因此颜色本身 无法区分这两种情况。

W28SCNView(3D 相机地球仪)

位置

保留分析窗口的中间面板。

技术细节

基于 SceneKit 的地球仪视图。该场景由以下部分组成: 一个线框球体(半径 1.0,36 段,深灰色)、三个 彩色的坐标轴短棍(红/绿/蓝对应 X/Y/Z,各长 1.2),以及每个 相机在单位球面上对应视线方向位置处的一个小标记球(半径 0.03) (略微在球面外侧,以免 它消失在线框球体内部)。每次切换 Fold 时标记 并不会重新构建—只有当帧列表发生变化时(也就是加载了 新的 JSON)才需要重建。取而代之的是,每次更新时会对材质 颜色进行原地更新:测试索引为红色,训练为绿色,两者 都不是则为浅灰色。这样即便相机数 N > 1000,滑块拖动 时也能保持流畅。

相机控制是启用的—你可以用鼠标旋转 地球仪、缩放、平移。灯光效果确保标记 看起来不是扁平的。背景为深灰色。

W29FoldCard(点击以选择 Fold)

位置

右侧边栏,「Angular Correlation」区块。

技术细节

每个 Fold 对应一个卡片视图—圆角 矩形,半径 6 pt,内边距 10,垂直布局,分两行 (上方「Fold N」+ 相机数量,下方「Mean nearest angle:」+ 以度为单位的 数值)。背景色是条件性的:激活的 Fold = 半透明的强调色,未激活的 = 中性的标准材质。点击 即可选择该 Fold,地球仪会实时改变颜色。

「Mean nearest angle」分数是每个 测试相机到最近的训练相机之间的最小角度的平均值(内部以弧度计算, 在界面中以度显示)。

贝叶斯优化控制台(W30–W39)

BayesOpt-Konsole — leerer Zustand vor Trial-Start
贝叶斯优化控制台 — 试验开始前的空状态

空状态下有搜索空间选择器(RadianceKit defaults (6-dim))、 试验预算滑块(默认 40)、随机种子(42),以及三个空面板, 分别对应收敛图表、试验日志和搜索空间参数列表。 一旦运行启动,收敛图表和试验表格就会填充数据 — 见下图。

BayesOpt-Konsole nach 40 Trials — Convergence-Chart steigt steil bis Trial 13, Best Value 0.9943, Trial Log mit init/bo/restart-Tags
40 次试验后的贝叶斯优化控制台 — 收敛图表在第 13 次试验前急剧上升, 最佳值 0.9943,试验日志带有 init/bo/restart 标签

右上方状态显示「Finished — best 0.9943 after 40 trials」,旁边是「Save Best Config」按钮;左上方是 「Start」按钮。左侧边栏:搜索空间选择器设为 RadianceKit defaults (6-dim),试验预算 40,随机种子 42。 参数列表显示了六个待调超参数及其取值范围: mipSmoothing3DScale [0.05, 0.5], mipFilter2DVariance [0.1, 0.6], densifyGradThreshold [5e-07, 5e-06], ssimWeight [0.05, 0.5], mcmcNoiseScale [1e-05, 0.0001], mcmcRelocationInterval [50, 200]。中间:收敛图表 「Convergence (best value so far)」(X 轴 = 试验索引 0–40,Y 轴 = 目标 函数值 0–1)— 蓝色点 = 初始采样,绿色点 = 贝叶斯优化采集,橙色点 = 重启试验(#22 值为 0.5303 以及 #31 值为 0.4885)。蓝色的最佳值曲线在第 ~5 次试验前急剧上升, 之后到第 ~13 次试验只有边际改进,此后 呈接近 1.0 的平坦高原。右侧边栏:试验日志,此处滚动到了第 #8–#36 次试验,每项都显示得分与标签(init/bo/restart)。 右上方的保存最佳配置按钮会写出 bayesopt-best.json

这是什么: 一个用于超参数搜索的贝叶斯优化控制台。贝叶斯优化是一种自动化方法, 它试图用尽可能少的实验次数找到一个未知函数的最优点 — 典型问题是:「哪种 高斯上限、SSIM 权重与密集化阈值的组合, 能为我的场景类别带来最佳 PSNR?」贝叶斯优化不需要 6^4 = 1296 次试验的网格搜索,而是通过大约 40–100 次有信息指导的试验, 就能接近最优值。

重要提示: 应用中当前发布的版本并不是针对真实的 训练运行来执行优化(那会耗费数天),而是针对一个合成的 演示目标函数 — 一个带有爬坡特性、外加轻微噪声的多模态景观。 这是刻意设计的:本窗口旨在向你展示优化器的行为 (收敛过程、采样点、迄今最佳值),并让 你理解搜索空间的定义方式。对于真正由训练驱动的 贝叶斯优化运行(如同开发内置预设时所使用的那样),会采用应用之外的 单独评估流程;本窗口只是用于观察的实时版本。

三种使用场景:1. 你想了解 贝叶斯优化的工作原理 — 那就启动一次演示运行,观察 收敛图表。2. 你正在规划一个新的场景类别(例如「水族馆」 或「古董家具」),而十五个内置预设都不完全适用。 在脑海中定义一个搜索空间,在此处用「Bowl demo (1-dim)」或 「densify-until + ssim-weight + grad-thresh」进行验证, 然后将最佳配置导出为 JSON, 将它作为真实训练运行的起点。3. 你想 检查内置的标准搜索空间(Mip 子集、RadianceKit 默认值)— 它们会列在左侧边栏的参数面板中。

- 收敛图表(中间栏):Y 轴 = 迄今达到的最佳目标函数值。X 轴 = 试验索引。开始时 急剧上升(贝叶斯优化随机尝试初始采样,其中一些运气不错), 然后逐渐趋于平坦,因为 接近最优区域已被充分探索。如果曲线连续 20 次以上试验保持平坦, 就可以停止运行了 — 更多试验也不会带来改善。图表中的 每个点是各次试验的独立数值(而非「迄今最佳」),按阶段着色:蓝色 = 初始采样,绿色 = 贝叶斯优化采集,橙色 = 重启。- 试验表格(右侧栏):#1, #2, #3, … 每项都有数值和阶段标签。目前 最佳的试验会标有黄色星形标记。你可以从表格中识别 最佳试验,并在导出时查看其参数值。- 搜索空间检查器(左侧边栏):显示所选预设的 所有参数名称及其搜索范围 [lo, hi]。如果你 选择的是「RadianceKit defaults (6-dim)」预设,会看到例如 「densifyGradThreshold [5e-7, 5e-6]」— 即在这两个值之间 对数均匀分布。

选择预设「RadianceKit defaults (6-dim)」, 试验预算 40,种子 42。点击「Start」。观察:前 8 次试验 是蓝色的(初始采样,拉丁超立方),随后是绿色的 (贝叶斯优化采集)。收敛图表在第 ~13 次试验前急剧上升, 之后趋于平缓。在第 ~30–40 次试验附近,最佳 值趋于稳定。点击「Save Best Config」— 会保存一个 bayesopt-best.json,其中包含预设名称、试验索引、值以及解码后的 参数值。之后你可以手动将此 JSON 中的内容 应用到你的预设定义中。

W30「Start」按钮

位置

左侧工具栏,处于空闲/已完成状态时。

技术细节

重置试验列表,切换到 运行状态,生成一个新的运行 ID(用于在多次点击开始按钮时进行陈旧数据检测), 并创建一个全新的暂停闸门。随后 启动一个后台任务,将优化器作为异步流执行。 初始采样的数量随预算增长,但最多为 8 个 — 即预算达到 28 以上时 通常为 8 个拉丁超立方采样,预算较小 时则更少。试验更新以增量方式接收并附加到 列表中。陈旧运行保护:如果在此期间第二次 点击开始按钮重新设置了运行 ID,来自旧运行的更新 将被丢弃。

主操作样式使按钮外观更加醒目。

W31「Pause」按钮

位置

左侧工具栏,处于运行状态时。

技术细节

激活暂停闸门并切换到 已暂停状态。实际效果是:运行器会在一个 50 毫秒的轮询循环中等待,然后才评估下一个目标函数。 这意味着当前正在进行的试验会被执行完(因为它 是合成的,只需微秒级时间),但不会启动新的 试验。一旦恢复运行,就会从中断的地方 继续。

W32「Stop」按钮

位置

左侧工具栏,处于运行和已暂停状态时。

技术细节

中止运行器任务,将引用置空, 释放暂停闸门(如果仍处于暂停状态),并切换到 已完成状态(如果存在试验)或空闲状态(如果没有试验)。 已经计算出的试验仍会保留在列表中可见 — Stop 不会删除它们。破坏性按钮角色以红色显示该按钮,因为 它会中止运行。

W33「Resume」按钮

位置

左侧工具栏,处于已暂停状态时。

技术细节

释放暂停闸门并切换回 运行状态。运行器任务其实已经在运行(它正在 轮询循环中等待);一旦循环检测到暂停已解除, 就会继续运行并启动下一次试验。

W34「Save Best Config」按钮

位置

右侧工具栏,始终可见(但在尚无 最佳运行结果之前呈灰色不可用)。

技术细节

打开一个保存对话框,默认 文件名为 bayesopt-best.json,仅限 JSON 格式。确认后 会构建一个负载字典:预设名称、试验索引、值 (目标函数得分)、参数(解码后的参数 名称 → 值的字典)。解码过程会将归一化的 搜索空间坐标从 [0,1]^d 投影回原始取值范围 (分别按对数均匀/线性/整数刻度处理)。JSON 输出为 美化格式,且键按排序排列。写入出错时(在 当前演示版本中)会静默忽略 — 不显示错误界面,因为这 是一个演示路径。

只要没有试验运行过,该按钮就会保持灰色。

W35「Search Space」预设选择器

位置

左侧边栏,顶部。

技术细节

带有四个预设选项的菜单选择器:- 「RadianceKit defaults (6-dim)」— 包含全部六个标准超参数的 完整标准搜索空间。- 「Mip subset (2-dim)」— 仅包含 mipSmoothing3DScale [0.05, 0.5](对数均匀)和 mipFilter2DVariance [0.1, 0.6](线性)。适用于你想针对某个场景类别 调优 Mip-Splatting 时使用。- 「densify-until + ssim-weight + grad-thresh」 — 三个与密集化相关的参数(densifyGradThreshold 对数均匀, ssimWeight 线性,densifyUntilIter 整数)。- 「Bowl demo (1-dim)」 — 用于讲解「贝叶斯优化是如何工作的」演示的单参数教学 搜索空间。

运行进行中时,无法切换搜索空间 (这会使优化器产生混乱)。

W36「Trial Budget」滑块

位置

左侧边栏,位于搜索空间选择器下方。

技术细节

滑块范围 10 到 200,步长 5。默认 40。这意味着:贝叶斯优化最多可以进行 N 次试验。其中 前几次是初始采样(拉丁超立方),其余是真正的 贝叶斯优化试验。实践经验法则:一个具有 d 维度的搜索空间,大约需要 d 的十到二十倍的试验次数 才能获得好的最优解。因此对于 6 维默认值,需要 60–120 次,对于 2 维 Mip 子集需要 20–40 次, 对于 1 维 Bowl 演示需要 10–20 次。

运行期间该滑块会被禁用。

W37「Random Seed」滑块

位置

左侧边栏,位于预算滑块下方。

技术细节

滑块范围 1 到 100,步长 1。默认 42。该种子会同时传递给初始的拉丁超立方 采样以及演示目标函数的噪声分量。 可复现性:相同的种子 + 相同的搜索空间 + 相同的预算 会产生完全相同的试验序列。这对于「你的同事 在重现演示时是否得到同一次运行结果」这种场景很有用。运行 期间该滑块会被禁用。

W38图表(收敛曲线)

位置

窗口中间栏。

技术细节

使用 Swift Charts 绘制的图表,包含两层:1. 每次试验的 「迄今最佳值」曲线 — 一条以强调色显示的单调 递增或保持不变的曲线。2. 每次试验的一个点,代表该次试验的 独立目标值,按阶段着色。符号大小为 40。三种 阶段标签:「init」(蓝色)、「bo」(绿色)、「restart」(橙色)。

左上方有一个小图例,显示各阶段的颜色。如果试验 列表为空(即在首次启动之前),则会显示一个空 状态界面,带有图表图标和提示文字「Press Start to begin a BayesOpt run.」。

W39表格(试验日志)

位置

窗口右侧栏。

技术细节

带懒加载堆叠试验行的 滚动区域。每行是一个横向堆叠:试验编号(3 位 等宽字体,左对齐)、值(等宽字体,右对齐,宽度 70 pt)、阶段 标签(胶囊形,25% 不透明度填充 — 灰色代表「init」、蓝色代表 「bo」、橙色代表「restart」;这些颜色特意与旁边图表中的 点颜色不同),如果该试验是当前最佳的,还会有一个 黄色星形标记。一个自动滚动机制会在有新 试验加入时自动跳到末尾 — 这样你就可以在屏幕 底部实时跟读最新进展,而无需自己滚动。

主窗口:损失曲线与高斯计数(I39–I41,交叉引用)

主窗口中有三个 Inspector 显示项值得单独说明,因为它们在训练过程中会持续显示,而且关于何时曲线看起来是健康的,存在一些重要的经验法则。这些显示项位于 Inspector 的 进度 区块中,在可展开的 损失曲线 分组里(参见第 2 章——Inspector),并且补充了上文 Aux 窗口中的 Holdout 分析。

Loss 曲线什么时候算健康? 一条健康的 Loss 曲线会呈现三个阶段:(1) 预热(Warmup)——最初的 200–500 次迭代中,Loss 会从较高值(根据场景不同,L1+SSIM 组合通常在 0.15–0.25 之间)陡降到大约一半。如果这个阶段 Loss 没有下降,通常是输入有问题(图像损坏、SfM 位姿不佳、初始高斯数量太少)。(2) 致密化(Densification)——在大约 500 次迭代到 densifyUntilIteration(经典方式通常为 15K,MCMC 则到 20K 或 25K)之间,Loss 会持续下降,常伴有小幅跳降——这是致密化操作插入新高斯、优化器随后加以利用的结果。高斯计数在此阶段会上升。(3) 精修(Refinement)——此后 Loss 会进入逐渐趋于平缓的尾段。作为参考的典型终值:一个光照良好的物体场景(例如使用 P4 Quality 预设的 Tanks-&-Temples Truck)最终 L1 ≈ 0.023,而像 Mip-NeRF 360 那样的大范围室外场景自然会更高(0.04–0.07)。

平台期意味着什么? 平台期(Loss 曲线在数千次迭代中保持水平)有两种解读:(a) 模型已经收敛,继续训练不会再有提升——这是好的情况。(b) 模型卡住了(陷入局部极小值、梯度信息不佳、达到了缓冲区上限的 Cap)——这是不好的情况。这两种情况在图表上看起来完全一样。区分方法:看高斯计数。如果它也是平的,并且接近 MCMC 的 Cap(例如在 P8 Quality (MCMC) 预设下达到 150K 中的 150K),那你已经到达上限——要么提高 Cap,要么接受这个平台期。如果高斯计数还在增长,但 Loss 不再下降,那就是卡住了。

什么时候该中止,什么时候该继续训练? 经验法则:如果 10K 次迭代内最小 Loss 没有任何改善 → 中止,继续训练是在浪费时间。在此之前:可以通过训练菜单 → Continue Training → “+5,000 iterations” 追加一段训练,如果你看到的是边际性的改善(这个操作没有对应的快捷键)。注意:在 MCMC 模式下,这种平台期往往是真实的——Cap 就是自然的边界。

高斯计数达到平台期 不是 “完成”的信号。 它只说明 MCMC 已经达到 Cap,或者经典致密化(Classic Densification)已经用尽了潜力。真正回答“是否完成”这个问题的,是在独立测试集上的 PSNR/SSIM/LPIPS——相关数值记录在你于 Pareto Dashboard(W13–W22)中查看的基准报告里。Holdout 窗口(W23–W29)并不提供这些指标;它只判断你的相机集合是否能够合理地划分为训练视角和测试视角。

PSNR/Holdout 才是真相,Loss 只是代理指标。 Loss 是一个相对指标:随着模型逐渐拟合训练视角,它会不断下降。但低 Loss 并不自动意味着模型好——如果模型把训练图像“背了下来”(过拟合),Loss 会很小,但在未见过的视角(Holdout)上的 PSNR 会很差。因此:进行最终质量评估时,务必参考 Holdout 指标,而不要只看最终 Loss。

经验法则框

  • User Guide 和 Keyboard Shortcuts 是静态帮助 — 关键词式问题查得快,深入内容请使用本手册。
  • 一旦磁盘剩余空间低于 10%,就打开 Manage Storage。日志和导入暂存区通常是罪魁祸首。
  • Pareto Dashboard 至少要有三到四份训练报告后才有意义。X 轴 = 成本(Time / Gs),Y 轴 = 质量(PSNR / SSIM)。Pareto 前沿显示的是高效组合。
  • 在与他人公布 PSNR 基准对比之前,先用 Holdout Analysis — 这能确保你的测试集确实具有代表性。导出的 Fold 划分是给外部工具用的;RadianceKit 依然按“每 8 张”规则继续训练。
  • BayesOpt Console 主要是用于搜索空间定义的学习和检视工具 — 它针对的是一个演示函数进行计算,而非真实的训练运行。
  • Loss 平台期和 Gaussian 数量平台期需要分开解读。Cap 上限并不是“完成”信号。真正的质量只能通过 Holdout-PSNR 衡量。
  • 若 10K 次迭代内 Min-Loss 都没有改善 → 应停止训练。