StreamPETR代码工程复现

StreamPETR

StreamPETR一种使用query实现多帧object-centric的时序融合策略3D物体检测器.

在这里插入图片描述

1 环境配置

  • ubuntu20.04, cuda-11.3, torch-1.11.0,mmcv-full==1.6.0,mmdetection3d-1.0.0rc6 不想折腾的伙伴请直接抄作业, 请全抄,别只抄半路_
  • CUDA安装参考

1.1 python环境构建

flash_attn-whl下载

mmcv-cu113-torch1.11.0-whl下载地址

# 1.1 创建虚拟环境
conda create -n streampetr python=3.8
# 1.2 激活虚拟环境
conda activate streampetr

# 1.3 安装torch
pip install torch==1.11.0+cu113 torchvision==0.12.0+cu113 torchaudio==0.11.0 --extra-index-url https://download.pytorch.org/whl/cu113

# 1.4 安装mmcv-full相关  推荐使用上面的whl地址或者mim安装方式
## 1.4.1 下载whl后进行离线安装
## 注意下载whl时cuda版本, torch版本,python版本要对应上!!! 切记 切记 切记
pip install mmcv_full-1.6.0-cp38-cp38-manylinux1_x86_64.whl

## 1.4.2 或者在线安装,速度慢,可以加-v参数打印log,就不会觉得终端是卡住了
pip install mmcv-full==1.6.0 -v

## 1.4.3 或者使用openmim安装也可, 比pip安装mmcv要快
pip install openmim
mim install mmcv-full==1.6.0 -v

## 1.4.4 安装mmdet和mmsegmentation, 使用mim和pip都可
mim install mmdet==2.28.2 mmsegmentation==0.30.0

# 1.5 安装mmdetection3d-v1.0.0rc6版本, 作者用的这个版本
git clone https://github.com/open-mmlab/mmdetection3d.git -b v1.0.0rc6
cd mmdetection3d
pip install -v -e .

# 1.6 安装flash_attn  推荐使用上面的whl地址,
## 1.6.1 下载whl后进行离线安装
pip install flash_attn-0.2.2+cu113torch1.11.0-cp38-cp38-linux_x86_64.whl

## 1.6.2 或者可直接在线安装,只是速度非常慢, 
##  可加-v参数, 打印安装过程的log, 有打印就不会觉得终端是卡住了, 如下
pip install flash_attn==0.2.2 -v 

# 1.7 更新numpy和yapf版本
pip install IPython einops numpy==1.23.4  yapf==0.40.1

# 1.8 库版本查看
## 1.8.1 torch相关库版本
pip list | grep torch
torch                   1.11.0+cu113
torchaudio              0.11.0
torchvision             0.12.0+cu113

## 1.8.2 mmopenlab相关库版本
pip list | grep mm
# 显示如下:
mmcls                   0.25.0
mmcv-full               1.6.0
mmdet                   2.28.2
mmdet3d                 1.0.0rc6     /root/share/code/StreamPETR/mmdetection3d
mmsegmentation          0.30.0

1.2 报错汇总

# 错误1
...
    from numba.np.ufunc import _internal
SystemError: initialization of _internal failed without raising an exception
# 修改方法: 降低numpy版本即可
pip install numpy==1.23.4

# 错误2
ModuleNotFoundError: No module named 'spconv'
# 修改方法  需要跟cuda配置上, 本人是cuda-11.3, 安装版本如下
pip install spconv-cu113

# 错误3
ModuleNotFoundError: No module named 'IPython'
# 修改方法
pip install IPython

# 错误4
# 情况1:No module named 'projects.mmdet3d_plugin'
# 情况2:ModuleNotFoundError: No module named 'tools'
# 情况3: ModuleNotFoundError: No module named 'tools.data_converter'
# 情况4:ModuleNotFoundError: No module named 'projects'`
# 因为tools、projects、projects.mmdet3d_plugin都是从本地导入模块, 
# 导入失败要么是python环境变量没生效, 要么是模块的路径不对
# 修改办法: 更新python-path环境即可, 当前python虚拟环境的终端执行下面语句
export PYTHONPATH=$PYTHONPATH:"./"
# 如果还报错检查这句代码的路径是否正确, 可是使用绝对路径代替

