BEVFormer代码复现实践

BEVFormer代码复现实践

1 环境配置

1.1 环境安装

  • ubuntu20.04,python-3.8, torch-1.10.0, cuda-11.3, cudnn-8.6
  • 不要问其他版本能不能通,小白和不想折腾环境的童鞋直接抄作业
  • 默认显卡驱动cuda,cudnn,conda已装好,未安装请参考cuda, cudnn,conda安装
# 1 拉取源码   github加速代理https://ghproxy.com/
git clone https://github.com/fundamentalvision/BEVFormer.git

# 2 创建虚拟环境
conda create -n bev python=3.8 -y

# 3 激活虚拟环境
conda activate bev

# 4.1 安装torch,torchvision,torchaudio
pip install torch==1.10.0+cu113 torchvision==0.11.0+cu113 torchaudio==0.10.0 -f https://download.pytorch.org/whl/torch_stable.html

# -i https://pypi.tuna.tsinghua.edu.cn/simple/

# 4.2 conda安装 本人使用的4.1进行安装,未报错,未验证过4.2使用conda安装
conda install pytorch==1.10.0 torchvision==0.11.0 torchaudio==0.10.0 cudatoolkit=11.3 -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/linux-64/

# 5 gcc版本 可选
conda install -c omgarcia gcc-6 # gcc-6.2

# 6 mmopenlib系列 mmcv-full会装很久,只要电脑没卡住都是正常现象
pip install mmcv-full==1.4.0 mmdet==2.14.0 mmsegmentation==0.14.1

# 7 源码安装mmdet3d-v0.17.1版本
# 7.1 进入bevformer目录
cd bevformer
# 7.2 下载mmdetection3d   github加速代理https://ghproxy.com/
git clone https://github.com/open-mmlab/mmdetection3d.git
# 7.3 进入mmdetection3d目录
cd mmdetection3d
# 7.4 切换v0.17.1
git checkout v0.17.1
# 7.5 安装mmdet3d-v0.17.1版本
python setup.py install

# 8 安装 Detectron2 and Timm
# 8.1 安装基本python依赖包
pip install einops fvcore seaborn iopath==0.1.9 timm==0.6.13  typing-extensions==4.5.0 pylint ipython==8.12  numpy==1.19.5 matplotlib==3.5.2 numba==0.48.0 pandas==1.4.4 scikit-image==0.19.3 setuptools==59.5.0 yapf==0.40.1
# 8.2 安装 Detectron2
python -m pip install 'git+https://github.com/facebookresearch/detectron2.git'

# 9 下载预训练模型
# 9.1 进入bevformer目录
cd bevformer
# 9.2 创建并进入ckpts文件夹
mkdir ckpts && cd ckpts
# 9.3 下载预训练权重r101_dcn_fcos3d_pretrain.pth,github加速代理https://ghproxy.com/
wget https://github.com/zhiqi-li/storage/releases/download/v1.0/r101_dcn_fcos3d_pretrain.pth

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'
# 修改方法
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'
# 因为tools和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即可
samples_per_gpu=1

运行出现报错请参考上面的报错汇总


2 准备数据集

  1. 数据集下载

下载数据参考MapTR代码复现实践的第2节数据集下载, 下载后数据放入data目录结构如下

# data文件夹展开,can_bus内容太多,这就不展开
data
├── can_bus   
    ├──...
└── nuscenes
    ├── maps
    ├── samples
    ├── sweeps
    └── v1.0-mini
  1. 生成训练需要的数据集格式
# 1 mini数据集 
python tools/create_data.py nuscenes --root-path ./data/nuscenes --out-dir ./data/nuscenes --extra-tag nuscenes --version v1.0-mini --canbus ./data

# 2 full数据集 可以将v1.0-mini复制一份命名v1.0-trainval
python tools/create_data.py nuscenes --root-path ./data/nuscenes --out-dir ./data/nuscenes --extra-tag nuscenes --version v1.0 --canbus ./data

运行上面代码后会在data/nuscenes/目录下生成2pkl2json 文件如下:

data
├── can_bus   
    ├──...
└── nuscenes
    ├── maps
    ├── nuscenes_infos_temporal_train.pkl
    ├── nuscenes_infos_temporal_train_mono3d.coco.json
    ├── nuscenes_infos_temporal_val.pkl
    ├── nuscenes_infos_temporal_val_mono3d.coco.json
    ├── samples
    ├── sweeps
    └── v1.0-mini

3 训练与测试

  1. 修改配置文件

训练前,修改配置文件./projects/configs/bevformer/bevformer_base.py参数, 主要下面4个参数:

前期测试环境是否正确, 建议设置max_epochs=2,samples_per_gpu=1,workers_per_gpu=0

load_from  # 预训练权重路径
max_epochs # 训练周期
samples_per_gpu=1, # bitch_size
workers_per_gpu=0, 
  1. 训练

最后一个参数是显卡个数, 只有一张显卡写1,8张写8

./tools/dist_train.sh ./projects/configs/bevformer/bevformer_base.py 1

训练6个周期,每2个周期保存一次权重,完成后生成valwork_dirs目录结构如下:

val
└── work_dirs
    └── bevformer_base
        └── Wed_Sep_27_21_04_49_2023
            └── pts_bbox

work_dirs
└──
    └── bevformer_base
        ├── 20230927_210445.log
        ├── 20230927_210445.log.json
        ├── bevformer_base.py
        ├── epoch_2.pth
        ├── epoch_4.pth
        ├── epoch_6.pth
        ├── latest.pth -> epoch_6.pth
        └── tf_logs
  1. 使用fp16精度训练模型
./tools/fp16/dist_train.sh ./projects/configs/bevformer_fp16/bevformer_tiny_fp16.py 1
  1. 测试评估
# 使用自己训练的权重预测
./tools/dist_test.sh ./projects/configs/bevformer/bevformer_base.py work_dirs/bevformer_base/latest.pth 1

生成test目录结构如下:

results_nusc.json就是检测结果

test
└── bevformer_base
    └── Thu_Sep_28_09_35_31_2023
        └── pts_bbox
            ├── metrics_details.json
            ├── metrics_summary.json
            ├── plots
            └── results_nusc.json

4 可视化

  1. 修改tools/analysis_tools/visual.py可视化代码
# 修改1 替换主函数
if __name__ == '__main__':
    # 数据集路径,使用mini就用v1.0-mini, 使用full就用v1.0-trainval
    nusc = NuScenes(version='v1.0-mini', dataroot='./data/nuscenes', verbose=False)
    # results_nusc.json路径
    bevformer_results = mmcv.load('test/bevformer_base/Thu_Sep_28_09_35_31_2023/pts_bbox/results_nusc.json')
    # 添加result目录
    save_dir = "result"
    if not os.path.exists(save_dir):
        os.mkdir(save_dir)

    sample_token_list = list(bevformer_results['results'].keys())
    
    for id in range(0, 10):
        render_sample_data(sample_token_list[id], pred_data=bevformer_results, out_path=os.path.join(save_dir, sample_token_list[id]))

# 修改2:将visual.py中的下面2句注释掉,就不用每次关闭当前显示窗口生成下一张图
# if verbose:
#     plt.show()
  1. 运行
python tools/analysis_tools/visual.py

结果图像保存到result目录下, 可视化如下:

在这里插入图片描述
由于只用mini数据集训练了6个周期,效果比较差。



  • 26
    点赞
  • 100
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 31
    评论
GitHub代码复现是指在GitHub上找到一个感兴趣或有用的开源代码项目,并通过阅读代码、运行代码并进行修改来重新实现或再次创建整个项目。 首先,需要在GitHub上搜索并找到目标项目。可以通过GitHub的搜索功能,输入关键词、项目名称、描述等来筛选出符合条件的项目。选择一个代码质量好、维护活跃的项目会更有保障。 一旦找到了目标项目,就可以clone(克隆)该项目到本地。可以使用git命令行或者通过GitHub Desktop等工具进行操作。克隆项目后,就可以在本地对代码进行修改、调试、定制等。 接下来,对项目进行配置和安装依赖。一般来说,项目中会有一个readme文件或者其他文档来指导配置环境和安装所需的依赖包。根据项目要求进行配置和安装。 然后,就可以运行项目了。根据项目的要求,可能需要提供一些参数或者数据集。根据项目的文档,在终端或者IDE中运行相应的命令或者程序。 当项目运行成功后,就可以根据自己的需求对代码进行修改和优化。可以根据项目的架构和实现逻辑进行更改,添加新的功能,或者提升代码的性能等。 最后,如果对项目的改进比较显著,可以考虑提交自己的贡献给项目的维护者。可以通过Fork项目、修改代码、提交Pull Request等方式向项目提交自己的改动。项目维护者会进行代码审查,并决定是否接受你的改动。 总之,GitHub代码复现是一个学习和交流的过程。通过复现别人的代码,可以提升自己的编程能力,了解项目的实现细节,还可以与其他开发者交流、合作,共同提高。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 31
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

全网最菜的Slamer

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

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

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

打赏作者

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

抵扣说明:

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

余额充值