BEVFusion: A Simple and Robust LiDAR-Camera Fusion Framework BEVFusion:一个简单而强大的LiDAR-相机融合框架

NeurIPS 2022

多模态传感器融合意味着信息互补、稳定,是自动驾驶感知的重要一环,本文注重工业落地,实际应用

融合方案: 前融合(数据级融合)指通过空间对齐直接融合不同模态的原始传感器数据。 深度融合(特征级融合)指通过级联或者元素相乘在特征空间中融合跨模态数据。 后融合(目标级融合)指将各模态模型的预测结果进行融合,做出最终决策。

// 框架与以前的激光雷达-相机融合方法的比较: a.将图像特征投影到原始点云上的点级融合机制 从点出发,从点云中采样一些点,然后根据相机的内参和外参矩阵,投影到图像上,采样到图像特征,然后拼接回点云,利用融合后的特征经过点云处理模块去做3D检测

b.将LiDAR 特征或建议分别投影到每个视图图像上以提取RGB信息的特征级融合机制 将两种模态的中间特征通过内外参矩阵,拼接投影,融合出完整的特征,传递的是query,输入点云,通过一个点云网络,得到初始位置,初始位置去图像上采样特征,采样完再拼接到原始点云特征上

c.提出将相机网络与LiDAR输入分离 相机内外参偏差,点云投影会有偏差;相机卡帧;雷达出问题 前两种有主次依赖关系,一方出错影响另一方,故提出并行框架

///

BEVFusion主体结构 包括相机模块Camera Stream,点云模块LiDAR Stream以及融合模块

图像分支:

Camera Stream设计流程: 步骤1:2D Backbone提取基础图像特征(LSS) 步骤2:FPN+ADP,多尺度特征融合 步骤3:2D → 3D特征转换模块 步骤4:3D → BEV特征编码模块 输出:Camera BEV Features // FPN+ADP设计流程: 输入:基础图像特征 步骤1:每层特征使用ADP模块 步骤2:ADP模块包括上采样、池化、卷积 步骤3:多层特征融合 输出:多尺度融合特征

/ 2D → 3D特征转换模块: 输入:多尺度融合特征 步骤1:深度分布估计 步骤2:2D到3D投影计算 输出:3D伪体素特征 /

点云分支

LiDAR Stream设计流程: 输入:原始点云 主要步骤:通过3D Backbone,处理原始点云数据,同时压缩到BEV空间,生成BEV特征 输出:LiDAR BEV Features 用的是 pointpillar结构 点柱

Fusion Module 融合模块 Fusion Module设计流程: 输入:点云和图像BEV特征 步骤1:按通道维度级联点云和图像BEV特征,再通过卷积网络提取级联后的特征 步骤2:通过全局平均池化和卷积预测,实现对级联特征的自适应挑选 输出:融合后的特征

/ 模态消融实验: 多模态的可行性,橙色框表示该范围内物体点云信息被丢弃,但BEVFusion可以通过camera分支恢复 nuScenes验证集(上)和测试集(下)的结果: / 阿里&北大版本的bevfusion环境部署: 首先git项目 https://github.com/ADLab-AutoDrive/BEVFusion.git

mmdet - INFO - Environment info:

------------------------------------------------------------

sys.platform: linux

Python: 3.8.3 (default, Jul 2 2020, 16:21:59) [GCC 7.3.0]

CUDA available: True

GPU 0,1: NVIDIA GeForce RTX 3090

CUDA_HOME: /usr/local/cuda

NVCC: Build cuda_11.1.TC455_06.29190527_0

GCC: gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0

PyTorch: 1.8.0+cu111

PyTorch compiling details: PyTorch built with:

- GCC 7.3

- C++ Version: 201402

- Intel(R) Math Kernel Library Version 2020.0.0 Product Build 20191122 for Intel(R) 64 architecture applications

- Intel(R) MKL-DNN v1.7.0 (Git Hash 7aed236906b1f7a05c0917e5257a1af05e9ff683)

- OpenMP 201511 (a.k.a. OpenMP 4.5)

- NNPACK is enabled

- CPU capability usage: AVX2

- CUDA Runtime 11.1

