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 使用体积渲染 (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 用于方向。
NeRF 训练过程 - 从数据准备到模型优化
NeRF 的训练是一个自监督过程: 从已知相机位姿渲染图像,与真实照片比较,通过梯度下降优化网络参数。
数据准备流程:
- 拍摄 50-200 张覆盖场景的照片 (均匀分布角度)
- 使用 COLMAP 估计相机内参和外参
- 可选: 使用 Mask 排除动态物体或天空
- 划分训练集和测试集 (通常每 8 张取 1 张作为测试)
训练细节:
- 损失函数: 渲染像素颜色与真实像素颜色的 MSE
- 每次迭代随机选择一批光线 (通常 1024-4096 条)
- 训练时间: 原始 NeRF 在单 GPU 上约需 1-2 天 (100k-300k 迭代)
- 网络结构: 8 层 MLP,每层 256 个神经元,ReLU 激活
常见问题与解决:
- 浮动伪影: 空气中出现半透明噪点。解决: 增加正则化或使用 distortion loss
- 模糊: 细节不清晰。解决: 增加位置编码频率,增加训练迭代
- 相机位姿不准: 导致整体模糊。解决: 使用 BARF 等联合优化位姿的方法
加速方法 - 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 的优点
实际工作流程 - 从拍摄到 3D 模型生成
将 NeRF/3DGS 应用于实际项目的完整工作流程,从数据采集到最终输出。
拍摄指南:
- 围绕物体/场景均匀拍摄,覆盖所有角度
- 保持一致的曝光和白平衡 (手动模式)
- 避免运动模糊和过曝/欠曝
- 场景中应有足够纹理供特征匹配
- 室内: 50-100 张; 室外大场景: 100-300 张
推荐工具链:
- Nerfstudio: 统一框架,支持多种 NeRF 变体和 3DGS。命令行友好,可视化完善
- COLMAP: SfM 相机位姿估计的标准工具
- Polycam / Luma AI: 手机端一键扫描和重建的商业应用
- Meshroom: 开源摄影测量软件,可与 NeRF 流程结合
输出格式:
- 新视角图像/视频: 直接从训练好的模型渲染
- 点云导出: 从密度场提取点云 (用于测量)
- 网格导出: Marching Cubes 提取等值面,用于 3D 打印或游戏引擎
- 3DGS 的 .ply 文件: 可在专用查看器中实时浏览
NeRF 应用与未来展望 - 从产业到研究前沿
NeRF 及其后续技术正在多个领域产生实际影响,同时研究前沿不断推进边界。
产业应用:
- 房地产: 室内空间的沉浸式虚拟游览
- 电商: 商品 3D 展示,消费者可自由旋转查看
- 文化遗产: 历史建筑和文物的数字化保存
- 影视 VFX: 实景场景的数字孪生,用于后期合成
- 自动驾驶: 驾驶场景重建用于仿真测试
研究前沿:
- 动态场景: D-NeRF、HyperNeRF 处理随时间变化的场景
- 生成式 NeRF: DreamFusion 从文本描述生成 3D 场景
- 大规模场景: Block-NeRF、Mega-NeRF 处理城市级别的大场景
- 少样本重建: pixelNeRF、SRN 从少量图像 (3-10 张) 重建
- 可编辑 NeRF: 修改场景中物体的位置、外观、光照
局限性与挑战:
- 反射和透明物体仍然困难
- 室外大范围场景的光照变化处理
- 动态物体和人体的实时重建
- 从 NeRF 表示到标准 3D 格式的高质量转换