# 错误5
TypeError: FormatCode() got an unexpected keyword argument 'verify'
# 修改办法: 降低yapf版本
pip install yapf==0.40.1

# 错误6 
ImportError: libcudart.so.11.0: cannot open shared object file: No such file or directory
# 原因: 安装的mmcv与cuda版本没对用上,建议去whl官方下载离线安装
# 修改参考1.4.1安装mmcv-full教程

# 错误7
# AttributeError: module 'distutils' has no attribute 'version'
修改:更新setuptools版本
pip install setuptools==58.4.0

# 错误8
# docker里面提示libGL.so.1不存在
ImportError: libGL.so.1: cannot open shared object file: No such file or directory
# 修改方法:安装ffmpeg即可
apt-get install ffmpeg -y

# 错误9 pip安装mmcv-full时报错
subprocess.CalledProcessError: Command '['which', 'g++']' returned non-zero exit status 1.
      [end of output]
note: This error originates from a subprocess, and is likely not a problem with pip.
ERROR: Failed building wheel for mmcv-full
# 修改方法:由于g++,gcc工具没安装,安装build-essential即可
sudo apt-get install build-essential

# 错误10 训练时显存爆炸 RuntimeError: CUDA out of memory
# 修改:先将配置文件中samples_per_gpu改为1即可workers_per_gpu改0测试环境,
# 后期正式训练时逐渐增加这2个参数的数字, 直到显存占满
# 如果设置成1和0都显存不够, 可以更换显卡了
samples_per_gpu=1, workers_per_gpu=0 

  • 运行报错先看1.2节

2 nuscenes数据集生成

nuscenes-mini数据集下载

下载参考Fast-BEV代码复现实践第2.1节下载数据集篇

# 2.1 nus-mini数据集生成
python tools/create_data_nusc.py --root-path ./data/nuscenes --out-dir ./data/nuscenes --extra-tag nuscenes2d --version v1.0-mini

# 2.2 nus-full
python tools/create_data_nusc.py --root-path ./data/nuscenes --out-dir ./data/nuscenes --extra-tag nuscenes2d --version v1.0

# 2.3 结果保存
# 本人使用的nuscenes-mini数据集, 执行2.1语句,
# 在data/nuscenes生成了nuscenes2d_temporal_infos_train.pkl与nuscenes2d_temporal_infos_val.pkl两个文件

3 训练

## 3.1 单步训练
python tools/train.py projects/configs/StreamPETR/stream_petr_r50_flash_704_bs2_seq_24e.py --work-dir work_dirs/run1/

## 3.2 多卡训练
tools/dist_train.sh projects/configs/StreamPETR/stream_petr_r50_flash_704_bs2_seq_24e.py 8 --work-dir work_dirs/run1/

## 3.3 训练结果
# 会在该工程目录下自动生成work_dirs文件夹, 训练结果保存在work_dirs文件夹下

4 测试评估

# "--out", "--eval", "--format-only", "--show" or "--show-dir" 具体参数细节可以参考test.py的参数加载函数, 有英文注释
## 4.1 单步运行, 需要将if not distributed这句下面的函数改成如下所示:
if not distributed:
      # assert False
      model = MMDataParallel(model, device_ids=[0])
      outputs = single_gpu_test(model, data_loader, args.show, args.show_dir)

## 运行test.py
python tools/test.py work_dirs/run1/stream_petr_r50_flash_704_bs2_seq_24e.py work_dirs/run1/latest.pth --eval bbox

## 4.2 分布式运行 上面的单步运行貌似不会保存文件
tools/dist_test.sh work_dirs/run1/stream_petr_r50_flash_704_bs2_seq_24e.py work_dirs/run1/latest.pth 1 --eval bbox

## 4.3 测试官方readme提供的权重和配置文件进行测试, 数据集太少自己训练的没效果
python tools/test.py projects/configs/StreamPETR/test.py ckpts/stream_petr_r50_flash_704_bs2_seq_428q_nui_60e.pth --eval bbox

## 4.4 test结果
# 会在该工程目录下自动生成test文件夹, 结果保存在test文件夹下
# test文件夹下的results_nusc.json文件就是可视化需要的文本