- NVCC architecture flags: -gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_60,code=sm_60;-gencode;arch=compute_70,code=sm_70;-gencode;arch=compute_75,code=sm_75;-gencode;arch=compute_80,code=sm_80;-gencode;arch=compute_86,code=sm_86

- CuDNN 8.0.5

- Magma 2.5.2

- Build settings: BLAS_INFO=mkl, BUILD_TYPE=Release, CUDA_VERSION=11.1, CUDNN_VERSION=8.0.5, CXX_COMPILER=/opt/rh/devtoolset-7/root/usr/bin/c++, CXX_FLAGS= -Wno-deprecated -fvisibility-inlines-hidden -DUSE_PTHREADPOOL -fopenmp -DNDEBUG -DUSE_KINETO -DUSE_FBGEMM -DUSE_QNNPACK -DUSE_PYTORCH_QNNPACK -DUSE_XNNPACK -O2 -fPIC -Wno-narrowing -Wall -Wextra -Werror=return-type -Wno-missing-field-initializers -Wno-type-limits -Wno-array-bounds -Wno-unknown-pragmas -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function -Wno-unused-result -Wno-unused-local-typedefs -Wno-strict-overflow -Wno-strict-aliasing -Wno-error=deprecated-declarations -Wno-stringop-overflow -Wno-psabi -Wno-error=pedantic -Wno-error=redundant-decls -Wno-error=old-style-cast -fdiagnostics-color=always -faligned-new -Wno-unused-but-set-variable -Wno-maybe-uninitialized -fno-math-errno -fno-trapping-math -Werror=format -Wno-stringop-overflow, LAPACK_INFO=mkl, PERF_WITH_AVX=1, PERF_WITH_AVX2=1, PERF_WITH_AVX512=1, TORCH_VERSION=1.8.0, USE_CUDA=ON, USE_CUDNN=ON, USE_EXCEPTION_PTR=1, USE_GFLAGS=OFF, USE_GLOG=OFF, USE_MKL=ON, USE_MKLDNN=ON, USE_MPI=OFF, USE_NCCL=ON, USE_NNPACK=ON, USE_OPENMP=ON,

TorchVision: 0.9.0+cu111

OpenCV: 4.8.1

MMCV: 1.4.0

MMCV Compiler: GCC 7.3

MMCV CUDA Compiler: 11.1

MMDetection: 2.11.0

MMDetection3D: 0.11.0+fb4384c

------------------------------------------------------------

库:

# packages in environment at /root/miniconda3/envs/bevfusion:

#

# Name Version Build Channel

_libgcc_mutex 0.1 main https://mirrors.ustc.edu.cn/anaconda/pkgs/main

_openmp_mutex 5.1 1_gnu https://mirrors.ustc.edu.cn/anaconda/pkgs/main

absl-py 2.0.0 pypi_0 pypi

addict 2.4.0 pypi_0 pypi

anyio 4.0.0 pypi_0 pypi

argon2-cffi 23.1.0 pypi_0 pypi

argon2-cffi-bindings 21.2.0 pypi_0 pypi

arrow 1.3.0 pypi_0 pypi

asttokens 2.4.0 pypi_0 pypi

async-lru 2.0.4 pypi_0 pypi

attrs 23.1.0 pypi_0 pypi

babel 2.13.0 pypi_0 pypi

backcall 0.2.0 pypi_0 pypi

beautifulsoup4 4.12.2 pypi_0 pypi

black 23.9.1 pypi_0 pypi

bleach 6.1.0 pypi_0 pypi

ca-certificates 2023.08.22 h06a4308_0 https://mirrors.ustc.edu.cn/anaconda/pkgs/main

cachetools 5.3.1 pypi_0 pypi

certifi 2023.7.22 pypi_0 pypi

cffi 1.16.0 pypi_0 pypi

charset-normalizer 3.3.0 pypi_0 pypi

click 8.1.7 pypi_0 pypi

comm 0.1.4 pypi_0 pypi

contourpy 1.1.1 pypi_0 pypi

cycler 0.12.1 pypi_0 pypi

cython 0.29.32 pypi_0 pypi

debugpy 1.8.0 pypi_0 pypi

decorator 5.1.1 pypi_0 pypi

