UniTR:首个统一的多模态3D感知Transformer主干网络
本仓库是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 (将门创投)]
新闻
- [24-07-01] 🔥 我们的 GiT 被 ECCV2024 接收。如果您觉得有帮助,请给它一个星标。🤗
- [24-03-15] 🔥 GiT,首个仅使用ViT的成功通用视觉模型已发布。对应潜在研究方向,我们尝试解决视觉端通用模型的问题。结合UniTR和GiT构建适用于自动驾驶场景的类LLM统一模型是一个有趣的方向。
- [23-09-21] 🚀 NuScenes的代码已发布。
- [23-08-16] 🏆
SOTA
我们的单一多模态UniTR在nuScenes检测基准(2023年8月)上超越了所有其他非TTA方法,NDS达到74.5
。 - [23-08-16] 🏆
SOTA
在NuScenes验证集上实现了多模态3D目标检测和BEV地图分割的最佳性能。 - [23-08-15] 👀 UniTR在arXiv上发布。
- [23-07-13] 🔥 UniTR被ICCV 2023接收。
概览
待办事项
简介
联合处理多个传感器的信息对于实现准确和稳健的感知至关重要,这是可靠自动驾驶系统的基础。然而,当前的3D感知研究遵循特定模态的范式,导致额外的计算开销和不同传感器数据之间的协作效率低下。
在本文中,我们提出了一个高效的户外3D感知多模态主干网络,它使用统一建模和共享参数处理各种模态。这是一个基本上与任务无关的主干网络,天然支持不同的3D感知任务。它在nuScenes基准测试中创造了新的最先进性能,在3D目标检测方面实现了+1.1 NDS
的提升,在BEV地图分割方面实现了+12.0 mIoU
的提升,同时推理延迟更低。
主要结果
3D目标检测(NuScenes验证集)
模型 | 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 | 检查点 | 日志 |
3D目标检测(NuScenes测试集)
模型 | 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 |
BEV地图分割(在NuScenes验证集上)
模型 | 平均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分割的最佳成果
我们的方法在多个任务(如3D目标检测和BEV地图分割)上取得了最佳性能,并且具有高度的通用性,只需替换骨干网络即可。
3D目标检测
BEV地图分割
🔥 所有模态间共享权重
我们引入了一个与模态无关的transformer编码器,用于处理这些视角不一致的传感器数据,实现并行的模态特定表示学习和自动跨模态交互,无需额外的融合步骤。
🔥 3D视觉基础模型的先决条件
权重共享的统一多模态编码器是基础模型的先决条件,特别是在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
数据集准备
- 请下载官方的NuScenes 3D目标检测数据集并按如下方式组织下载的文件:
OpenPCDet
├── data
│ ├── nuscenes
│ │ │── v1.0-trainval (或v1.0-mini如果你使用mini版本)
│ │ │ │── samples
│ │ │ │── sweeps
│ │ │ │── maps
│ │ │ │── v1.0-trainval
├── pcdet
├── tools
- (可选)要安装用于bev地图分割任务的地图扩展,请从地图扩展(地图扩展包(v1.3))下载文件,并将文件复制到你的nuScenes地图文件夹中,例如
/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中,只会在终端中打印
缓存测试
- 🔥如果你使用的数据集的相机和激光雷达参数保持不变,那么使用我们的缓存模式不会影响性能。你甚至可以在训练阶段缓存所有映射计算,这可以显著加快你的训练速度。
- Nuscenes中的每个样本的相机参数会有一些变化,在正常推理过程中,我们禁用缓存模式以确保结果准确性。然而,由于我们映射的鲁棒性,即使在像Nuscenes这样相机参数有变化的场景中,性能也只会略微下降(大约0.4 NDS)。
- 缓存模式目前只支持batch_size为1,8x1=8
- 根据我们的观察,骨干网络缓存可以减少40%的推理延迟。
# 仅适用于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
添加LSS
缓存多模态主干网络和LSS的映射计算
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)