BEVFormer代码复现实践
1 环境配置
- 感谢大佬们的开源工作,
BEVFormer-github地址-YYDS
- BEV各算法环境部署实战汇总
- 如果本文对您有帮助,请一键三连支持一波,
^_^
- 部署有问题的小伙伴欢迎留言和加
Q
裙-472648720
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 准备数据集
- 数据集下载
-
- nuscenes-mini百度网盘下载地址 提取码: v3cv
下载数据参考MapTR代码复现实践的第2节数据集下载, 下载后数据放入data
目录结构如下
# data文件夹展开,can_bus内容太多,这就不展开
data
├── can_bus
├──...
└── nuscenes
├── maps
├── samples
├── sweeps
└── v1.0-mini
- 生成训练需要的数据集格式
# 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/
目录下生成2
个 pkl
和 2
个 json
文件如下:
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 训练与测试
- 修改配置文件
训练前,修改配置文件./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,8张写8
./tools/dist_train.sh ./projects/configs/bevformer/bevformer_base.py 1
训练6个周期,每2个周期保存一次权重,完成后生成val
和work_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
- 使用fp16精度训练模型
./tools/fp16/dist_train.sh ./projects/configs/bevformer_fp16/bevformer_tiny_fp16.py 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 可视化
- 修改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()
- 运行
python tools/analysis_tools/visual.py
结果图像保存到result
目录下, 可视化如下:
由于只用mini数据集训练了6个周期,效果比较差。
- BEV各算法环境部署实战汇总
- 如果本文对您有帮助,一键三连一波
^_^
- 欢迎加入
Q
裙-472648720
,大家一起学习bev
相关知识1+1>2
😊