BEVfusion论文复现:胎教级教程,小白也能学会(二、论文复现篇)

该文章已生成可运行项目,

目录

前言

一、依赖包的安装

二、代码修改

三、准备nuscenes数据集

3.1 下载和解压数据集

3.2 数据集预处理

3.3 运行create_data.py文件

四、训练部分

4.1 预训练权重下载

4.2 训练、测试与可视化


前言

本篇文章复现论文的前提是基础环境已经搭建完成,具体参考本系列篇一。

实验环境:ubantu20.04,python-3.8,torch-1.10.0,CUDA-11.3,Cudnn-8.6。
BEV复现文件分享链接:https://pan.quark.cn/s/4fae9f4fb2b0
提取码:j1Sf

BEVfusion论文复现:胎教级教程,小白也能学会(一、基础环境配置篇)-CSDN博客https://blog.csdn.net/Chenqinghe528/article/details/150861138?spm=1001.2014.3001.5502

一、依赖包的安装

在篇一已经创建好虚拟环境bevfusion的前提下,激活虚拟环境。

conda activate bevfusion

安装libgll和libopenmpi等,这一步需要有管理员权限。这些包会被安装到系统的全局目录中,任何登录这台服务器的用户都能使用这些包,不会产生什么负面影响。

sudo apt-get install wget libgl1-mesa-glx libglib2.0-0 openmpi-bin openmpi-common libopenmpi-dev libgtk2.0-dev git -y

若是上述命令无法运行成功,或者没有管理员权限的,可以换成以下下载方法。

安装openmpi

注意:在编译处理之前,需要新建文件夹/home/XXX/local

# 首先cd到主目录下
cd /home/XXX

# 下载并解压openmpi
wget https://download.open-mpi.org/release/open-mpi/v4.1/openmpi-4.1.4.tar.gz
tar zxf openmpi-4.1.4.tar.gz

# 编译处理
cd openmpi-4.1.4
./configure --prefix=/home/XXX/local/openmpi
make -j8
make install

配置环境变量

vim ~/.bashrc

在vim编辑器中,添加以下路径

MPI_HOME=/home/XXX/local/openmpi
OMPI_MCA_opal_cuda_support=true
export PATH=${MPI_HOME}/bin:$PATH
export LD_LIBRARY_PATH=${MPI_HOME}/lib:$LD_LIBRARY_PATH
export MANPATH=${MPI_HOME}/share/man:$MANPATH

测试是否编译成功

cd /openmpi-4.1.4/examples
make
mpirun -np 4 hello_c

若出现以下内容,则成功:

下载openlib相关安装包

pip install Pillow==8.4.0 tqdm torchpack nuscenes-devkit mpi4py==3.0.3 numba==0.48.0 setuptools==56.1.0 ninja==1.11.1 numpy==1.23.4 opencv-python==4.8.0.74 opencv-python-headless==4.8.0.74 yapf==0.40.1

下载mmcv-full、mmdet

pip install mmcv-full==1.4.0

pip install mmdet==2.20.0

配置setup.py。项目文件提前下载上传到服务器,参考笔者该系列篇一。

# cd 到项目文件下,笔者的路径如下

cd /home/XXX/Projects/bevfusion-main

pip install -v -e .

下载成功显示:

至此,所有实验运行所需的基础环境以及安装包,基本下载完成,后续实验环境根据读者需要修改。查看安装包版本命令如下:

pip list | grep torch

pip list | grep mm

二、代码修改

该部分是由于代码在运行时会产生许多奇奇怪怪的报错。笔者在此对源代码做出了初步的修改,因此笔者是用pycharm远程连接服务器,并且同步代码进行修改。后续的报错修改,将在下文中遇到时逐步给出修改方法。参考博客:

