By Xizhou Zhu, Weijie Su, Lewei Lu, Bin Li, Xiaogang Wang, Jifeng Dai.
This repository is an official implementation of the paper Deformable DETR: Deformable Transformers for End-to-End Object Detection.
TL; DR. Deformable DETR is an efficient and fast-converging end-to-end object detector. It mitigates the high complexity and slow convergence issues of DETR via a novel sampling-based efficient attention mechanism.
Abstract. DETR has been recently proposed to eliminate the need for many hand-designed components in object detection while demonstrating good performance. However, it suffers from slow convergence and limited feature spatial resolution, due to the limitation of Transformer attention modules in processing image feature maps. To mitigate these issues, we proposed Deformable DETR, whose attention modules only attend to a small set of key sampling points around a reference. Deformable DETR can achieve better performance than DETR (especially on small objects) with 10× less training epochs. Extensive experiments on the COCO benchmark demonstrate the effectiveness of our approach.
This project is released under the Apache 2.0 license.
See changelog.md for detailed logs of major changes.
If you find Deformable DETR useful in your research, please consider citing:
@article{zhu2020deformable,
title={Deformable DETR: Deformable Transformers for End-to-End Object Detection},
author={Zhu, Xizhou and Su, Weijie and Lu, Lewei and Li, Bin and Wang, Xiaogang and Dai, Jifeng},
journal={arXiv preprint arXiv:2010.04159},
year={2020}
}
Method | Epochs | AP | APS | APM | APL | params (M) |
FLOPs (G) |
Total Train Time (GPU hours) |
Train Speed (GPU hours /epoch) |
Infer Speed (FPS) |
Batch Infer Speed (FPS) |
URL |
---|---|---|---|---|---|---|---|---|---|---|---|---|
Faster R-CNN + FPN | 109 | 42.0 | 26.6 | 45.4 | 53.4 | 42 | 180 | 380 | 3.5 | 25.6 | 28.0 | - |
DETR | 500 | 42.0 | 20.5 | 45.8 | 61.1 | 41 | 86 | 2000 | 4.0 | 27.0 | 38.3 | - |
DETR-DC5 | 500 | 43.3 | 22.5 | 47.3 | 61.1 | 41 | 187 | 7000 | 14.0 | 11.4 | 12.4 | - |
DETR-DC5 | 50 | 35.3 | 15.2 | 37.5 | 53.6 | 41 | 187 | 700 | 14.0 | 11.4 | 12.4 | - |
DETR-DC5+ | 50 | 36.2 | 16.3 | 39.2 | 53.9 | 41 | 187 | 700 | 14.0 | 11.4 | 12.4 | - |
Deformable DETR (single scale) |
50 | 39.4 | 20.6 | 43.0 | 55.5 | 34 | 78 | 160 | 3.2 | 27.0 | 42.4 | config log model |
Deformable DETR (single scale, DC5) |
50 | 41.5 | 24.1 | 45.3 | 56.0 | 34 | 128 | 215 | 4.3 | 22.1 | 29.4 | config log model |
Deformable DETR | 50 | 44.5 | 27.1 | 47.6 | 59.6 | 40 | 173 | 325 | 6.5 | 15.0 | 19.4 | config log model |
+ iterative bounding box refinement | 50 | 46.2 | 28.3 | 49.2 | 61.5 | 41 | 173 | 325 | 6.5 | 15.0 | 19.4 | config log model |
++ two-stage Deformable DETR | 50 | 46.9 | 29.6 | 50.1 | 61.6 | 41 | 173 | 340 | 6.8 | 14.5 | 18.8 | config log model |
Note:
Linux, CUDA>=9.2, GCC>=5.4
Python>=3.7
We recommend you to use Anaconda to create a conda environment:
conda create -n deformable_detr python=3.7 pip
Then, activate the environment:
conda activate deformable_detr
PyTorch>=1.5.1, torchvision>=0.6.1 (following instructions here)
For example, if your CUDA version is 9.2, you could install pytorch and torchvision as following:
conda install pytorch=1.5.1 torchvision=0.6.1 cudatoolkit=9.2 -c pytorch
Other requirements
pip install -r requirements.txt
cd ./models/ops
sh ./make.sh
# unit test (should see all checking is True)
python test.py
Please download COCO 2017 dataset and organize them as following:
code_root/
└── data/
└── coco/
├── train2017/
├── val2017/
└── annotations/
├── instances_train2017.json
└── instances_val2017.json
For example, the command for training Deformable DETR on 8 GPUs is as following:
GPUS_PER_NODE=8 ./tools/run_dist_launch.sh 8 ./configs/r50_deformable_detr.sh
For example, the command for training Deformable DETR on 2 nodes of each with 8 GPUs is as following:
On node 1:
MASTER_ADDR=<IP address of node 1> NODE_RANK=0 GPUS_PER_NODE=8 ./tools/run_dist_launch.sh 16 ./configs/r50_deformable_detr.sh
On node 2:
MASTER_ADDR=<IP address of node 1> NODE_RANK=1 GPUS_PER_NODE=8 ./tools/run_dist_launch.sh 16 ./configs/r50_deformable_detr.sh
If you are using slurm cluster, you can simply run the following command to train on 1 node with 8 GPUs:
GPUS_PER_NODE=8 ./tools/run_dist_slurm.sh <partition> deformable_detr 8 configs/r50_deformable_detr.sh
Or 2 nodes of each with 8 GPUs:
GPUS_PER_NODE=8 ./tools/run_dist_slurm.sh <partition> deformable_detr 16 configs/r50_deformable_detr.sh
You can get the config file and pretrained model of Deformable DETR (the link is in "Main Results" session), then run following command to evaluate it on COCO 2017 validation set:
<path to config file> --resume <path to pre-trained model> --eval
You can also run distributed evaluation by using ./tools/run_dist_launch.sh
or ./tools/run_dist_slurm.sh
.