L4 · 模块二 · 工程实践 预计阅读 18 分钟 ← 课程目录

NeRF 工程实践 — 用 nerfstudio 训练与调优

本课是模块二的第一节。前3节课已经建立了 NeRF 和 3DGS 的原理框架,现在进入「动手做」的阶段。

从原理到实践的桥梁

L1 你已经理解了 NeRF 的核心:5D 坐标 → MLP → 体积渲染 → 像素。现在的问题是:如何在真实数据上跑起来?

从零手写一个完整的 NeRF 训练管线,需要处理相机标定、数据加载、采样策略、损失计算、可视化等大量工程细节。这不是 Mission 的目标。nerfstudio 把这些都封装好了,让你专注于模型本身。

为什么选 nerfstudio

nerfstudio 是当前最成熟的 NeRF/3DGS 开源框架,核心优势有三:

环境安装:一条最简路径

以下是在 Linux + NVIDIA GPU 上的推荐安装流程。nerfstudio 要求 Python ≥ 3.8、CUDA 兼容的 PyTorch,以及 tiny-cuda-nn(用于 Instant-NGP 等方法的高效 CUDA kernel)。

# 1. 创建 conda 环境
conda create -n nerfstudio -y python=3.8
conda activate nerfstudio

# 2. 安装 PyTorch (CUDA 11.8 版本)
pip install torch==2.1.2+cu118 torchvision==0.16.2+cu118 \
    --extra-index-url https://download.pytorch.org/whl/cu118

# 3. 安装 CUDA toolkit
conda install -c "nvidia/label/cuda-11.8.0" cuda-toolkit

# 4. 安装 tiny-cuda-nn
pip install ninja git+https://github.com/NVlabs/tiny-cuda-nn/\
    #subdirectory=bindings/torch

# 5. 安装 nerfstudio
pip install nerfstudio

# 6. 启用命令行补全(可选但推荐)
ns-install-cli
常见问题

CUDA 版本不匹配:PyTorch 和 tiny-cuda-nn 必须用相同 CUDA 版本编译。如果报错,先确认 nvcc --version 和 PyTorch 的 CUDA 版本一致。

Windows 安装:nerfstudio 在 Windows 上问题较多,推荐 WSL2 或 Linux 环境。

nerfstudio 核心命令一览

nerfstudio 提供 6 个核心 CLI 命令,覆盖从数据到部署的全流程:

命令作用典型用法
ns-process-data从图片/视频生成训练数据(含 COLMAP 位姿估计)ns-process-data images --data images/ --output-dir data/custom/
ns-train训练模型ns-train nerfacto --data data/custom/
ns-viewer启动 Web Viewer 查看训练好的模型ns-viewer --load-config outputs/.../config.yml
ns-eval评估模型质量(PSNR/SSIM/LPIPS)ns-eval --load-config outputs/.../config.yml
ns-render渲染视频或图片序列ns-render --load-config ... --traj spiral
ns-export导出点云、网格、高斯点云等ns-export pointcloud --load-config ...

实战:训练你的第一个 NeRF

下面用 nerfstudio 自带的 poster 数据集完成一个完整流程。这个数据集是室内场景,包含约 200 张图像,适合初次实验。

Step 1:下载数据

ns-download-data nerfstudio --capture-name=poster

数据会被下载到 data/nerfstudio/poster/,目录结构如下:

data/nerfstudio/poster/
├── images/           # 原始图像
├── transforms.json   # COLMAP 标定的相机位姿和内参
└── ...

Step 2:训练模型

ns-train nerfacto --data data/nerfstudio/poster

训练启动后,终端会显示实时指标,同时自动打开 Web Viewer(默认端口 7007)。

关于 nerfacto

nerfacto 是 nerfstudio 的默认模型,不是原始 NeRF。它整合了多个改进:

简单来说,nerfacto ≈ NeRF + Instant-NGP + Mip-NeRF 360 的工程融合。它是真实世界场景的最佳起点。

Step 3:交互式查看

