NeRF 基础 - 从图像进行 3D 场景重建
什么是 NeRF - 用神经网络表示 3D 场景
NeRF (Neural Radiance Fields) 是 2020 年由 Mildenhall 等人提出的方法,使用神经网络从多张 2D 照片重建 3D 场景。网络学习将 3D 坐标和观察方向映射到颜色和密度,从而能够从任意角度渲染逼真的新视角图像。
核心思想:将 3D 场景表示为连续的辐射场函数 F(x, y, z, θ, φ) → (r, g, b, σ),其中 (x,y,z) 是空间坐标,(θ,φ) 是观察方向,(r,g,b) 是颜色,σ 是体积密度。这个函数由 MLP (多层感知器) 近似。
与传统方法的区别:
- 传统摄影测量:提取特征点 → 稀疏点云 → 稠密点云 → 网格。显式几何表示
- NeRF:隐式表示,无需显式几何。直接从连续函数渲染图像
输入要求:通常需要 50-200 张从不同角度拍摄的照片,以及每张照片的相机位姿 (位置和朝向)。相机位姿通常通过 COLMAP 等 SfM (Structure from Motion) 工具自动估计。
补充:NeRF (Neural Radiance Fields) 由 UC Berkeley 的研究团队于 2020 年发表,并在 ECCV 2020 上获得 Best Paper Honorable Mention,为三维计算机视觉领域带来了革新。其基本思路是:以三维空间中的各点 (x, y, z) 与视线方向 (θ, φ) 作为输入,学习一个输出该点颜色 (RGB) 与密度 (σ) 的神经网络 F: (x, y, z, θ, φ) → (r, g, b, σ)。与传统方法相比,摄影测量 (SfM + MVS) 会生成显式网格,但纹理质量存在上限;点云以离散的点来表示,难以还原连续的表面;而 NeRF 借助连续的隐式表示,实现了照片级真实感的质量。
体积渲染 - 通过光线行进生成图像
NeRF 使用体积渲染 (Volume Rendering) 从辐射场生成 2D 图像。对于图像中的每个像素,从相机发射一条光线,沿光线采样多个点,累积颜色和密度得到最终像素颜色。
渲染方程:
C(r) = ∫ T(t) × σ(t) × c(t) dt
其中 T(t) = exp(-∫σ(s)ds) 是累积透射率,σ(t) 是 t 处的密度,c(t) 是 t 处的颜色。直观理解:光线穿过场景时,在每个点根据该点的密度和颜色累积贡献,密度高的区域贡献大。
离散化近似:实际计算中将连续积分离散化为 N 个采样点的加权求和。分层采样 (Stratified Sampling) 将光线均匀分段,每段内随机采样一点,避免采样偏差。
层级采样 (Hierarchical Sampling): NeRF 使用粗-细两阶段采样。粗网络先均匀采样 64 个点估计密度分布,然后根据密度分布在重要区域 (物体表面附近) 追加 128 个精细采样点。这大幅提高了渲染效率和质量。
位置编码 (Positional Encoding):直接输入 (x,y,z) 坐标会导致网络难以学习高频细节。NeRF 使用正弦/余弦位置编码将低维坐标映射到高维空间:γ(p) = [sin(2⁰πp), cos(2⁰πp), ..., sin(2^(L-1)πp), cos(2^(L-1)πp)]。L=10 用于坐标,L=4 用于方向。
补充:分层采样 (Hierarchical Sampling):NeRF 分为粗 (coarse) 网络与细 (fine) 网络两个阶段进行采样,先用粗网络沿光线均匀取样以把握密度分布,再用细网络在密度较高的区域集中取样。位置编码中 sin(2^0πp) 的第 0 项对应最低频成分,正是通过显式输入高频成分,才使细小纹理的还原成为可能。
NeRF 训练过程 - 从数据准备到模型优化
NeRF 的训练是一个自监督过程:从已知相机位姿渲染图像,与真实照片比较,通过梯度下降优化网络参数。
数据准备流程:
- 拍摄 50-200 张覆盖场景的照片 (均匀分布角度)
- 使用 COLMAP 估计相机内参和外参
- 可选:使用 Mask 排除动态物体或天空
- 划分训练集和测试集 (通常每 8 张取 1 张作为测试)
训练细节:
- 损失函数:渲染像素颜色与真实像素颜色的 MSE
- 每次迭代随机选择一批光线 (通常 1024-4096 条)
- 训练时间:原始 NeRF 在单 GPU 上约需 1-2 天 (100k-300k 迭代)
- 网络结构:8 层 MLP,每层 256 个神经元,ReLU 激活
常见问题与解决:
- 浮动伪影:空气中出现半透明噪点。解决:增加正则化或使用 distortion loss
- 模糊:细节不清晰。解决:增加位置编码频率,增加训练迭代
- 相机位姿不准:导致整体模糊。解决:使用 BARF 等联合优化位姿的方法
补充:由于每个场景都要单独训练一个模型,其目的并非泛化,而是刻意的过拟合 (memorization)。拍摄时相邻图像之间的重叠率建议保持在 60% 以上。损失函数采用预测颜色与实际像素颜色的 MSE:L = Σ||C_pred(r) - C_gt(r)||^2。优化器使用 Adam,学习率从 5e-4 开始并按指数衰减,通常经过 200,000-500,000 次迭代收敛。原始 NeRF 在 NVIDIA V100 上训练单个场景约需 1-2 天。
加速方法 - Instant NGP 和 3D Gaussian Splatting
原始 NeRF 训练慢 (数天) 且渲染慢 (每帧数秒),限制了实际应用。近年来的加速方法将训练缩短到分钟级,渲染达到实时。
Instant NGP (2022, NVIDIA):
- 使用多分辨率哈希编码替代 MLP 的大部分计算
- 将场景空间划分为多级网格,每级使用哈希表存储特征向量
- 训练时间从数天缩短到 5-15 秒 (RTX 3090)
- 渲染速度达到实时 (30+ fps)
- 实现:NVIDIA 的 instant-ngp 开源项目
3D Gaussian Splatting (2023):
- 完全不同的表示方法:使用数百万个 3D 高斯椭球体显式表示场景
- 每个高斯体有位置、协方差 (形状)、颜色和不透明度参数
- 渲染使用可微分光栅化而非光线行进,速度极快
- 训练约 10-30 分钟,渲染 100+ fps (1080p)
- 质量与 NeRF 相当或更好,尤其在细节表现上
其他加速方法:
- TensoRF:张量分解表示辐射场,内存效率高
- Plenoxels:体素网格 + 球谐函数,无需神经网络
- Zip-NeRF:结合 mip-NeRF 360 和 Instant NGP 的优点
补充:Instant NGP (Neural Graphics Primitives) 是 NVIDIA 于 2022 年发表的方法,借助多分辨率哈希编码把训练时间缩短到数秒至数分钟。速度对比如下:原始 NeRF 训练 1-2 天、渲染 30 秒/帧;Instant NGP 训练 5 秒至 5 分钟、渲染 15ms/帧;3D Gaussian Splatting 训练 5-30 分钟、渲染 7ms/帧 (可实时浏览)。
实际工作流程 - 从拍摄到 3D 模型生成
将 NeRF/3DGS 应用于实际项目的完整工作流程,从数据采集到最终输出。
拍摄指南:
- 围绕物体/场景均匀拍摄,覆盖所有角度
- 保持一致的曝光和白平衡 (手动模式)
- 避免运动模糊和过曝/欠曝
- 场景中应有足够纹理供特征匹配
- 室内:50-100 张;室外大场景:100-300 张
推荐工具链:
- Nerfstudio:统一框架,支持多种 NeRF 变体和 3DGS。命令行友好,可视化完善
- COLMAP: SfM 相机位姿估计的标准工具
- Polycam / Luma AI:手机端一键扫描和重建的商业应用
- Meshroom:开源摄影测量软件,可与 NeRF 流程结合
输出格式:
- 新视角图像/视频:直接从训练好的模型渲染
- 点云导出:从密度场提取点云 (用于测量)
- 网格导出:Marching Cubes 提取等值面,用于 3D 打印或游戏引擎
- 3DGS 的 .ply 文件:可在专用查看器中实时浏览
补充:拍摄时相机之间的重叠率以 60-80% 为理想,应避免视角的剧烈跳变。用智能手机也能获得足够的质量,但以 RAW 拍摄并固定曝光可以让结果更稳定。之后用 COLMAP 估计相机位姿,再用 Instant NGP 或 Nerfacto (Nerfstudio 自有方法) 进行训练。
NeRF 应用与未来展望 - 从产业到研究前沿
NeRF 及其后续技术正在多个领域产生实际影响,同时研究前沿不断推进边界。
产业应用:
- 房地产:室内空间的沉浸式虚拟游览
- 电商:商品 3D 展示,消费者可自由旋转查看
- 文化遗产:历史建筑和文物的数字化保存
- 影视 VFX:实景场景的数字孪生,用于后期合成
- 自动驾驶:驾驶场景重建用于仿真测试
研究前沿:
- 动态场景: D-NeRF、HyperNeRF 处理随时间变化的场景
- 生成式 NeRF: DreamFusion 从文本描述生成 3D 场景
- 大规模场景: Block-NeRF、Mega-NeRF 处理城市级别的大场景
- 少样本重建: pixelNeRF、SRN 从少量图像 (3-10 张) 重建
- 可编辑 NeRF:修改场景中物体的位置、外观、光照
局限性与挑战:
- 反射和透明物体仍然困难
- 室外大范围场景的光照变化处理
- 动态物体和人体的实时重建
- 从 NeRF 表示到标准 3D 格式的高质量转换
补充:由文本生成 3D:DreamFusion (Google) 与 Magic3D (NVIDIA) 可以从文本提示生成三维物体。它们把预训练的扩散模型 (Stable Diffusion) 通过 SDS (Score Distillation Sampling) 损失用于 NeRF 的优化,从而生成与文本描述相符的三维形状。