NeuRAD复现

内容分享3天前发布
0 0 0

1、环境配置

按照下述配置创建服务器:

NeuRAD复现

切换安装源:

NeuRAD复现

NeuRAD 需要
python >= 3.10
.我们建议使用 conda 来管理依赖项。

 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.

NeuRAD复现

这不是“安装失败”或“致命错误”,而是
pip
依赖解析器(resolver)报告的冲突警告NeuRAD 本身和其他库都已经成功安装并构建完成,这只是提醒你某些库的版本并不满足其他库的版本要求。

为什么会发生这个错误?

现有环境中:

要求版本 实际安装

tensorflow
2.11.0

tensorboard>=2.11,<2.12
❌ 你有
tensorboard==2.19.0

tensorflow-addons
0.23.0

typeguard<3.0.0
❌ 你有
typeguard==4.4.2

waymo-open-dataset
1.6.1

pillow==9.2.0
❌ 你有
pillow==11.2.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"

NeuRAD复现

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=“ ”。

如果一切正常,应该会看到如下所示的训练进度(下述是训练完成的截图):

NeuRAD复现

3.2 通过webviewer查看训练建模过程

webviewer作用:WebViewer 是 NeuRAD(基于 Nerfstudio)附带的一个网页可视化界面,用于实时观察训练过程中生成的中间结果,方便你:

可视化渲染图像(Novel View Synthesis)

监控模型学习进展(渲染质量是否逐渐变好)

动态查看相机轨迹、Lidar 点云和动态物体位置

实时评估训练数据与重建效果的对齐程度

导航到终端末尾的链接将加载 webviewer。

由于我是在autodl 云服务器 上运行 NeuRAD,因此不能直接在 本地 Windows 浏览器 中访问
http://localhost:7007
,因为这个地址是服务器上的本地地址(不是你我电脑的)。要解决这个问题,我需要进行端口转发,即将服务器的 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
端口,不是交互式终端,所以登录成功后不会显示任何提示(看起来像“卡住”),但实际上它已经在监听转发了):

NeuRAD复现

注意保持这个 PowerShell 窗口 不要关闭,因为关闭这个 PowerShell 窗口或中断命令,端口映射就会失效。

输入下述autodl服务器定义好的密码(注意最好手动输入,不要复制粘贴(Win终端常有粘贴错误)):

NeuRAD复现

NeuRAD复现

最后打开windows的浏览器,在本地浏览器中输入:

http://localhost:7007

如果成功可以看到如下画面:

NeuRAD复现

下述是webviewer右侧按钮解释:

NeuRAD复现

上述图示对应下述功能:

NeuRAD复现

下述为隐藏视图帧的效果:

NeuRAD复现

NeuRAD复现

上述图示对应下述功能:

NeuRAD复现

NeuRAD复现

上述图示对应下述功能:

NeuRAD复现

NeuRAD复现

上述图示对应下述功能:

NeuRAD复现

NeuRAD复现

上述图示对应下述功能:

NeuRAD复现

NeuRAD复现

上述图示对应下述功能:

NeuRAD复现

NeuRAD复现

上述图示对应下述功能:

NeuRAD复现

NeuRAD 的可编辑性体现于此:你可以在线“移动”动态物体并立刻看到新视图渲染效果


Render
面板 → 用于生成视频动画

NeuRAD复现

上述图示对应下述功能:

NeuRAD复现

NeuRAD复现

NeuRAD复现


Export
面板 → 用于导出点云或网格模型

NeuRAD复现

上述图示对应下述功能:

NeuRAD复现

下述为点击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

NeuRAD复现

下述为点击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
+
Output: rgb
:可查看 RGB 图与点云一致性

切换
Output: features / depth
:用于调试渲染质量与几何恢复

启用
Split Screen
:同时对比 Ground Truth 与预测图像

拖动
Time
+ 修改 Actor Pose:测试动态物体的新轨迹模拟

NeuRAD复现

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端口也不能看到训练结果。

NeuRAD复现

那么如果想在按了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

对应的
render.py
文件,其作用是:用于在训练结束后导出NeuRAD模型的渲染结果和评估指标

NeuRAD复现

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

🧩 参数逐项说明:

参数 含义

python nerfstudio/scripts/render.py dataset
表示执行
render.py
中的
dataset
模式,渲染的是整个数据集中(train/val/test)某一部分的所有视角

--load-config outputs/pandaset/001/2025-05-24_172136/config.yml
指定你训练后的模型配置文件,系统将从这个配置中读取模型结构和 checkpoint 权重

--output-path renders/pandaset_001/images
指定将渲染输出保存到的目录,最终图像和评估结果都会保存在这个路径下

--pose-source val
指定要渲染的数据集部分,这里是
eval
(通常代表验证集) 你也可以换成
train

test

--rendered-output-names rgb depth
指定要输出的图像内容: •
rgb
: 渲染彩色图像 •
depth
: 渲染深度图
–calculate-and-save-metrics 输出每张图片的评价指标(PSNR、SSIM、LPIPS)

下述目录(autodl-tmp/neurad-studio/renders/rgb和autodl-tmp/neurad-studio/renders/depth)存有渲染的图像和深度图:

NeuRAD复现

NeuRAD复现

最后输出的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)

最后输出的是每张图片的三个指标

NeuRAD复现

要想要得到论文中的平均值,运行下述代码(记得更改路径):

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复现

那么NeuRAD文章有四个表,其中第一个表是评估的新视角合成指标,第二个表是评估的激光雷达点云合成指标,第三个表是评估移动、删除动态物体的指标(FID分数),第四个是消融实验。

NeuRAD复现

那么对于第一个表是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 中保存的
camera_path.json
(可在 WebViewer 右侧导出),先点击Add Keyframe添加关键帧视角,可以通过旋转、移动视角,点击多次
Add Keyframe
添加多个路径点。添加至少两个关键帧后,点击
Generate Command
按钮,注意可以在Render name中修改最终生成的json文件名字:

NeuRAD复现

最终导出的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%,我运行了几十分钟都是这样,然后我在想只要渲染的图片和指标知道怎么求就行了,我就没管这个点云和网格的输出了:

NeuRAD复现

4、KITTI数据集

在文章明确写了只训练了KITTI数据集的0006序列。

NeuRAD复现

NeuRAD复现

上述是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”下载,如下:

NeuRAD复现

timestamps.txt在“The KITTI Vision Benchmark Suite”下载,如下:

NeuRAD复现

但是并没有对应的0006序列下载,在 KITTI raw 数据页面上已经无法找到 drive_0006(即 2011_09_26_drive_0006_sync),可能是由于版权、存储或历史调整原因,这个序列已被移除或隐藏。

首先因为想要复现出论文中的精度,因此我首先是写了邮件给作者,寻求这个时间戳文件。

下述是github上一个人的提问,他也是没有找到时间戳文件:

NeuRAD复现

我在KITTI raw 数据页面上下载了“2011_09_26_drive_0001_sync”,对应的是KITTI数据集的0001序列,如下所示,有对应的时间戳文件:

NeuRAD复现

因此我模仿“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") + "
")

再将生成的这个图片复制进下述目录中(四个都一样):

NeuRAD复现

然后在运行下述训练命令,其中experiment-name表示存储实验结果的名称,max-num-iterations为最大训练步数,–data指向包含
image_02
,
oxts
,
calib
,
label_02
等子文件夹的目录,–sequence指定序列号(如
0006
),–use-mars-nvs-50-split是否使用论文中使用的训练测试划分(Mars使用的50%数据集划分):

ns-train neurad 
  --experiment-name kitti_006 
  --max-num-iterations 20000 
  kittimot-data 
  --data ./data/kittimot 
  --sequence 0006 
  --use-mars-nvs-50-split=True

下述是训练成功的截图:

NeuRAD复现

训练完成之后我运行了输出渲染图和渲染指标的命令:

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之外,其余两个指标逊色一点点,我不知道是不是因为我自己构建的时间戳文件的原因:

NeuRAD复现

我觉得如果想要得到准确的结果肯定是要官方提供的时间戳文件,但是没有,那么我觉得就可以训练官方提供了时间戳的场景序列,如0001,然后与之前跑的SUDS的结果做对比  ​

© 版权声明

相关文章

暂无评论

none
暂无评论...