defusedxml 0.7.1 pypi_0 pypi

descartes 1.1.0 pypi_0 pypi

exceptiongroup 1.1.3 pypi_0 pypi

executing 2.0.0 pypi_0 pypi

fastjsonschema 2.18.1 pypi_0 pypi

filelock 3.12.4 pypi_0 pypi

fire 0.5.0 pypi_0 pypi

flake8 6.1.0 pypi_0 pypi

fonttools 4.43.1 pypi_0 pypi

fqdn 1.5.1 pypi_0 pypi

fsspec 2023.9.2 pypi_0 pypi

google-auth 2.23.3 pypi_0 pypi

google-auth-oauthlib 1.0.0 pypi_0 pypi

grpcio 1.59.0 pypi_0 pypi

huggingface-hub 0.18.0 pypi_0 pypi

idna 3.4 pypi_0 pypi

imageio 2.31.5 pypi_0 pypi

importlib-metadata 6.8.0 pypi_0 pypi

importlib-resources 6.1.0 pypi_0 pypi

iniconfig 2.0.0 pypi_0 pypi

ipykernel 6.25.2 pypi_0 pypi

ipython 8.12.3 pypi_0 pypi

ipython-genutils 0.2.0 pypi_0 pypi

ipywidgets 8.1.1 pypi_0 pypi

isoduration 20.11.0 pypi_0 pypi

jedi 0.19.1 pypi_0 pypi

jinja2 3.1.2 pypi_0 pypi

joblib 1.3.2 pypi_0 pypi

json5 0.9.14 pypi_0 pypi

jsonpointer 2.4 pypi_0 pypi

jsonschema 4.19.1 pypi_0 pypi

jsonschema-specifications 2023.7.1 pypi_0 pypi

jupyter 1.0.0 pypi_0 pypi

jupyter-client 8.4.0 pypi_0 pypi

jupyter-console 6.6.3 pypi_0 pypi

jupyter-core 5.4.0 pypi_0 pypi

jupyter-events 0.7.0 pypi_0 pypi

jupyter-lsp 2.2.0 pypi_0 pypi

jupyter-server 2.7.3 pypi_0 pypi

jupyter-server-terminals 0.4.4 pypi_0 pypi

jupyterlab 4.0.7 pypi_0 pypi

jupyterlab-pygments 0.2.2 pypi_0 pypi

jupyterlab-server 2.25.0 pypi_0 pypi

jupyterlab-widgets 3.0.9 pypi_0 pypi

kiwisolver 1.4.5 pypi_0 pypi

ld_impl_linux-64 2.38 h1181459_1 https://mirrors.ustc.edu.cn/anaconda/pkgs/main

libffi 3.3 he6710b0_2 https://mirrors.ustc.edu.cn/anaconda/pkgs/main

libgcc-ng 11.2.0 h1234567_1 https://mirrors.ustc.edu.cn/anaconda/pkgs/main

libgomp 11.2.0 h1234567_1 https://mirrors.ustc.edu.cn/anaconda/pkgs/main

libstdcxx-ng 11.2.0 h1234567_1 https://mirrors.ustc.edu.cn/anaconda/pkgs/main

llvmlite 0.31.0 pypi_0 pypi

lyft-dataset-sdk 0.0.8 pypi_0 pypi

markdown 3.5 pypi_0 pypi

markupsafe 2.1.3 pypi_0 pypi

matplotlib 3.6.2 pypi_0 pypi

matplotlib-inline 0.1.6 pypi_0 pypi

mccabe 0.7.0 pypi_0 pypi

mistune 3.0.2 pypi_0 pypi

mmcv-full 1.4.0 pypi_0 pypi

mmdet 2.11.0 dev_0

mmdet3d 0.11.0 dev_0

mmpycocotools 12.0.3 pypi_0 pypi

mypy-extensions 1.0.0 pypi_0 pypi

nbclient 0.8.0 pypi_0 pypi

nbconvert 7.9.2 pypi_0 pypi

nbformat 5.9.2 pypi_0 pypi

ncurses 6.4 h6a678d5_0 https://mirrors.ustc.edu.cn/anaconda/pkgs/main

nest-asyncio 1.5.8 pypi_0 pypi

