目录
前言
本篇文章复现论文的前提是基础环境已经搭建完成,具体参考本系列篇一。
实验环境:ubantu20.04,python-3.8,torch-1.10.0,CUDA-11.3,Cudnn-8.6。
BEV复现文件分享链接:https://pan.quark.cn/s/4fae9f4fb2b0
提取码:j1Sf
一、依赖包的安装
在篇一已经创建好虚拟环境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数据集
参考博客:
3.1 下载和解压数据集
温馨提示:笔者本篇开头分享的文件链接中,已经有mini数据集。
下载地址:nuScenes
https://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 ·麻省理工学院-汉实验室/Bevfusion
https://github.com/mit-han-lab/bevfusion/issues/532#issuecomment-1886443570
3万+

被折叠的 条评论
为什么被折叠?



