前言

  • 进来面临搬家,念旧情打算把之前呆四年的地方进行一个保留,于是有了使用三维重建对居所进行建模的想法,于是就有了本文。
  • 本文基于 Nerfstudio 实现了对单目视频的三维重建流程,主要使用 nerfacto 模型实现 NeRF 场景重建,并完成 COLMAP 到训练到可视化的完整 pipeline 验证。请添加图片描述

1 NeRF神经辐射场

1-1 介绍
  • NeRF(Neural Radiance Fields,神经辐射场)是一种基于神经网络的三维场景表示方法。
  • 其核心思想是:
    • 用一个神经网络学习“空间位置 + 视角 → 颜色 + 密度”的映射关系,从而隐式表示整个三维场景。
  • 与传统的点云、三角网格、体素不同,NeRF 不显式存储几何结构,而是用网络参数表达场景。

1-2 原理
  • NeRF 的输入输出可以简单理解如下:(实际中会对坐标与视角进行 positional encoding 后输入网络)
    • 输入: ( x , y , z , θ , φ ) (x,y,z,\theta,φ) (x,y,z,θ,φ)
    • 输出: ( R , G , B , σ ) (R, G, B, σ) (R,G,B,σ)
  • 其中:
    • ( x , y , z ) (x, y, z) (x,y,z):空间位置
    • ( θ , φ ) (θ, φ) (θ,φ):观察方向
    • ( R , G , B ) (R, G, B) (R,G,B):颜色
    • σ σ σ:体密度(density)
  • NeRF 使用体渲染(Volume Rendering):
    • 沿相机光线采样多个点
    • 每个点预测颜色与密度
    • 按权重积分得到像素颜色
  • 最终公式本质是:

一条光线 = 多个采样点加权叠加结果(本质上是对体渲染积分的数值离散近似)


1-3 COLMAP
  • COLMAP(Structure-from-Motion and Multi-View Stereo)是一款广泛使用的开源三维重建工具,主要用于从多视角图像中恢复相机位姿与稀疏三维结构。
  • 在 NeRF / nerfacto 等方法中,COLMAP 通常作为前端几何初始化模块,负责提供可靠的相机参数与稀疏点云。
  • COLMAP 的主要输出包括:
    • 相机内参(Intrinsic)
    • 相机外参(Pose)
    • 稀疏三维点云(Sparse Point Cloud)
  • 这些信息共同构成 NeRF 训练所需的几何基础。
  • COLMAP 的整体处理流程如下:(实际流程中还包含 Bundle Adjustment 全局优化步骤)
输入图像序列
      ↓
特征提取(SIFT)
      ↓
特征匹配(Feature Matching)
      ↓
几何验证(RANSAC)
      ↓
增量式 SfM 重建
      ↓
相机位姿 + 稀疏点云

1-4 现有方案分析
  • 目前 NeRF 生态主要有以下实现:
方案 特点 适用场景
原始 NeRF 论文实现,速度慢 学术研究
Instant-NGP CUDA加速,训练极快 实时实验
Nerfstudio 完整 pipeline + 工具链 工程/部署
Plenoxels 显式体素表示 实验性
  • 考虑到本文的目标是在本地快速完成单目视频的三维重建验证流程,最终选择 Nerfstudio 作为实现框架。

2 环境配置

2-1 nerfstudio介绍

请添加图片描述

  • Nerfstudio 是一个面向 NeRF 的统一三维重建框架,提供完整 pipeline:
    • 数据处理(视频 / 图片)
    • COLMAP 位姿估计
    • NeRF / nerfacto 训练
    • Web 可视化
    • 模型导出
  • 官方文档: https://docs.nerf.studio/
  • 对于本文而言,Nerfstudio 主要负责:
    • 数据预处理与 COLMAP 位姿估计
    • NeRF(nerfacto)训练流程统一管理
    • Web 可视化与模型导出

2-2 显卡驱动配置
sudo apt update
sudo ubuntu-drivers autoinstall
sudo reboot
  • 验证:
nvidia-smi

请添加图片描述


2-3 环境配置
  • 创建 Conda 环境,推荐 Python 3.8–3.10
conda create --name nerfstudio -y python=3.8
conda activate nerfstudio
python -m pip install --upgrade pip
  • 安装支持 CUDA 11.8 的 PyTorch。
pip install torch==2.1.2+cu118 torchvision==0.16.2+cu118 --extra-index-url https://download.pytorch.org/whl/cu118
  • 验证 PyTorch CUDA,确保下载的是CUDA 11.8
python -c "import torch; print(torch.version.cuda)"