本地连接Linux服务器跑实验:XSHELL远程连接服务器,XFTP传输文件,上传代码,Pycharm同步代码-CSDN博客文章浏览阅读153次,点赞5次,收藏8次。这就需要打开Linux服务器,当然需要给服务器连接显示屏和键鼠哈。由于只需要输入Linux命令,在此用XSHELL远程连接Linux服务器为读者演示。在XSHELL已经连接好服务器的前提下,在XSHELL界面点击XFTP即可打开。这一步的前提是Linux服务器上,读者早已经配置好了虚拟环境。下载XSHELL和XFTP,软件进行用户注册之后,即可使用。下面同步文件的前提是已经将项目代码传输到Linux服务器上。至此,成功远程连接服务器,可以开始修改代码,跑项目了。输入命令,ifconfig,即可查询。 https://blog.csdn.net/Chenqinghe528/article/details/150862684?sharetype=blogdetail&sharerId=150862684&sharerefer=PC&sharesource=Chenqinghe528&spm=1011.2480.3001.81181)将mmdet3d/ops/spconv/src/indice_cuda.cu文件里面所有的4096改为256,ctr+F查询即可。

2)算力更改:setup.py文件中第22行左右,只保留一行

"-gencode=arch=compute_86,code=sm_86"

因为笔者使用的是3090和3060服务器,算力应该选择86,具体服务器算力,可以自行查询。

三、准备nuscenes数据集

参考博客:

Fast-BEV代码复现实践_fastbev复现-CSDN博客https://blog.csdn.net/h904798869/article/details/130317240?spm=1001.2014.3001.5502

3.1 下载和解压数据集

温馨提示:笔者本篇开头分享的文件链接中,已经有mini数据集。

下载地址:nuSceneshttps://www.nuscenes.org/nuscenes#download

由于nuscenes数据太大,这里只测试nuscense提供mini版本, 下载map跟mini。

下载后解压得到:

在服务器新建文件夹/home/XXX/Projects/nuScenes_mini,将第一个zip文件上传到该路径。

创建另一个文件夹/home/XXX/Projects/nuScenes_mini/v1.0-mini_out,将第二个tgz文件上传到该路径。

解压文件。

unzip nuScenes-map-expansion-v1.3.zip

tar -zxvf v1.0-mini.tgz

解压得到:

3.2 数据集预处理

将/home/XXX/Projects/nuScenes_mini中的basemap、expansion、prediction三个文件夹复制到/home/XXX/Projects/nuScenes_mini/v1.0-mini_out/maps中。

​
cd /home/XXX/Projects/nuScenes_mini
cp -r basemap expansion prediction /home/XXX/Projects/nuScenes_mini/v1.0-mini_out/maps

​

此时maps中一共有七个文件。

进入到项目主目录下,创建data/nuscenes目录,

将/home/XXX/Projects/nuScenes_mini/v1.0-mini_out文件夹下的四个文件复制到/home/XXX/Projects/bevfusion-main/data/nuscenes

cp -r maps samples sweeps v1.0-mini /home/XXX/Projects/bevfusion-main/data/nuscenes​

3.3 运行create_data.py文件

cd /home/XXX/Projects/bevfusion-main
python tools/create_data.py nuscenes --root-path ./data/nuscenes --out-dir ./data/nuscenes --extra-tag nuscenes --workers 10 --version v1.0-mini

出现报错:

ImportError: cannot import name 'feature_decorator_ext' from partially initialized module 'mmdet3d.ops.feature_decorator' (most likely due to a circular import) (/root/autodl-tmp/bevfusion/mmdet3d/ops/feature_decorator/__init__.py)

解决办法:找到mmdet3/ops/__init__.py。将第十二行注释掉。

再次运行create_data.py文件后,出现报错:

FileNotFoundError:NuScenesDataset:[Errno 2] No such file or directory:'data/nuscenes//nuscenes_infos_train.pkl'

解决办法:找到/tools/data_converter/nuscenes_converter.py文件下的95-100行代码。

将其改为:

        info_path = osp.join(root_path,
                             '{}_infos_train.pkl'.format(info_prefix))
        mmcv.dump(data, info_path)
        data['infos'] = val_nusc_infos
        info_val_path = osp.join(root_path,
                                 '{}_infos_val.pkl'.format(info_prefix))

