首页 > 其他分享 >Lift-Splat-Shoot 复现

Lift-Splat-Shoot 复现

时间:2024-10-26 16:33:25浏览次数:4  
标签:Shoot 训练 代码 内存 nuscenes Lift devkit Splat LSS

我理解的复现,就是把代码跑通,完整训练一遍,然后测试,争取达到论文里报告的效果。虽然大部分工作复现出来可能都到不了论文里的性能,比较玄学。

概述

Lift-Splat-Shoot (LSS) 是 BEV 方法的开山之作,作者来自 NVIDIA。该方法是一个纯视觉的感知方法,用来做 BEV 分割任务的,但是其架构和思路可以推广到其他感知任务。

思路:等我看懂了再补吧……

代码简介

原代码仓库:https://github.com/nv-tlabs/lift-splat-shoot

我 fork 的仓库:https://github.com/Eslzzyl/lss

LSS 的代码简直是自动驾驶感知方法里的一股清流。

现在的大多数方法都是用 mmdet3d 改的,mmdet3d 相对比较成熟,如果熟悉这个框架改起来当然容易,但 mmdet3d 的环境太难配了,python pytorch cudatoolkit setuptools mmengine mmcv mmdet nuscenes-devkit mmdet3d 这几个包(以及它们的一大堆依赖)的版本互相牵扯,坑非常多;而且这个框架比较复杂,对初学者不是很友好;最难顶的是这些方法绝大多数都是用自己魔改的 mmdet3d 代码库,很多要自己编译 CUDA 算子,又牵扯到 gcc 和 nvcc,问题繁多。

LSS 的代码则是直接在 nuscenes-devkit 的基础上自己写了数据加载、模型结构和训练流程,整体上还是比较复合标准的 PyTorch 训练 pipeline 的,依赖也很少,对像我这样的小白来说比较容易理解。

再加上 LSS 是一个纯视觉的方法,不需要做 Fusion、模态对齐之类的,结构就更简单。这份代码实测可以用最新版本的工具链来训练,详见环境配置部分。

LSS 代码库只有 6 个主要的 Python 文件:

  • main.py,程序入口
  • train.py,训练脚本
  • data.py,建立在 nuscenes-devkit 基础上的数据加载代码
  • models.py,模型代码
  • tools.py,实用工具
  • explore.py 主要是模型验证和可视化代码

环境配置

我配置的环境如下:

  • Python 3.12
  • Pytorch 2.4.1
  • torchvision
  • 自己改的 nuscenes-devkit,兼容 Python 3.12

以下是具体配置过程。

创建虚拟环境

建议使用 conda 创建虚拟环境。

conda create -n lss python=3.12
conda activate lss

安装 PyTorch 和 torchvision

本文假定读者已经安装了 NVIDIA 显卡驱动和 CUDA 工具包,示例版本是 12.1。LSS 不需要自行编译 CUDA 算子。

# 此处遵循 PyTorch 官网指南安装最新版本的 pytorch 和 torchvision 即可
conda install pytorch torchvision pytorch-cuda=12.1 -c pytorch -c nvidia

安装 nuscenes-devkit

# 克隆我修改的 nuscenes-devkit
git clone https://github.com/Eslzzyl/nuscenes-devkit.git
cd nuscenes-devkit
# 安装。nuscenes-devkit 的依赖将被自动安装。
pip install -v -e ./setup

安装 LSS 的依赖

# 克隆我修改的 LSS 代码
git clone https://github.com/Eslzzyl/lss.git
cd lss
# 安装依赖
pip install -r requirements.txt

环境配置到此完成。没有恼人的版本不兼容问题,不需要执行任何编译操作。

训练

我尝试了在两套环境上训练 LSS:

  1. 8 卡 2080Ti(11G),96G内存,双路 Xeon Gold 5118 CPU,共 24 核
  2. 单卡 4090(24G),41G内存,Xeon w7-3465x CPU,9核(这个是在 docker 容器里面跑的,所以没法用到所有的内存和 CPU)

LSS 代码里设定是 nuScenes trainval 上跑 10000 个 epoch,应该是随便给了一个比较大的数,然后看收敛了就停下来。我改成 1000 了,在环境 1 训练完需要大概 3 天,环境 2 是 6 天。但是环境 1 因为后面内存爆了就停下来了。这里要引以为鉴,nuScenes 上开多个 worker 加载数据非常消耗内存,可用的内存一定要和卡数匹配。

幸运的是,LSS 的数据加载部分没有内存泄露的问题。这个方向有很多代码的数据加载是有内存泄漏的,根本跑不完整个训练过程。

(环境 2)查看 TensorBoard 的日志,基本上到第 20k 个 step 模型就已经收敛,IOU 来到 0.28 左右。此时距离模型开始训练过去了两个小时。

# 在执行下面的命令启动训练之前,先修改 train.sh 中的超参数,确保适合自己的硬件配置,不会导致内存或显存溢出。
bash train.sh

验证

其实就是在 nuScenes 的验证集上跑一遍验证过程,这个和训练过程中的验证是完全一样的。

