Nerfstudio 环境配置与自有数据集(图片和视频)测试全方位全流程实战【2025最新版!!】
一、引言
神经辐射场(Neural Radiance Fields,简称NeRF)是近年来计算机视觉和图形学领域的一项革命性技术,它能够从2D图像中学习复杂的3D场景表示。然而,NeRF技术的实现和应用门槛较高,需要较为专业的计算机视觉和深度学习知识。
Nerfstudio作为一个开源框架,极大地简化了NeRF技术的使用流程,使研究人员和开发者能够更轻松地构建、训练和测试NeRF模型。本文将详细介绍如何在Ubuntu 20.04和CUDA 11.8环境下配置Nerfstudio,并使用自有图片和视频数据集进行训练和测试,最终导出为点云和网格等多种格式。
二、Nerfstudio简介
Nerfstudio是由加州大学伯克利分校的研究人员开发的一个模块化NeRF开发框架,旨在提供一个更加用户友好的环境来探索NeRF技术。它的主要优势包括:
- 模块化设计:将NeRF的各个组件模块化,便于理解和定制
- 完整工作流:提供从数据采集、处理到训练、渲染的完整工作流
- 可视化界面:内置基于Web的3D可视化工具,支持实时交互
- 多种算法支持:集成了多种NeRF变体算法,如nerfacto、instant-ngp等
- 社区支持:活跃的开发者社区和详尽的文档
无论是初学者还是研究人员,Nerfstudio都能满足你对NeRF技术的探索需求。
三、环境配置
3.1 硬件要求
Nerfstudio需要一定的硬件配置才能正常运行:
- GPU:NVIDIA GPU,显存至少8GB(推荐12GB以上)
- CPU:多核处理器,至少8GB RAM(推荐16GB以上)
- 存储:至少50GB可用空间(数据集大小视情况而定)
本文将在以下环境中进行测试: - Ubuntu 20.04 LTS
- CUDA 11.8
- NVIDIA GeForce RTX 4090 GPU (24GB 显存)
3.2 软件环境准备
首先,我们需要确保系统已经安装了适当的NVIDIA驱动和CUDA 11.8。让我们检查当前的CUDA版本:
nvidia-smi
如果CUDA版本不是11.8,您需要安装对应版本的CUDA工具包。可以从NVIDIA官网下载CUDA 11.8安装包。
接下来,我们需要配置Python环境。Nerfstudio要求Python版本至少为3.8。我们将使用Conda创建一个独立的环境:
# 安装Miniconda(如果尚未安装)
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
bash Miniconda3-latest-Linux-x86_64.sh -b
source ~/miniconda3/bin/activate# 创建名为nerfstudio的环境
conda create --name nerfstudio python=3.8 -y
conda activate nerfstudio# 更新pip
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
接下来,我们需要安装CUDA工具包和tiny-cuda-nn,这是NeRF实现中常用的库:
# 安装CUDA工具包
conda install -c "nvidia/label/cuda-11.8.0" cuda-toolkit -y# 安装tiny-cuda-nn
pip install ninja git+https://github.com/NVlabs/tiny-cuda-nn/#subdirectory=bindings/torch
3.3 Nerfstudio安装
现在,我们可以开始安装Nerfstudio。我们将从GitHub克隆最新的代码:
# 克隆Nerfstudio仓库
git clone https://github.com/nerfstudio-project/nerfstudio.git
cd nerfstudio# 安装Nerfstudio
pip install --upgrade pip setuptools
pip install -e .
此外,我们还需要安装COLMAP,这是一个用于从图像中恢复相机参数的结构运动(Structure from Motion,SfM)工具:
# 安装COLMAP依赖项
sudo apt-get update && sudo apt-get install -y \git cmake build-essential \libboost-program-options-dev \libboost-filesystem-dev \libboost-graph-dev \libboost-system-dev \libboost-test-dev \libeigen3-dev \libsuitesparse-dev \libfreeimage-dev \libgoogle-glog-dev \libgflags-dev \libglew-dev \qtbase5-dev \libqt5opengl5-dev \libcgal-dev \libcgal-qt5-dev# 克隆COLMAP仓库
git clone https://github.com/colmap/colmap.git
cd colmap
git checkout dev# 编译安装COLMAP
mkdir build
cd build
cmake ..
make -j $(nproc)
sudo make install# 返回之前的目录
cd ../..
具体内容也可也参考我之前的博客
基于NVIDIA RTX 4090的COLMAP 3.7安装指南:Ubuntu 20.04 + CUDA 11.8环境配置【2025最新版!!】
3.4 安装验证
完成安装后,我们可以运行以下命令来验证安装是否成功:
# 检查Nerfstudio是否安装成功
ns-train -h
如果安装成功,应该能看到Nerfstudio的帮助信息。
四、预置数据集测试
在使用自己的数据集之前,可以先使用Nerfstudio提供的预置数据集进行测试,以确保所有组件正常工作。
4.1 下载测试数据
Nerfstudio提供了多个预置数据集,我们可以使用ns-download-data命令下载这些数据集:
# 使用nerfacto模型训练poster数据集
ns-train nerfacto --data data/nerfstudio/poster
这将在当前目录下创建一个data/nerfstudio/poster目录,其中包含了poster数据集的所有图像和相机参数文件。
4.2 训练模型
现在,我们可以使用下载的数据集训练一个NeRF模型。Nerfstudio提供了多种模型实现,在此我们选择nerfacto,这是一个性能较好的通用模型:
# 使用nerfacto模型训练poster数据集
ns-train nerfacto --data data/nerfstudio/poster
在训练过程中,终端会显示训练进度、损失值等信息。训练通常需要数小时到数天不等,具体取决于数据集大小、选择的模型和硬件配置。默认情况下,训练结果会保存在outputs目录下,目录名为训练开始的时间戳。
如果一切正常,你应该会看到如下所示的训练进度:
4.3 可视化结果
Nerfstudio提供了一个基于Web的可视化工具,可以实时查看训练进度和结果。在训练开始后,终端会输出一个本地Web服务器地址,通常是http://localhost:7007。您可以在浏览器中打开这个地址来查看训练进度和实时渲染结果。
如果您是在远程服务器上运行Nerfstudio,需要进行端口转发才能访问可视化工具:
# 本地端口转发(在本地终端中运行)
ssh -L 7007:localhost:7007 <username>@<server-ip>
然后,在本地浏览器中访问http://localhost:7007。
五、自有图片数据集处理
现在,可以尝试使用自己的图片数据集来训练NeRF模型。
5.1 拍摄建议
拍摄用于NeRF的图像需要遵循一些建议,以确保能够获得良好的重建结果:
- 拍摄角度:从不同角度拍摄物体,覆盖尽可能多的视角
- 重叠度:相邻图像之间应有足够的重叠(约60-80%)
- 光照条件:保持一致的光照条件,避免强烈的阴影或高光
- 物体静止:确保场景中的物体保持静止
- 数量:通常需要30-100张图像,具体取决于场景复杂度
- 清晰度:避免模糊的图像,使用三脚架或高速快门
5.2 数据准备
首先,我们需要创建一个目录来存放我们的图像数据:
# 创建目录
mkdir -p data/custom/input
然后,将你的图像复制到这个目录中:
# 假设您的图像在~/my_images目录下
cp ~/my_images/*.jpg data/custom/input/
5.3 数据处理
接下来,我们需要使用ns-process-data命令处理这些图像,以便Nerfstudio能够使用它们:
# 处理图像数据集
ns-process-data images \--data data/custom/images \--output-dir data/custom/processed_images
此命令将使用COLMAP估计图像的相机参数,并生成Nerfstudio所需的格式。处理过程可能需要一些时间,具体取决于图像数量和计算机性能。
如果你的图像具有特殊特性(如全景图像),可以使用其他参数:
# 处理全景图像
ns-process-data images \--data data/custom/images \--output-dir data/custom/processed_images \--camera-type equirectangular
如果COLMAP处理失败,可以尝试使用不同的特征提取和匹配参数:
# 使用更全面的特征匹配方法
ns-process-data images \--data data/custom/images \--output-dir data/custom/processed_images \--matching-method exhaustive \--feature-type sift \--verbose
5.4 训练自定义数据集
处理完成后,我们可以使用处理好的数据集训练NeRF模型:
# 使用nerfacto模型训练自定义数据集
ns-train nerfacto \--data data/custom/processed_images \--experiment-name custom_images
你可以根据需要调整训练参数,如学习率、批量大小等:
# 使用更高的学习率和更多的训练步数
ns-train nerfacto \--data data/custom/processed_images \--experiment-name custom_images_high_lr \--optimizers.fields.optimizer.lr 1e-2 \--optimizers.fields.scheduler.max-steps 30000
如果你的GPU显存较小,可以减少批量大小:
# 减小批量大小
ns-train nerfacto \--data data/custom/processed_images \--experiment-name custom_images_small_batch \--pipeline.datamanager.train-num-rays-per-batch 1024
六、自有视频数据集处理
除了图像,我们还可以使用视频作为数据源来训练NeRF模型。
6.1 视频拍摄建议
拍摄用于NeRF的视频也需要遵循一些建议:
- 相机移动:缓慢移动相机,避免剧烈抖动
- 场景覆盖:尽量围绕物体一圈,从不同角度拍摄
- 光照条件:保持一致的光照
- 帧率:使用较高的帧率(至少30fps)
- 分辨率:使用较高的分辨率(至少1080p)
- 持续时间:视频长度约为30-60秒
6.2 视频数据准备
首先,创建一个目录来存放视频数据:
# 创建目录
mkdir -p data/custom/video
然后,将你的视频复制到这个目录中:
# 假设您的视频在~/my_video.mp4
cp ~/my_video.mp4 data/custom/video/
6.3 视频数据处理
接下来,我们使用ns-process-data命令处理视频数据:
# 处理视频数据集
ns-process-data video \--data data/custom/video/my_video.mp4 \--output-dir data/custom/processed_video
此命令将视频分解为帧,并使用COLMAP估计相机参数。默认情况下,它会提取约300帧,您可以通过参数调整帧数:
# 提取更多帧
ns-process-data video \--data data/custom/video/my_video.mp4 \--output-dir data/custom/processed_video \--num-frames-target 500
如果你的视频具有特殊特性(如全景视频),可以使用相应的参数:
# 处理全景视频
ns-process-data video \--data data/custom/video/my_video.mp4 \--output-dir data/custom/processed_video \--camera-type equirectangular
6.4 训练自定义视频数据集
处理完成后,我们可以使用处理好的视频数据集训练NeRF模型:
# 使用nerfacto模型训练自定义视频数据集
ns-train nerfacto \--data data/custom/processed_video \--experiment-name custom_video
由于视频帧之间的变化通常较小,我们可以使用顺序采样来提高训练效率:
# 使用顺序采样
ns-train nerfacto \--data data/custom/processed_video \--experiment-name custom_video_sequential \--pipeline.datamanager.train-num-images-to-sample-from 25
七、训练失败排查
如果你在训练过程中遇到问题,这里有一些常见的故障排除方法:
(1)CUDA内存不足:
CUDA out of memory
解决方法:减小批量大小或模型复杂度
ns-train nerfacto \--data data/custom/processed_images \--pipeline.datamanager.train-num-rays-per-batch 1024 \--pipeline.model.num-proposal-samples-per-ray 64
(2)COLMAP失败:
COLMAP failed to reconstruct the scene
解决方法:尝试使用不同的特征提取和匹配参数
ns-process-data images \--data data/custom/images \--output-dir data/custom/processed_images \--matching-method exhaustive \--feature-type sift \--colmap-gpu True
(3)训练不收敛:
如果模型训练不收敛,可以尝试调整学习率或使用不同的优化器:
ns-train nerfacto \--data data/custom/processed_images \--experiment-name custom_images_adam \--optimizers.fields.optimizer.type Adam \--optimizers.fields.optimizer.lr 5e-4
八、模型优化技巧
以下是一些优化NeRF模型性能的技巧:
(1)使用相机优化:
允许模型微调相机参数可以提高重建质量:
ns-train nerfacto \--data data/custom/processed_images \--experiment-name custom_images_camera_opt \--pipeline.model.camera-optimizer.mode SO3xR3
(2)调整网络架构:
尝试不同的网络大小和复杂度:
ns-train nerfacto \--data data/custom/processed_images \--experiment-name custom_images_large_net \--pipeline.model.field-network.num-layers 8 \--pipeline.model.field-network.hidden-dim 256
(3)尝试不同的模型:
Nerfstudio提供了多种模型实现,如instant-ngp(速度更快)、vanilla-nerf(原始实现)等:ns-train instant-ngp \--data data/custom/processed_images \--experiment-name custom_images_instant_ngp
九、性能调优
以下是一些提高训练和渲染速度的技巧:
(1)使用混合精度训练:
ns-train nerfacto \--data data/custom/processed_images \--experiment-name custom_images_mixed_precision \--mixed-precision True
(2)减少评估频率:
ns-train nerfacto \--data data/custom/processed_images \--experiment-name custom_images_less_eval \--pipeline.datamanager.eval-num-rays-per-chunk 1024 \--steps-per-eval 500
(3)使用更高效的模型:
ns-train instant-ngp \--data data/custom/processed_images \--experiment-name custom_images_instant_ngp
七、总结
在本文中,我们详细介绍了如何在Ubuntu 20.04和CUDA 11.8环境下配置Nerfstudio,并使用自有图片和视频数据集进行训练和测试,通过Nerfstudio,我们可以轻松地将2D图像转换为3D模型,并生成新视角的渲染效果。这一技术在虚拟现实、增强现实、游戏开发、建筑可视化等领域都有广泛的应用。