本仓库是ICCV2023论文《UniTR: 用于鸟瞰图表示的统一高效多模态Transformer》的官方实现,以及后续相关工作。我们的UniTR在nuScenes数据集上实现了最先进的性能,使用了真正统一的、权重共享的多模态(如摄像头和激光雷达)主干网络。UniTR基于[DSVT]的代码库构建,我们竭尽全力确保代码库简洁、易读、先进,并且只依赖最少的外部库。
UniTR: 用于鸟瞰图表示的统一高效多模态Transformer
王海阳*, 唐浩*, 石少帅 $^\dagger$, 李傲雪, 李正国, Bernt Schiele, 王立威 $^\dagger$
联系人: 王海阳 (wanghaiyang6@stu.pku.edu.cn), 唐浩 (tanghao@stu.pku.edu.cn), 石少帅 (shaoshuaics@gmail.com)
🚀 感谢唐浩对代码的大量重构和对开源项目的重要贡献。他的宝贵努力对UniTR的顺利完成至关重要。
🔥 👀 诚实地说,UniTR中的分区操作较慢,占用了总时间的约40%,但通过更好的策略或一些工程优化,这部分可以优化至零,表明速度优化还有很大空间。我们不是高性能计算专家,但如果业界有人想改进这一点,我们相信可以 将其减半。重要的是,这部分不会随模型规模增加而增加,这对更大的模型很友好。
📘 我将毫无保留地分享我对通用3D感知基础模型的理解和未来计划。请参阅🔥 潜在研究方向🔥。如果您觉得对您的研究有用或有启发,欢迎加入我一起构建这个蓝图。
解读文章: [CVer] [自动驾驶之心] [ReadPaper] [知乎] [CSDN] [TechBeat (将门创投)]
SOTA
我们的单一多模态UniTR在nuScenes检测基准(2023年8月)上超越了所有其他非TTA方法,NDS达到74.5
。SOTA
在NuScenes验证集上实现了多模态3D目标检测和BEV地图分割的最佳性能。联合处理多个传感器的信息对于实现准确和稳健的感知至关重要,这是可靠自动驾驶系统的基础。然而,当前的3D感知研究遵循特定模态的范式,导致额外的计算开销和不同传感器数据之间的协作效率低下。
在本文中,我们提出了一个高效的户外3D感知多模态主干网络,它使用统一建模和共享参数处理各种模态。这是一个基本上与任务无关的主干网络,天然支持不同的3D感知任务。它在nuScenes基准测试中创造了新的最先进性能,在3D目标检测方面实现了+1.1 NDS
的提升,在BEV地图分割方面实现了+12.0 mIoU
的提升,同时推理延迟更低。
模型 | NDS | mAP | mATE | mASE | mAOE | mAVE | mAAE | 检查点 | 日志 |
---|---|---|---|---|---|---|---|---|---|
UniTR | 73.0 | 70.1 | 26.3 | 24.7 | 26.8 | 24.6 | 17.9 | 检查点 | 日志 |
UniTR+LSS | 73.3 | 70.5 | 26.0 | 24.4 | 26.8 | 24.8 | 18.7 | 检查点 | 日志 |
模型 | NDS | mAP | mATE | mASE | mAOE | mAVE | mAAE |
---|---|---|---|---|---|---|---|
UniTR | 74.1 | 70.5 | 24.4 | 23.3 | 25.7 | 24.1 | 13.0 |
UniTR+LSS | 74.5 | 70.9 | 24.1 | 22.9 | 25.6 | 24.0 | 13.1 |
模型 | 平均IoU | 可行驶区 | 人行横道 | 人行道 | 停止线 | 停车场 | 分隔带 | 检查点 | 日志 |
---|---|---|---|---|---|---|---|---|---|
UniTR | 73.2 | 90.4 | 73.1 | 78.2 | 66.6 | 67.3 | 63.8 | 检查点 | 日志 |
UniTR+LSS | 74.7 | 90.7 | 74.0 | 79.3 | 68.2 | 72.9 | 64.2 | 检查点 | 日志 |
我们的方法在多个任务(如3D目标检测和BEV地图分割)上取得了最佳性能,并且具有高度的通用性,只需替换骨干网络即可。
我们引入了一个与模态无关的transformer编码器,用于处理这些视角不一致的传感器数据,实现并行的模态特定表示学习和自动跨模态交互,无需额外的融合步骤。
权重共享的统一多模态编码器是基础模型的先决条件,特别是在3D感知的背景下,统一来自图像和LiDAR数据的信息。这是第一个真正的多模态融合骨干网络,可以无缝连接到任何3D检测头。
conda create -n unitr python=3.8 # 安装torch,我们只在pytorch 1.10中测试过 pip install torch==1.10.1+cu113 torchvision==0.11.2+cu113 -f https://download.pytorch.org/whl/torch_stable.html git clone https://github.com/Haiyang-W/UniTR cd UniTR # 安装额外依赖 pip install -r requirements.txt # 安装nuscenes-devkit pip install nuscenes-devkit==1.0.5 # 开发 python setup.py develop
OpenPCDet
├── data
│ ├── nuscenes
│ │ │── v1.0-trainval (或v1.0-mini如果你使用mini版本)
│ │ │ │── samples
│ │ │ │── sweeps
│ │ │ │── maps
│ │ │ │── v1.0-trainval
├── pcdet
├── tools
/data/nuscenes/v1.0-trainval/maps
,如下所示:OpenPCDet
├── maps
│ ├── ......
│ ├── boston-seaport.json
│ ├── singapore-onenorth.json
│ ├── singapore-queenstown.json
│ ├── singapore-hollandvillage.json
# 创建数据集信息文件,激光雷达和图像gt数据库 python -m pcdet.datasets.nuscenes.nuscenes_dataset --func create_nuscenes_infos \ --cfg_file tools/cfgs/dataset_configs/nuscenes_dataset.yaml \ --version v1.0-trainval \ --with_cam \ --with_cam_gt \ # --share_memory # 如果使用共享内存进行激光雷达和图像gt采样(大约24G+143G或12G+72G) # 共享内存将大大提高你的训练速度,但需要150G或75G额外的缓存内存。 # 注意:所有实验都使用了共享内存。共享内存不会影响性能
OpenPCDet
├── data
│ ├── nuscenes
│ │ │── v1.0-trainval (或v1.0-mini如果你使用mini版本)
│ │ │ │── samples
│ │ │ │── sweeps
│ │ │ │── maps
│ │ │ │── v1.0-trainval
│ │ │ │── img_gt_database_10sweeps_withvelo
│ │ │ │── gt_database_10sweeps_withvelo
│ │ │ │── nuscenes_10sweeps_withvelo_lidar.npy (可选) # 如果开启共享内存
│ │ │ │── nuscenes_10sweeps_withvelo_img.npy (可选) # 如果开启共享内存
│ │ │ │── nuscenes_infos_10sweeps_train.pkl
│ │ │ │── nuscenes_infos_10sweeps_val.pkl
│ │ │ │── nuscenes_dbinfos_10sweeps_withvelo.pkl
├── pcdet
├── tools
请从unitr_pretrain.pth下载预训练检查点,并将文件复制到根文件夹下,例如UniTR/unitr_pretrain.pth
。这个文件是在Imagenet和Nuimage数据集上预训练DSVT的权重。
3D目标检测:
# 多GPU训练 ## 普通 cd tools bash scripts/dist_train.sh 8 --cfg_file ./cfgs/nuscenes_models/unitr.yaml --sync_bn --pretrained_model ../unitr_pretrain.pth --logger_iter_interval 1000 ## 添加lss cd tools bash scripts/dist_train.sh 8 --cfg_file ./cfgs/nuscenes_models/unitr+lss.yaml --sync_bn --pretrained_model ../unitr_pretrain.pth --logger_iter_interval 1000
BEV地图分割:
# 多GPU训练 # 注意,我们在BEV地图分割中不使用图像预训练 ## 普通 cd tools bash scripts/dist_train.sh 8 --cfg_file ./cfgs/nuscenes_models/unitr_map.yaml --sync_bn --eval_map --logger_iter_interval 1000 ## 添加lss cd tools bash scripts/dist_train.sh 8 --cfg_file ./cfgs/nuscenes_models/unitr_map+lss.yaml --sync_bn --eval_map --logger_iter_interval 1000
3D目标检测:
# 多GPU测试 ## 普通 cd tools bash scripts/dist_test.sh 8 --cfg_file ./cfgs/nuscenes_models/unitr.yaml --ckpt <检查点文件> ## 添加LSS cd tools bash scripts/dist_test.sh 8 --cfg_file ./cfgs/nuscenes_models/unitr+lss.yaml --ckpt <检查点文件>
BEV地图分割
# 多GPU测试 ## 普通 cd tools bash scripts/dist_test.sh 8 --cfg_file ./cfgs/nuscenes_models/unitr_map.yaml --ckpt <检查点文件> --eval_map ## 添加LSS cd tools bash scripts/dist_test.sh 8 --cfg_file ./cfgs/nuscenes_models/unitr_map+lss.yaml --ckpt <检查点文件> --eval_map # 注意:评估结果不会记录在*.log中,只会在终端中打印
# 仅适用于3D目标检测 ## 普通 ### 缓存多模态骨干网络的映射计算 cd tools bash scripts/dist_test.sh 8 --cfg_file ./cfgs/nuscenes_models/unitr_cache.yaml --ckpt <检查点文件> --batch_size 8 ## 添加LSS ### 缓存多模态骨干网络的映射计算 cd tools bash scripts/dist_test.sh 8 --cfg_file ./cfgs/nuscenes_models/unitr+LSS_cache.yaml --ckpt <检查点文件> --batch_size 8
cd tools bash scripts/dist_test.sh 8 --cfg_file ./cfgs/nuscenes_models/unitr+LSS_cache_plus.yaml --ckpt <检查点文件> --batch_size 8
#### 在NuScenes验证集上的缓存测试性能(相机参数有些变化)
| 模型 | NDS | mAP |mATE | mASE | mAOE | mAVE| mAAE |
|---------|---------|--------|---------|---------|--------|---------|--------|
| [UniTR (缓存主干网络)](https://github.com/Haiyang-W/UniTR/blob/main/tools/cfgs/nuscenes_models/unitr_cache.yaml) | 72.6(-0.4) | 69.4(-0.7) | 26.9 | 24.8 | 26.3 | 24.6 | 18.2 |
| [UniTR+LSS (缓存主干网络)](https://github.com/Haiyang-W/UniTR/blob/main/tools/cfgs/nuscenes_models/unitr%2Blss_cache.yaml) | 73.1(-0.2) | 70.2(-0.3) | 25.8 | 24.4 | 26.0 | 25.3 | 18.2 |
| [UniTR+LSS (缓存主干网络和LSS)](https://github.com/Haiyang-W/UniTR/blob/main/tools/cfgs/nuscenes_models/unitr%2Blss_cache_plus.yaml) | 72.6(-0.7) | 69.3(-1.2) | 26.7 | 24.3 | 25.9 | 25.3 | 18.2 |
## 潜在研究方向
* **3D视觉基础模型的基础架构。**
对大型模型来说,高效的网络设计至关重要。有了可靠的模型结构,大型模型的开发就可以推进。如何使通用多模态主干网络更高效且易于部署。说实话,UniTR中的划分较慢,大约占总时间的40%,但通过更好的"划分策略"或"一些工程努力",这可以优化至零,表明在速度优化方面仍有巨大空间。我们不是高性能计算专家,但如果业内有人想改进这一点,我们相信可以将其减半。重要的是,这部分不会随模型大小而扩展,这对更大的模型很友好。
* **基于图像-激光雷达对和UniTR的多模态自监督学习。**
请参考下图。图像和点云都描述了同一个3D场景;它们在高度信息丰富的对应关系方面相互补充。这允许使用共享参数对更通用的场景表示进行无监督学习。
* **单模态预训练。** 我们的模型与ViT几乎相同(除了一些位置嵌入策略)。如果我们适当调整位置嵌入,DSVT和UniTR可以直接加载ViT的预训练参数。这有利于与2D社区更好地整合。
* **3D视觉的统一建模。**
请参考下图。
<div align="center">
<img src="https://yellow-cdn.veclightyear.com/835a84d5/308acddf-9f45-41b8-a70f-62b51a29897d.png" width="800"/>
</div>
## 可能遇到的问题
* 如果在fp16训练过程中遇到梯度变为NaN的情况,不支持。
* 如果找不到解决方案,请在我们的github问题页面[这里](https://github.com/Haiyang-W/UniTR/issues)搜索已开放和已关闭的问题。
* 我们在训练阶段默认提供torch检查点选项[这里](https://github.com/Haiyang-W/UniTR/blob/3f75dc1a362fe8f325dabd2e878ac57df2ab7323/tools/cfgs/nuscenes_models/unitr.yaml#L125),以节省50%的CUDA内存。
* Nuscenes中的样本在相机参数上有一些变化。因此,在训练过程中,每个样本都会重新计算相机-激光雷达映射,这显著降低了训练速度(~40%)。如果您数据集中的外部参数是一致的,我建议在训练期间缓存这个计算。
* 如果仍然无法解决,请在我们的github上开一个新的问题。我们通常会在几天内回复。
## 引用
如果我们的工作对您有帮助,请考虑按以下方式引用:
@inproceedings{wang2023unitr, title={UniTR: A Unified and Efficient Multi-Modal Transformer for Bird's-Eye-View Representation}, author={Haiyang Wang, Hao Tang, Shaoshuai Shi, Aoxue Li, Zhenguo Li, Bernt Schiele, Liwei Wang}, booktitle={ICCV}, year={2023} }
## 致谢
UniTR使用了来自几个开源仓库的代码。如果没有这些人的努力(以及他们愿意发布他们的实现),UniTR就不可能实现。我们感谢这些作者的努力!
* Shaoshuai Shi: [OpenPCDet](https://github.com/open-mmlab/OpenPCDet)
* Chen Shi: [DSVT](https://github.com/Haiyang-W/DSVT)
* Zhijian Liu: [BevFusion](https://github.com/mit-han-lab/bevfusion)