bash eval.sh

程序将报告 IoU 指标,我这里测的是 0.28 左右。就像上面说的,训练开始不久后验证的 IoU 指标就达到了这个值。

可视化

bash visual.sh

将产生许多张图片,这是其中一张。

可视化结果

总结

LSS 的代码是很值得借鉴的,干净利落,没有太多的封装。

标签:Shoot,训练,代码,内存,nuscenes,Lift,devkit,Splat,LSS
From: https://www.cnblogs.com/eslzzyl/p/18504164

相关文章

  • Spacetime Gaussian Feature Splatting for Real-Time Dynamic View Synthesis
    SpacetimeGaussianFeatureSplattingforReal-TimeDynamicViewSynthesis摘要动态场景的新视角合成一直是一个引人入胜但充满挑战的问题。尽管最近取得了很多进展,但如何同时实现高分辨率的真实感渲染、实时渲染和紧凑的存储,依然是一个巨大的挑战。为了应对这些挑战,......
  • xssplatform小问题之404页面解决
    不要在小皮里面直接进行伪静态的书写我反复修改然后就是一直反复404出问题方法:1、在这个初始化空白的.htaccess中写入apache的伪静态(在安装说明中有) 粘进去保存。(2)检查一下小皮的apache配置文件中是否开启rewrite刷新页面发现可以访问了二编:如果再次打开发现......
  • 3D Gaussion Splatting
    Splatting一种体渲染方法,从3D物体渲染到2D平面也叫抛雪球方法核心选择雪球抛掷,3D投影到2D合成形成最后图像捏雪球(搞定一个核形状)选择3D高斯椭圆仿射后高斯仍闭合3D降2D依然为高斯(沿一个轴积分)3Dgaussian为什么是椭球?v的概率密度函数x的概率密度......
  • Splatt3R: Zero-shot Gaussian Splatting from Uncalibrated Image Pairs 论文解读
    目录一、概述二、相关工作1、近期工作2、DUSt3R3、MASt3R三、Splatt3R1、MASt3R的Backbone 2、高斯预测头3、点云与3D高斯参数结合4、3D高斯渲染5、损失函数四、实验 1、对比实验2、消融实验一、概述    该论文首次提出了一种无需任何相机参数和深......
  • GS-LRM: Large Reconstruction Modelfor 3D Gaussian Splatting 论文解读
    目录一、概述二、相关工作1、多视图的三维重建2、前馈重建三、LRM1、编码器2、解码器3、NeRF渲染四、GS-LRM 1、输入处理2、Transformer3、损失函数五、实验六、局限一、概述    该论文提出了一种利用稀疏输入图像高效预测3D高斯原语的方法,也是第一......
  • SS241012B. 电梯(lift)
    SS241012B.电梯(lift)题意你有\(n\)种货物,每种货物有一个高度\(f\)和体积\(w\)。其中\(w\)表示体积是\(2^w\)。你有一个大小为\(2^m\)的背包,一个背包的花费是背包物品的最大高度,问使用若干个背包装完物品的最小代价。思路膜拜黄队%%%感觉黄队的做法比题解好。首先一......
  • P8392 [BalticOI 2022 Day1] Uplifting Excursion(特殊背包问题)
    题意简述有\(2m+1\)种物品,体积分别为\(-m\simm\),每种物品有\(a_i\)个。你需要选出尽可能多数量的物品,使得物品体积和为\(l\)。\(m\le300,a_i,|l|\le10^{18}\)分析此题属于“背包容量极大,物品体积极小”的特殊背包问题。考虑背包问题的经典错误贪心:按照性价比降序排......
  • 题解:P9947 [USACO20JAN] Photoshoot B
    P9947[USACO20JAN]PhotoshootB题解纯模拟!在\(a_{1}\)算出来之后,我们就可以通过\(b\)数组可以求出以后\(a\)数组的所有元素。要判断是否为排列,我们可以使用一个\(vis\)做桶,为了保证字典序最小,我们可以从\(1\)开始枚举,每次枚举前要清空一下\(vis\)数组,最后使用......
  • Liftoff:基于参考基因组的基因组注释
    Liftoff是一个可以准确根据同一物种或近缘物种基因组进行基因注释映射的工具(与liftOver进行不同基因组版本的染色体位置转换有点类似)。该工具仅需两个基因组序列和参考基因组的基因注释文件即可进行基因注释。Liftoff使用minimap2将参考基因组的基因序列与目标基因组比对,这样的好......
  • 南沙C++noip老师解一本通题: 1360:奇怪的电梯(lift)
    ​【题目描述】大楼的每一层楼都可以停电梯,而且第i层楼(1≤i≤N)上有一个数字Ki(0≤=Ki≤=N)。电梯只有四个按钮:开,关,上,下。上下的层数等于当前楼层上的那个数字。当然,如果不能满足要求,相应的按钮就会失灵。例如:33125代表了Ki(K1=3,K2=3,……),从一楼开始。在一楼,按“上”可以到4......