networkx 2.2 pypi_0 pypi

notebook 7.0.5 pypi_0 pypi

notebook-shim 0.2.3 pypi_0 pypi

numba 0.48.0 pypi_0 pypi

numpy 1.19.5 pypi_0 pypi

nuscenes-devkit 1.1.9 pypi_0 pypi

oauthlib 3.2.2 pypi_0 pypi

opencv-python 4.8.1.78 pypi_0 pypi

openssl 1.1.1w h7f8727e_0 https://mirrors.ustc.edu.cn/anaconda/pkgs/main

overrides 7.4.0 pypi_0 pypi

packaging 23.2 pypi_0 pypi

pandas 1.4.4 pypi_0 pypi

pandocfilters 1.5.0 pypi_0 pypi

parso 0.8.3 pypi_0 pypi

pathspec 0.11.2 pypi_0 pypi

pexpect 4.8.0 pypi_0 pypi

pickleshare 0.7.5 pypi_0 pypi

pillow 10.1.0 pypi_0 pypi

pip 23.2.1 py38h06a4308_0 https://mirrors.ustc.edu.cn/anaconda/pkgs/main

pkgutil-resolve-name 1.3.10 pypi_0 pypi

platformdirs 3.11.0 pypi_0 pypi

plotly 5.11.0 pypi_0 pypi

pluggy 1.3.0 pypi_0 pypi

plyfile 1.0.1 pypi_0 pypi

prometheus-client 0.17.1 pypi_0 pypi

prompt-toolkit 3.0.39 pypi_0 pypi

protobuf 4.24.4 pypi_0 pypi

psutil 5.9.6 pypi_0 pypi

ptyprocess 0.7.0 pypi_0 pypi

pure-eval 0.2.2 pypi_0 pypi

pyasn1 0.5.0 pypi_0 pypi

pyasn1-modules 0.3.0 pypi_0 pypi

pycocotools 2.0.7 pypi_0 pypi

pycodestyle 2.11.1 pypi_0 pypi

pycparser 2.21 pypi_0 pypi

pyflakes 3.1.0 pypi_0 pypi

pygments 2.16.1 pypi_0 pypi

pyparsing 3.1.1 pypi_0 pypi

pyquaternion 0.9.9 pypi_0 pypi

pytest 7.4.2 pypi_0 pypi

python 3.8.3 hcff3b4d_2 https://mirrors.ustc.edu.cn/anaconda/pkgs/main

python-dateutil 2.8.2 pypi_0 pypi

python-json-logger 2.0.7 pypi_0 pypi

pytz 2023.3.post1 pypi_0 pypi

pywavelets 1.4.1 pypi_0 pypi

pyyaml 6.0.1 pypi_0 pypi

pyzmq 25.1.1 pypi_0 pypi

qtconsole 5.4.4 pypi_0 pypi

qtpy 2.4.0 pypi_0 pypi

readline 8.2 h5eee18b_0 https://mirrors.ustc.edu.cn/anaconda/pkgs/main

referencing 0.30.2 pypi_0 pypi

requests 2.31.0 pypi_0 pypi

requests-oauthlib 1.3.1 pypi_0 pypi

rfc3339-validator 0.1.4 pypi_0 pypi

rfc3986-validator 0.1.1 pypi_0 pypi

rpds-py 0.10.6 pypi_0 pypi

rsa 4.9 pypi_0 pypi

safetensors 0.4.0 pypi_0 pypi

scikit-image 0.19.3 pypi_0 pypi

scikit-learn 1.1.3 pypi_0 pypi

scipy 1.9.3 pypi_0 pypi

send2trash 1.8.2 pypi_0 pypi

setuptools 68.0.0 py38h06a4308_0 https://mirrors.ustc.edu.cn/anaconda/pkgs/main

shapely 1.8.5.post1 pypi_0 pypi

six 1.16.0 pypi_0 pypi

sniffio 1.3.0 pypi_0 pypi

soupsieve 2.5 pypi_0 pypi

sqlite 3.41.2 h5eee18b_0 https://mirrors.ustc.edu.cn/anaconda/pkgs/main

stack-data 0.6.3 pypi_0 pypi