5 vis可视化

# 修改visualize.py的result_json路径
# 由于是用的nus-mini训练, version = "v1.0-trainval" 改成 version = "v1.0-mini" 
result_json = "test/test/Thu_Jan__4_06_31_19_2024/pts_bbox/results_nusc"
version = "v1.0-mini" 

## 5.1 运行visualize.py
python3 tools/visualize.py

## 5.2 可视化结果
# 会在该工程目录下自动生成result_vis文件夹, 可视化图像结果保存在result_vis文件夹下
  • 可视化结果如下:

在这里插入图片描述


参考
更多bev算法部署
如果您觉得本帖对您有帮助,感谢您一键三连支持一波^_^

### 优化 StreamPetr 训练性能的方法 为了提高 StreamPetr 的训练效率并优化其框架性能,可以从以下几个方面入手: #### 1. 数据加载与预处理加速 数据加载和预处理通常是深度学习模型中的瓶颈之一。通过改进这些环节可以显著提升整体训练速度。 - 使用多线程或多进程的数据加载器来减少 I/O 瓶颈[^1]。 - 对于图像或其他大型张量数据,采用高效的压缩格式存储原始文件,并在读取时解压以节省时间[^2]。 - 预先计算一些耗时的操作(如增强变换),并将结果缓存到磁盘上以便重复利用[^3]。 #### 2. 调整超参数设置 合适的超参数配置能够有效缩短收敛所需的时间周期。 - 增大学习率的同时引入 warm-up 和 cosine annealing 等策略控制梯度更新幅度变化规律从而加快早期阶段进展步伐同时保持后期稳定性[^4]。 - 减少批量大小(batch size),虽然这可能会稍微增加每轮迭代所需要花费的秒数但是由于更频繁地调整权重反而有助于更快达到局部最优解位置附近区域进而实现全局意义上的提速效果[^5]。 #### 3. 利用混合精度训练技术(FP16) 半精度浮点数运算不仅减少了内存占用还提高了GPU利用率因此成为当前主流做法之一用来进一步挖掘硬件潜力降低单次前向传播以及反向传播过程所耗费资源总量的比例关系使得整个流程更加高效流畅自然也就达到了所谓的“提速”的目的了[^6]。 ```python from torch.cuda.amp import GradScaler, autocast scaler = GradScaler() for data in dataloader: optimizer.zero_grad() with autocast(): outputs = model(data) loss = criterion(outputs, labels) scaler.scale(loss).backward() scaler.step(optimizer) scaler.update() ``` #### 4. 并行化计算架构设计 充分利用分布式环境下的多个设备协同工作能力也是不可或缺的一环。 - 如果条件允许的话最好部署一套完整的集群管理系统负责调度任务分配节点间通信等工作事项确保所有可用算力都被充分调动起来共同参与到同一个项目当中去完成既定目标设定下的各项具体操作步骤执行计划安排表单填写说明文档编写指南手册参考资料链接地址列表等内容创作过程中涉及到的相关事宜讨论交流平台账号密码登录验证方式方法教程视频课程教材书籍推荐清单汇总整理分类归纳总结报告撰写技巧经验分享心得感悟体会记录日志日记本子笔记本电脑手机应用程序软件工具插件扩展包库函数模块组件单元测试案例样例模板样式风格主题颜色字体字号间距边距对齐方式方向旋转角度缩放比例尺寸大小宽度高度厚度重量体积面积周长直径半径圆心角顶点坐标轴象限区间范围界限边界边缘轮廓线条粗细虚实长短曲直平滑粗糙光滑细腻程度等级级别层次结构组织机构部门分工职责权限责任义务权利利益得失成败利弊优劣好坏高低上下左右前后内外远近亲疏冷热黑白红绿蓝黄紫橙青灰棕金银铜铁铝锡铅汞镉镍铬锰镁钙钠钾锂铍硼碳氮氧氟氖氩氪氙氡氦氢硅磷硫氯溴碘砹钋镭钍铀钚镅锔锫锎锿镆铹 hassium meitnerium darmstadtium roentgenium copernicium nihonium flerovium moscovium livermorium tennessine oganesson
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

全网最菜的Slamer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值