(论文)[2025-SIG] Multiple Importance Reweighting for Path Guiding

Multiple Importance Reweighting for Path Guiding

  • 作者:ZHIMIN FAN,南京大学
  • 代码
    • 【跑了它的代码,cbox、kitchen 都直接段错误了可能是配置问题,代码没给示例场景和默认配置】
  • 摘要
    • PPG 在线学习,使用 inverse variance 进行不同迭代轮的图片混合【只考虑了 image space】;本文提出了新的方式【考虑 path space】
    • 只能用于 PPG 这样的树结构
    • 效果一般啊【比 inverse-variance 好,但是和 accumulate+outlier removal 相比没有优势啊】
    • 不太能支持 NEE【内存开销大】

Motivation

  • 迭代学习的 PT,第 \(M\) 迭代轮的 MC 估计
    • \(p_{M}(\cdot)\) 表示第 \(M\) 轮的采样分布(一般是 BSDF sampling 和上一轮学习结果的 mixture)

\[ \left\langle \int_{\mathcal{P}} f(\bar{x}) \mathrm{d}\bar{x} \right\rangle = \frac{1}{n_M} \sum_{j = 1}^{n_M} \frac{f(\bar{X}_{M, j})}{p_M(\bar{X}_{M, j})}\tag{2} \]

  • 不同迭代轮方差不同,如何使用不同迭代轮生成的图片?
    • 直接平均
    • inverse variance weighted
      • PPG 实现
        • 当前轮次,每个像素计算方差 localVar
        • localVar clamp 之后对所有像素取平均的得到当前轮次的 variance 估计【\(V_M\)
        • 使用 \(1/V_m\) 作为权重,混合之前迭代轮得到的图片【需要保存之前迭代轮得到的图片及其方差】
          • global constant 含义上的最优(所有像素都一样)
  • 问题
    • 不同像素收敛率不一样
    • 即使考虑 per-pixel 的也不行,因为没有考虑 path space 的收敛不同【只考虑了 image space】

方法论

  • methodology:计算 spatio-directional varying combination weight

path-level reweighting

  • 迭代轮 \(i\)
  • \(w_i(\bar{x})\) 表示 path-level weight
    • \(M\) 求和为 1

\[ \left\langle \int_{\mathcal{P}} f(\bar{x})\,\mathrm{d}\bar{x} \right\rangle = \sum_{i=1}^{M} \frac{1}{n_i} \sum_{j=1}^{n_i} \frac{w_i(\bar{x}_{i,j}) f(\bar{x}_{i,j})}{p_i(\bar{x}_{i,j})} \tag{3} \]

  • 路径采样概率 \(p_i(\bar{x})\)
    • 采样位置,采样立体角

\[ \begin{aligned} p_i(\bar{x}) &= p_i(x_1) p_i(x_2 | x_1) \prod_{j=2}^{N-1} p_i(x_{j+1} | x_j, x_{j-1})\\ &= p_i(x_1) G(x_1, x_2) p_i(\omega_1 | x_1) \prod_{j=2}^{N-1} G(x_j, x_{j+1}) p_i(\omega_j | x_j, x_{j-1})\\ \end{aligned}\tag{4,5} \]

  • 直观\(p_i(x)\) 大、样本多;那么 \(w_i(x)\)
  • 好处
    • 迭代早期有些区域 path guiding(pg) 近似不好导致高方差【大 \(f(x)\),小 \(p_i(x)\)
      • 可以通过给特别小的 \(p_i(x)\) 赋值小的 \(w_i(x)\) 实现
    • 不同迭代轮之间存在相关性,导致近似有 bias
      • 上一轮样本影响这轮的分布,可能收敛到不正确的区域
  • 实验设置【

Variance reduction potentials via sample division

  • 目前降低分布噪声的方式:保持方向的细分【4k~32k】
    • 大区域不准,小区域难拟合
  • 通过分享迭代轮之间的信息,我们的方法在更精细的细分依然可用(鲁棒性)
  • 常规 pg,迭代轮之间会增加样本数(x2)
    • 提高了分布质量,但是复杂场景收敛变慢
    • 我们的方式能够让 path 少的情况下效果也好

Mixture-based weighting schemes

  • 根据上面的直观,使用 balance heuristic
    • 这里的 \(n_i\) 表示这一轮迭代用的样本数【只和轮次相关(像素、路径无关)

