BEVFusion
网站 | 论文 | 视频
新闻
- (2024/5) BEVFusion 被集成到 NVIDIA DeepStream 用于传感器融合。
- (2023/5) NVIDIA 提供了 BEVFusion 的 TensorRT 部署解决方案,在 Jetson Orin 上实现了 25 FPS。
- (2023/4) BEVFusion 在 Argoverse 3D 物体检测排行榜中排名第一。
- (2023/1) BEVFusion 被集成到 MMDetection3D。
- (2023/1) BEVFusion 被 ICRA 2023 接受!
- (2022/8) BEVFusion 在 Waymo 3D 物体检测排行榜中排名第一。
- (2022/6) BEVFusion 在 nuScenes 3D 物体检测排行榜中排名第一。
- (2022/6) BEVFusion 在 nuScenes 3D 物体检测排行榜中排名第一。
摘要
多传感器融合对于精确且可靠的自动驾驶系统至关重要。最近的方法基于点级融合:用相机特征增强 LiDAR 点云。然而,相机到 LiDAR 的投影丢弃了相机特征的语义密度,尤其是在语义导向任务(例如 3D 场景分割)中,降低了此类方法的有效性。在本文中,我们打破了这种根深蒂固的常规,提出了 BEVFusion,这是一个高效且通用的多任务多传感器融合框架。它在共享的鸟瞰视图 (BEV) 表示空间中统一了多模态特征,完美地保留了几何和语义信息。为实现这一目标,我们通过优化的 BEV 池化对视图转换中的关键效率瓶颈进行了诊断和提升,将延迟减少了超过 40 倍。BEVFusion 基本上是任务无关的,几乎无需架构更改即可无缝支持不同的 3D 感知任务。它在 nuScenes 基准上建立了新的艺术状态,在 3D 物体检测中实现了 1.3% 较高的 mAP 和 NDS,在 BEV 地图分割中实现了 13.6% 较高的 mIoU,计算成本较低 1.9 倍。
结果
3D 物体检测 (Waymo 测试)
模型 | mAP-L1 | mAPH-L1 | mAP-L2 | mAPH-L2 |
---|---|---|---|---|
BEVFusion | 82.72 | 81.35 | 77.65 | 76.33 |
BEVFusion-TTA | 86.04 | 84.76 | 81.22 | 79.97 |
这里,BEVFusion 仅使用单一模型而没有任何测试时增强。BEVFusion-TTA 使用单一模型进行测试时增强,没有应用模型集成。
3D 物体检测 (nuScenes 测试)
模型 | 模态 | mAP | NDS |
---|---|---|---|
BEVFusion-e | C+L | 74.99 | 76.09 |
BEVFusion | C+L | 70.23 | 72.88 |
BEVFusion-base* | C+L | 71.72 | 73.83 |
*: 我们将模型的 MACs 扩大到与并发工作匹配的计算成本。
3D 物体检测 (nuScenes 验证)
注意: 仅用相机物体检测基线是 BEVDet-Tiny 的一个变体,具有更重的视图变压器和超参数的其他差异。借助我们高效的 BEV 池化 操作符,在相同的输入分辨率下,此模型运行更快且 mAP 较 BEVDet-Tiny 高。请参考 BEVDet repo 以获取原始 BEVDet-Tiny 实现。仅用 LiDAR 基线是 TransFusion-L。
BEV 地图分割 (nuScenes 验证)
用法
先决条件
代码是基于以下库构建的:
- Python >= 3.8, <3.9
- OpenMPI = 4.0.4 和 mpi4py = 3.0.3(需要 torchpack)
- Pillow = 8.4.0 (详见此处)
- PyTorch >= 1.9, <= 1.10.2
- tqdm
- torchpack
- mmcv = 1.4.0
- mmdetection = 2.20.0
- nuscenes-dev-kit
安装这些依赖项后,请运行此命令以安装代码库:
python setup.py develop
我们还提供了一个 Dockerfile 以简化环境设置。要用 docker 入门,请确保您的计算机上已安装 nvidia-docker
。之后,请执行以下命令以构建 docker 镜像:
cd docker && docker build . -t bevfusion
然后,我们可以使用以下命令运行 docker:
nvidia-docker run -it -v `pwd`/../data:/dataset --shm-size 16g bevfusion /bin/bash
我们建议用户(如果可能)在 docker 之外运行数据准备(说明将在下一节提供)。请注意,数据集目录应为绝对路径。在 docker 中,请运行以下命令以克隆我们的仓库并安装自定义 CUDA 扩展: ```bash cd home && git clone https://github.com/mit-han-lab/bevfusion && cd bevfusion python setup.py develop
然后,你可以创建一个符号链接 `data` 指向 docker 中的 `/dataset` 目录。
### 数据准备
#### nuScenes
请按照[此处](https://github.com/open-mmlab/mmdetection3d/blob/master/docs/en/datasets/nuscenes_det.md)的说明下载和预处理 nuScenes 数据集。请记得下载检测数据集和地图扩展(用于 BEV 非鸟瞰图分割)。数据准备完成后,你将能够看到以下目录结构(如 mmdetection3d 中所示):
mmdetection3d ├── mmdet3d ├── tools ├── configs ├── data │ ├── nuscenes │ │ ├── maps │ │ ├── samples │ │ ├── sweeps │ │ ├── v1.0-test │ │ ├── v1.0-trainval │ │ ├── nuscenes_database │ │ ├── nuscenes_infos_train.pkl │ │ ├── nuscenes_infos_val.pkl │ │ ├── nuscenes_infos_test.pkl │ │ ├── nuscenes_dbinfos_train.pkl
### 评估
我们还提供了评估我们预训练模型的说明。请使用以下脚本下载检查点:
```bash
./tools/download_pretrained.sh
然后,你将能够运行:
torchpack dist-run -np [GPU 数量] python tools/test.py [配置文件路径] pretrained/[检查点名称].pth --eval [评估类型]
例如,如果你想评估 BEVFusion 的检测版本,你可以尝试:
torchpack dist-run -np 8 python tools/test.py configs/nuscenes/det/transfusion/secfpn/camera+lidar/swint_v0p075/convfuser.yaml pretrained/bevfusion-det.pth --eval bbox
而对于 BEVFusion 的分割版本,以下命令将有所帮助:
torchpack dist-run -np 8 python tools/test.py configs/nuscenes/seg/fusion-bev256d2-lss.yaml pretrained/bevfusion-seg.pth --eval map
训练
我们提供了在 nuScenes 上复现我们结果的说明。
例如,如果你想为对象检测训练仅使用相机的版本,请运行:
torchpack dist-run -np 8 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
对于仅使用相机的 BEV 分割模型,请运行:
torchpack dist-run -np 8 python tools/train.py configs/nuscenes/seg/camera-bev256d2.yaml --model.encoders.camera.backbone.init_cfg.checkpoint pretrained/swint-nuimages-pretrained.pth
对于仅使用 LiDAR 的检测器,请运行:
torchpack dist-run -np 8 python tools/train.py configs/nuscenes/det/transfusion/secfpn/lidar/voxelnet_0p075.yaml
对于仅使用 LiDAR 的 BEV 分割模型,请运行:
torchpack dist-run -np 8 python tools/train.py configs/nuscenes/seg/lidar-centerpoint-bev128.yaml
对于 BEVFusion 检测模型,请运行:
torchpack dist-run -np 8 python tools/train.py configs/nuscenes/det/transfusion/secfpn/camera+lidar/swint_v0p075/convfuser.yaml --model.encoders.camera.backbone.init_cfg.checkpoint pretrained/swint-nuimages-pretrained.pth --load_from pretrained/lidar-only-det.pth
对于 BEVFusion 分割模型,请运行:
torchpack dist-run -np 8 python tools/train.py configs/nuscenes/seg/fusion-bev256d2-lss.yaml --model.encoders.camera.backbone.init_cfg.checkpoint pretrained/swint-nuimages-pretrained.pth
注意:请在训练后单独运行 tools/test.py
以获得最终评估指标。
在 TensorRT 上部署
CUDA-BEVFusion:TensorRT 的最佳实践,提供了 INT8 加速解决方案,并在 ORIN 上实现了 25fps。
FAQs
问:我们可以直接使用 mmdetection3d 准备的信息文件吗?
答:我们建议使用该代码库重新生成信息文件,因为我们在他们的坐标系重构之前就分叉了 mmdetection3d。
致谢
BEVFusion 基于 mmdetection3d。它也极大地受到以下对开源社区的杰出贡献的启发:LSS、BEVDet、TransFusion、CenterPoint、MVP、FUTR3D、CVT 和DETR3D。
也请看看相机单独 3D 感知社区的相关论文,如 BEVDet4D、BEVerse、BEVFormer、M2BEV、PETR 和 PETRv2,这些可能是 BEVFusion 有趣的未来扩展方向。
引用
如果 BEVFusion 对你的研究有用或相关,请通过引用我们的论文来认可我们的贡献:
@inproceedings{liu2022bevfusion,
title={BEVFusion: Multi-Task Multi-Sensor Fusion with Unified Bird's-Eye View Representation},
author={Liu, Zhijian and Tang, Haotian and Amini, Alexander and Yang, Xingyu and Mao, Huizi and Rus, Daniela and Han, Song},
booktitle={IEEE International Conference on Robotics and Automation (ICRA)},
year={2023}
}