ICCV 2021 · Oral · arXiv:2103.15606v3

没有已知相机姿态,怎样训练一个 NeRF?

GNeRF 把单场景 NeRF 看作由相机先验驱动的图像生成器:先用 GAN 学到全局外观分布和粗姿态,再用反演网络约束每张真实图像的姿态,最后用光度误差精修。

Quan Meng 等ShanghaiTech University / UC San DiegoICCV 2021, 6351–6361DOI 10.1109/ICCV48922.2021.00629
论文 Figure 1:从无姿态灰度掩码同时恢复几何与相机姿态
Figure 1:作者展示了极端的无纹理灰度掩码案例。它是定性应用演示,未构成透明物体重建的定量验证。

研究问题与边界

输入是同一个静态场景的多张 RGB 图像、已知或固定的相机内参及场景近远边界;每张图像的外参未知。输出是每张图像的相机外参与一个可用于新视角合成的场景专属 NeRF。

1 scene每次训练一个场景
0 GT poses训练不使用真实外参
100 / 43Synthetic / DTU 训练图像
30 h单 RTX TITAN 每场景
Research gap

光度损失的吸引域太小

标准 NeRF 假设相机姿态准确。iNeRF 需要已经训练好的 NeRF;NeRF-- 在较短、近似前向轨迹和合理初始化附近联合优化。相机起点完全错误时,像素对应关系失真,光度梯度容易把姿态和场景同时带入局部极小值。

Core intuition

先匹配分布,再建立逐图对应

Phase A 暂时不要求“第 \(i\) 张生成图必须等于第 \(i\) 张真实图”。GAN 只要求随机姿态渲染出的 patch 分布接近真实 patch 分布;反演网络再从生成图像学习姿态回归,并将这种回归迁移到真实图像。

Required prior

无外参仍有相机先验

方法需要合理的姿态采样空间、内参、near/far 和场景尺度。Synthetic-NeRF 使用半径 4、上半球、朝向原点;DTU 使用方位角 \(0^{\circ}\)–\(150^{\circ}\)、仰角 \(0^{\circ}\)–\(80^{\circ}\),look-at 在原点附近扰动。

What it is

单场景自监督标定与重建

GNeRF 没有跨场景预训练,也没有从随机 latent 生成不同对象。随机变量是相机姿态;同一个 \(F_{\Theta}\) 表示同一个场景。GAN 在这里提供全局分布约束。

读者应保留的限定:“without posed camera”表示不提供每张图像的已知外参。它没有移除相机内参、场景边界或姿态分布先验。官方 README 也明确指出,姿态先验要接近数据;对称场景可能因一幅图像对应多个姿态而使反演失败。

表示、渲染与目标函数

论文沿用标准 NeRF 渲染方程,并将监督关系从已配对的图像–姿态监督扩展为分布匹配、生成图像姿态回归和真实图像重建三种信号。

相机姿态

相机中心 \(\mathbf{t}\in\mathbb{R}^{3}\)。自由旋转用 \(\mathbf{r}\in\mathbb{R}^{6}\) 表示:从旋转矩阵取两列,再经 Gram–Schmidt 正交化恢复 \(SO(3)\)。代码把 \(\mathbf{t}\) 与 6D 旋转拼成 9 维可优化向量;Synthetic 的朝向由 camera center 和 look-at 直接计算,因此仅优化 3 维中心。

\[ \mathbf{b}_1=\frac{\mathbf{a}_1}{\lVert\mathbf{a}_1\rVert_2},\quad \mathbf{b}_2=\frac{\mathbf{a}_2-(\mathbf{b}_1^{\top}\mathbf{a}_2)\mathbf{b}_1}{\lVert\mathbf{a}_2-(\mathbf{b}_1^{\top}\mathbf{a}_2)\mathbf{b}_1\rVert_2},\quad \mathbf{b}_3=\mathbf{b}_1\times\mathbf{b}_2. \]

场景函数与体渲染

场景函数 \(F_{\Theta}:(\mathbf{x},\mathbf{d})\rightarrow(\mathbf{c},\sigma)\) 将 3D 位置和观察方向映射为 RGB 颜色与密度。体渲染器 \(G(\phi;F_{\Theta})\) 沿姿态 \(\phi\) 定义的射线采样并积分。代码使用 64 个 coarse 样本和 64 个 importance 样本。

