SUDS复现

1、环境配置

根据下述要求:

选择如下配置:

记得切换安装源:

运行下述代码克隆代码库:

 git clone https://github.com/hturki/suds.git

配置环境:

 conda env create -f environment.yml

激活环境:

 conda env create -f environment.ym

编译环境:

 python setup.py install

2、数据准备(针对于KITTI数据集的0006序列进行训练)

1、从 KITTI MOT 数据集下载以下内容:

  1. 左图彩色图片

  2. 正确的彩色图像

  3. GPS/IMU 数据

  4. 相机校准文件

  5. Velodyne 点云

  6. (可选)语义标签

2、KITTI数据集各个文件夹解析

  • data_tracking_calib:包含了一系列相机与激光雷达的外参和内参矩阵,比如:P2:左相机投影矩阵、P3:右相机投影矩阵、R_rect:相机矫正矩阵、Tr_velo_to_cam:激光雷达坐标系 → 相机坐标系的变换矩阵

  • data_tracking_image_0:每帧一张图片(左摄像头),用于视图合成、深度预测等。

  • data_tracking_image_03:每帧一张图片(右摄像头),主要用于立体视觉(stereo matching)任务。

  • data_tracking_oxts:GPS/IMU 测量数据,提供每帧的位置信息(经纬度)和姿态(角速度、加速度等),有助于时序建图。

  • data_tracking_velodyne:激光雷达点云数据,每帧一个 .bin 文件,内含 3D 点云数据(x, y, z, 强度)。

  • kitti-step:每张RGB图像的语义标签。

3、将所有内容提取到并保持数据结构./data/kitti

4、从 Velodyne 点云生成深度图:PYTHONPATH=. python scripts/create_kitti_depth_maps.py --kitti_sequence 0006,其中PYTHONPATH=.是将告诉 Python:“请把当前目录(.)当作模块根目录来搜索 suds 包”。

5、(可选)从语义标签生成天空和静态掩码(由于suds没有提供0006序列场景的语义标签数据(kitti-step/train中没有0006序列),所以没有执行这一步,并没有生成天空和静态掩码):python scripts/create_kitti_masks.py --kitti_sequence $SEQUENCE

6、创建元数据文件:PYTHONPATH=. python scripts/create_kitti_metadata.py --config_file scripts/configs/kitti-06.yaml,生成一个autodl-tmp/suds/metadata文件夹,下面保存有kitti-06.json文件。将 KITTI 每帧图像、相机姿态、光流、深度图等信息组织成结构化 metadata,并保存成 JSON 文件,供 SUDS 在训练阶段加载。

7、Extract DINO 功能:

  1. 先运行export PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:64,防止爆显存,在运行PYTHONPATH=. python scripts/extract_dino_features.py --metadata_path metadata/kitti-06.json或用于多 GPU 提取python -m torch.distributed.run --standalone --nnodes=1 --nproc_per_node $NUM_GPUS scripts/extract_dino_features.py --metadata_path $METADATA_PATH

  2. PYTHONPATH=. python scripts/run_pca.py --metadata_path metadata/kitti-06.json,运行这个文件,对提取出来的高维 DINO 特征进行降维(PCA),以便后续训练中减少内存开销、提高效率。(修改了对应的run_pca.py文件)

8、先运行export PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:64,防止爆显存,提取 DINO 对应关系:PYTHONPATH=. python scripts/extract_dino_correspondences.py --metadata_path metadata/kitti-06.json或用于多 GPU 提取python -m torch.distributed.run --standalone --nnodes=1 --nproc_per_node $NUM_GPUS scripts/extract_dino_correspondences.py --metadata_path $METADATA_PATH,该条命令运行时间较长。

9、(可选)生成用于可视化的特征集群:python scripts/create_kitti_feature_clusters.py --metadata_path $METADATA_PATH --output_path $OUTPUT_PATH。这一步对所有图像特征做 K-Means 聚类,提取“原型中心(feature clusters)”,在某些实验中可用来引导聚类损失或原型增强。

3、训练

值得注意的是--pipeline.feature_clusters后跟的不是create_kitti_feature_clusters.py生成的文件夹。--pipeline.feature_clusters 参数它的作用是告诉 SUDS 模型是否启用预处理的 PCA 特征作为训练输入。如果你执行了 run_pca.py,每帧图像的 DINO 特征 .pt 被转换成了 .parquet,设置 --pipeline.feature_clusters true 后,训练时将 .parquet 文件读取 PCA 后的特征,而不是从 .pt 文件加载原始的高维 DINO 特征。

将autodl-tmp/suds/data/suds_datamanager.py中train_num_rays_per_batch: int 由4096改为 512,可以把时间从2天 ⼤⼤减⼩为 6个⼩时。

 #用于优化 PyTorch GPU 显存分配策略的环境变量设置。PyTorch 默认会尽量 “预分配大块显存”,以减少频繁申请/释放造成的性能开销。下面一行命令是将 PyTorch 内存池中能“单次分配的最大内存块”限制为 64MB,这样就避免 PyTorch 去分配“过大的连续显存块”,从而 降低碎片风险、减少 OOM(Out of Memory) 错误。
 export PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:64
 ​
 PYTHONPATH=. python suds/train.py suds --experiment-name kitti_0006 --pipeline.datamanager.dataparser.metadata_path metadata/kitti-06.json

训练过程遇到:

 OSError: Could not find compatible tinycudann extension for compute capability 80.