打开终端输出的 Viewer URL(如 http://localhost:7007),你可以:

Step 4:评估质量

训练完成后,用测试集评估 PSNR、SSIM、LPIPS:

ns-eval --load-config outputs/poster/nerfacto/.../config.yml \
    --output-path eval.json

数据准备:从照片到训练数据

用你自己的照片训练 NeRF,需要先做两件事:位姿估计(每张照片的相机位置和朝向)和 数据格式化

拍摄建议

自动处理流程

# 从图片文件夹生成训练数据
ns-process-data images \
    --data path/to/your/images/ \
    --output-dir data/custom-scene/

# 从视频生成(自动抽帧)
ns-process-data video \
    --data path/to/video.mp4 \
    --output-dir data/custom-scene/ \
    --num-frames-target 200

ns-process-data 内部会自动运行 COLMAP(Structure from Motion 工具),完成:

  1. 特征提取与匹配
  2. 稀疏重建(得到相机位姿和稀疏点云)
  3. 输出 transforms.json(nerfstudio 需要的格式)
COLMAP 失败的常见原因

对策:增加拍摄角度变化、避免大面弱纹理、移除动态元素。若 COLMAP 仍然失败,可考虑使用 HLoc 等替代工具。

超参数调优指南

nerfacto 的默认参数已经过大量场景调优,通常无需修改。但遇到以下情况时可以针对性调整:

参数作用何时调整典型值
--pipeline.datamanager.train-num-rays-per-batch每批次采样射线数显存不足/过剩时2048–8192(默认 4096)
--pipeline.model.num-levels哈希编码层级数场景复杂度变化时12–16(默认 16)
--pipeline.model.hidden-dimMLP 隐藏层维度需要更高/更低精度时64–128(默认 64)
--trainer.steps-per-save保存 checkpoint 的间隔磁盘空间有限时2000(默认)
--optimizers.fields.lr场景 MLP 的学习率训练不稳定时1e-2(默认)
--max-num-iterations最大迭代次数场景复杂度变化时30000(默认)

一个显存受限时的调参示例:

ns-train nerfacto \
    --pipeline.datamanager.train-num-rays-per-batch 2048 \
    --pipeline.model.hidden-dim 32 \
    --max-num-iterations 20000 \
    --data data/custom-scene/

质量评估:三个指标的含义

nerfstudio 使用三个标准指标评估重建质量:

实际调优时,建议优先关注 LPIPS。一个模型可能 PSNR 很高但 LPIPS 很差(意味着图像「看起来不对」)。

1. nerfstudio 的默认模型 nerfacto 整合了哪些改进?
2. 使用自己的照片训练 NeRF 时,ns-process-data 内部做了什么?
3. 如果训练时显存不足(OOM),最应该调整哪个参数?

常见训练问题排查

现象可能原因解决方案
重建结果模糊、缺乏细节训练不足;哈希层级不够;位姿不准增加迭代次数;提高 num-levels;检查 COLMAP 质量
出现「鬼影」(运动模糊痕迹)场景中有移动物体;拍摄时手抖移除动态元素;使用三脚架;减少相邻帧重叠
天空/白色区域出现 artifact弱纹理区域 COLMAP 位姿不准避免大面积纯色;增加其他角度覆盖
训练 loss 不下降学习率过大;数据损坏降低学习率;检查 transforms.json 格式
Viewer 无法连接端口被占用;远程机器未做端口转发更换端口 --viewer.websocket-port 7008;配置 SSH 隧道

动手任务

  1. 安装环境:按本课流程安装 nerfstudio,确认 ns-train --help 能正常输出。
  2. 跑通示例:下载 poster 数据集,用 nerfacto 训练,观察 Viewer 中的实时效果。
  3. 评估对比:用 ns-eval 评估 poster 模型,记录 PSNR、SSIM、LPIPS。
  4. 尝试调参:修改 train-num-rays-per-batch 为 2048 和 8192 分别训练,对比训练速度和最终质量。

延伸阅读

有问题?

如果在安装、训练或调优过程中遇到任何问题,随时问我。我可以帮你排查报错、解释参数含义,或讨论特定场景的拍摄策略。

← L3: NeRF & GS 与生成模型 L5: Gaussian Splatting 工程实践 →