\[ \hat{I}_i=G(\phi_i;F_{\Theta}),\qquad \mathcal{L}_{N}(\Theta,\Phi)=\frac{1}{n}\sum_{i=1}^{n}\lVert I_i-\hat{I}_i\rVert_2^2. \]

Eq. 1:沿相机射线累积颜色

射线为 \(\mathbf r(s)=\mathbf o+s\mathbf d\),其中 \(\mathbf o\) 为相机中心、\(\mathbf d\) 为世界坐标方向,\(s\) 为射线距离。采样位置间隔为 \(\delta_j\),网络输出颜色 \(\mathbf c_j\) 与密度 \(\sigma_j\)。

\[ \hat{\mathbf C}(\mathbf r)=\sum_{j=1}^{M}T_j\left(1-\exp(-\sigma_j\delta_j)\right)\mathbf c_j,\qquad T_j=\exp\left(-\sum_{k=1}^{j-1}\sigma_k\delta_k\right). \]

\(T_j\) 表示射线到达第 \(j\) 个采样位置之前的透射率;密度决定局部不透明度。颜色累积对 NeRF 和相机位置、方向均可微,因此 photometric loss 能同时更新场景与姿态。coarse 分布提供 importance sampling,fine 阶段额外抽取 64 个位置,使用两组位置联合渲染。官方 Synthetic 配置 near/far 为 2/6、白背景;DTU 为 1.5/8、无白背景。

Eq. 2–4:生成分布与 GAN

论文 Eq. 3 写作对图像值的积分,若把它逐字理解为“平均图像”会失去概率分布含义。严格地说,生成分布是姿态先验 \(P_{\Phi}\) 经渲染映射 \(G_{\Theta}\) 的 pushforward:

\[ P_{g}(I\mid\Theta)=(G_{\Theta})_{\#}P_{\Phi},\qquad p_g(I\mid\Theta)=\int \delta\!\left(I-G(\phi;F_{\Theta})\right)p_{\Phi}(\phi)\,d\phi. \]

论文的优化意图为 \(\Theta^{\ast}=\arg\min_{\Theta}\operatorname{Dist}(P_g\Vert P_d)\),并用经典 minimax GAN:

\[ \min_{\Theta}\max_{\eta}\ \mathcal{L}_{A}(\Theta,\eta)= \mathbb{E}_{I\sim P_d}[\log D_{\eta}(I)] + \mathbb{E}_{\hat I\sim P_g}[\log(1-D_{\eta}(\hat I))]. \]

固定代码实现使用 logits 上的 binary cross entropy:生成器目标标签为 1,属于常用的 non-saturating generator loss;判别器分别以 1/0 监督真实与生成 patch,并对真实输入加入梯度范数正则。它与论文写出的 minimax 形式具有同一对抗目标,梯度形式并不逐字相同。

Eq. 5:反演网络

对随机姿态 \(\phi\) 渲染生成图,再训练 \(E\) 回归生成该图的姿态。监督来自系统自身采样,属于场景内自监督。

\[ \mathcal{L}_{E}(\theta_E)=\mathbb{E}_{\phi\sim P_{\Phi}}\left[\left\lVert E(G(\phi;F_{\Theta});\theta_E)-\phi\right\rVert_2^2\right]. \]

Eq. 6:正则化联合优化

光度项更新 NeRF 与每图姿态;反演项把真实图像姿态拉向冻结 \(E\) 的预测。

\[ \mathcal{L}_{R}(\Theta,\Phi)=\mathcal{L}_{N}(\Theta,\Phi)+\frac{\lambda}{n}\sum_{i=1}^{n}\left\lVert E(I_i;\theta_E)-\phi_i\right\rVert_2^2. \]

代码没有一次性联合求和:姿态正则在 A 子步骤以均方误差乘 \(0.1\) 单独更新姿态;B 子步骤以 photometric MSE 乘 \(50\) 更新 NeRF 与姿态。\(E\) 在真实图像姿态正则与 B 中冻结。

真实训练是 A → AB…AB → B

论文的“两阶段”是概念结构;公开实现包含三段 schedule。中间段的每一次训练迭代先运行完整 A 子流程,再运行 B 子流程。

论文 Figure 2:GNeRF 完整训练架构
Figure 2:动态 patch 用于 GAN,静态全视野稀疏 patch 用于姿态反演;右侧 photometric loss 联合精修场景和每图姿态。

初始化与渐进分辨率

每张训练图与验证图的 pose parameter 初始化为相同的 canonical pose。A 阶段从 \(16\times16\) 输出分辨率逐渐增至 \(128\times128\);AB 段再逐渐增至数据分辨率。内参按当前尺寸缩放。

A-1:更新生成器 \(G\)

从姿态先验采样相机,渲染 coarse 与 fine 两组 \(16\times16\) 动态 patch,判别器冻结;BCE 目标令两组 fake 被判为 real。仅 NeRF 参数接收梯度。

A-2:更新判别器 \(D\)

NeRF、反演网络与全部姿态冻结。\(D\) 对真实 patch 取标签 1,对已 detach 的生成 patch 取标签 0;默认使用真实输入梯度正则、spectral normalization、instance normalization 与 color/cutout DiffAugment。

A-3:更新反演网络 \(E\)

NeRF 冻结但负责产生 \(64\times64\) 静态全视野稀疏图;\(E\) 同时回归 coarse 和 fine 图对应的采样姿态。只有 ViT 参数更新。

A-4:约束真实图姿态

\(E\) 与 NeRF 冻结。真实图降采样为 \(64\times64\) 全视野 patch,训练姿态以 \(0.1\lVert E(I_i)-\phi_i\rVert^2\) 更新;验证图姿态也独立执行同类更新,用于测试视角渲染。

B:光度精修

\(D\) 与 \(E\) 冻结,使用真实 patch 坐标和当前每图姿态渲染 coarse/fine;\(50\times\) MSE 同时更新 NeRF 与训练姿态。验证姿态每 8 步更新一次,此时 NeRF 冻结。

A:0–12k

对抗生成、反演训练、真实图姿态正则。没有 photometric refine。

AB:12k–20k

每步依次执行 A 的全部子步骤与 B 光度更新。此处是真正的交替耦合。

B:20k 以后

只保留光度精修。README 建议总计约 40k iterations。

相机约定:公开代码存储 \(3\times4\) camera-to-world 矩阵 \([R\mid t]\)。\(t\) 是 ray origin,即相机中心;射线方向由相机坐标方向乘 \(R\) 得到世界方向。DTU 原始 extrinsic 在数据加载时求逆后才进入这一约定。

实验设置与完整结果

Table 1 的 holdout 新视角测试、Table 2 的 49 张训练视角重建、Table 3 的训练集姿态误差属于三种不同协议。数值只能在各自协议内解释。

数据与划分

Synthetic-NeRF:6 个场景,100 张训练图;从原 test split 选 8 张角距离较大的测试图。GNeRF 与 NeRF baseline 训练分辨率 \(400\times400\)。

DTU:scan4、48、63、104 用于 Table 1,每第 8 张作为测试,其余 43 张训练,分辨率 \(500\times400\)。Table 2 另用 scan48、97、104 的全部 49 张训练视角。

模型与优化

一个共享的 8 层、宽度 360 NeRF MLP 同时服务 coarse 与 fine;64+64 samples。ViT 反演器:64 输入、16×16 token 网格、dim 256、6 层、16 heads。batch size 12。

RMSprop:\(G=5\times10^{-4}\)、\(D=10^{-4}\)。Adam:\(E=10^{-4}\)、pose \(=5\times10^{-3}\),公开代码 beta 为 \((0.9,0.99)\)。官方配置中,生成器与判别器每 8,000 步将学习率减半,反演网络与训练/验证姿态优化器每 4,000 步减半。

Table 1 · Novel-view synthesis

数据 / 场景PSNR ↑SSIM ↑LPIPS ↓
C+nC+rOursG+nC+nC+rOursG+nC+nC+rOursG+n
Synthetic · Chair33.7532.7031.3032.840.970.950.940.970.030.050.080.04
Synthetic · Drums22.3923.4224.3026.710.910.880.900.930.100.130.130.07
Synthetic · Hotdog25.1433.5932.0029.720.960.970.960.950.050.030.070.04
Synthetic · Lego29.1328.7328.5231.060.930.920.910.950.060.080.090.04
Synthetic · Mic26.6231.5831.0734.650.960.970.960.970.040.030.060.02
Synthetic · Ship27.4928.0426.5128.970.880.860.850.820.160.180.210.15
DTU · Scan422.0524.2322.8825.520.690.720.820.780.320.200.370.18
DTU · Scan486.71810.4023.2526.200.520.620.870.900.650.600.210.21
DTU · Scan6327.8026.6125.1132.190.900.900.900.930.210.190.290.24
DTU · Scan10410.5213.9221.4023.350.480.550.760.820.600.590.440.36

C+n:COLMAP pose + 原始 NeRF;C+r:COLMAP pose 后再联合优化;G+n:真实 pose + NeRF。加粗为逐行单指标最优,原论文标注方式可能同时突出作者关注项。结论具有场景差异:Ours 在 Drums、Scan48、Scan104 明显缓解 COLMAP 失败;Chair、Ship 和多项正常纹理场景中 COLMAP 或真实姿态更好。

协议不对称:GNeRF 用 100 张 \(400^2\) 训练图,通过冻结 \(E\) 约束 8 张测试图的姿态,并在 B/AB 阶段每 8 步使用这些测试图像的 photometric loss 更新其姿态;此时 NeRF 固定。COLMAP 使用训练与测试合计 108 张 \(800^2\) 图共同注册,随后各方法在 \(400^2\) 训练。COLMAP 得到更多图像和更高注册分辨率;测试图也进入其几何注册。因此 Table 1 适合评价最终系统结果,不能把差异完全归因于同一观测条件下的算法能力。
论文 Figure 3:Synthetic-NeRF 与 DTU 的定性新视角对比
Figure 3:Ours 在低纹理或重复纹理案例中保持结构;正常纹理场景的 COLMAP 结果通常更锐利。原图按论文编号直接引用。

Table 2 · 与 IDR 的训练视角重建比较(PSNR)

方法Scan48Scan97Scan104
IDR(mask 内)21.1717.4212.26
Ours(mask 内)20.4019.4019.81
Ours(全图)25.7124.5225.70

三种结果不可跨 mask / whole-image 直接排序。IDR 和 Ours 都在每场景全部 49 张训练图上联合优化模型与外参,报告训练视角平均 PSNR;它不等同于 Table 1 的 holdout novel-view protocol。IDR 还使用 mask 和 noisy pose initialization,Ours 不使用这两项。

论文 Figure 4:IDR 与 GNeRF 定性比较
Figure 4:IDR 与 GNeRF 在 DTU 训练视角的渲染比较。论文把更自然、细节更多归因于 volume rendering,但这一解释主要来自定性观察。

Table 3 · Synthetic-NeRF 训练集姿态误差

场景COLMAP Rot↓COLMAP Trans↓Ours Rot↓Ours Trans↓
Chair0.119°0.0060.363°0.018
Drums9.985°0.5220.204°0.010
Hotdog0.542°0.0242.349°0.122
Lego7.492°0.3320.430°0.023
Mic0.746°0.0471.865°0.031
Ship0.191°0.0103.721°0.176

ATE toolbox 完成轨迹配准后报告训练集平均旋转与平移差。GNeRF 只在 Drums、Lego 两个困难场景全面胜出;其余多数场景 COLMAP 姿态更准确。输入仍为 COLMAP 108 张 \(800^2\) 与 GNeRF 100 张 \(400^2\)。

消融与先验敏感性

消融在 Chair 上说明三类信号各有作用;附录进一步显示“合理先验”容许小幅错配,但覆盖大量未见视角会明显降低质量。

Table 4 · 组件消融

AdversarialInversionPhotometricPSNR↑Rot↓Trans↓
—✓✓19.31108.22°2.53
✓—✓13.82132.85°3.05
✓✓—20.605.91°0.24
✓✓✓31.300.36°0.02

移除 adversarial 或 inversion 后姿态彻底失败;只移除 photometric 时粗姿态已可用,但渲染与姿态精度仍远低于完整模型。该表支持“分布级初始化 + 逐图姿态约束 + 光度精修”的组合价值。

论文 Figure 5:三个组件的消融可视化
Figure 5:完整模型在 RGB 与深度图上最稳定;缺少对抗或反演时几何失败,缺少光度项时只得到粗结构。

Table 5 · schedule 消融

训练 schedulePSNR↑Rot↓Trans↓
A → B29.230.592°0.034
A → AB…AB → B31.300.363°0.018

中间交替使 PSNR 增加 2.07 dB,旋转误差降低约 38.7%,平移误差降低约 47.1%。它直接反驳了把实现理解为一次 A 后一次 B 的简化描述。

论文 Figure 6:A-B 与 A-AB-B 的相机分布和深度比较
Figure 6:迭代 schedule 的 camera projection 更接近真值,边缘深度更细。定量结果见 Table 5。

Table 6 · Chair 的姿态先验变化

RadiusElevationAzimuthLook-atPSNR↑
4[0°, 90°][0°, 360°](0,0,0)31.30
[3,5][0°, 90°][0°, 360°](0,0,0)29.68
4[−90°, 90°][0°, 360°](0,0,0)23.08
4[0°, 90°][0°, 360°]\(\mathcal{N}(0,0.01^2)\)30.48

半径壳层或轻微 look-at 扰动影响有限;把 elevation 扩到包含训练中不存在的下半球视角损失 8.22 dB。证据仅来自 Chair,不能外推为任意数据的先验容忍性。

Table 7 · COLMAP 注册数与图像尺寸

输入尺寸ChairDrumsHotdogLegoMicShip
400×40010887981081982
800×80010810010410884108

原 caption 写“image numbers analysis / reduce training image numbers”,正文与表格实际改变的是分辨率,固定输入 108 张。这项附录实验解释了作者为何给 COLMAP 使用 \(800^2\) 图像注册。

附录应用的证据边界

无姿态 mask 重建

作者把 mask 当一通道图像,用相同体渲染训练,再按原 NeRF 脚本以 marching cubes 提取几何。Figure 7 是有限案例的定性演示,没有表面误差、更多对象或失败率。

强噪声图像

Figure 8 使用高斯噪声 \(\mathcal{N}(0,0.5^2)\)。COLMAP 注册失败,GNeRF 仍给出渲染和深度。作者只用对应姿态的渲染作定性核验,没有报告噪声强度曲线或姿态数值。

论文 Figure 7:无姿态掩码的三维重建
Figure 7:从无姿态 masks 恢复姿态和 3D。论文提出其可能服务于透明物体,但没有执行透明材质真实图像的定量实验。
论文 Figure 8:带强噪声图像的姿态与 NeRF 恢复
Figure 8:强噪声定性案例。它支持“关键点法失败时仍可能训练”,尚不足以建立普遍噪声鲁棒性结论。

Paper vs. implementation

以下核查基于官方仓库固定提交 a008c63dba3a0f7165e912987942c47972759879(2021-11-12)。代码与论文核心方法一致,同时补充了论文未写清的 schedule、权重、归一化和梯度流。

Schedule 与冻结trainer.py:83–88:A ≤ 12000,ABAB ≤ 20000,之后 B。每个 trainstep 使用 toggle_grad 显式冻结其他模块。ABAB 分支同一迭代先执行 A 的 G/D/E/pose regularization,再执行 B photometric refine。
损失的实现比例真实图姿态正则为 mean squared error × 0.1;photometric refine 为 coarse 与 fine 两组 patch 的 mean squared error × 50。论文只用 \(\lambda\) 概括,没有报告这两个代码比例。
GAN 目标默认 gan_type=standard,使用 binary_cross_entropy_with_logits。生成器 target=1;判别器 real=1、fake=0,并以系数 10 对 real input gradient norm 正则化。
姿态维度Synthetic 的 pose_mode=3d 只学习 camera center,由 look-at 原点决定旋转。DTU 的 pose_mode=6d 实际参数为 3 translation + 6 rotation,共 9 维。
共享 MLP 与细物体代价coarse 和 fine 重用同一个宽 360 的 NeRF MLP,以保持两个层级姿态空间一致。README 明确警告单 MLP 会降低细物体表现,并把 mip-NeRF、BARF、NeRF++ 组合列作 future improvements。
方向编码配置未生效config.py 声明 dir_freq=4,但 train.py:103–105 构造 GNeRF 时传入 dir_freq=args.xyz_freq。默认 xyz_freq=10,因此公开代码的实际方向编码频率为 10。
可复现缺口代码公开 batch size 12、40k iterations、scheduler 与 Adam betas;论文没有随机种子、重复运行方差、完整数据准备哈希或所有场景逐项命令。README 报告默认约 13 GB GPU memory,没有独立复现实验记录。

Reviewer 视角

Paper Verified

论文真正验证了什么

  • 合理的 pose prior 下,可以从随机每图 pose parameter 开始,联合恢复单场景 NeRF 与外参。
  • Drums、Lego 的姿态误差明显降低;Drums、DTU 48/104 的 PSNR 高于 COLMAP 两种配置。
  • 完整三信号与 A→AB…AB→B schedule 在 Chair 消融中优于删减版本。
  • 小幅 radius/look-at 错配可容忍,大范围未见 elevation 会明显退化。
Author Claim

证据仍有限的解释

  • 作者把困难场景优势主要归因于“高层特征而非关键点”,但没有直接分析 \(E\) 的特征或与学习型匹配器比较。
  • “end-to-end”描述成立于可微训练系统;公开实现仍把模块分步优化并显式 detach/freeze。
  • 透明物体重建属于潜在应用推断,论文只演示 mask。
  • 强噪声鲁棒性来自少量定性结果。
Our Interpretation

方法的核心价值

  • GAN 提供跨图像的弱对应全局信号,扩大姿态优化的有效吸引域。
  • 反演网络把生成器的已知采样姿态转化为真实图像的 scene-specific amortized pose prior。
  • 中间 AB 段让生成分布与逐图重建相互修正,是整个系统最关键的工程设计。
  • 性能上限受 pose prior、对称歧义与有限 \(64^2\) 反演输入约束。

Strengths

  • 问题重要,直接挑战 NeRF 对 SfM 的依赖;单场景、小数据和复杂 outside-in 设定在当时具有明显新意。
  • 把分布级 GAN 目标、姿态反演学习和 photometric bundle adjustment 组合成完整的训练流程。
  • 实验包含合成与真实场景、图像质量、姿态误差、组件消融、schedule 消融和先验错配。
  • 公开代码与核心论文描述高度一致,并显式给出关键默认配置。

Weaknesses

  • 姿态先验仍是强假设,室内随机轨迹很难用少数球面参数表达。
  • Table 1 的 COLMAP 与 GNeRF 使用不同分辨率、图像数量及测试图参与方式,系统比较有现实意义,但算法归因受到混杂。
  • 消融集中在 Chair,缺少跨场景方差与多次训练稳定性。
  • 对称物体存在一图多姿态,确定性 \(E\) 无法表达多峰后验。
  • 单一共享 MLP 牺牲细结构;训练每场景约 30 小时,推理前仍需昂贵优化。
Research Extension

对 procedural material / inverse graphics 的启发

可以把材质图程序或 shader 参数视为隐藏结构,用分布级渲染判别提供宽吸引域,再以一个 amortized inverter 为每个观测提供初始化,最后用可微 renderer 做逐样本 photometric / perceptual refine。进一步需要让 inverter 输出多峰分布,配合 execution-aware search 处理图结构与参数的多解性;还需要严格区分 topology prior、rendering prior 与真实可编辑性评测。这些是研究设想,GNeRF 没有生成 material graph,也没有验证材质编辑。

来源与核查范围

  1. Meng et al., GNeRF, arXiv:2103.15606v3:12 页 PDF,正文与附录完整读取;公式、Figure 1–8、Table 1–7。
  2. CVF ICCV 2021 Open Access:正式出版信息,pp. 6351–6361。
  3. IEEE DOI 10.1109/ICCV48922.2021.00629:正式 DOI。
  4. 官方代码固定提交 a008c63:训练 schedule、梯度流、网络、优化器、数据划分、姿态采样与实现限制。
  5. 官方 issue:Pose Distribution Prior:作者进一步说明 forward-facing、inward-facing 与随机分布场景的 pose prior 适用边界。

核查日期:2026-09-29。页面中的论文事实、代码事实、作者解释和研究延伸均分开标注。未运行完整训练,运行时间和显存沿用论文与官方 README 报告。