请添加图片描述


  • 安装 CUDA Toolkit
conda install -c "nvidia/label/cuda-11.8.0" cuda-toolkit
  • 验证nvcc版本
nvcc -V

请添加图片描述

  • 若使用 conda CUDA toolkit,需确认 CUDA_HOME 指向 conda 环境路径
export CUDA_HOME=/usr/local/cuda
export PATH=$CUDA_HOME/bin:$PATH
export LD_LIBRARY_PATH=$CUDA_HOME/lib64:$LD_LIBRARY_PATH

  • 安装 CUDA 加速依赖
pip install ninja git+https://github.com/NVlabs/tiny-cuda-nn/#subdirectory=bindings/torch

2-4 nerfstudio安装
  • 安装 Nerfstudio
pip install nerfstudio
  • 初始化 CLI 工具
ns-install-cli

请添加图片描述

2-5 colmap安装
conda install -c conda-forge colmap

3 测试与运行

3-1 视频录制
  • 拍摄的时候建议以“绕圈扫描”的方式拍摄目标场景,确保相邻视频帧有重叠画面
  • 为了保证 COLMAP 和后续重建效果,拍摄时需要注意:
    • 保持移动速度稳定(不要快速晃动)
    • 避免画面模糊或剧烈抖动
    • 保证足够的视角重叠(约 60%~80%)
    • 尽量避免动态物体(人、宠物等)
    • 光照尽量稳定,不要频繁变化

3-2 演示工作空间:
  • 我们只需要自己创建一个工作空间文件夹,新建一个文件夹用于存储训练预处理数据,并把测试用的视频也放在同级目录下
(base) lzh@lzh:~/nerfstudio_ws$ tree .
.
├── test_data
└── test.mp4
  • 进行下述命令的时候记得
conda activate nerfstudio
cd nerfstudio_ws

3-3 数据预处理
ns-process-data video \
--data test.mp4 \
--output-dir test_data \
--num-downscales 3 \
--num-frames-target 80

请添加图片描述

  • 其中:
    • --data:指定输入视频路径。
    • --output-dir:指定数据处理后的输出目录。Nerfstudio 会在该目录下生成:
      • 抽帧图片
      • COLMAP 数据
      • 相机参数文件
    • --num-downscales:控制图像金字塔的缩放层级。用于生成不同分辨率的数据版本。
      • 数值越大:速度更快,但细节越少。
      • 为了确保后面不会炸显存,这边推荐降低分辨率
    • --num-frames-target:控制从视频中抽取的目标帧数。
      • 帧数越多 → 重建更精细但训练更慢
      • 帧数越少 → 训练更快但细节减少

3-4 训练NeRF
export CUDA_VISIBLE_DEVICES=0

ns-train nerfacto \
--vis viewer \
--machine.num-devices 1 \
--pipeline.datamanager.train-num-rays-per-batch 1536 \
--data test_data

请添加图片描述

  • 其中:
    • CUDA_VISIBLE_DEVICES:指定使用哪一张 GPU 进行训练
    • ns-train nerfacto:指定训练模型类型,nerfacto 是 Nerfstudio 提供的默认高质量重建模型。
    • --vis viewer:启用实时 Web 可视化界面训练过程中可以在浏览器查看重建效果。
    • --machine.num-devices:指定使用的 GPU 数量。
    • --pipeline.datamanager.train-num-rays-per-batch:控制每次训练采样的光线数量(ray batch size)。
    • --data test_data:指定训练数据路径。该目录是 ns-process-data 处理后的输出结果。
  • 训练过程中,可以访问下述地址用于实时监控训练效果
http://localhost:7007/

请添加图片描述
请添加图片描述


3-4 训练结果说明(结构解析)
  • 训练完成后项目结构会长这样:
(base) lzh@lzh:~/nerfstudio_ws$ tree .
.
├── cuda-keyring_1.1-1_all.deb
├── outputs
│   └── test_data
│       └── nerfacto
│           └── 2026-06-08_013457
│               ├── config.yml
│               ├── dataparser_transforms.json
│               └── nerfstudio_models
│                   └── step-000029999.ckpt
├── test_data
│   ├── colmap
│   │   ├── database.db
│   │   └── sparse
│   │       └── 0
│   │           ├── cameras.bin
│   │           ├── images.bin
│   │           ├── points3D.bin
│   │           └── project.ini
│   ├── images
│   │   ├── frame_00001.png
│   ├── sparse_pc.ply
│   └── transforms.json
└── test.mp4
  • test.mp4:原始输入视频文件。
  • cuda-keyring_1.1-1_all.deb:CUDA 软件源的安装包,用于配置 NVIDIA 官方 apt 仓库。
  • test_data:数据处理结果,由 ns-process-data 生成。
    • images:从视频中抽取的关键帧图片,用于 COLMAP 和训练输入。
    • colmap:COLMAP 的完整重建结果。
      • database.db:特征匹配数据库,存储图像特征点与匹配关系。
      • sparse:稀疏重建结果(SfM 输出)。
        • cameras.bin:相机内参(焦距、主点、畸变等)。
        • images.bin:相机外参(每张图像的位姿与朝向)。
        • points3D.bin:稀疏三维点云,由多视角三角测量恢复得到。
      • project.ini:COLMAP 工程配置文件,记录项目路径与参数。
  • transforms.json:Nerfstudio 使用的相机标定文件,由 COLMAP 转换生成,用于训练阶段的相机位姿输入。
  • sparse_pc.ply:COLMAP 导出的稀疏点云文件,可用 MeshLab / Blender 可视化场景结构。
  • outputs:模型训练输出目录,由 ns-train 生成。
    • test_data/nerfacto/2026-06-08_013457:本次训练任务的输出结果目录。
      • config.yml:训练配置文件,记录模型结构与训练参数,用于复现结果。
      • dataparser_transforms.json:训练阶段使用的相机变换信息(内部坐标系统)。
      • nerfstudio_models:模型权重保存目录。
        • step-000029999.ckpt:训练得到的模型权重文件,保存当前迭代状态的三维场景表示。

3-5 训练结果可视化
  • 我们可以通过读取训练后生产的yaml文件来可视化
 ns-viewer --load-config /home/lzh/nerfstudio_ws/outputs/test_data/nerfacto/2026-06-08_013457/config.yml 

请添加图片描述

请添加图片描述


3-6 模型导出
ns-export pointcloud \
--load-config outputs/test_data/nerfacto/*/config.yml \
--output-dir export_ply

4 局限与扩展

4-1 NeRF的局限与缺点
  • 虽然 NeRF(以及本文使用的 nerfacto)已经可以较稳定地完成单目视频的三维重建,但在实际工程中仍然存在一些不可忽视的限制:
    • 训练速度仍然较慢
      • 相比传统 SfM + Mesh 或显式点云方法,NeRF 仍需要较长训练时间(通常几十分钟到数小时)
      • 即使使用 GPU 加速,仍然难以做到“即拍即得”
    • 显存占用较高
      • nerfacto 在训练过程中需要缓存大量 ray sampling 结果
      • 在 8GB 显存(如 RTX 4060 Laptop)上容易出现 OOM,需要降低 batch size 或分辨率
    • 对输入数据质量敏感
      • 模糊、快速运动、曝光变化会显著影响 COLMAP 位姿估计
      • 位姿不稳定会直接导致重建“漂浮”或几何扭曲
    • 单目视频存在尺度不确定性
      • NeRF 本质无法恢复真实尺度
      • 重建结果通常只能保证“相对几何关系”,无法直接得到真实尺寸
    • 动态物体不兼容
      • NeRF 假设场景是静态的
      • 人、宠物、移动物体会造成“重影 / 幽灵伪影”
    • 可解释性较弱
      • 场景被编码为网络权重或隐式特征
      • 难以像点云/mesh一样直接编辑或语义操作
4-2 高斯泼濺
  • 为缓解 NeRF 在训练效率与渲染速度方面的瓶颈,近年来提出了多种显式表示方法,其中 3D Gaussian Splatting 是代表性方法之一。
  • 与 NeRF 的“隐式神经网络表示”不同,3DGS 采用显式的三维高斯点集合来表示场景:
    • 每个高斯点携带位置、颜色、透明度以及协方差信息
    • 整个场景由大量高斯椭球体共同构成
  • 在渲染方式上,3DGS 不再依赖神经网络逐点推理,而是直接将三维高斯投影到图像平面,并通过 GPU 光栅化实现实时渲染,因此在速度上具有明显优势。
  • 其整体流程与 NeRF 类似,同样依赖 COLMAP 提供相机位姿,并通过优化高斯参数使渲染结果逼近真实图像,但优化目标从“网络参数拟合”转变为“显式几何分布优化”。

总结

  • 本文基于 Nerfstudio 实现了对单目视频的三维重建流程,主要使用 nerfacto 模型实现 NeRF 场景重建,并完成 COLMAP 到训练到可视化的完整 pipeline 验证。
  • 后面考虑试试3D Gaussian Splatting(3DGS)
  • 如有错误,欢迎指出!
  • 感谢观看!!!
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