1、环境配置
按照下述配置创建服务器:
切换安装源:
NeuRAD 需要
.我们建议使用 conda 来管理依赖项。
python >= 3.10
conda create --name neurad -y python=3.10 conda activate neurad pip install --upgrade pip
安装依赖项:
#使用CUDA(此存储库已使用 CUDA 11.7 和 CUDA 11.8 进行了测试)和 tiny-cuda-nn 安装 PyTorch。cuda-toolkit是构建tiny-cuda-nn所必需的。 #安装特定版本的 PyTorch 和 torchvision,并确保它们支持 CUDA 11.8 GPU 加速。 pip install torch==2.0.1+cu118 torchvision==0.15.2+cu118 --extra-index-url https://download.pytorch.org/whl/cu118 #从指定的 NVIDIA 仓库安装 CUDA Toolkit 11.8.0 版本,用于支持 PyTorch、TensorFlow 等深度学习框架的 GPU 编译和运行。 conda install -c "nvidia/label/cuda-11.8.0" cuda-toolkit #在安装 tiny-cuda-nn 之前,有些需要升级 dill pip install dill --upgrade pip install --upgrade pip "setuptools<70.0" pip install ninja git+https://github.com/NVlabs/tiny-cuda-nn/#subdirectory=bindings/torch
为了支持数据集Waymo-Open-Dataset v2(需要 python3.10,而且这个包的依赖项非常严格,所以不能将其添加到 pyproject.toml,需要先安装):
pip install waymo-open-dataset-tf-2-11-0==1.6.1
安装 NeuRAD:
git clone https://github.com/georghess/neurad-studio.git cd neurad-studio pip install -e .
运行最后一条编译命令
时,出现下述提示信息:
pip install -e .
ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts. tensorflow 2.11.0 requires tensorboard<2.12,>=2.11, but you have tensorboard 2.19.0 which is incompatible. tensorflow-addons 0.23.0 requires typeguard<3.0.0,>=2.7, but you have typeguard 4.4.2 which is incompatible. waymo-open-dataset-tf-2-11-0 1.6.1 requires pillow==9.2.0, but you have pillow 11.2.1 which is incompatible.
❗这不是“安装失败”或“致命错误”,而是
的 依赖解析器(resolver)报告的冲突警告,NeuRAD 本身和其他库都已经成功安装并构建完成,这只是提醒你某些库的版本并不满足其他库的版本要求。
pip
为什么会发生这个错误?
现有环境中:
库 | 要求版本 | 实际安装 |
---|---|---|
2.11.0 |
|
❌ 你有
|
0.23.0 |
|
❌ 你有
|
1.6.1 |
|
❌ 你有
|
这些冲突是由于
的某些依赖或功能(如新版依赖的
NeuRAD
、
viser
等)拉高了部分依赖的版本,导致与
torch
和
Waymo
的旧依赖不一致。
TensorFlow
如果你不使用 Waymo 数据集(也不需要运行
部分),是完全可以忽略的;
tensorflow
如果你后面打算使用
或
Waymo
相关功能(例如调用其训练、数据加载器),则可能会报错,推荐你手动回退这几个库的版本。
tensorflow
运行下述几条命令安装对应的依赖,值得注意的是
会自动卸载旧版本并安装指定版本,它内部会调用
pip install X==version
逻辑,无需手动卸载:
pip uninstall
pip install tensorboard==2.11.0 pip install typeguard==2.13.3 pip install pillow==9.2.0
上述进行版本降级之后又出现与Nerfstudio版本的不兼容的问题,因此先恢复至原来的版本,先不考虑Waymo 数据集,看看会不会报其他错。
2、数据集准备(无需预处理)
在https://huggingface.co/datasets/georghess/pandaset网址下载pandaset数据集,并将其解压至autodl-tmp/neurad-studio/data/文件目录下。
注意在neurad-studio/nerfstudio/data/dataparsers /pandaset_dataparser.py文件的107行左右,定义了 PandaSet 数据集的默认训练数据场景为
"001"
3、训练
3.1 训练过程
训练命令如下(默认训练pandaset001序列):
# Train model python nerfstudio/scripts/train.py neurad pandaset-data #另外的训练命令 ns-train neurad --experiment-name pandaset_01_density_test pandaset-data ns-train neurad --logging.local-writer.max-log-size 100 --vis viewer --experiment-name pandaset_158_density_TV_0.1 pandaset-data ns-train --experiment-name pandaset_158_density_TV_0.1 --logging.local-writer.max-log-size 100 --vis viewer neurad pandaset-data
如果想要训练pandaset数据集其他场景序列,则修改neurad-studio/nerfstudio/data/dataparsers /pandaset_dataparser.py文件中的sequence:str=“ ”。
如果一切正常,应该会看到如下所示的训练进度(下述是训练完成的截图):
3.2 通过webviewer查看训练建模过程
webviewer作用:WebViewer 是 NeuRAD(基于 Nerfstudio)附带的一个网页可视化界面,用于实时观察训练过程中生成的中间结果,方便你:
可视化渲染图像(Novel View Synthesis)
监控模型学习进展(渲染质量是否逐渐变好)
动态查看相机轨迹、Lidar 点云和动态物体位置
实时评估训练数据与重建效果的对齐程度
导航到终端末尾的链接将加载 webviewer。
由于我是在autodl 云服务器 上运行 NeuRAD,因此不能直接在 本地 Windows 浏览器 中访问
,因为这个地址是服务器上的本地地址(不是你我电脑的)。要解决这个问题,我需要进行端口转发,即将服务器的 7007 端口映射到我本地电脑上。下述是详细步骤:
http://localhost:7007
(注意一定是跑上了在执行下述的连接步骤,不然看不到)。
在windows端中按下“电脑”的符号,在其中搜索Powershell,复制以下命令在 PowerShell 中执行(Windows 用户):
ssh -CNg -L 7007:127.0.0.1:7007 root@region-9.autodl.pro -p 17224
它会要求输入密码,如下图(输入密码之后只要密码正确,这个终端不会有任何反应,因为在后台静默创建一个 SSH 隧道,将本地的
映射到服务器的
localhost:7007
端口,不是交互式终端,所以登录成功后不会显示任何提示(看起来像“卡住”),但实际上它已经在监听转发了):
7007
注意保持这个 PowerShell 窗口 不要关闭,因为关闭这个 PowerShell 窗口或中断命令,端口映射就会失效。
输入下述autodl服务器定义好的密码(注意最好手动输入,不要复制粘贴(Win终端常有粘贴错误)):
最后打开windows的浏览器,在本地浏览器中输入:
http://localhost:7007
如果成功可以看到如下画面:
下述是webviewer右侧按钮解释:
上述图示对应下述功能:
下述为隐藏视图帧的效果:
上述图示对应下述功能:
上述图示对应下述功能:
上述图示对应下述功能:
上述图示对应下述功能:
上述图示对应下述功能:
上述图示对应下述功能:
NeuRAD 的可编辑性体现于此:你可以在线“移动”动态物体并立刻看到新视图渲染效果。
面板 → 用于生成视频动画
Render
上述图示对应下述功能:
面板 → 用于导出点云或网格模型
Export
上述图示对应下述功能:
下述为点击Generate Command生成的命令
ns-export pointcloud --load-config outputs/unnamed/neurad/2025-06-04_211525/config.yml --output-dir exports/pcd/ --num-points 1000000 --remove-outliers True --normal-method open3d --use_bounding_box False --save-world-frame False --obb_center 0.0000000000 0.0000000000 0.0000000000 --obb_rotation 0.0000000000 0.0000000000 0.0000000000 --obb_scale 1.0000000000 1.0000000000 1.0000000000
下述为点击Generate Command生成的命令:
ns-export poisson --load-config outputs/unnamed/neurad/2025-06-04_211525/config.yml --output-dir exports/mesh/ --target-num-faces 50000 --num-pixels-per-side 2048 --num-points 1000000 --remove-outliers True --normal-method open3d --use_bounding_box False --obb_center 0.0000000000 0.0000000000 0.0000000000 --obb_rotation 0.0000000000 0.0000000000 0.0000000000 --obb_scale 1.0000000000 1.0000000000 1.0000000000
✅ 常见用法建议
开启
+
Lidar Rendering
:可查看 RGB 图与点云一致性
Output: rgb
切换
:用于调试渲染质量与几何恢复
Output: features / depth
启用
:同时对比 Ground Truth 与预测图像
Split Screen
拖动
+ 修改 Actor Pose:测试动态物体的新轨迹模拟
Time
3.3 从检查点恢复运行(从检查点文件恢复训练)
从检查点恢复 / 可视化现有运行,可以通过运行(训练结束之后会生成outputs/…/nerfstudio_models目录,nerfstudio_models文件夹里面就是检查点ckpt文件):
pyhton nerfstudio/scripts/train.py neurad pandaset-data --load-dir {outputs/.../nerfstudio_models}
3.4 训练结束后可视化运行
下述是训练时候的输出信息,可以通过webviewer查看可视化的训练过程,训练到100%时,也不会自动终止,此时还是可以通过webviewer查看训练结果,但是一旦按ctrl+c就会退出训练过程,这时候在连接7007端口也不能看到训练结果。
那么如果想在按了ctrl+c之后,还能通过webviewer查看训练结果可以运行下述命令:
python nerfstudio/scripts/viewer/run_viewer.py --load-config outputs/.../config.yml #示例(注意正确的路径应该是outputs/unnamed/neurad/2025-05-24_172136/config.yml,因为Neurad训练模型的时候最后是在outputs下直接输出了结果,文件名字就是unnamed,下述的路径是我为了区分数据集自己创建的,如果直接运行下述命令,会显示找不到检查点文件,因为config.yml里面记录的检查点路径是NeuRAD自己生成的,我后面自己设定的肯定找不到啦) python nerfstudio/scripts/viewer/run_viewer.py --load-config outputs/pandaset/001/2025-05-24_172136/config.yml
已经训练完成后,单独重新打开 WebViewer 来可视化结果,而不必重新训练(但是还是需要显卡)。
3.5 导出结果
python nerfstudio/scripts/render.py --help
对应的
文件,其作用是:用于在训练结束后导出NeuRAD模型的渲染结果和评估指标。
render.py
3.5.1 输出渲染图像及评估指标
python nerfstudio/scripts/render.py dataset --load-config outputs/unnamed/neurad/2025-05-24_172136/config.yml --output-path renders/pandaset_001/images_metircs --pose-source val --rendered-output-names rgb depth --calculate-and-save-metrics True
🧩 参数逐项说明:
参数 | 含义 |
---|---|
|
表示执行 中的 模式,渲染的是整个数据集中(train/val/test)某一部分的所有视角 |
|
指定你训练后的模型配置文件,系统将从这个配置中读取模型结构和 checkpoint 权重 |
|
指定将渲染输出保存到的目录,最终图像和评估结果都会保存在这个路径下 |
|
指定要渲染的数据集部分,这里是 (通常代表验证集) 你也可以换成 或
|
|
指定要输出的图像内容: • : 渲染彩色图像 • : 渲染深度图 |
–calculate-and-save-metrics | 输出每张图片的评价指标(PSNR、SSIM、LPIPS) |
下述目录(autodl-tmp/neurad-studio/renders/rgb和autodl-tmp/neurad-studio/renders/depth)存有渲染的图像和深度图:
最后输出的autodl-tmp/neurad-studio/renders/pandaset_001/images_metrics/metrics.pkl是评估指标文件,但是其是二进制文件,想要得到其中内容,可以调用python运行下述代码:
import pickle with open('renders/pandaset_001/images_metrics/val/metrics.pkl', 'rb') as f: metrics = pickle.load(f) print(metrics)
最后输出的是每张图片的三个指标
要想要得到论文中的平均值,运行下述代码(记得更改路径):
import pickle import numpy as np # Load the actual metrics.pkl file with open("/mnt/data/metrics.pkl", "rb") as f: metrics = pickle.load(f) # Extract metric values psnr_values = [] ssim_values = [] lpips_values = [] for data in metrics.values(): psnr_values.append(data.get("psnr", 0)) ssim_values.append(data.get("ssim", 0)) lpips_values.append(data.get("lpips", 0)) # Calculate averages avg_psnr = np.mean(psnr_values) avg_ssim = np.mean(ssim_values) avg_lpips = np.mean(lpips_values) avg_psnr, avg_ssim, avg_lpips
对于001场景我平均评估指标为:
那么NeuRAD文章有四个表,其中第一个表是评估的新视角合成指标,第二个表是评估的激光雷达点云合成指标,第三个表是评估移动、删除动态物体的指标(FID分数),第四个是消融实验。
那么对于第一个表是Nuerad在五个不同数据集上与不同的方法对比的指标,那么根据复现SUDS的经验,首先应该判断每个指标对应的各个数据集的哪些序列场景(这一点作者在文章中明确写得有,不像suds)。
首先对于Panda数据集,UniSim报告了前置摄像头和360毫米激光雷达在以下序列上的编号:001,011,016,028,053,063,084,106,123,158。NeuARD将此协议称为Panda FC,并额外报告Panda 360结果,使用所有6个摄像头(和360个激光雷达)。
其次对于nuScenes数据集,S-Nerf使用四个序列进行评价:0164、0209、0359、0916。
对于KITII数据集,MARS报告第5-260帧单个序列0006的NVS质量。
对于Argoverse数据集,在以下序列中使用所有环绕摄像机和两个激光雷达:05fa5048-f355-3274-b565-c0ddc547b315, 0b86f508-5df9-4a46-bc59-5b9536dbde9f, 185d3943-dd15-397a-8b2e-69cd86628fb7, 25e5c600-36fe-3245-9cc0-40ef91620c22, 27be7d34-ecb4-377b-8477-ccfd7cf4d0bc, 280269f9-6111-311d-b351-ce9f63f88c81, 2f2321d2-7912-3567-a789-25e46a145bda, 3bffdcff-c3a7-38b6-a0f2-64196d130958, 44adf4c4-6064-362f-94d3-323ed42cfda9, 5589de60-1727-3e3f-9423-33437fc5da4b.
最后对于ZOD数据集,在以下序列上使用前置摄像头和所有三个激光雷达:000784, 000005, 000030, 000221, 000231, 000387, 001186, 000657, 000581, 000619, 000546, 000244, 000811.
消融实验数据集:采用了20个场景序列作为消融数据集,这20个序列分别来自于上述5个数据集(每个数据集四个场景序列),其中
PandaSet:001, 011, 063, 106,001,
nuScenes:0164, 0209, 0359, 0916
KITTI:0006, 0010, 0000, 0002
Argoverse:280269f9-6111-311d-b351-ce9f63f88c81, 185d3943-dd15-397a-8b2e-69cd86628fb7, 05fa5048-f355-3274-b565-c0ddc547b315, 0b86f508-5df9-4a46-bc59-5b9536dbde9f
ZOD:000030, 000221, 000657, 000005
3.5.2 输出渲染视频
想要输出渲染视频,必须有 viewer 中保存的
(可在 WebViewer 右侧导出),先点击Add Keyframe添加关键帧视角,可以通过旋转、移动视角,点击多次
camera_path.json
添加多个路径点。添加至少两个关键帧后,点击
Add Keyframe
按钮,注意可以在Render name中修改最终生成的json文件名字:
Generate Command
最终导出的json文件路径为/root/autodl-tmp/neurad-studio/data/pandaset/camera_paths/pandaset_001.json
想要输出渲染视频则运行下述命令:
ns-render camera-path --load-config outputs/unnamed/neurad/2025-05-24_172136/config.yml --camera-path-filename /root/autodl-tmp/neurad-studio/data/pandaset/camera_paths/pandaset_001.json --output-path renders/pandaset/pandaset_001.mp4
3.5.3 输出点云/网格文件
#点云 ns-export pointcloud --load-config outputs/unnamed/neurad/2025-05-24_172136/config.yml --output-dir exports/pcd/ --num-points 1000000 --remove-outliers True --normal-method open3d --use_bounding_box False --save-world-frame False --obb_center 0.0000000000 0.0000000000 0.0000000000 --obb_rotation 0.0000000000 0.0000000000 0.0000000000 --obb_scale 1.0000000000 1.0000000000 1.0000000000 #mesh ns-export poisson --load-config outputs/unnamed/neurad/2025-05-24_172136/config.yml --output-dir exports/mesh/ --target-num-faces 50000 --num-pixels-per-side 2048 --num-points 1000000 --remove-outliers True --normal-method open3d --use_bounding_box False --obb_center 0.0000000000 0.0000000000 0.0000000000 --obb_rotation 0.0000000000 0.0000000000 0.0000000000 --obb_scale 1.0000000000 1.0000000000 1.0000000000
运行了上述命令之后是如下界面,但是一直卡在0%,我运行了几十分钟都是这样,然后我在想只要渲染的图片和指标知道怎么求就行了,我就没管这个点云和网格的输出了:
4、KITTI数据集
在文章明确写了只训练了KITTI数据集的0006序列。
上述是NeuRAD对于训练其他自动驾驶数据集的描述(需要添加修改代码文件),但对于其论文中提及的五个数据集,属于NeuRAD 内置支持的五个自动驾驶数据集,无需再去修改或者添加代码文件,无需为这些内置数据集额外编写 dataparser,只需按照预设格式准备数据路径即可训练。
首先是准备KITTI数据集,但是与SUDS不同的是,NeuRAD不需要对数据进行预处理,并且所准备的数据结构也不同,NeuRAD针对KITTI数据,路径结构应为如下:
autdl-tmp/neurad-studio/data/kittimot/ └── training/ ├── image_02/ │ └── 0006/ │ ├── 000000.png │ ├── ... ├── image_03/ │ └── 0006/ │ ├── 000000.png ├── velodyne/ │ └── 0006/ │ ├── 000000.bin ├── calib/ │ └── 0006.txt ├── oxts/ │ └── 0006.txt ├── label_02/ │ └── 0006.txt ├── image_02/timestamps/0006/timestamps.txt ├── image_03/timestamps/0006/timestamps.txt ├── velodyne/timestamps/0006/timestamps.txt ├── oxts/timestamps/0006/timestamps.txt
其中label_02/0006.txt和timestamps.txt之前没有下载,需要重新下载,其中label_02/0006.txt在“The KITTI Vision Benchmark Suite”下载,如下:
timestamps.txt在“The KITTI Vision Benchmark Suite”下载,如下:
但是并没有对应的0006序列下载,在 KITTI raw 数据页面上已经无法找到 drive_0006(即 2011_09_26_drive_0006_sync),可能是由于版权、存储或历史调整原因,这个序列已被移除或隐藏。
首先因为想要复现出论文中的精度,因此我首先是写了邮件给作者,寻求这个时间戳文件。
下述是github上一个人的提问,他也是没有找到时间戳文件:
我在KITTI raw 数据页面上下载了“2011_09_26_drive_0001_sync”,对应的是KITTI数据集的0001序列,如下所示,有对应的时间戳文件:
因此我模仿“2011_09_26_drive_0001_sync”文件中的timestamps.txt文件,运行下述代码生成了和images_02和images_03文件夹下相同图片数量的相同行数的timestamps.txt文件:
from datetime import datetime, timedelta # 起始时间(参考0001) start_time = datetime.strptime("2011-09-26 13:02:25.961661", "%Y-%m-%d %H:%M:%S.%f") frame_count = 270 # 根据你实际图像数量修改 interval = timedelta(seconds=0.1) timestamps = [start_time + i * interval for i in range(frame_count)] # 输出为 timestamps.txt 文件 with open("timestamps.txt", "w") as f: for ts in timestamps: f.write(ts.strftime("%Y-%m-%d %H:%M:%S.%f") + " ")
再将生成的这个图片复制进下述目录中(四个都一样):
然后在运行下述训练命令,其中experiment-name表示存储实验结果的名称,max-num-iterations为最大训练步数,–data指向包含
,
image_02
,
oxts
,
calib
等子文件夹的目录,–sequence指定序列号(如
label_02
),–use-mars-nvs-50-split是否使用论文中使用的训练测试划分(Mars使用的50%数据集划分):
0006
ns-train neurad --experiment-name kitti_006 --max-num-iterations 20000 kittimot-data --data ./data/kittimot --sequence 0006 --use-mars-nvs-50-split=True
下述是训练成功的截图:
训练完成之后我运行了输出渲染图和渲染指标的命令:
python nerfstudio/scripts/render.py dataset --load-config outputs/kitti_006/neurad/2025-06-18_164823/config.yml --output-path renders/kitti_0006/images_metircs --pose-source val --rendered-output-names rgb depth --calculate-and-save-metrics True PSNR: 26.73913213610649 、SSIM: 0.7980728503316641 、LPIPS: 0.08462543226778507
最后运行计算指标的平均代码文件(记得修改metrics.py中对应路径):
#在autodl-tmp/neurad-studio目录下 (neurad) root@autodl-container-00ff4cb9d9-42389eca:~/autodl-tmp/neurad-studio# python metrics.py PSNR: 26.73913213610649 、SSIM: 0.7980728503316641 、LPIPS: 0.08462543226778507
下述是论文中kitti_06序列对应的精度指标,除了SSIM之外,其余两个指标逊色一点点,我不知道是不是因为我自己构建的时间戳文件的原因:
我觉得如果想要得到准确的结果肯定是要官方提供的时间戳文件,但是没有,那么我觉得就可以训练官方提供了时间戳的场景序列,如0001,然后与之前跑的SUDS的结果做对比