计算机图形学 E07:用八个三维高斯拟合多视图图像
六张图能否约束同一个三维表示,使它在另外三个视角也接近目标?E06 只恢复固定场景的一个光强;这次同时调整八个高斯的世界中心、颜色和不透明度。每次渲染都从同一组世界参数重新投影,不能为每张图单独拟合二维椭圆。
实验采用 24×24 RGB 合成图、固定协方差和两组随机初始化。它复现三维高斯表示、投影、合成与多视图优化的受限子集,保留训练成本和全部持出结果。
数据与未知量怎样分开
每个高斯含三维中心 μ、线性 RGB 颜色 c 和不透明度 o,共 7 个待优化数,八个合计 56 个。世界协方差统一固定为 diag(0.045,0.025,0.035),单位是世界长度的平方;颜色没有视线方向依赖。这里没有神经网络权重,连续场由显式高斯参数表达。
生成器中的八个真实高斯只用于产生目标。训练器接收六幅 RGB、相机及公共约束,不接收真实中心和颜色。初始化种子固定为 701、702,中心各分量均匀取自 [−0.6,0.6],颜色来自 [0.2,0.8],不透明度为 0.5。更新后中心限制到 [−0.85,0.85],颜色和不透明度限制到 [0.02,0.98]。
相机绕原点布置,水平半径 3、高度 0.55,均朝向原点。训练方位角为 0、60、120、180、240、300 度;提前固定的持出角为 30、150、270 度,对应视图 6、7、8。持出图不参与梯度、停止条件或超参数选择,两组结果都保留。
数据由仓库自有生成器产生,许可文件允许使用、修改与分发。生成和拟合使用同一个渲染器,因此这是自洽合成问题;它不能独立证明真实照片重建能力,也不能代替成像公式的单独检查。
三维协方差如何成为屏幕椭圆
沿用右手坐标,相机朝 −Z,图像纵坐标向下。世界中心变到相机空间 p=R_c μ+t,记 p=(x,y,z),正深度 d=−z。焦距 f=24 像素,主点为 (12,12):
第三列的符号来自 d=−z。对中心附近的小位移 δp,投影变化约为 Jδp;线性变换后的协方差因此是:
最后一项是固定的像素重建方差,单位为像素平方。Σ 正定,附加项也使屏幕矩阵便于稳定求逆。这个椭圆来自中心处的局部线性化,透视映射后的完整三维高斯并不严格仍为二维高斯。高斯离相机过近或覆盖范围过大时,近似误差会变得重要。
检查器将中心放在原点、相机放在 (0,0,3):屏幕中心必须为 (12,12),两个轴方差应分别为 64×0.045+0.25 和 64×0.025+0.25。另用相机空间有限差分检查 J 的深度列,避免生成器与拟合器共享错误却互相匹配。
颜色为什么必须按深度合成
在像素中心 q=(u+0.5,v+0.5),令 δ=q−π(p),高斯的覆盖权重为:
这里没有概率密度归一化系数,峰值由 o 决定;背景 b 的三个通道都是 0.025。高斯按中心深度从近到远稳定排序,前面已经覆盖的部分通过 T 衰减后面的贡献。两个重叠高斯交换顺序,颜色通常改变,即便最终剩余透射率相同。
每次模型更新和每次中心差分都重新计算投影中心、J、S 与深度顺序。只移动二维中心却沿用旧协方差,求得的梯度就不再对应上述前向函数。
同一初始化的视图 0 中,故意翻转投影纵轴得到 MSE 0.00451897,故意反转深度顺序得到 0.0000229697;比较对象都是正确实现的输出。这两个负对照说明错误可被检测,数值大小不能解释为对应错误在任意场景中的影响上界。
六十次更新怎样计算
训练损失 E 是六幅图所有像素、三个线性通道的均方误差,不带 1/2。对第 k 个参数使用中心差分:
一次梯度需要 112 次完整损失计算。每轮先试步长 2,将候选参数截入公共范围,只依据训练损失接受不增的候选;否则步长减半,最多尝试十次。全部失败则保持当前模型,仍消耗一轮预算。两次实际运行的 60 轮都接受步长 2,没有使用回退。
排序交换处可能不光滑。独立方向检查只扰动颜色和不透明度,保持中心与顺序不变:梯度点积为 −0.00411691465948,沿整条方向直接差分为 −0.00411691466161。它核对了该平滑方向,不能据此宣称跨排序边界的中心导数也处处可靠。
固定预算结束后,种子 701 的训练 MSE 从 0.00904647 降到 0.00349552,702 从 0.00937555 降到 0.00417604。训练下降只是拟合证据;新的相机仍需单独评价,也没有任何断言要求持出结果必须改善。
持出图还剩多少误差
下表均为初始值→最终值。PSNR=−10log₁₀(MSE),峰值固定为线性 RGB 的 1,没有逐图归一化。前景仅选目标图中最大通道大于 0.075 的像素,前后使用同一掩码,避免背景占比掩盖物体误差。
| 种子/视图 | 全图 MSE | PSNR(dB) | 前景 MSE |
|---|---|---|---|
| 701/6 | 0.008873→0.003246 | 20.52→24.89 | 0.030453→0.011303 |
| 701/7 | 0.007175→0.003455 | 21.44→24.62 | 0.023712→0.012070 |
| 701/8 | 0.008792→0.002874 | 20.56→25.42 | 0.032013→0.010849 |
| 702/6 | 0.010490→0.004540 | 19.79→23.43 | 0.036254→0.015858 |
| 702/7 | 0.008914→0.004243 | 20.50→23.72 | 0.030648→0.014818 |
| 702/8 | 0.008429→0.004180 | 20.74→23.79 | 0.031715→0.015851 |
显示图由实际 PPM 转成 PNG,显示阶段使用 sRGB 编码,表格仍比较浮点线性值。两个初始化都改善了三个持出视角,最终误差却不同,前景也远未完全吻合。高斯可交换编号,颜色与覆盖还可能互相补偿;图像改善不能推出真实三维中心已唯一恢复。
训练成本与画一帧的成本
每组有 1+60×(112+1)=6781 次训练目标求值,即 40686 次视图渲染。记录环境为 macOS 27.0.1 arm64、Apple clang 21.0.0、C++17、O2。701、702 的训练墙钟分别为 0.611676、0.604630 秒,包含差分、候选检查及内存中的轨迹格式化,排除生成数据、落盘、持出评估和单独校验。
训练完成后,每组另测 30 次单视图渲染,三个持出相机各十次。均值分别为 14.3958、14.4474 微秒,包括投影、排序与像素循环,排除写文件和误差计算。这是八个高斯、576 个像素的 CPU 测量,不能作为官方 CUDA、大场景或 GPU 性能结论。
按双精度数的逻辑存储计算,56 个优化参数加八份三维固定协方差对角线,共 640 字节;这不含相机、图像和运行时容器,也不是 CSV 大小或进程内存。当前协方差相同,另设计去重编码可进一步减小,不能混用两种存储口径。
原论文还训练协方差,使用方向相关球谐颜色,并结合 SfM 初始化、增密、拆分、裁剪及高效分块光栅化。这里均未实现,也未运行官方代码。只据当前小实验比较误差与成本,无法复现论文的质量或速度结论。
练习与自检
练习一。中心在相机光轴上,深度由 3 变为 6,屏幕协方差会缩到四分之一吗?
答案:几何投影项缩到四分之一;固定的 0.25I 不变,所以完整 S 不按同一比例缩小。
练习二。两个高斯的 α 都为 0.5,前红后蓝,背景为黑;交换后得到什么?
答案:原颜色为 (0.5,0,0.25),交换后为 (0.25,0,0.5)。两次剩余透射率都是 0.25,说明只检查透射率无法验证颜色排序。
练习三。若每轮第一次候选失败、第二次才接受,60 轮需要多少损失求值?可以据持出最优轮提前停止吗?
答案:1+60×(112+2)=6841 次,对应 41046 次训练视图渲染。用持出选择停止轮会把它变成验证集;若要报告独立测试误差,需另保留未参与选择的数据。本实验始终固定六十轮。
复跑与资料
在仓库根目录执行,输出仍保存在仓库内:
1 | |
相机与划分、线性观测、全部持出指标、训练成本、逐次渲染计时保留原始记录。701 损失轨迹和702 损失轨迹均含初态及六十次更新;对应模型见701 初态、701 终态、702 初态、702 终态。源码位于 examples/computer-graphics/gaussianE07.hpp 与检查器,命令和哈希见 writing-plans/computer-graphics/evidence/E07-cpu.txt。
Kerbl 等的 3D Gaussian Splatting,§2.3给出排序后的 alpha 合成,§4解释三维表示与投影协方差,§5及附录 B讨论优化与密度控制。官方软件许可应与论文和自生成数据许可分别阅读;本文没有复制其 CUDA 实现。
系列入口 · 上一篇:反推光源强度 · 下一篇:资源流送。