该错误说明 tiny-cuda-nn 不能在你当前使用的 GPU 上运行,因为它缺少为该显卡“计算能力(compute capability)= 8.0” 编译的扩展。当前的 GPU 是 NVIDIA A100,它的 compute capability 是 8.0,但当前 tiny-cuda-nn 安装版本可能:

  • 没有预编译支持 compute 8.0;

  • 或者没有正确为你机器的 CUDA 环境编译。

解决tinycuda-nn的问题:

 # 删除已安装版本(如果有)
 pip uninstall tinycudann -y
 ​
 # 重新 clone 项目
 cd ~/autodl-tmp/
 git clone https://github.com/NVlabs/tiny-cuda-nn.git
 cd tiny-cuda-nn
 # 重新编译,指定当前 GPU 架构(compute 80 是 A100 的架构)
 export TCNN_CUDA_ARCHITECTURES=80
 # 安装绑定模块
 cmake . -B build

进行编译时报错:

 CMake Error at CMakeLists.txt:23 (cmake_minimum_required):
   CMake 3.18 or higher is required.  You are running version 3.16.3

tiny-cuda-nn 编译要求 CMake ≥ 3.18,而当前的版本是 3.16.3。

🔗 点击下载 CMake 3.25.2 安装包(Github)然后将该 .sh 文件上传到 AutoDL的根目录~/下,然后:

 #手动创建该目录
 mkdir -p ~/cmake-3.25.2
 #确认是否有写权限
 touch ~/cmake-3.25.2/test.txt && echo "✅ 有权限" || echo "❌ 无权限"
 #运行安装脚本
 ./cmake-3.25.2-linux-x86_64.sh --skip-license --prefix=$HOME/cmake-3.25.2
 #然后设置路径
 export PATH=$(pwd)/cmake-3.25.2-local/bin:$PATH
 #查看cmake版本是否正确,需要大于3.18版本
 cmake --version

至此Cmake版本问题已被解决。

继续利用Cmake编译tiny-cuda-nn:

 ~/autodl-tmp/tiny-cuda-nn# cmake . -B build
 #报错
 CMake Error at CMakeLists.txt:49 (message):
   Some tiny-cuda-nn dependencies are missing.  If you forgot the
   "--recursive" flag when cloning this project, this can be fixed by calling
   "git submodule update --init --recursive".

现在遇到的错误是:

Some tiny-cuda-nn dependencies are missing 原因是你在 git clone 的时候 没有加 --recursive,导致子模块(尤其是 cutlass 等核心组件)没有被拉取

解决方案就说补全子模块,在 tiny-cuda-nn 项目目录下执行以下命令:

 git submodule update --init --recursive

然后重新执行构建:

 cmake . -B build
 cmake --build build --config RelWithDebInfo -j
 pip install ./bindings/torch

编译成功如下图所示:

在次运行SUDS的训练命令:

 #用于优化 PyTorch GPU 显存分配策略的环境变量设置。PyTorch 默认会尽量 “预分配大块显存”,以减少频繁申请/释放造成的性能开销。下面一行命令是将 PyTorch 内存池中能“单次分配的最大内存块”限制为 64MB,这样就避免 PyTorch 去分配“过大的连续显存块”,从而 降低碎片风险、减少 OOM(Out of Memory) 错误。
 export PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:64
 ​
 PYTHONPATH=. python suds/train.py suds --experiment-name kitti_0006 --pipeline.datamanager.dataparser.metadata_path metadata/kitti-06.json

又报错:

 RuntimeError: Encoding 'SequentialGrid' not found

这表示你编译安装的 tiny-cuda-nn 版本 不包含 SequentialGrid 编码模块,而这个模块正是 SUDS 训练所依赖的。确实已经成功编译并安装了 tiny-cuda-nn,但这个版本是从 官方仓库 克隆的 main 分支,并不包含 SUDS 自定义的扩展模块

所以你现在需要做的是:

 #先卸载当前版本
 pip uninstall tinycudann -y
 #重新 clone 正确分支,并安装
 cd ~/autodl-tmp
 rm -rf tiny-cuda-nn
 # Clone 带有 SequentialGrid 的 SUDS 专用分支
 git clone https://github.com/hturki/tiny-cuda-nn.git -b ht/res-grid
 cd tiny-cuda-nn
 git submodule update --init --recursive
 ​
 # 指定你的 GPU 架构(A100 是 80)
 export TCNN_CUDA_ARCHITECTURES=80
 ​
 # 构建 & 安装
 cmake . -B build
 cmake --build build --config RelWithDebInfo -j
 pip install ./bindings/torch

然后运行以下代码验证是否包含 SequentialGrid

 python -c "import tinycudann as tcnn; print(tcnn.network_encoding_names())"

在次运行SUDS的训练命令:

 #用于优化 PyTorch GPU 显存分配策略的环境变量设置。PyTorch 默认会尽量 “预分配大块显存”,以减少频繁申请/释放造成的性能开销。下面一行命令是将 PyTorch 内存池中能“单次分配的最大内存块”限制为 64MB,这样就避免 PyTorch 去分配“过大的连续显存块”,从而 降低碎片风险、减少 OOM(Out of Memory) 错误。
 export PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:64
 ​
 PYTHONPATH=. python suds/train.py suds --experiment-name kitti_0006 --pipeline.datamanager.dataparser.metadata_path metadata/kitti-06.json

训练完成之后运行下述命令进行评估:

 #单个GPU
 PYTHONPATH=. python suds/eval.py --load_config outputs/kitti_0006/suds/2025-05-23_141128/config.yml --output-path outputs/kitti_0006/suds/2025-05-23_141128/eval
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值