【传知代码】BEVFormer详细复现方案(论文复现)
前言:BEVFormer,作为一种基于鸟瞰图(Bird's Eye View, BEV)的Transformer架构,在自动驾驶的3D目标检测领域取得了显著的成果。它巧妙地将Transformer的强大学习能力与BEV的直观表示相结合,实现了对复杂交通场景的深入理解与高效处理。与传统的感知算法相比,BEVFormer不仅具有更高的检测精度和更广的感知范围,而且能够更好地应对动态变化的环境和复杂多变的交通状况,然而,BEVFormer的实现并非易事。其背后的技术原理、算法细节以及优化策略都需要我们深入研究和精心设计。因此,本文将详细阐述BEVFormer的复现方案,从算法原理、网络结构、训练过程、优化策略等方面进行全面解析,旨在为读者提供一个系统、全面的学习参考。
本文所涉及所有资源均在传知代码平台可获取
概述
本文介绍了一种新的框架——BEVFormer,用于学习具有时空Transformer的统一BEV表征,以支持多个自动驾驶感知任务。BEVFormer利用空间和时间信息,通过预定的网格状BEV查询向量与空间和时间域交互。为了聚合空间信息,作者设计了一个空间交叉注意力,每个BEV查询向量从跨相机视图的感兴趣区域提取空间特征。对于时间信息,作者提出了一种时间自注意力来递归融合历史BEV信息。实验结果表明,在nuScenes测试集上,BEVFormer的NDS指标达到了最新的56.9%,比之前的最佳技术高出9.0分,与基于lidar的基线性能相当。此外,BEVFormer还显著提高了低能见度条件下目标速度估计和召回率的准确性,如下图所示:
本论文提出了一种名为BEVFormer的新型BEV特征生成框架,该框架能够通过注意力机制有效地聚合来自多视角相机的时空特征和历史BEV特征。BEVFormer主要由六个编码器层组成,其中包括BEV查询、空间交叉注意力和时间自我注意力三种定制设计。BEVFormer的BEV查询向量是一组网格形状的可学习参数,用于从多目相机视图中查询BEV空间中的特征。空间交叉注意力和时间自注意力则用于根据BEV查询从多相机图像中查找和聚合空间特征和历史BEV的时间特征。BEVFormer还设计了一个基于可变形注意力的端到端三维探测头和一个基于二维分割方法Panoptic SegFormer的地图分割头,如下图所示:
BEVFormer采用了可变形注意力和时间自注意力两种注意力机制,使得BEVFormer能够在不增加计算成本的前提下,有效地聚合来自多视角相机的时空特征和历史BEV特征。另外,BEVFormer还设计了一个基于可变形DETR探测器的端到端三维探测头和一个基于二维分割方法Panoptic SegFormer的地图分割头,使得BEVFormer可以应用于三维物体检测和地图分割等多个自动驾驶感知任务。
解决的问题:BEVFormer的目标是解决多目相机三维感知问题,即如何从多目相机视图中聚合时空特征和历史BEV特征,以实现准确的三维物体检测和地图分割。传统的方法通常是独立完成三维物体检测或地图分割任务,而BEVFormer通过引入注意力机制,能够有效地聚合来自多视角相机的时空特征和历史BEV特征,从而提高了多目相机三维感知的准确性。
本文介绍了BEVFormer模型在nuScenes和Waymo两个公共自动驾驶数据集上的实验结果。实验内容包括:
1)数据集介绍:作者使用了nuScenes和Waymo两个数据集进行实验,其中nuScenes数据集包含1000个场景,每个场景持续时间大约为20s,关键样本以2Hz的频率进行标注;Waymo开放数据集是一个大型自动驾驶数据集,拥有798个训练序列和202个验证序列。
2)实验设置:作者采用了两种类型的骨干ResNet101-DCN和VoVnet99,并使用FPN输出的多尺度特征。在nuScenes上,BEV查询向量的默认大小为200×200,感知范围为[-51.2m, 51.2m]的X轴和Y轴,BEV网格分辨率s大小为0.512m。在Waymo上,BEV查询向量的默认空间形状为300×220,感知范围为X轴[-35.0m, 75.0m],Y轴[-75.0m, 75.0m],每个网格分辨率s的大小为0.5m。
3)三维目标检测结果:作者使用了检测头训练模型进行检测任务,并与其他先进的三维目标检测方法进行比较。在nuScenes测试集和验证集拆分上,BEVFormer模型在val集上超过了DETR3D模型超过9.2个百分点(51.7% NDS vs. 42.5% NDS)。在测试集上,BEVFormer模型在没有花里胡哨的情况下实现了56.9% NDS,比DETR3D(47.9% NDS)高了9.0个百分点。此外,BEVFormer模型的时间信息在多镜头检测的速度估计中起着至关重要的作用,平均速度误差(mA VE)为0.378米/秒,接近基于激光雷达的方法[43]的性能。
4)多任务感知结果:作者同时使用检测头和分割头对模型进行训练,以验证模型对多任务的学习能力。在nuScenes验证集上,BEVFormer在所有任务中都实现了更高的性能,例如,在闪避任务上高出11.0个百分点(52.0% NDS v.s. 41.0% NDS)。与单独训练任务相比,多任务学习通过共享更多的模块来节省计算成本和减少推理时间。
演示效果
接下来项目数据集进行测试和训练:
./tools/dist_train.sh ./projects/configs/bevformer/bevformer_base.py 8
./tools/dist_test.sh ./projects/configs/bevformer/bevformer_base.py ./path/to/ckpts.pth 8
接下来使用FP16去训练模型:
./tools/fp16/dist_train.sh ./projects/configs/bevformer_fp16/bevformer_tiny_fp16.py 8
选择模型权重可以参考下表内容所示:
Backbone | Method | Lr Schd | NDS | mAP | memroy | Config | Download |
---|---|---|---|---|---|---|---|
R50 | BEVFormer-tiny_fp16 | 24ep | 35.9 | 25.7 | - | config | model/log |
R50 | BEVFormer-tiny | 24ep | 35.4 | 25.2 | 6500M | config | model/log |
R101-DCN | BEVFormer-small | 24ep | 47.9 | 37.0 | 10500M | config | model/log |
R101-DCN | BEVFormer-base | 24ep | 51.7 | 41.6 | 28500M | config | model/log |
R50 | BEVformerV2-t1-base | 24ep | 42.6 | 35.1 | 23952M | config | model/log |
R50 | BEVformerV2-t1-base | 48ep | 43.9 | 35.9 | 23952M | config | model/log |
R50 | BEVformerV2-t1 | 24ep | 45.3 | 38.1 | 37579M | config | model/log |
R50 | BEVformerV2-t1 | 48ep | 46.5 | 39.5 | 37579M | config | model/log |
R50 | BEVformerV2-t2 | 24ep | 51.8 | 42.0 | 38954M | config | model/log |
R50 | BEVformerV2-t2 | 48ep | 52.6 | 43.1 | 38954M | config | model/log |
R50 | BEVformerV2-t8 | 24ep | 55.3 | 46.0 | 40392M | config | model/log |
最终实现的效果如下所示:
复现过程
创建一个conda虚拟环境并将其激活,如下:
conda create -n open-mmlab python=3.8 -y
conda activate open-mmlab
按照官方说明安装PyTorch和torchvision:
pip install torch==1.9.1+cu111 torchvision==0.10.1+cu111 torchaudio==0.9.1 -f https://download.pytorch.org/whl/torch_stable.html
# Recommended torch>=1.9
在conda-env中安装gcc>=5(可选)。
conda install -c omgarcia gcc-6 # gcc-6.2
完全安装mmcv:
pip install mmcv-full==1.4.0
# pip install mmcv-full==1.4.0 -f https://download.openmmlab.com/mmcv/dist/cu111/torch1.9.0/index.html
安装mmdet和mmseg:
pip install mmdet==2.14.0
pip install mmsegmentation==0.14.1
从源代码安装mmdet3d:
git clone https://github.com/open-mmlab/mmdetection3d.git
cd mmdetection3d
git checkout v0.17.1 # Other versions may not be compatible.
python setup.py install
安装Detectron2和Timm:
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
python -m pip install 'git+https://github.com/facebookresearch/detectron2.git'
克隆Bevformer:
git clone https://github.com/fundamentalvision/BEVFormer.git
准备预训练的模型:
cd bevformer
mkdir ckpts
cd ckpts & wget https://github.com/zhiqi-li/storage/releases/download/v1.0/r101_dcn_fcos3d_pretrain.pth
复现过程中遇到的问题可以参考如下的解答:
# 错误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'
# 因为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即可workers_per_gpu改0测试环境,
# 后期正式训练时逐渐增加这2个参数的数字, 直到显存占满
# 如果设置成1和0都显存不够, 可以更换显卡了
samples_per_gpu=1, workers_per_gpu=0
写在最后
经过对BEVFormer详细复现方案的深入探讨,我们不禁为这项技术的精湛与前瞻所折服。BEVFormer,作为自动驾驶感知领域的一颗璀璨明星,其基于鸟瞰图(Bird's Eye View, BEV)的Transformer架构,不仅为我们展示了感知技术的新可能,更为自动驾驶的未来发展描绘了一幅壮丽的蓝图,通过复现BEVFormer,我们不仅深入了解了其背后的技术原理和实现细节,更在实践中积累了丰富的经验和教训。这些经验和教训将为我们未来在自动驾驶感知技术的研究和应用中提供宝贵的参考和借鉴。
详细复现过程的项目源码、数据和预训练好的模型可从该文章下方附件获取。
【传知科技】关注有礼 公众号、抖音号、视频号
转载自:https://juejin.cn/post/7376622203302363175