\[ w_i(\bar{x}) = \frac{n_i p_i(\bar{x})}{\sum_{k=1}^M n_k p_k(\bar{x})}\tag{6} \]

  • AMIS【2009】表示这个方式对于如下场景效果好
    • 近似随着 \(M\) 增加越来越好
  • 引入方差估计
    • 有些情况下,inverse-variance 效果好【例如最后迭代轮完美近似】
    • 引入 per-pixel variance factor:二阶矩除以样本方差
      • 参考【2019】Variance-Aware MIS
    • 引入方差不能保证效果好【无法完美近似】,实验部分不使用这个

\[ w_i(\bar{x}) = \frac{n_i v_i p_i(\bar{x})}{\sum_{k=1}^M n_k v_k p_k(\bar{x})}, v_i = \frac{u_{2,i}}{\sigma_i^2}\tag{7} \]

加速与实现

  • 式子 6 的 \(p_i\) 展开为式子 5,几何项被约分
  • 最简单的实现:\((N-1)M\) 次查询计算 \(p_i\)
  • 时间复杂度:\(\mathcal{O}((C_S+C_D)MN)\),其中 S、D 分别表示空间结构、方向结构的查询开销
    • 实践中,\(C_S\) 更大,尤其是大场景
    • 在空间结构的树节点保留历史的的方向结构指针,让复杂度降为 \(\mathcal{O}(C_SN+C_DMN)\)
      • 降了一半开销
  • 路径
    • 保存 \(N\) 个节点的 position(3 N floats)
      • 方向可以计算出来
    • \(N\) 个节点的 bsdf pdf(defensive sampling)(N floats)
      • 【PPG 采样概率是 \(\alpha\) 混合】
    • 最后一个节点的入射方向(1 float,放到两个 16 位的定点数)
    • 路径贡献(3 float)
  • 开销:\(16(N+1)\) bytes
    • 实际实现如下
1
2
3
4
5
6
7
struct RawImageSample {
std::vector<Point4f> path; // 位置 + 采样 pdf
Point2f last_dir; // 最后一个位置的方向 // 2*max_quadtree_depth bits at most actually
Spectrum value; // 贡献值
int iter; // uint8_t actually, neglectable
float original_radiance; // 用于排序,就是 sum(value) // not really needed
};
  • 内存随着样本数线性增加

固定大小内存

  • 为 path sample 分配固定大小内存【500MB】
  • 当超过大小时,移除最不重要的样本【优先队列,上面的 original_radiance 就是重要性】
  • 移除的时候,我们使用部分 MIS
    • \(i\) 表示当前轮次
    • 实现上,利用mitsuba 的 ESpectrumAlphaWeight 相片;对所有的路径都累计 \(wL\)\(w\) 忽略 \(\sum_{k=1}^{M} n_k\)【ESpectrumAlphaWeight 最后计算的时候刚好作为权重项除掉了】
    • 怎么感觉都不是无偏的呢?
      • 在一个迭代轮中,只有被去除的样本使用下面计算
      • 假设只有轮次 \(M-1\) 中的一个样本被去除了,那么这里感觉 \(w\) 的和都不是 1 呢?

\[ w_i(\bar{x}) = \frac{n_i p_i(\bar{x})}{\sum_{k=1}^{i} n_k p_k(\bar{x})} \frac{\sum_{k=1}^{i} n_k}{\sum_{k=1}^{M} n_k} \tag{8} \]

  • 256 spp 对比如下:后面 3 个依次是
    • 无限内存、移除样本不使用加权、部分 MIS 加权
    • relMSE、relative mean absolute bias、渲染时间

  • 论文中说效果好了

实验

  • 不开 NEE、RR;最大深度 3-12
  • 论文中和直接 累计+outlier removal 做对比
    • 数据上看,outlier removal 的效果极好【论文中说存在一些视觉比较差的 artifacts,下图确实有
      • 【CGF-2018】Reweighting Firefly Samples for Improved Finite-Sample Monte Carlo Estimates

  • 问题
    • 内存开销大问题
    • 目前只能针对 PPG 这样的树结构,如果是 NN,无法存储
    • NEE 不太能开,需要存储更多的量,内存问题

评价

  • 自己有些实验也发现,直接累计+outlier removal 效果就很好
  • 首先论文也没啥理论支撑,然后无偏性不确定【可能是没看懂】,内存问题还不支持 NEE,评价为一点用都没有
  • 而且我感觉 \(p_i\) 本身不靠谱,范围非常大
  • 贡献:提出一个问题的好方向【利用 path space 的信息,混合不同迭代轮此之间的生成图片】,但是没能解决,全文其实就是用了一个式子 8【还不是他自己提出的】