create_data.py执行完成后:

四、训练部分

4.1 预训练权重下载

温馨提示:该部分权重文件在本篇开头的网盘链接中有的,文件夹训练阶段。

找到/tools/download_pretrained.sh,该段代码的作用是在bevfusion项目主目录下,创建一个pretrained的文件夹,并将下面的权重文件下载到该文件夹下。

方法一:可以直接运行代码

./tools/download_pretrained.sh

方法二:如果方法一运行太慢或者失败,可以选择手动下载。对照好权重文件的名称和网址,将网址复制到浏览器下载即可。

4.2 训练、测试与可视化

代码参数修改:

1)configs/default.yaml中修改epoch:max_epochs: 2(先跑2个周期试试)

2)configs/nuscenes/det/centerhead/lssfpn/camera/256x704/swint/default.yaml文件中,测试是否能够跑通时,建议设置samples_per_gpu: 1,这个参数代表每个GPU处理的样本数量(batch_size),后期训练根据硬件配置修改。

3)测试环境时,configs/nuscenes/default.yaml中 参数修改:

workers_per_gpu: 0(0为单线程),samples_per_gpu: 1

4)运行

torchpack dist-run -np 1 python tools/train.py configs/nuscenes/det/centerhead/lssfpn/camera/256x704/swint/default.yaml --model.encoders.camera.backbone.init_cfg.checkpoint pretrained/swint-nuimages-pretrained.pth --run-dir train_result

出现报错:

ImportError: cannot import name 'feature_decorator_ext' from partially initialized module 'mmdet3d.ops.feature_decorator' (most likely due to a circular import) 

解决办法:

找到mmdet3d/ops/feature_decorator/__init__.py,将第一行代码注释掉。

找到mmdet3d/models/backbones/__init__.py,将第9行代码from .radar_encoder import注释掉。

再次运行,出现报错:

TypeError: CyclicLrUpdaterHook: __init__() got an unexpected keyword argument 'min_lr_ratio'

解决办法:

注释掉configs/nuscenes/det/centerhead/lssfpn/default.yaml 中最后一行的 min_lr_ratio: 1.0e-3 

再再次运行,终于能够初步跑通了,恭喜各位,看到了胜利的曙光!!!

运行完成后,将生成以下内容。

5)测试

温馨提示:该部分pretrained需要下载的权重文件,也在夸克链接中,文件夹测试阶段。

# pretrained
torchpack dist-run -np 1 python tools/test.py configs/nuscenes/det/centerhead/lssfpn/camera/256x704/swint/default.yaml pretrained/swint-nuimages-pretrained.pth --eval bbox --out box.pkl

# Custom
torchpack dist-run -np 1 python tools/test.py train_result/configs.yaml train_result/latest.pth --eval bbox --out box.pkl

出现报错:

urllib.error.URLError: <urlopen error BEVFusion: <urlopen error [Errno 110] Connection timed out>>下载时网络超时。

解决办法:手动下载,复制网址https://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_tiny_patch4_window7_224.pth

新建文件夹并将权重文件复制到该文件夹下:

mkdir -p /home/XXX/.cache/torch/hub/checkpoints/

cp swin_tiny_patch4_window7_224.pth /home/XXX/.cache/torch/hub/checkpoints/​

再次运行测试代码,运行后会生成box.pkl文档。

6)可视化

首先,需要修改两个报错。

报错一:运行tools/visualize.py报错No module named 'torchpack.utils.tqdm。

解决办法:

把tools/visualize.py文件中from torchpack.utils.tqdm import tqdm

改成from tqdm import tqdm,如下:

# from torchpack.utils.tqdm import tqdm
from tqdm import tqdm

报错二:mmdet3d/models/vtransforms/base.py中2个forward函数的参数都加上metas变量,加到**kwargs前即可,如下所示:

def forward(
...
metas,
**kwargs,
):

执行以下命令:

# Custom
torchpack dist-run -np 1 python tools/visualize.py train_result/configs.yaml --mode pred --checkpoint train_result/latest.pth --bbox-score 0.2 --out-dir vis_result

# gt
torchpack dist-run -np 1 python tools/visualize.py train_result/configs.yaml --mode gt --checkpoint train_result/latest.pth --bbox-score 0.5 --out-dir vis_result

# pretrained
torchpack dist-run -np 1 python tools/visualize.py train_result/configs.yaml --mode pred --checkpoint pretrained/swint-nuimages-pretrained.pth --bbox-score 0.2 --out-dir vis_result

出现报错:TypeError: get_cam_feats() takes 2 positional arguments but 3 were given

解决办法:将tools/visualize.py下的73行代码修改为。

if args.mode == "pred":
    model = build_model(cfg.model)
    fp16_cfg = cfg.get("fp16", None)
    if fp16_cfg is not None:
        wrap_fp16_model(model)
    load_checkpoint(model, args.checkpoint, map_location="cpu")

运行成功后,生成如下文件夹:

恭喜各位读者,成功初步复现bevfusion代码,炼丹之路就此开启吧!!

最后,笔者的初衷是,由于一直没有找到一篇面向基础小白的从头到尾的复现教程,又由于本人能力比较不足,花费了一段很长的时间才基本跑通,因此出了这么一个系列,希望能够有所帮助,十分感谢各位的观看,再次提一下本系列参考的各位大佬的博客。

BEVFusion代码复现实践_bevfusion复现-CSDN博客https://blog.csdn.net/h904798869/article/details/132210022复现BEVFusion遇到过的问题_bevfusion运行自定义数据集-CSDN博客https://blog.csdn.net/weixin_62497890/article/details/131999972BEVFusion-mit复现与实践(nuscenes数据集)_bevfusion复现-CSDN博客https://blog.csdn.net/weixin_54678439/article/details/134571637#:~:text=%E9%9C%80%E8%A6%81%E6%8A%8A%E6%98%BE%E5%8D%A1%E7%AE%97%E5%8A%9B%E6%94%B9%E6%88%90%E8%87%AA%E5%B7%B1%E5%AF%B9%E5%BA%94%E7%9A%84%EF%BC%8C%E5%85%B6%E4%BD%99%E7%9A%84%E6%B3%A8%E9%87%8A%E6%8E%89%E3%80%82%20%E4%BE%8B%E5%A6%82%E6%88%91%E7%9A%843090%E6%98%AF86%EF%BC%88%E5%85%B7%E4%BD%93%E7%9A%84%E7%AE%97%E5%8A%9B%E5%AF%B9%E5%BA%94%E5%A4%A7%E5%AE%B6%E5%8F%AF%E4%BB%A5%E6%9F%A5%E6%9F%A5%EF%BC%89%20Map%20expansion%20pack%20%28v1.3%29%20%E4%B8%8B%E8%BD%BD%E8%A7%A3%E5%8E%8B%E5%88%B0maps%E6%96%87%E4%BB%B6%E5%A4%B9%E4%B8%AD%E3%80%82,%E5%90%A6%E5%88%99%E5%90%8E%E9%9D%A2%E8%BF%90%E8%A1%8C%E5%88%86%E5%89%B2%E7%9A%84%E6%97%B6%E5%80%99%E4%BC%9A%E6%8A%A5%E9%94%99%EF%BC%81%20%E6%8A%A5%E9%94%994%EF%BC%9A%20RuntimeError%3A%20CUDA%20out%20of%20memory.mit-bevfusion遇到的问题及其解决办法_swint-nuimages-pretrained.pth-CSDN博客https://blog.csdn.net/2301_77102499/article/details/137194174TypeError: get_cam_feats() 接受 3 个位置参数,但给出了 4 个 ·问题 #532 ·麻省理工学院-汉实验室/Bevfusionhttps://github.com/mit-han-lab/bevfusion/issues/532#issuecomment-1886443570

本文章已经生成可运行项目
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值