tenacity 8.2.3 pypi_0 pypi

tensorboard 2.14.1 pypi_0 pypi

tensorboard-data-server 0.7.1 pypi_0 pypi

termcolor 2.3.0 pypi_0 pypi

terminado 0.17.1 pypi_0 pypi

terminaltables 3.1.10 pypi_0 pypi

threadpoolctl 3.2.0 pypi_0 pypi

tifffile 2023.7.10 pypi_0 pypi

timm 0.9.7 pypi_0 pypi

tinycss2 1.2.1 pypi_0 pypi

tk 8.6.12 h1ccaba5_0 https://mirrors.ustc.edu.cn/anaconda/pkgs/main

tomli 2.0.1 pypi_0 pypi

torch 1.8.0+cu111 pypi_0 pypi

torchaudio 0.8.0 pypi_0 pypi

torchvision 0.9.0+cu111 pypi_0 pypi

tornado 6.3.3 pypi_0 pypi

tqdm 4.66.1 pypi_0 pypi

traitlets 5.11.2 pypi_0 pypi

types-python-dateutil 2.8.19.14 pypi_0 pypi

typing-extensions 4.8.0 pypi_0 pypi

uri-template 1.3.0 pypi_0 pypi

urllib3 2.0.6 pypi_0 pypi

wcwidth 0.2.8 pypi_0 pypi

webcolors 1.13 pypi_0 pypi

webencodings 0.5.1 pypi_0 pypi

websocket-client 1.6.4 pypi_0 pypi

werkzeug 3.0.0 pypi_0 pypi

wheel 0.41.2 py38h06a4308_0 https://mirrors.ustc.edu.cn/anaconda/pkgs/main

widgetsnbextension 4.0.9 pypi_0 pypi

xz 5.4.2 h5eee18b_0 https://mirrors.ustc.edu.cn/anaconda/pkgs/main

yapf 0.32.0 pypi_0 pypi

zipp 3.17.0 pypi_0 pypi

zlib 1.2.13 h5eee18b_0 https://mirrors.ustc.edu.cn/anaconda/pkgs/main

最重要的是这三个: mmcv-full一定要下载好与环境对应的版本,不然会影响编译,出奇怪的环境错误 提供我用的mmcv-full地址mmcv-full 1.4.0 cuda11 torch1.8.0版本 下好后直接pip安装这个压缩包(mmcv-full 1.4.0 安装好了) 其他的可以按照如上先pip install 下好,以免编译过程系统找这些包超时,也可直接编译,报一个不匹配装一个

然后 cd mmdetection-2.11.0,依次执行

pip install -r requirements/build.txt

pip install -v -e . # or "python setup.py develop"

(mmdet 2.11.0 编译完毕) 编译最好执行这个命令:python setup.py develop mmdetection3d没必要按他说的重新下载,整个文件夹就相当是,所以直接回到上级目录,执行 python setup.py develop(mmdet3d 0.11.0 编译完毕)

data文件直接在BEVFusion下创建,并把下载好的nuscenes解压放好,包括测试集解压后470多g 执行 python tools/create_data.py nuscenes --root-path ./data/nuscenes --out-dir ./data/nuscenes --extra-tag nuscenes处理数据,要点时间

# training example for bevfusion-pointpillar

# train nuimage for camera stream backbone and neck.

./tools/dist_train.sh configs/bevfusion/cam_stream/mask_rcnn_dbswin-t_fpn_3x_nuim_cocopre.py 8

# first train camera stream

./tools/dist_train.sh configs/bevfusion/cam_stream/bevf_pp_4x8_2x_nusc_cam.py 8

# then train LiDAR stream

./tools/dist_train.sh configs/bevfusion/lidar_stream/hv_pointpillars_secfpn_sbn-all_4x8_2x_nus-3d.py 8

# then train BEVFusion

./tools/dist_train.sh configs/bevfusion/bevf_pp_2x8_1x_nusc.py 8

8是gpu数,按卡数改 执行训练,第一条nuimage的训练可以忽略,直接git上下载模型放好,后面三条语句依次执行就行,官方要求3090*8,自己没这么多卡,就两张,把batchsize调为1勉强能跑

好文阅读

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: