DN-DETR:通过引入查询去噪加速DETR训练
本仓库是DN-DETR的官方实现。该论文被CVPR 2022接收(得分112,口头报告)。代码现已开放。 [CVPR论文链接] [扩展版论文链接] [中文解读]
新闻
[2022/12]:我们在arxiv上发布了DN-DETR的扩展版,这是论文链接!我们将去噪训练应用于基于CNN的模型Faster R-CNN、分割模型Mask2Former以及其他类DETR模型如Anchor DETR和DETR,以提高这些模型的性能。
[2022/12]:Mask DINO的代码已开放!Mask DINO在COCO数据集上使用ResNet-50和SwinL骨干网络(无额外检测数据)分别达到了51.7和59.0的框AP,在相同设置下超越了DINO!
[2022/11]:基于DN-DETR的DINO实现已在本仓库中发布。感谢@Vallum!这个优化版本在ResNet-50下能在36轮训练中达到50.8 ~ 51.0 AP。
[2022/9]:我们发布了一个工具箱detrex,提供了许多最先进的基于Transformer的检测算法。其中包括性能更好的DN-DETR。欢迎使用!
[2022/6]:我们发布了一个统一的检测和分割模型Mask DINO,在三个分割任务上都取得了最佳结果(COCO实例分割榜单上54.5 AP,COCO全景分割榜单上59.4 PQ,以及ADE20K语义分割榜单上60.8 mIoU)!代码将在这里开放。
[2022/5]:我们的代码已开放!使用ResNet-50在COCO上达到了更好的性能49.5
AP。
[2022/3]:我们创建了一个仓库Awesome Detection Transformer,展示了关于用于检测和分割的transformer的论文。欢迎关注!
[2022/3]:DN-DETR被选为CVPR2022的口头报告。
[2022/3]:我们发布了另一项工作DINO:DETR with Improved DeNoising Anchor Boxes for End-to-End Object Detection,首次将DETR类模型确立为榜单上的SOTA模型。同样基于DN。代码将在这里开放。
简介
- 我们提出了一种新颖的去噪训练方法,以加速DETR训练,并对DETR类方法收敛缓慢问题提供了深入理解。
- DN仅是一种训练方法,可插入许多DETR类模型甚至传统模型中以提升性能。
- DN-DETR在使用ResNet-50骨干网络进行12和50轮训练时,分别达到了43.4和48.6的AP。与相同设置下的基线模型相比,DN-DETR仅用**50%**的训练轮数就达到了可比的性能。
- 我们优化后的模型取得了更好的性能。DN-Deformable-DETR使用ResNet-50骨干网络达到了49.5的AP。
模型
我们在DAB-DETR的基础上添加了去噪部分以加速训练收敛。这只增加了最少的计算量,并在推理时会被移除。 我们进行了广泛的实验来验证我们的去噪训练的有效性,例如收敛曲线比较。您可以参考我们的论文获取更多实验结果。
模型库
我们提供了DAB-DETR、DAB-Deformable-DETR(仅可变形编码器)和DAB-Deformable-DETR下的模型(参见DAB-DETR的代码和论文了解更多详情)。
您也可以参考我们的
[百度网盘模型库](提取码niet)。
50轮训练设置
名称 | 骨干网络 | 边界框AP | 日志/配置/检查点 | 在我们的论文中的位置 | |
---|---|---|---|---|---|
0 | DN-DETR-R50 | R50 | 44.41 | 谷歌云盘 / 百度网盘 | 表1 |
2 | DN-DETR-R50-DC5 | R50 | 46.3 | 谷歌云盘 / 百度网盘 | 表1 |
5 | DN-DAB-可变形-DETR (仅可变形编码器)3 | R50 | 48.6 | 谷歌云盘 / 百度网盘 | 表3 |
6 | DN-DAB-可变形-DETR-R50-v24 | R50 | 49.5(24轮训练为48.4) | 谷歌云盘 / 百度网盘 | 优化实现,在编码器和解码器中都使用可变形注意力。更多详情请参见DAB-DETR。 |
名称 | 骨干网络 | 边界框AP | 日志/配置/检查点 | 在我们的论文中的位置 | |
---|---|---|---|---|---|
1 | DN-DAB-DETR-R50-DC5(3模式)2 | R50 | 41.7 | 谷歌云盘 / 百度网盘 | 表2 |
4 | DN-DAB-DETR-R101-DC5(3模式)2 | R101 | 42.8 | 谷歌云盘 / 百度网盘 | 表2 |
5 | DN-DAB-Deformable-DETR (仅可变形编码器)3 | R50 | 43.4 | 谷歌云盘 / 百度网盘 | 表2 |
5 | DN-DAB-Deformable-DETR (仅可变形编码器)3 | R101 | 44.1 | 谷歌云盘 / 百度网盘 | 表2 |
注意:
- 1:由于我们优化了代码,结果相比论文中报告的有所提升(从
44.1
到44.4
)。我们没有重新运行其他模型,所以你可能会获得比我们论文中报告的更好的性能。 - 2:标记为(3模式)的模型使用多种模式嵌入进行训练(更多详情请参考Anchor DETR或DAB-DETR)。
- 3:此模型基于DAB-Deformable-DETR(仅可变形编码器),是DAB-DETR的多尺度版本。由于仅在编码器中使用可变形注意力,需要16个GPU进行训练。
- 4:此模型基于DAB-Deformable-DETR,是一个优化的可变形DETR实现。更多详情请参见DAB-DETR。
我们鼓励你使用这个可变形版本,因为它在编码器和解码器中都使用了可变形注意力,更加轻量级(即可以用4/8个A100 GPU训练)并且收敛更快(即在24轮内达到
48.4
,与50轮的DAB-Deformable-DETR相当)。
使用方法
如何在你自己的模型中使用去噪训练
我们的代码大部分遵循DAB-DETR,并添加了用于去噪训练的额外组件,这些组件封装在dn_components.py文件中。主要包括3个函数:prepare_for_dn、dn_post_proces(前两个用于在检测前向函数中处理去噪部分)和compute_dn_loss(用于计算去噪损失)。你可以导入这些函数并将它们添加到你自己的检测模型中。 如果你想在自己的检测模型中使用它,你也可以比较DN-DETR和DAB-DETR,看看这些函数是如何添加的。
我们也鼓励你将其应用到其他类DETR模型甚至传统检测模型中,并在这个仓库中更新结果。
安装
我们使用DAB-DETR项目作为我们的代码基础,因此我们的DN-DETR不需要额外的依赖。对于DN-Deformable-DETR,你需要手动编译可变形注意力算子。
我们在python=3.7.3,pytorch=1.9.0,cuda=11.1
环境下测试了我们的模型。其他版本可能也适用。
- 克隆此仓库
git clone https://github.com/IDEA-Research/DN-DETR.git
cd DN-DETR
- 安装Pytorch和torchvision
按照https://pytorch.org/get-started/locally/的说明进行操作。
# 示例:
conda install -c pytorch pytorch torchvision
- 安装其他所需包
pip install -r requirements.txt
- 编译CUDA算子
cd models/dn_dab_deformable_detr/ops
python setup.py build install
# 单元测试(应该看到所有检查都为True)
python test.py
cd ../../..
数据
请下载COCO 2017数据集并按以下方式组织:
COCODIR/
├── train2017/
├── val2017/
└── annotations/
├── instances_train2017.json
└── instances_val2017.json
运行
我们以标准的DN-DETR-R50和DN-Deformable-DETR-R50为例进行训练和评估。
评估我们预训练的模型
从此链接下载我们的DN-DETR-R50模型检查点,并执行以下命令。
你可以预期最终AP约为44.4
。
对于我们的DN-DAB-Deformable-DETR_Deformable_Encoder_Only(在此下载)。预期的最终AP为48.6
。
对于我们的DN-DAB-Deformable-DETR(在此下载),预期的最终AP为49.5
。
# 对于dn_detr:44.1 AP;优化结果为44.4AP
python main.py -m dn_dab_detr \
--output_dir logs/dn_DABDETR/R50 \
--batch_size 1 \
--coco_path /path/to/your/COCODIR \ # 替换为你的COCO路径
--resume /path/to/our/checkpoint \ # 替换为你的检查点路径
--use_dn \
--eval
# 对于dn_deformable_detr:49.5 AP
python main.py -m dn_deformable_detr \
--output_dir logs/dab_deformable_detr/R50 \
--batch_size 1 \
--coco_path /path/to/your/COCODIR \ # 替换为你的COCO路径
--resume /path/to/our/checkpoint \ # 替换为你的检查点路径
--transformer_activation relu \
--use_dn \
--eval
# 对于dn_deformable_detr_deformable_encoder_only:48.6 AP
python main.py -m dn_dab_deformable_detr_deformable_encoder_only
--output_dir logs/dab_deformable_detr/R50 \
--batch_size 1 \
--coco_path /path/to/your/COCODIR \ # 替换为你的COCO路径
--resume /path/to/our/checkpoint \ # 替换为你的检查点路径
--transformer_activation relu \
--num_patterns 3 \ # 使用3个模式嵌入
--use_dn \
--eval
训练你自己的模型
同样,你也可以在单个进程上训练我们的模型:
# 对于dn_detr
python main.py -m dn_dab_detr \
--output_dir logs/dn_DABDETR/R50 \
--batch_size 1 \
--epochs 50 \
--lr_drop 40 \
--coco_path /path/to/your/COCODIR # 替换为你的COCO路径
--use_dn
分布式运行
然而,由于训练耗时较长,我们建议在多设备上训练模型。
如果你计划在使用Slurm的集群上训练模型,这里是一个训练命令示例:
# 对于dn_detr:44.4 AP
python run_with_submitit.py \
--timeout 3000 \
--job_name DNDETR \
--coco_path /path/to/your/COCODIR \
-m dn_dab_detr \
--job_dir logs/dn_DABDETR/R50_%j \
--batch_size 2 \
--ngpus 8 \
--nodes 1 \
--epochs 50 \
--lr_drop 40 \
--use_dn
# 对于dn_dab_deformable_detr:49.5 AP
python run_with_submitit.py \
--timeout 3000 \
--job_name dn_dab_deformable_detr \
--coco_path /path/to/your/COCODIR \
-m dab_deformable_detr \
--transformer_activation relu \
--job_dir logs/dn_dab_deformable_detr/R50_%j \
--batch_size 2 \
--ngpus 8 \
--nodes 1 \
--epochs 50 \
--lr_drop 40 \
--use_dn
# 对于dn_dab_deformable_detr_deformable_encoder_only:48.6 AP
python run_with_submitit.py \
--timeout 3000 \
--job_name dn_dab_deformable_detr_deformable_encoder_only \
--coco_path /path/to/your/COCODIR \
-m dn_dab_deformable_detr_deformable_encoder_only \
--transformer_activation relu \
--job_dir logs/dn_dab_deformable_detr/R50_%j \
--num_patterns 3 \
--batch_size 1 \
--ngpus 8 \
--nodes 2 \
--epochs 50 \
--lr_drop 40 \
--use_dn
如果你想训练我们的DC版本或多模式版本,添加
--dilation # 对于DC版本
--num_patterns 3 # 对于3个模式
但是,这需要额外的训练资源和内存,即使用16个GPU。
最终的AP应该与我们的相似或更好,因为我们优化后的结果比论文中报告的性能更好(例如,我们报告DN-DETR为44.1
,但我们的新结果可以达到44.4
。
如果你得到更好的结果,不要感到惊讶!)。
我们的训练设置与DAB-DETR相同,但添加了一个参数--use_dn
,你也可以参考DAB-DETR。
注意:
- 结果对批量大小敏感。我们默认使用16(每个GPU 2张图像 x 8个GPU)。
或者在单个节点上使用多进程运行:
# 对于dn_dab_detr:44.4 AP
python -m torch.distributed.launch --nproc_per_node=8 \
main.py -m dn_dab_detr \
--output_dir logs/dn_DABDETR/R50 \
--batch_size 2 \
--epochs 50 \
--lr_drop 40 \
--coco_path /path/to/your/COCODIR \
--use_dn
# 对于dn_deformable_detr: 49.5 AP
python -m torch.distributed.launch --nproc_per_node=8 \
main.py -m dn_dab_deformable_detr \
--output_dir logs/dn_dab_deformable_detr/R50 \
--batch_size 2 \
--epochs 50 \
--lr_drop 40 \
--transformer_activation relu \
--coco_path /path/to/your/COCODIR \
--use_dn
相关链接
我们的工作基于DAB-DETR。我们还发布了另一个基于DN-DETR和DAB-DETR的SOAT检测模型DINO。
-
DINO: 使用改进的去噪锚框的端到端目标检测DETR。 Hao Zhang*, Feng Li*, Shilong Liu*, Lei Zhang, Hang Su, Jun Zhu, Lionel M. Ni, Heung-Yeung Shum。 arxiv 2022。 [论文] [代码]。
-
DAB-DETR: 动态锚框是DETR更好的查询。 Shilong Liu, Feng Li, Hao Zhang, Xiao Yang, Xianbiao Qi, Hang Su, Jun Zhu, Lei Zhang。 国际学习表示会议(ICLR)2022。 [论文] [代码]。
许可证
DN-DETR在Apache 2.0许可下发布。更多信息请参见LICENSE文件。
版权所有 (c) IDEA。保留所有权利。
根据Apache许可证2.0版("许可证")获得许可;除非符合许可证,否则您不得使用这些文件。您可以在http://www.apache.org/licenses/LICENSE-2.0 获取许可证副本。
除非适用法律要求或书面同意,根据许可证分发的软件是基于"按原样"分发的,不附带任何明示或暗示的担保或条件。请参阅许可证以了解许可证下的特定语言和限制。
引用
如果您发现我们的工作对您的研究有帮助,请考虑引用以下BibTeX条目。
@inproceedings{li2022dn,
title={Dn-detr: 通过引入查询去噪加速detr训练},
author={Li, Feng and Zhang, Hao and Liu, Shilong and Guo, Jian and Ni, Lionel M and Zhang, Lei},
booktitle={计算机视觉与模式识别IEEE/CVF会议论文集},
pages={13619--13627},
year={2022}
}