Add Deformable DETR (#17281)
* First draft * More improvements * Improve model, add custom CUDA code * Import torch before * Add script that imports custom layer * Add everything in new ops directory * Import custom layer in modeling file * Fix ARCHIVE_MAP typo * Creating the custom kernel on the fly. * Import custom layer in modeling file * More improvements * Fix CUDA loading * More improvements * Improve conversion script * Improve conversion script * Make it work until encoder_outputs * Make forward pass work * More improvements * Make logits match original implementation * Make implementation also support single_scale model * Add support for single_scale and dilation checkpoint * Add support for with_box_refine model * Support also two stage model * Improve tests * Fix more tests * Make more tests pass * Upload all models to the hub * Clean up some code * Improve decoder outputs * Rename intermediate hidden states and reference points * Improve model outputs * Move tests to dedicated folder * Improve model outputs * Fix retain_grad test * Improve docs * Clean up and make test_initialization pass * Improve variable names * Add copied from statements * Improve docs * Fix style * Improve docs * Improve docs, move tests to model folder * Fix rebase * Remove DetrForSegmentation from auto mapping * Apply suggestions from code review * Improve variable names and docstrings * Apply some more suggestions from code review * Apply suggestion from code review * better docs and variables names * hint to num_queries and two_stage confusion * remove asserts and code refactor * add exception if two_stage is True and with_box_refine is False * use f-strings * Improve docs and variable names * Fix code quality * Fix rebase * Add require_torch_gpu decorator * Add pip install ninja to CI jobs * Apply suggestion of @sgugger * Remove DeformableDetrForObjectDetection from auto mapping * Remove DeformableDetrModel from auto mapping * Add model to toctree * Add model back to mappings, skip model in pipeline tests * Apply @sgugger's suggestion * Fix imports in the init * Fix copies * Add CPU implementation * Comment out GPU function * Undo previous change * Apply more suggestions * Remove require_torch_gpu annotator * Fix quality * Add logger.info * Fix logger * Fix variable names * Fix initializaztion * Add missing initialization * Update checkpoint name * Add model to doc tests * Add CPU/GPU equivalence test * Add Deformable DETR to pipeline tests * Skip model for object detection pipeline Co-authored-by: Nicolas Patry <patry.nicolas@protonmail.com> Co-authored-by: Nouamane Tazi <nouamane98@gmail.com> Co-authored-by: Sylvain Gugger <Sylvain.gugger@gmail.com>
This commit is contained in:
@@ -285,6 +285,7 @@ Current number of checkpoints: ** (from Microsoft) released with the paper [DeBERTa: Decoding-enhanced BERT with Disentangled Attention](https://arxiv.org/abs/2006.03654) by Pengcheng He, Xiaodong Liu, Jianfeng Gao, Weizhu Chen.
|
1. **[DeBERTa](https://huggingface.co/docs/transformers/model_doc/deberta)** (from Microsoft) released with the paper [DeBERTa: Decoding-enhanced BERT with Disentangled Attention](https://arxiv.org/abs/2006.03654) by Pengcheng He, Xiaodong Liu, Jianfeng Gao, Weizhu Chen.
|
||||||
1. **[DeBERTa-v2](https://huggingface.co/docs/transformers/model_doc/deberta-v2)** (from Microsoft) released with the paper [DeBERTa: Decoding-enhanced BERT with Disentangled Attention](https://arxiv.org/abs/2006.03654) by Pengcheng He, Xiaodong Liu, Jianfeng Gao, Weizhu Chen.
|
1. **[DeBERTa-v2](https://huggingface.co/docs/transformers/model_doc/deberta-v2)** (from Microsoft) released with the paper [DeBERTa: Decoding-enhanced BERT with Disentangled Attention](https://arxiv.org/abs/2006.03654) by Pengcheng He, Xiaodong Liu, Jianfeng Gao, Weizhu Chen.
|
||||||
1. **[Decision Transformer](https://huggingface.co/docs/transformers/model_doc/decision_transformer)** (from Berkeley/Facebook/Google) released with the paper [Decision Transformer: Reinforcement Learning via Sequence Modeling](https://arxiv.org/abs/2106.01345) by Lili Chen, Kevin Lu, Aravind Rajeswaran, Kimin Lee, Aditya Grover, Michael Laskin, Pieter Abbeel, Aravind Srinivas, Igor Mordatch.
|
1. **[Decision Transformer](https://huggingface.co/docs/transformers/model_doc/decision_transformer)** (from Berkeley/Facebook/Google) released with the paper [Decision Transformer: Reinforcement Learning via Sequence Modeling](https://arxiv.org/abs/2106.01345) by Lili Chen, Kevin Lu, Aravind Rajeswaran, Kimin Lee, Aditya Grover, Michael Laskin, Pieter Abbeel, Aravind Srinivas, Igor Mordatch.
|
||||||
|
1. **[Deformable DETR](https://huggingface.co/docs/transformers/main/model_doc/deformable_detr)** (from SenseTime Research) released with the paper [Deformable DETR: Deformable Transformers for End-to-End Object Detection](https://arxiv.org/abs/2010.04159) by Xizhou Zhu, Weijie Su, Lewei Lu, Bin Li, Xiaogang Wang, Jifeng Dai.
|
||||||
1. **[DeiT](https://huggingface.co/docs/transformers/model_doc/deit)** (from Facebook) released with the paper [Training data-efficient image transformers & distillation through attention](https://arxiv.org/abs/2012.12877) by Hugo Touvron, Matthieu Cord, Matthijs Douze, Francisco Massa, Alexandre Sablayrolles, Hervé Jégou.
|
1. **[DeiT](https://huggingface.co/docs/transformers/model_doc/deit)** (from Facebook) released with the paper [Training data-efficient image transformers & distillation through attention](https://arxiv.org/abs/2012.12877) by Hugo Touvron, Matthieu Cord, Matthijs Douze, Francisco Massa, Alexandre Sablayrolles, Hervé Jégou.
|
||||||
1. **[DETR](https://huggingface.co/docs/transformers/model_doc/detr)** (from Facebook) released with the paper [End-to-End Object Detection with Transformers](https://arxiv.org/abs/2005.12872) by Nicolas Carion, Francisco Massa, Gabriel Synnaeve, Nicolas Usunier, Alexander Kirillov, Sergey Zagoruyko.
|
1. **[DETR](https://huggingface.co/docs/transformers/model_doc/detr)** (from Facebook) released with the paper [End-to-End Object Detection with Transformers](https://arxiv.org/abs/2005.12872) by Nicolas Carion, Francisco Massa, Gabriel Synnaeve, Nicolas Usunier, Alexander Kirillov, Sergey Zagoruyko.
|
||||||
1. **[DialoGPT](https://huggingface.co/docs/transformers/model_doc/dialogpt)** (from Microsoft Research) released with the paper [DialoGPT: Large-Scale Generative Pre-training for Conversational Response Generation](https://arxiv.org/abs/1911.00536) by Yizhe Zhang, Siqi Sun, Michel Galley, Yen-Chun Chen, Chris Brockett, Xiang Gao, Jianfeng Gao, Jingjing Liu, Bill Dolan.
|
1. **[DialoGPT](https://huggingface.co/docs/transformers/model_doc/dialogpt)** (from Microsoft Research) released with the paper [DialoGPT: Large-Scale Generative Pre-training for Conversational Response Generation](https://arxiv.org/abs/1911.00536) by Yizhe Zhang, Siqi Sun, Michel Galley, Yen-Chun Chen, Chris Brockett, Xiang Gao, Jianfeng Gao, Jingjing Liu, Bill Dolan.
|
||||||
|
|||||||
@@ -237,6 +237,7 @@ Flax, PyTorch, TensorFlow 설치 페이지에서 이들을 conda로 설치하는
|
|||||||
1. **[DeBERTa](https://huggingface.co/docs/transformers/model_doc/deberta)** (from Microsoft) released with the paper [DeBERTa: Decoding-enhanced BERT with Disentangled Attention](https://arxiv.org/abs/2006.03654) by Pengcheng He, Xiaodong Liu, Jianfeng Gao, Weizhu Chen.
|
1. **[DeBERTa](https://huggingface.co/docs/transformers/model_doc/deberta)** (from Microsoft) released with the paper [DeBERTa: Decoding-enhanced BERT with Disentangled Attention](https://arxiv.org/abs/2006.03654) by Pengcheng He, Xiaodong Liu, Jianfeng Gao, Weizhu Chen.
|
||||||
1. **[DeBERTa-v2](https://huggingface.co/docs/transformers/model_doc/deberta-v2)** (from Microsoft) released with the paper [DeBERTa: Decoding-enhanced BERT with Disentangled Attention](https://arxiv.org/abs/2006.03654) by Pengcheng He, Xiaodong Liu, Jianfeng Gao, Weizhu Chen.
|
1. **[DeBERTa-v2](https://huggingface.co/docs/transformers/model_doc/deberta-v2)** (from Microsoft) released with the paper [DeBERTa: Decoding-enhanced BERT with Disentangled Attention](https://arxiv.org/abs/2006.03654) by Pengcheng He, Xiaodong Liu, Jianfeng Gao, Weizhu Chen.
|
||||||
1. **[Decision Transformer](https://huggingface.co/docs/transformers/model_doc/decision_transformer)** (from Berkeley/Facebook/Google) released with the paper [Decision Transformer: Reinforcement Learning via Sequence Modeling](https://arxiv.org/abs/2106.01345) by Lili Chen, Kevin Lu, Aravind Rajeswaran, Kimin Lee, Aditya Grover, Michael Laskin, Pieter Abbeel, Aravind Srinivas, Igor Mordatch.
|
1. **[Decision Transformer](https://huggingface.co/docs/transformers/model_doc/decision_transformer)** (from Berkeley/Facebook/Google) released with the paper [Decision Transformer: Reinforcement Learning via Sequence Modeling](https://arxiv.org/abs/2106.01345) by Lili Chen, Kevin Lu, Aravind Rajeswaran, Kimin Lee, Aditya Grover, Michael Laskin, Pieter Abbeel, Aravind Srinivas, Igor Mordatch.
|
||||||
|
1. **[Deformable DETR](https://huggingface.co/docs/transformers/main/model_doc/deformable_detr)** (from SenseTime Research) released with the paper [Deformable DETR: Deformable Transformers for End-to-End Object Detection](https://arxiv.org/abs/2010.04159) by Xizhou Zhu, Weijie Su, Lewei Lu, Bin Li, Xiaogang Wang, Jifeng Dai.
|
||||||
1. **[DeiT](https://huggingface.co/docs/transformers/model_doc/deit)** (from Facebook) released with the paper [Training data-efficient image transformers & distillation through attention](https://arxiv.org/abs/2012.12877) by Hugo Touvron, Matthieu Cord, Matthijs Douze, Francisco Massa, Alexandre Sablayrolles, Hervé Jégou.
|
1. **[DeiT](https://huggingface.co/docs/transformers/model_doc/deit)** (from Facebook) released with the paper [Training data-efficient image transformers & distillation through attention](https://arxiv.org/abs/2012.12877) by Hugo Touvron, Matthieu Cord, Matthijs Douze, Francisco Massa, Alexandre Sablayrolles, Hervé Jégou.
|
||||||
1. **[DETR](https://huggingface.co/docs/transformers/model_doc/detr)** (from Facebook) released with the paper [End-to-End Object Detection with Transformers](https://arxiv.org/abs/2005.12872) by Nicolas Carion, Francisco Massa, Gabriel Synnaeve, Nicolas Usunier, Alexander Kirillov, Sergey Zagoruyko.
|
1. **[DETR](https://huggingface.co/docs/transformers/model_doc/detr)** (from Facebook) released with the paper [End-to-End Object Detection with Transformers](https://arxiv.org/abs/2005.12872) by Nicolas Carion, Francisco Massa, Gabriel Synnaeve, Nicolas Usunier, Alexander Kirillov, Sergey Zagoruyko.
|
||||||
1. **[DialoGPT](https://huggingface.co/docs/transformers/model_doc/dialogpt)** (from Microsoft Research) released with the paper [DialoGPT: Large-Scale Generative Pre-training for Conversational Response Generation](https://arxiv.org/abs/1911.00536) by Yizhe Zhang, Siqi Sun, Michel Galley, Yen-Chun Chen, Chris Brockett, Xiang Gao, Jianfeng Gao, Jingjing Liu, Bill Dolan.
|
1. **[DialoGPT](https://huggingface.co/docs/transformers/model_doc/dialogpt)** (from Microsoft Research) released with the paper [DialoGPT: Large-Scale Generative Pre-training for Conversational Response Generation](https://arxiv.org/abs/1911.00536) by Yizhe Zhang, Siqi Sun, Michel Galley, Yen-Chun Chen, Chris Brockett, Xiang Gao, Jianfeng Gao, Jingjing Liu, Bill Dolan.
|
||||||
|
|||||||
@@ -261,6 +261,7 @@ conda install -c huggingface transformers
|
|||||||
1. **[DeBERTa](https://huggingface.co/docs/transformers/model_doc/deberta)** (来自 Microsoft) 伴随论文 [DeBERTa: Decoding-enhanced BERT with Disentangled Attention](https://arxiv.org/abs/2006.03654) 由 Pengcheng He, Xiaodong Liu, Jianfeng Gao, Weizhu Chen 发布。
|
1. **[DeBERTa](https://huggingface.co/docs/transformers/model_doc/deberta)** (来自 Microsoft) 伴随论文 [DeBERTa: Decoding-enhanced BERT with Disentangled Attention](https://arxiv.org/abs/2006.03654) 由 Pengcheng He, Xiaodong Liu, Jianfeng Gao, Weizhu Chen 发布。
|
||||||
1. **[DeBERTa-v2](https://huggingface.co/docs/transformers/model_doc/deberta-v2)** (来自 Microsoft) 伴随论文 [DeBERTa: Decoding-enhanced BERT with Disentangled Attention](https://arxiv.org/abs/2006.03654) 由 Pengcheng He, Xiaodong Liu, Jianfeng Gao, Weizhu Chen 发布。
|
1. **[DeBERTa-v2](https://huggingface.co/docs/transformers/model_doc/deberta-v2)** (来自 Microsoft) 伴随论文 [DeBERTa: Decoding-enhanced BERT with Disentangled Attention](https://arxiv.org/abs/2006.03654) 由 Pengcheng He, Xiaodong Liu, Jianfeng Gao, Weizhu Chen 发布。
|
||||||
1. **[Decision Transformer](https://huggingface.co/docs/transformers/model_doc/decision_transformer)** (来自 Berkeley/Facebook/Google) 伴随论文 [Decision Transformer: Reinforcement Learning via Sequence Modeling](https://arxiv.org/abs/2106.01345) 由 Lili Chen, Kevin Lu, Aravind Rajeswaran, Kimin Lee, Aditya Grover, Michael Laskin, Pieter Abbeel, Aravind Srinivas, Igor Mordatch 发布。
|
1. **[Decision Transformer](https://huggingface.co/docs/transformers/model_doc/decision_transformer)** (来自 Berkeley/Facebook/Google) 伴随论文 [Decision Transformer: Reinforcement Learning via Sequence Modeling](https://arxiv.org/abs/2106.01345) 由 Lili Chen, Kevin Lu, Aravind Rajeswaran, Kimin Lee, Aditya Grover, Michael Laskin, Pieter Abbeel, Aravind Srinivas, Igor Mordatch 发布。
|
||||||
|
1. **[Deformable DETR](https://huggingface.co/docs/transformers/main/model_doc/deformable_detr)** (来自 SenseTime Research) 伴随论文 [Deformable DETR: Deformable Transformers for End-to-End Object Detection](https://arxiv.org/abs/2010.04159) 由 Xizhou Zhu, Weijie Su, Lewei Lu, Bin Li, Xiaogang Wang, Jifeng Dai 发布。
|
||||||
1. **[DeiT](https://huggingface.co/docs/transformers/model_doc/deit)** (来自 Facebook) 伴随论文 [Training data-efficient image transformers & distillation through attention](https://arxiv.org/abs/2012.12877) 由 Hugo Touvron, Matthieu Cord, Matthijs Douze, Francisco Massa, Alexandre Sablayrolles, Hervé Jégou 发布。
|
1. **[DeiT](https://huggingface.co/docs/transformers/model_doc/deit)** (来自 Facebook) 伴随论文 [Training data-efficient image transformers & distillation through attention](https://arxiv.org/abs/2012.12877) 由 Hugo Touvron, Matthieu Cord, Matthijs Douze, Francisco Massa, Alexandre Sablayrolles, Hervé Jégou 发布。
|
||||||
1. **[DETR](https://huggingface.co/docs/transformers/model_doc/detr)** (来自 Facebook) 伴随论文 [End-to-End Object Detection with Transformers](https://arxiv.org/abs/2005.12872) 由 Nicolas Carion, Francisco Massa, Gabriel Synnaeve, Nicolas Usunier, Alexander Kirillov, Sergey Zagoruyko 发布。
|
1. **[DETR](https://huggingface.co/docs/transformers/model_doc/detr)** (来自 Facebook) 伴随论文 [End-to-End Object Detection with Transformers](https://arxiv.org/abs/2005.12872) 由 Nicolas Carion, Francisco Massa, Gabriel Synnaeve, Nicolas Usunier, Alexander Kirillov, Sergey Zagoruyko 发布。
|
||||||
1. **[DialoGPT](https://huggingface.co/docs/transformers/model_doc/dialogpt)** (来自 Microsoft Research) 伴随论文 [DialoGPT: Large-Scale Generative Pre-training for Conversational Response Generation](https://arxiv.org/abs/1911.00536) 由 Yizhe Zhang, Siqi Sun, Michel Galley, Yen-Chun Chen, Chris Brockett, Xiang Gao, Jianfeng Gao, Jingjing Liu, Bill Dolan 发布。
|
1. **[DialoGPT](https://huggingface.co/docs/transformers/model_doc/dialogpt)** (来自 Microsoft Research) 伴随论文 [DialoGPT: Large-Scale Generative Pre-training for Conversational Response Generation](https://arxiv.org/abs/1911.00536) 由 Yizhe Zhang, Siqi Sun, Michel Galley, Yen-Chun Chen, Chris Brockett, Xiang Gao, Jianfeng Gao, Jingjing Liu, Bill Dolan 发布。
|
||||||
|
|||||||
@@ -273,6 +273,7 @@ conda install -c huggingface transformers
|
|||||||
1. **[DeBERTa](https://huggingface.co/docs/transformers/model_doc/deberta)** (from Microsoft) released with the paper [DeBERTa: Decoding-enhanced BERT with Disentangled Attention](https://arxiv.org/abs/2006.03654) by Pengcheng He, Xiaodong Liu, Jianfeng Gao, Weizhu Chen.
|
1. **[DeBERTa](https://huggingface.co/docs/transformers/model_doc/deberta)** (from Microsoft) released with the paper [DeBERTa: Decoding-enhanced BERT with Disentangled Attention](https://arxiv.org/abs/2006.03654) by Pengcheng He, Xiaodong Liu, Jianfeng Gao, Weizhu Chen.
|
||||||
1. **[DeBERTa-v2](https://huggingface.co/docs/transformers/model_doc/deberta-v2)** (from Microsoft) released with the paper [DeBERTa: Decoding-enhanced BERT with Disentangled Attention](https://arxiv.org/abs/2006.03654) by Pengcheng He, Xiaodong Liu, Jianfeng Gao, Weizhu Chen.
|
1. **[DeBERTa-v2](https://huggingface.co/docs/transformers/model_doc/deberta-v2)** (from Microsoft) released with the paper [DeBERTa: Decoding-enhanced BERT with Disentangled Attention](https://arxiv.org/abs/2006.03654) by Pengcheng He, Xiaodong Liu, Jianfeng Gao, Weizhu Chen.
|
||||||
1. **[Decision Transformer](https://huggingface.co/docs/transformers/model_doc/decision_transformer)** (from Berkeley/Facebook/Google) released with the paper [Decision Transformer: Reinforcement Learning via Sequence Modeling](https://arxiv.org/abs/2106.01345) by Lili Chen, Kevin Lu, Aravind Rajeswaran, Kimin Lee, Aditya Grover, Michael Laskin, Pieter Abbeel, Aravind Srinivas, Igor Mordatch.
|
1. **[Decision Transformer](https://huggingface.co/docs/transformers/model_doc/decision_transformer)** (from Berkeley/Facebook/Google) released with the paper [Decision Transformer: Reinforcement Learning via Sequence Modeling](https://arxiv.org/abs/2106.01345) by Lili Chen, Kevin Lu, Aravind Rajeswaran, Kimin Lee, Aditya Grover, Michael Laskin, Pieter Abbeel, Aravind Srinivas, Igor Mordatch.
|
||||||
|
1. **[Deformable DETR](https://huggingface.co/docs/transformers/main/model_doc/deformable_detr)** (from SenseTime Research) released with the paper [Deformable DETR: Deformable Transformers for End-to-End Object Detection](https://arxiv.org/abs/2010.04159) by Xizhou Zhu, Weijie Su, Lewei Lu, Bin Li, Xiaogang Wang, Jifeng Dai.
|
||||||
1. **[DeiT](https://huggingface.co/docs/transformers/model_doc/deit)** (from Facebook) released with the paper [Training data-efficient image transformers & distillation through attention](https://arxiv.org/abs/2012.12877) by Hugo Touvron, Matthieu Cord, Matthijs Douze, Francisco Massa, Alexandre Sablayrolles, Hervé Jégou.
|
1. **[DeiT](https://huggingface.co/docs/transformers/model_doc/deit)** (from Facebook) released with the paper [Training data-efficient image transformers & distillation through attention](https://arxiv.org/abs/2012.12877) by Hugo Touvron, Matthieu Cord, Matthijs Douze, Francisco Massa, Alexandre Sablayrolles, Hervé Jégou.
|
||||||
1. **[DETR](https://huggingface.co/docs/transformers/model_doc/detr)** (from Facebook) released with the paper [End-to-End Object Detection with Transformers](https://arxiv.org/abs/2005.12872) by Nicolas Carion, Francisco Massa, Gabriel Synnaeve, Nicolas Usunier, Alexander Kirillov, Sergey Zagoruyko.
|
1. **[DETR](https://huggingface.co/docs/transformers/model_doc/detr)** (from Facebook) released with the paper [End-to-End Object Detection with Transformers](https://arxiv.org/abs/2005.12872) by Nicolas Carion, Francisco Massa, Gabriel Synnaeve, Nicolas Usunier, Alexander Kirillov, Sergey Zagoruyko.
|
||||||
1. **[DialoGPT](https://huggingface.co/docs/transformers/model_doc/dialogpt)** (from Microsoft Research) released with the paper [DialoGPT: Large-Scale Generative Pre-training for Conversational Response Generation](https://arxiv.org/abs/1911.00536) by Yizhe Zhang, Siqi Sun, Michel Galley, Yen-Chun Chen, Chris Brockett, Xiang Gao, Jianfeng Gao, Jingjing Liu, Bill Dolan.
|
1. **[DialoGPT](https://huggingface.co/docs/transformers/model_doc/dialogpt)** (from Microsoft Research) released with the paper [DialoGPT: Large-Scale Generative Pre-training for Conversational Response Generation](https://arxiv.org/abs/1911.00536) by Yizhe Zhang, Siqi Sun, Michel Galley, Yen-Chun Chen, Chris Brockett, Xiang Gao, Jianfeng Gao, Jingjing Liu, Bill Dolan.
|
||||||
|
|||||||
@@ -364,6 +364,8 @@
|
|||||||
title: ConvNeXT
|
title: ConvNeXT
|
||||||
- local: model_doc/cvt
|
- local: model_doc/cvt
|
||||||
title: CvT
|
title: CvT
|
||||||
|
- local: model_doc/deformable_detr
|
||||||
|
title: Deformable DETR
|
||||||
- local: model_doc/deit
|
- local: model_doc/deit
|
||||||
title: DeiT
|
title: DeiT
|
||||||
- local: model_doc/detr
|
- local: model_doc/detr
|
||||||
|
|||||||
@@ -77,6 +77,7 @@ The documentation is organized into five sections:
|
|||||||
1. **[DeBERTa](model_doc/deberta)** (from Microsoft) released with the paper [DeBERTa: Decoding-enhanced BERT with Disentangled Attention](https://arxiv.org/abs/2006.03654) by Pengcheng He, Xiaodong Liu, Jianfeng Gao, Weizhu Chen.
|
1. **[DeBERTa](model_doc/deberta)** (from Microsoft) released with the paper [DeBERTa: Decoding-enhanced BERT with Disentangled Attention](https://arxiv.org/abs/2006.03654) by Pengcheng He, Xiaodong Liu, Jianfeng Gao, Weizhu Chen.
|
||||||
1. **[DeBERTa-v2](model_doc/deberta-v2)** (from Microsoft) released with the paper [DeBERTa: Decoding-enhanced BERT with Disentangled Attention](https://arxiv.org/abs/2006.03654) by Pengcheng He, Xiaodong Liu, Jianfeng Gao, Weizhu Chen.
|
1. **[DeBERTa-v2](model_doc/deberta-v2)** (from Microsoft) released with the paper [DeBERTa: Decoding-enhanced BERT with Disentangled Attention](https://arxiv.org/abs/2006.03654) by Pengcheng He, Xiaodong Liu, Jianfeng Gao, Weizhu Chen.
|
||||||
1. **[Decision Transformer](model_doc/decision_transformer)** (from Berkeley/Facebook/Google) released with the paper [Decision Transformer: Reinforcement Learning via Sequence Modeling](https://arxiv.org/abs/2106.01345) by Lili Chen, Kevin Lu, Aravind Rajeswaran, Kimin Lee, Aditya Grover, Michael Laskin, Pieter Abbeel, Aravind Srinivas, Igor Mordatch.
|
1. **[Decision Transformer](model_doc/decision_transformer)** (from Berkeley/Facebook/Google) released with the paper [Decision Transformer: Reinforcement Learning via Sequence Modeling](https://arxiv.org/abs/2106.01345) by Lili Chen, Kevin Lu, Aravind Rajeswaran, Kimin Lee, Aditya Grover, Michael Laskin, Pieter Abbeel, Aravind Srinivas, Igor Mordatch.
|
||||||
|
1. **[Deformable DETR](model_doc/deformable_detr)** (from SenseTime Research) released with the paper [Deformable DETR: Deformable Transformers for End-to-End Object Detection](https://arxiv.org/abs/2010.04159) by Xizhou Zhu, Weijie Su, Lewei Lu, Bin Li, Xiaogang Wang, Jifeng Dai.
|
||||||
1. **[DeiT](model_doc/deit)** (from Facebook) released with the paper [Training data-efficient image transformers & distillation through attention](https://arxiv.org/abs/2012.12877) by Hugo Touvron, Matthieu Cord, Matthijs Douze, Francisco Massa, Alexandre Sablayrolles, Hervé Jégou.
|
1. **[DeiT](model_doc/deit)** (from Facebook) released with the paper [Training data-efficient image transformers & distillation through attention](https://arxiv.org/abs/2012.12877) by Hugo Touvron, Matthieu Cord, Matthijs Douze, Francisco Massa, Alexandre Sablayrolles, Hervé Jégou.
|
||||||
1. **[DETR](model_doc/detr)** (from Facebook) released with the paper [End-to-End Object Detection with Transformers](https://arxiv.org/abs/2005.12872) by Nicolas Carion, Francisco Massa, Gabriel Synnaeve, Nicolas Usunier, Alexander Kirillov, Sergey Zagoruyko.
|
1. **[DETR](model_doc/detr)** (from Facebook) released with the paper [End-to-End Object Detection with Transformers](https://arxiv.org/abs/2005.12872) by Nicolas Carion, Francisco Massa, Gabriel Synnaeve, Nicolas Usunier, Alexander Kirillov, Sergey Zagoruyko.
|
||||||
1. **[DialoGPT](model_doc/dialogpt)** (from Microsoft Research) released with the paper [DialoGPT: Large-Scale Generative Pre-training for Conversational Response Generation](https://arxiv.org/abs/1911.00536) by Yizhe Zhang, Siqi Sun, Michel Galley, Yen-Chun Chen, Chris Brockett, Xiang Gao, Jianfeng Gao, Jingjing Liu, Bill Dolan.
|
1. **[DialoGPT](model_doc/dialogpt)** (from Microsoft Research) released with the paper [DialoGPT: Large-Scale Generative Pre-training for Conversational Response Generation](https://arxiv.org/abs/1911.00536) by Yizhe Zhang, Siqi Sun, Michel Galley, Yen-Chun Chen, Chris Brockett, Xiang Gao, Jianfeng Gao, Jingjing Liu, Bill Dolan.
|
||||||
@@ -223,6 +224,7 @@ Flax), PyTorch, and/or TensorFlow.
|
|||||||
| DeBERTa | ✅ | ✅ | ✅ | ✅ | ❌ |
|
| DeBERTa | ✅ | ✅ | ✅ | ✅ | ❌ |
|
||||||
| DeBERTa-v2 | ✅ | ✅ | ✅ | ✅ | ❌ |
|
| DeBERTa-v2 | ✅ | ✅ | ✅ | ✅ | ❌ |
|
||||||
| Decision Transformer | ❌ | ❌ | ✅ | ❌ | ❌ |
|
| Decision Transformer | ❌ | ❌ | ✅ | ❌ | ❌ |
|
||||||
|
| Deformable DETR | ❌ | ❌ | ✅ | ❌ | ❌ |
|
||||||
| DeiT | ❌ | ❌ | ✅ | ✅ | ❌ |
|
| DeiT | ❌ | ❌ | ✅ | ✅ | ❌ |
|
||||||
| DETR | ❌ | ❌ | ✅ | ❌ | ❌ |
|
| DETR | ❌ | ❌ | ✅ | ❌ | ❌ |
|
||||||
| DistilBERT | ✅ | ✅ | ✅ | ✅ | ✅ |
|
| DistilBERT | ✅ | ✅ | ✅ | ✅ | ✅ |
|
||||||
|
|||||||
50
docs/source/en/model_doc/deformable_detr.mdx
Normal file
50
docs/source/en/model_doc/deformable_detr.mdx
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
<!--Copyright 2022 The HuggingFace Team. All rights reserved.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
|
||||||
|
the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
|
||||||
|
an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations under the License.
|
||||||
|
-->
|
||||||
|
|
||||||
|
# Deformable DETR
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
The Deformable DETR model was proposed in [Deformable DETR: Deformable Transformers for End-to-End Object Detection](https://arxiv.org/abs/2010.04159) by Xizhou Zhu, Weijie Su, Lewei Lu, Bin Li, Xiaogang Wang, Jifeng Dai.
|
||||||
|
Deformable DETR mitigates the slow convergence issues and limited feature spatial resolution of the original [DETR](detr) by leveraging a new deformable attention module which only attends to a small set of key sampling points around a reference.
|
||||||
|
|
||||||
|
The abstract from the paper is the following:
|
||||||
|
|
||||||
|
*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 times less training epochs. Extensive experiments on the COCO benchmark demonstrate the effectiveness of our approach.*
|
||||||
|
|
||||||
|
Tips:
|
||||||
|
|
||||||
|
- One can use the [`AutoFeatureExtractor`] API to prepare images (and optional targets) for the model. This will instantiate a [`DetrFeatureExtractor`] behind the scenes.
|
||||||
|
- Training Deformable DETR is equivalent to training the original [DETR](detr) model. Demo notebooks can be found [here](https://github.com/NielsRogge/Transformers-Tutorials/tree/master/DETR).
|
||||||
|
|
||||||
|
<img src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/deformable_detr_architecture.png"
|
||||||
|
alt="drawing" width="600"/>
|
||||||
|
|
||||||
|
<small> Deformable DETR architecture. Taken from the <a href="https://arxiv.org/abs/2010.04159">original paper</a>.</small>
|
||||||
|
|
||||||
|
This model was contributed by [nielsr](https://huggingface.co/nielsr). The original code can be found [here](https://github.com/fundamentalvision/Deformable-DETR).
|
||||||
|
|
||||||
|
## DeformableDetrConfig
|
||||||
|
|
||||||
|
[[autodoc]] DeformableDetrConfig
|
||||||
|
|
||||||
|
|
||||||
|
## DeformableDetrModel
|
||||||
|
|
||||||
|
[[autodoc]] DeformableDetrModel
|
||||||
|
- forward
|
||||||
|
|
||||||
|
|
||||||
|
## DeformableDetrForObjectDetection
|
||||||
|
|
||||||
|
[[autodoc]] DeformableDetrForObjectDetection
|
||||||
|
- forward
|
||||||
1
setup.py
1
setup.py
@@ -411,6 +411,7 @@ setup(
|
|||||||
url="https://github.com/huggingface/transformers",
|
url="https://github.com/huggingface/transformers",
|
||||||
package_dir={"": "src"},
|
package_dir={"": "src"},
|
||||||
packages=find_packages("src"),
|
packages=find_packages("src"),
|
||||||
|
package_data={"transformers": ["py.typed", "*.cu", "*.cpp", "*.cuh", "*.h"]},
|
||||||
zip_safe=False,
|
zip_safe=False,
|
||||||
extras_require=extras,
|
extras_require=extras,
|
||||||
entry_points={"console_scripts": ["transformers-cli=transformers.commands.transformers_cli:main"]},
|
entry_points={"console_scripts": ["transformers-cli=transformers.commands.transformers_cli:main"]},
|
||||||
|
|||||||
@@ -187,6 +187,7 @@ _import_structure = {
|
|||||||
"models.deberta": ["DEBERTA_PRETRAINED_CONFIG_ARCHIVE_MAP", "DebertaConfig", "DebertaTokenizer"],
|
"models.deberta": ["DEBERTA_PRETRAINED_CONFIG_ARCHIVE_MAP", "DebertaConfig", "DebertaTokenizer"],
|
||||||
"models.deberta_v2": ["DEBERTA_V2_PRETRAINED_CONFIG_ARCHIVE_MAP", "DebertaV2Config"],
|
"models.deberta_v2": ["DEBERTA_V2_PRETRAINED_CONFIG_ARCHIVE_MAP", "DebertaV2Config"],
|
||||||
"models.decision_transformer": ["DECISION_TRANSFORMER_PRETRAINED_CONFIG_ARCHIVE_MAP", "DecisionTransformerConfig"],
|
"models.decision_transformer": ["DECISION_TRANSFORMER_PRETRAINED_CONFIG_ARCHIVE_MAP", "DecisionTransformerConfig"],
|
||||||
|
"models.deformable_detr": ["DEFORMABLE_DETR_PRETRAINED_CONFIG_ARCHIVE_MAP", "DeformableDetrConfig"],
|
||||||
"models.deit": ["DEIT_PRETRAINED_CONFIG_ARCHIVE_MAP", "DeiTConfig"],
|
"models.deit": ["DEIT_PRETRAINED_CONFIG_ARCHIVE_MAP", "DeiTConfig"],
|
||||||
"models.detr": ["DETR_PRETRAINED_CONFIG_ARCHIVE_MAP", "DetrConfig"],
|
"models.detr": ["DETR_PRETRAINED_CONFIG_ARCHIVE_MAP", "DetrConfig"],
|
||||||
"models.dialogpt": [],
|
"models.dialogpt": [],
|
||||||
@@ -682,12 +683,20 @@ try:
|
|||||||
if not (is_timm_available() and is_vision_available()):
|
if not (is_timm_available() and is_vision_available()):
|
||||||
raise OptionalDependencyNotAvailable()
|
raise OptionalDependencyNotAvailable()
|
||||||
except OptionalDependencyNotAvailable:
|
except OptionalDependencyNotAvailable:
|
||||||
from .utils import dummy_timm_objects
|
from .utils import dummy_timm_and_vision_objects
|
||||||
|
|
||||||
_import_structure["utils.dummy_timm_objects"] = [
|
_import_structure["utils.dummy_timm_and_vision_objects"] = [
|
||||||
name for name in dir(dummy_timm_objects) if not name.startswith("_")
|
name for name in dir(dummy_timm_and_vision_objects) if not name.startswith("_")
|
||||||
]
|
]
|
||||||
else:
|
else:
|
||||||
|
_import_structure["models.deformable_detr"].extend(
|
||||||
|
[
|
||||||
|
"DEFORMABLE_DETR_PRETRAINED_MODEL_ARCHIVE_LIST",
|
||||||
|
"DeformableDetrForObjectDetection",
|
||||||
|
"DeformableDetrModel",
|
||||||
|
"DeformableDetrPreTrainedModel",
|
||||||
|
]
|
||||||
|
)
|
||||||
_import_structure["models.detr"].extend(
|
_import_structure["models.detr"].extend(
|
||||||
[
|
[
|
||||||
"DETR_PRETRAINED_MODEL_ARCHIVE_LIST",
|
"DETR_PRETRAINED_MODEL_ARCHIVE_LIST",
|
||||||
@@ -3072,6 +3081,7 @@ if TYPE_CHECKING:
|
|||||||
DECISION_TRANSFORMER_PRETRAINED_CONFIG_ARCHIVE_MAP,
|
DECISION_TRANSFORMER_PRETRAINED_CONFIG_ARCHIVE_MAP,
|
||||||
DecisionTransformerConfig,
|
DecisionTransformerConfig,
|
||||||
)
|
)
|
||||||
|
from .models.deformable_detr import DEFORMABLE_DETR_PRETRAINED_CONFIG_ARCHIVE_MAP, DeformableDetrConfig
|
||||||
from .models.deit import DEIT_PRETRAINED_CONFIG_ARCHIVE_MAP, DeiTConfig
|
from .models.deit import DEIT_PRETRAINED_CONFIG_ARCHIVE_MAP, DeiTConfig
|
||||||
from .models.detr import DETR_PRETRAINED_CONFIG_ARCHIVE_MAP, DetrConfig
|
from .models.detr import DETR_PRETRAINED_CONFIG_ARCHIVE_MAP, DetrConfig
|
||||||
from .models.distilbert import DISTILBERT_PRETRAINED_CONFIG_ARCHIVE_MAP, DistilBertConfig, DistilBertTokenizer
|
from .models.distilbert import DISTILBERT_PRETRAINED_CONFIG_ARCHIVE_MAP, DistilBertConfig, DistilBertTokenizer
|
||||||
@@ -3502,8 +3512,14 @@ if TYPE_CHECKING:
|
|||||||
if not (is_timm_available() and is_vision_available()):
|
if not (is_timm_available() and is_vision_available()):
|
||||||
raise OptionalDependencyNotAvailable()
|
raise OptionalDependencyNotAvailable()
|
||||||
except OptionalDependencyNotAvailable:
|
except OptionalDependencyNotAvailable:
|
||||||
from .utils.dummy_timm_objects import *
|
from .utils.dummy_timm_and_vision_objects import *
|
||||||
else:
|
else:
|
||||||
|
from .models.deformable_detr import (
|
||||||
|
DEFORMABLE_DETR_PRETRAINED_MODEL_ARCHIVE_LIST,
|
||||||
|
DeformableDetrForObjectDetection,
|
||||||
|
DeformableDetrModel,
|
||||||
|
DeformableDetrPreTrainedModel,
|
||||||
|
)
|
||||||
from .models.detr import (
|
from .models.detr import (
|
||||||
DETR_PRETRAINED_MODEL_ARCHIVE_LIST,
|
DETR_PRETRAINED_MODEL_ARCHIVE_LIST,
|
||||||
DetrForObjectDetection,
|
DetrForObjectDetection,
|
||||||
|
|||||||
@@ -47,6 +47,7 @@ from . import (
|
|||||||
deberta,
|
deberta,
|
||||||
deberta_v2,
|
deberta_v2,
|
||||||
decision_transformer,
|
decision_transformer,
|
||||||
|
deformable_detr,
|
||||||
deit,
|
deit,
|
||||||
detr,
|
detr,
|
||||||
dialogpt,
|
dialogpt,
|
||||||
|
|||||||
@@ -53,6 +53,7 @@ CONFIG_MAPPING_NAMES = OrderedDict(
|
|||||||
("deberta", "DebertaConfig"),
|
("deberta", "DebertaConfig"),
|
||||||
("deberta-v2", "DebertaV2Config"),
|
("deberta-v2", "DebertaV2Config"),
|
||||||
("decision_transformer", "DecisionTransformerConfig"),
|
("decision_transformer", "DecisionTransformerConfig"),
|
||||||
|
("deformable_detr", "DeformableDetrConfig"),
|
||||||
("deit", "DeiTConfig"),
|
("deit", "DeiTConfig"),
|
||||||
("detr", "DetrConfig"),
|
("detr", "DetrConfig"),
|
||||||
("distilbert", "DistilBertConfig"),
|
("distilbert", "DistilBertConfig"),
|
||||||
@@ -182,6 +183,7 @@ CONFIG_ARCHIVE_MAP_MAPPING_NAMES = OrderedDict(
|
|||||||
("data2vec-vision", "DATA2VEC_VISION_PRETRAINED_CONFIG_ARCHIVE_MAP"),
|
("data2vec-vision", "DATA2VEC_VISION_PRETRAINED_CONFIG_ARCHIVE_MAP"),
|
||||||
("deberta", "DEBERTA_PRETRAINED_CONFIG_ARCHIVE_MAP"),
|
("deberta", "DEBERTA_PRETRAINED_CONFIG_ARCHIVE_MAP"),
|
||||||
("deberta-v2", "DEBERTA_V2_PRETRAINED_CONFIG_ARCHIVE_MAP"),
|
("deberta-v2", "DEBERTA_V2_PRETRAINED_CONFIG_ARCHIVE_MAP"),
|
||||||
|
("deformable_detr", "DEFORMABLE_DETR_PRETRAINED_CONFIG_ARCHIVE_MAP"),
|
||||||
("deit", "DEIT_PRETRAINED_CONFIG_ARCHIVE_MAP"),
|
("deit", "DEIT_PRETRAINED_CONFIG_ARCHIVE_MAP"),
|
||||||
("detr", "DETR_PRETRAINED_CONFIG_ARCHIVE_MAP"),
|
("detr", "DETR_PRETRAINED_CONFIG_ARCHIVE_MAP"),
|
||||||
("distilbert", "DISTILBERT_PRETRAINED_CONFIG_ARCHIVE_MAP"),
|
("distilbert", "DISTILBERT_PRETRAINED_CONFIG_ARCHIVE_MAP"),
|
||||||
@@ -307,6 +309,7 @@ MODEL_NAMES_MAPPING = OrderedDict(
|
|||||||
("deberta", "DeBERTa"),
|
("deberta", "DeBERTa"),
|
||||||
("deberta-v2", "DeBERTa-v2"),
|
("deberta-v2", "DeBERTa-v2"),
|
||||||
("decision_transformer", "Decision Transformer"),
|
("decision_transformer", "Decision Transformer"),
|
||||||
|
("deformable_detr", "Deformable DETR"),
|
||||||
("deit", "DeiT"),
|
("deit", "DeiT"),
|
||||||
("detr", "DETR"),
|
("detr", "DETR"),
|
||||||
("dialogpt", "DialoGPT"),
|
("dialogpt", "DialoGPT"),
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ FEATURE_EXTRACTOR_MAPPING_NAMES = OrderedDict(
|
|||||||
("cvt", "ConvNextFeatureExtractor"),
|
("cvt", "ConvNextFeatureExtractor"),
|
||||||
("data2vec-audio", "Wav2Vec2FeatureExtractor"),
|
("data2vec-audio", "Wav2Vec2FeatureExtractor"),
|
||||||
("data2vec-vision", "BeitFeatureExtractor"),
|
("data2vec-vision", "BeitFeatureExtractor"),
|
||||||
|
("deformable_detr", "DetrFeatureExtractor"),
|
||||||
("deit", "DeiTFeatureExtractor"),
|
("deit", "DeiTFeatureExtractor"),
|
||||||
("detr", "DetrFeatureExtractor"),
|
("detr", "DetrFeatureExtractor"),
|
||||||
("detr", "DetrFeatureExtractor"),
|
("detr", "DetrFeatureExtractor"),
|
||||||
|
|||||||
@@ -53,6 +53,7 @@ MODEL_MAPPING_NAMES = OrderedDict(
|
|||||||
("deberta-v2", "DebertaV2Model"),
|
("deberta-v2", "DebertaV2Model"),
|
||||||
("decision_transformer", "DecisionTransformerModel"),
|
("decision_transformer", "DecisionTransformerModel"),
|
||||||
("decision_transformer_gpt2", "DecisionTransformerGPT2Model"),
|
("decision_transformer_gpt2", "DecisionTransformerGPT2Model"),
|
||||||
|
("deformable_detr", "DeformableDetrModel"),
|
||||||
("deit", "DeiTModel"),
|
("deit", "DeiTModel"),
|
||||||
("detr", "DetrModel"),
|
("detr", "DetrModel"),
|
||||||
("distilbert", "DistilBertModel"),
|
("distilbert", "DistilBertModel"),
|
||||||
@@ -451,6 +452,7 @@ MODEL_FOR_MASKED_LM_MAPPING_NAMES = OrderedDict(
|
|||||||
MODEL_FOR_OBJECT_DETECTION_MAPPING_NAMES = OrderedDict(
|
MODEL_FOR_OBJECT_DETECTION_MAPPING_NAMES = OrderedDict(
|
||||||
[
|
[
|
||||||
# Model for Object Detection mapping
|
# Model for Object Detection mapping
|
||||||
|
("deformable_detr", "DeformableDetrForObjectDetection"),
|
||||||
("detr", "DetrForObjectDetection"),
|
("detr", "DetrForObjectDetection"),
|
||||||
("yolos", "YolosForObjectDetection"),
|
("yolos", "YolosForObjectDetection"),
|
||||||
]
|
]
|
||||||
|
|||||||
61
src/transformers/models/deformable_detr/__init__.py
Normal file
61
src/transformers/models/deformable_detr/__init__.py
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
# flake8: noqa
|
||||||
|
# There's no way to ignore "F401 '...' imported but unused" warnings in this
|
||||||
|
# module, but to preserve other warnings. So, don't check this module at all.
|
||||||
|
|
||||||
|
# Copyright 2022 The HuggingFace Team. All rights reserved.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
|
||||||
|
from typing import TYPE_CHECKING
|
||||||
|
|
||||||
|
from ...utils import OptionalDependencyNotAvailable, _LazyModule, is_timm_available
|
||||||
|
|
||||||
|
|
||||||
|
_import_structure = {
|
||||||
|
"configuration_deformable_detr": ["DEFORMABLE_DETR_PRETRAINED_CONFIG_ARCHIVE_MAP", "DeformableDetrConfig"],
|
||||||
|
}
|
||||||
|
|
||||||
|
try:
|
||||||
|
if not is_timm_available():
|
||||||
|
raise OptionalDependencyNotAvailable()
|
||||||
|
except OptionalDependencyNotAvailable:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
_import_structure["modeling_deformable_detr"] = [
|
||||||
|
"DEFORMABLE_DETR_PRETRAINED_MODEL_ARCHIVE_LIST",
|
||||||
|
"DeformableDetrForObjectDetection",
|
||||||
|
"DeformableDetrModel",
|
||||||
|
"DeformableDetrPreTrainedModel",
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
if TYPE_CHECKING:
|
||||||
|
from .configuration_deformable_detr import DEFORMABLE_DETR_PRETRAINED_CONFIG_ARCHIVE_MAP, DeformableDetrConfig
|
||||||
|
|
||||||
|
try:
|
||||||
|
if not is_timm_available():
|
||||||
|
raise OptionalDependencyNotAvailable()
|
||||||
|
except OptionalDependencyNotAvailable:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
from .modeling_deformable_detr import (
|
||||||
|
DEFORMABLE_DETR_PRETRAINED_MODEL_ARCHIVE_LIST,
|
||||||
|
DeformableDetrForObjectDetection,
|
||||||
|
DeformableDetrModel,
|
||||||
|
DeformableDetrPreTrainedModel,
|
||||||
|
)
|
||||||
|
|
||||||
|
else:
|
||||||
|
import sys
|
||||||
|
|
||||||
|
sys.modules[__name__] = _LazyModule(__name__, globals()["__file__"], _import_structure, module_spec=__spec__)
|
||||||
@@ -0,0 +1,227 @@
|
|||||||
|
# coding=utf-8
|
||||||
|
# Copyright 2022 SenseTime and The HuggingFace Inc. team. All rights reserved.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
""" Deformable DETR model configuration"""
|
||||||
|
|
||||||
|
from ...configuration_utils import PretrainedConfig
|
||||||
|
from ...utils import logging
|
||||||
|
|
||||||
|
|
||||||
|
logger = logging.get_logger(__name__)
|
||||||
|
|
||||||
|
DEFORMABLE_DETR_PRETRAINED_CONFIG_ARCHIVE_MAP = {
|
||||||
|
"SenseTime/deformable-detr": "https://huggingface.co/sensetime/deformable-detr/resolve/main/config.json",
|
||||||
|
# See all Deformable DETR models at https://huggingface.co/models?filter=deformable-detr
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class DeformableDetrConfig(PretrainedConfig):
|
||||||
|
r"""
|
||||||
|
This is the configuration class to store the configuration of a [`DeformableDetrModel`]. It is used to instantiate
|
||||||
|
a Deformable DETR model according to the specified arguments, defining the model architecture. Instantiating a
|
||||||
|
configuration with the defaults will yield a similar configuration to that of the Deformable DETR
|
||||||
|
[SenseTime/deformable-detr](https://huggingface.co/SenseTime/deformable-detr) architecture.
|
||||||
|
|
||||||
|
Configuration objects inherit from [`PretrainedConfig`] and can be used to control the model outputs. Read the
|
||||||
|
documentation from [`PretrainedConfig`] for more information.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
num_queries (`int`, *optional*, defaults to 300):
|
||||||
|
Number of object queries, i.e. detection slots. This is the maximal number of objects
|
||||||
|
[`DeformableDetrModel`] can detect in a single image. In case `two_stage` is set to `True`, we use
|
||||||
|
`two_stage_num_proposals` instead.
|
||||||
|
d_model (`int`, *optional*, defaults to 256):
|
||||||
|
Dimension of the layers.
|
||||||
|
encoder_layers (`int`, *optional*, defaults to 6):
|
||||||
|
Number of encoder layers.
|
||||||
|
decoder_layers (`int`, *optional*, defaults to 6):
|
||||||
|
Number of decoder layers.
|
||||||
|
encoder_attention_heads (`int`, *optional*, defaults to 8):
|
||||||
|
Number of attention heads for each attention layer in the Transformer encoder.
|
||||||
|
decoder_attention_heads (`int`, *optional*, defaults to 8):
|
||||||
|
Number of attention heads for each attention layer in the Transformer decoder.
|
||||||
|
decoder_ffn_dim (`int`, *optional*, defaults to 1024):
|
||||||
|
Dimension of the "intermediate" (often named feed-forward) layer in decoder.
|
||||||
|
encoder_ffn_dim (`int`, *optional*, defaults to 1024):
|
||||||
|
Dimension of the "intermediate" (often named feed-forward) layer in decoder.
|
||||||
|
activation_function (`str` or `function`, *optional*, defaults to `"relu"`):
|
||||||
|
The non-linear activation function (function or string) in the encoder and pooler. If string, `"gelu"`,
|
||||||
|
`"relu"`, `"silu"` and `"gelu_new"` are supported.
|
||||||
|
dropout (`float`, *optional*, defaults to 0.1):
|
||||||
|
The dropout probability for all fully connected layers in the embeddings, encoder, and pooler.
|
||||||
|
attention_dropout (`float`, *optional*, defaults to 0.0):
|
||||||
|
The dropout ratio for the attention probabilities.
|
||||||
|
activation_dropout (`float`, *optional*, defaults to 0.0):
|
||||||
|
The dropout ratio for activations inside the fully connected layer.
|
||||||
|
init_std (`float`, *optional*, defaults to 0.02):
|
||||||
|
The standard deviation of the truncated_normal_initializer for initializing all weight matrices.
|
||||||
|
init_xavier_std (`float`, *optional*, defaults to 1):
|
||||||
|
The scaling factor used for the Xavier initialization gain in the HM Attention map module.
|
||||||
|
encoder_layerdrop: (`float`, *optional*, defaults to 0.0):
|
||||||
|
The LayerDrop probability for the encoder. See the [LayerDrop paper](see https://arxiv.org/abs/1909.11556)
|
||||||
|
for more details.
|
||||||
|
decoder_layerdrop: (`float`, *optional*, defaults to 0.0):
|
||||||
|
The LayerDrop probability for the decoder. See the [LayerDrop paper](see https://arxiv.org/abs/1909.11556)
|
||||||
|
for more details.
|
||||||
|
auxiliary_loss (`bool`, *optional*, defaults to `False`):
|
||||||
|
Whether auxiliary decoding losses (loss at each decoder layer) are to be used.
|
||||||
|
position_embedding_type (`str`, *optional*, defaults to `"sine"`):
|
||||||
|
Type of position embeddings to be used on top of the image features. One of `"sine"` or `"learned"`.
|
||||||
|
backbone (`str`, *optional*, defaults to `"resnet50"`):
|
||||||
|
Name of convolutional backbone to use. Supports any convolutional backbone from the timm package. For a
|
||||||
|
list of all available models, see [this
|
||||||
|
page](https://rwightman.github.io/pytorch-image-models/#load-a-pretrained-model).
|
||||||
|
dilation (`bool`, *optional*, defaults to `False`):
|
||||||
|
Whether to replace stride with dilation in the last convolutional block (DC5).
|
||||||
|
class_cost (`float`, *optional*, defaults to 1):
|
||||||
|
Relative weight of the classification error in the Hungarian matching cost.
|
||||||
|
bbox_cost (`float`, *optional*, defaults to 5):
|
||||||
|
Relative weight of the L1 error of the bounding box coordinates in the Hungarian matching cost.
|
||||||
|
giou_cost (`float`, *optional*, defaults to 2):
|
||||||
|
Relative weight of the generalized IoU loss of the bounding box in the Hungarian matching cost.
|
||||||
|
mask_loss_coefficient (`float`, *optional*, defaults to 1):
|
||||||
|
Relative weight of the Focal loss in the panoptic segmentation loss.
|
||||||
|
dice_loss_coefficient (`float`, *optional*, defaults to 1):
|
||||||
|
Relative weight of the DICE/F-1 loss in the panoptic segmentation loss.
|
||||||
|
bbox_loss_coefficient (`float`, *optional*, defaults to 5):
|
||||||
|
Relative weight of the L1 bounding box loss in the object detection loss.
|
||||||
|
giou_loss_coefficient (`float`, *optional*, defaults to 2):
|
||||||
|
Relative weight of the generalized IoU loss in the object detection loss.
|
||||||
|
eos_coefficient (`float`, *optional*, defaults to 0.1):
|
||||||
|
Relative classification weight of the 'no-object' class in the object detection loss.
|
||||||
|
num_feature_levels (`int`, *optional*, defaults to 4):
|
||||||
|
The number of input feature levels.
|
||||||
|
encoder_n_points (`int`, *optional*, defaults to 4):
|
||||||
|
The number of sampled keys in each feature level for each attention head in the encoder.
|
||||||
|
decoder_n_points (`int`, *optional*, defaults to 4):
|
||||||
|
The number of sampled keys in each feature level for each attention head in the decoder.
|
||||||
|
two_stage (`bool`, *optional*, defaults to `False`):
|
||||||
|
Whether to apply a two-stage deformable DETR, where the region proposals are also generated by a variant of
|
||||||
|
Deformable DETR, which are further fed into the decoder for iterative bounding box refinement.
|
||||||
|
two_stage_num_proposals (`int`, *optional*, defaults to 300):
|
||||||
|
The number of region proposals to be generated, in case `two_stage` is set to `True`.
|
||||||
|
with_box_refine (`bool`, *optional*, defaults to `False`):
|
||||||
|
Whether to apply iterative bounding box refinement, where each decoder layer refines the bounding boxes
|
||||||
|
based on the predictions from the previous layer.
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
|
||||||
|
```python
|
||||||
|
>>> from transformers import DeformableDetrModel, DeformableDetrConfig
|
||||||
|
|
||||||
|
>>> # Initializing a Deformable DETR SenseTime/deformable-detr style configuration
|
||||||
|
>>> configuration = DeformableDetrConfig()
|
||||||
|
|
||||||
|
>>> # Initializing a model from the SenseTime/deformable-detr style configuration
|
||||||
|
>>> model = DeformableDetrModel(configuration)
|
||||||
|
|
||||||
|
>>> # Accessing the model configuration
|
||||||
|
>>> configuration = model.config
|
||||||
|
```"""
|
||||||
|
model_type = "deformable_detr"
|
||||||
|
attribute_map = {
|
||||||
|
"hidden_size": "d_model",
|
||||||
|
"num_attention_heads": "encoder_attention_heads",
|
||||||
|
}
|
||||||
|
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
num_queries=300,
|
||||||
|
max_position_embeddings=1024,
|
||||||
|
encoder_layers=6,
|
||||||
|
encoder_ffn_dim=1024,
|
||||||
|
encoder_attention_heads=8,
|
||||||
|
decoder_layers=6,
|
||||||
|
decoder_ffn_dim=1024,
|
||||||
|
decoder_attention_heads=8,
|
||||||
|
encoder_layerdrop=0.0,
|
||||||
|
decoder_layerdrop=0.0,
|
||||||
|
is_encoder_decoder=True,
|
||||||
|
activation_function="relu",
|
||||||
|
d_model=256,
|
||||||
|
dropout=0.1,
|
||||||
|
attention_dropout=0.0,
|
||||||
|
activation_dropout=0.0,
|
||||||
|
init_std=0.02,
|
||||||
|
init_xavier_std=1.0,
|
||||||
|
return_intermediate=True,
|
||||||
|
auxiliary_loss=False,
|
||||||
|
position_embedding_type="sine",
|
||||||
|
backbone="resnet50",
|
||||||
|
dilation=False,
|
||||||
|
num_feature_levels=4,
|
||||||
|
encoder_n_points=4,
|
||||||
|
decoder_n_points=4,
|
||||||
|
two_stage=False,
|
||||||
|
two_stage_num_proposals=300,
|
||||||
|
with_box_refine=False,
|
||||||
|
class_cost=1,
|
||||||
|
bbox_cost=5,
|
||||||
|
giou_cost=2,
|
||||||
|
mask_loss_coefficient=1,
|
||||||
|
dice_loss_coefficient=1,
|
||||||
|
bbox_loss_coefficient=5,
|
||||||
|
giou_loss_coefficient=2,
|
||||||
|
eos_coefficient=0.1,
|
||||||
|
**kwargs
|
||||||
|
):
|
||||||
|
self.num_queries = num_queries
|
||||||
|
self.max_position_embeddings = max_position_embeddings
|
||||||
|
self.d_model = d_model
|
||||||
|
self.encoder_ffn_dim = encoder_ffn_dim
|
||||||
|
self.encoder_layers = encoder_layers
|
||||||
|
self.encoder_attention_heads = encoder_attention_heads
|
||||||
|
self.decoder_ffn_dim = decoder_ffn_dim
|
||||||
|
self.decoder_layers = decoder_layers
|
||||||
|
self.decoder_attention_heads = decoder_attention_heads
|
||||||
|
self.dropout = dropout
|
||||||
|
self.attention_dropout = attention_dropout
|
||||||
|
self.activation_dropout = activation_dropout
|
||||||
|
self.activation_function = activation_function
|
||||||
|
self.init_std = init_std
|
||||||
|
self.init_xavier_std = init_xavier_std
|
||||||
|
self.encoder_layerdrop = encoder_layerdrop
|
||||||
|
self.decoder_layerdrop = decoder_layerdrop
|
||||||
|
self.auxiliary_loss = auxiliary_loss
|
||||||
|
self.position_embedding_type = position_embedding_type
|
||||||
|
self.backbone = backbone
|
||||||
|
self.dilation = dilation
|
||||||
|
# deformable attributes
|
||||||
|
self.num_feature_levels = num_feature_levels
|
||||||
|
self.encoder_n_points = encoder_n_points
|
||||||
|
self.decoder_n_points = decoder_n_points
|
||||||
|
self.two_stage = two_stage
|
||||||
|
self.two_stage_num_proposals = two_stage_num_proposals
|
||||||
|
self.with_box_refine = with_box_refine
|
||||||
|
if two_stage is True and with_box_refine is False:
|
||||||
|
raise ValueError("If two_stage is True, with_box_refine must be True.")
|
||||||
|
# Hungarian matcher
|
||||||
|
self.class_cost = class_cost
|
||||||
|
self.bbox_cost = bbox_cost
|
||||||
|
self.giou_cost = giou_cost
|
||||||
|
# Loss coefficients
|
||||||
|
self.mask_loss_coefficient = mask_loss_coefficient
|
||||||
|
self.dice_loss_coefficient = dice_loss_coefficient
|
||||||
|
self.bbox_loss_coefficient = bbox_loss_coefficient
|
||||||
|
self.giou_loss_coefficient = giou_loss_coefficient
|
||||||
|
self.eos_coefficient = eos_coefficient
|
||||||
|
super().__init__(is_encoder_decoder=is_encoder_decoder, **kwargs)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def num_attention_heads(self) -> int:
|
||||||
|
return self.encoder_attention_heads
|
||||||
|
|
||||||
|
@property
|
||||||
|
def hidden_size(self) -> int:
|
||||||
|
return self.d_model
|
||||||
@@ -0,0 +1,237 @@
|
|||||||
|
# coding=utf-8
|
||||||
|
# Copyright 2022 The HuggingFace Inc. team.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
"""Convert Deformable DETR checkpoints."""
|
||||||
|
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
import json
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
import torch
|
||||||
|
from PIL import Image
|
||||||
|
|
||||||
|
import requests
|
||||||
|
from huggingface_hub import cached_download, hf_hub_url
|
||||||
|
from transformers import DeformableDetrConfig, DeformableDetrForObjectDetection, DetrFeatureExtractor
|
||||||
|
from transformers.utils import logging
|
||||||
|
|
||||||
|
|
||||||
|
logging.set_verbosity_info()
|
||||||
|
logger = logging.get_logger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
def rename_key(orig_key):
|
||||||
|
if "backbone.0.body" in orig_key:
|
||||||
|
orig_key = orig_key.replace("backbone.0.body", "backbone.conv_encoder.model")
|
||||||
|
if "transformer" in orig_key:
|
||||||
|
orig_key = orig_key.replace("transformer.", "")
|
||||||
|
if "norm1" in orig_key:
|
||||||
|
if "encoder" in orig_key:
|
||||||
|
orig_key = orig_key.replace("norm1", "self_attn_layer_norm")
|
||||||
|
else:
|
||||||
|
orig_key = orig_key.replace("norm1", "encoder_attn_layer_norm")
|
||||||
|
if "norm2" in orig_key:
|
||||||
|
if "encoder" in orig_key:
|
||||||
|
orig_key = orig_key.replace("norm2", "final_layer_norm")
|
||||||
|
else:
|
||||||
|
orig_key = orig_key.replace("norm2", "self_attn_layer_norm")
|
||||||
|
if "norm3" in orig_key:
|
||||||
|
orig_key = orig_key.replace("norm3", "final_layer_norm")
|
||||||
|
if "linear1" in orig_key:
|
||||||
|
orig_key = orig_key.replace("linear1", "fc1")
|
||||||
|
if "linear2" in orig_key:
|
||||||
|
orig_key = orig_key.replace("linear2", "fc2")
|
||||||
|
if "query_embed" in orig_key:
|
||||||
|
orig_key = orig_key.replace("query_embed", "query_position_embeddings")
|
||||||
|
if "cross_attn" in orig_key:
|
||||||
|
orig_key = orig_key.replace("cross_attn", "encoder_attn")
|
||||||
|
|
||||||
|
return orig_key
|
||||||
|
|
||||||
|
|
||||||
|
def read_in_q_k_v(state_dict):
|
||||||
|
# transformer decoder self-attention layers
|
||||||
|
for i in range(6):
|
||||||
|
# read in weights + bias of input projection layer of self-attention
|
||||||
|
in_proj_weight = state_dict.pop(f"decoder.layers.{i}.self_attn.in_proj_weight")
|
||||||
|
in_proj_bias = state_dict.pop(f"decoder.layers.{i}.self_attn.in_proj_bias")
|
||||||
|
# next, add query, keys and values (in that order) to the state dict
|
||||||
|
state_dict[f"decoder.layers.{i}.self_attn.q_proj.weight"] = in_proj_weight[:256, :]
|
||||||
|
state_dict[f"decoder.layers.{i}.self_attn.q_proj.bias"] = in_proj_bias[:256]
|
||||||
|
state_dict[f"decoder.layers.{i}.self_attn.k_proj.weight"] = in_proj_weight[256:512, :]
|
||||||
|
state_dict[f"decoder.layers.{i}.self_attn.k_proj.bias"] = in_proj_bias[256:512]
|
||||||
|
state_dict[f"decoder.layers.{i}.self_attn.v_proj.weight"] = in_proj_weight[-256:, :]
|
||||||
|
state_dict[f"decoder.layers.{i}.self_attn.v_proj.bias"] = in_proj_bias[-256:]
|
||||||
|
|
||||||
|
|
||||||
|
# We will verify our results on an image of cute cats
|
||||||
|
def prepare_img():
|
||||||
|
url = "http://images.cocodataset.org/val2017/000000039769.jpg"
|
||||||
|
im = Image.open(requests.get(url, stream=True).raw)
|
||||||
|
|
||||||
|
return im
|
||||||
|
|
||||||
|
|
||||||
|
@torch.no_grad()
|
||||||
|
def convert_deformable_detr_checkpoint(
|
||||||
|
checkpoint_path,
|
||||||
|
single_scale,
|
||||||
|
dilation,
|
||||||
|
with_box_refine,
|
||||||
|
two_stage,
|
||||||
|
pytorch_dump_folder_path,
|
||||||
|
push_to_hub,
|
||||||
|
):
|
||||||
|
"""
|
||||||
|
Copy/paste/tweak model's weights to our Deformable DETR structure.
|
||||||
|
"""
|
||||||
|
|
||||||
|
# load default config
|
||||||
|
config = DeformableDetrConfig()
|
||||||
|
# set config attributes
|
||||||
|
if single_scale:
|
||||||
|
config.num_feature_levels = 1
|
||||||
|
config.dilation = dilation
|
||||||
|
config.with_box_refine = with_box_refine
|
||||||
|
config.two_stage = two_stage
|
||||||
|
# set labels
|
||||||
|
config.num_labels = 91
|
||||||
|
repo_id = "datasets/huggingface/label-files"
|
||||||
|
filename = "coco-detection-id2label.json"
|
||||||
|
id2label = json.load(open(cached_download(hf_hub_url(repo_id, filename)), "r"))
|
||||||
|
id2label = {int(k): v for k, v in id2label.items()}
|
||||||
|
config.id2label = id2label
|
||||||
|
config.label2id = {v: k for k, v in id2label.items()}
|
||||||
|
|
||||||
|
# load feature extractor
|
||||||
|
feature_extractor = DetrFeatureExtractor(format="coco_detection")
|
||||||
|
|
||||||
|
# prepare image
|
||||||
|
img = prepare_img()
|
||||||
|
encoding = feature_extractor(images=img, return_tensors="pt")
|
||||||
|
pixel_values = encoding["pixel_values"]
|
||||||
|
|
||||||
|
logger.info("Converting model...")
|
||||||
|
|
||||||
|
# load original state dict
|
||||||
|
state_dict = torch.load(checkpoint_path, map_location="cpu")["model"]
|
||||||
|
# rename keys
|
||||||
|
for key in state_dict.copy().keys():
|
||||||
|
val = state_dict.pop(key)
|
||||||
|
state_dict[rename_key(key)] = val
|
||||||
|
# query, key and value matrices need special treatment
|
||||||
|
read_in_q_k_v(state_dict)
|
||||||
|
# important: we need to prepend a prefix to each of the base model keys as the head models use different attributes for them
|
||||||
|
prefix = "model."
|
||||||
|
for key in state_dict.copy().keys():
|
||||||
|
if not key.startswith("class_embed") and not key.startswith("bbox_embed"):
|
||||||
|
val = state_dict.pop(key)
|
||||||
|
state_dict[prefix + key] = val
|
||||||
|
# finally, create HuggingFace model and load state dict
|
||||||
|
model = DeformableDetrForObjectDetection(config)
|
||||||
|
model.load_state_dict(state_dict)
|
||||||
|
model.eval()
|
||||||
|
|
||||||
|
device = "cuda" if torch.cuda.is_available() else "cpu"
|
||||||
|
model.to(device)
|
||||||
|
# verify our conversion
|
||||||
|
outputs = model(pixel_values.to(device))
|
||||||
|
|
||||||
|
expected_logits = torch.tensor(
|
||||||
|
[[-9.6645, -4.3449, -5.8705], [-9.7035, -3.8504, -5.0724], [-10.5634, -5.3379, -7.5116]]
|
||||||
|
)
|
||||||
|
expected_boxes = torch.tensor([[0.8693, 0.2289, 0.2492], [0.3150, 0.5489, 0.5845], [0.5563, 0.7580, 0.8518]])
|
||||||
|
|
||||||
|
if single_scale:
|
||||||
|
expected_logits = torch.tensor(
|
||||||
|
[[-9.9051, -4.2541, -6.4852], [-9.6947, -4.0854, -6.8033], [-10.0665, -5.8470, -7.7003]]
|
||||||
|
)
|
||||||
|
expected_boxes = torch.tensor([[0.7292, 0.4991, 0.5532], [0.7959, 0.2426, 0.4236], [0.7582, 0.3518, 0.4451]])
|
||||||
|
|
||||||
|
if single_scale and dilation:
|
||||||
|
expected_logits = torch.tensor(
|
||||||
|
[[-8.9652, -4.1074, -5.6635], [-9.0596, -4.9447, -6.6075], [-10.1178, -4.5275, -6.2671]]
|
||||||
|
)
|
||||||
|
expected_boxes = torch.tensor([[0.7665, 0.4130, 0.4769], [0.8364, 0.1841, 0.3391], [0.6261, 0.3895, 0.7978]])
|
||||||
|
|
||||||
|
if with_box_refine:
|
||||||
|
expected_logits = torch.tensor(
|
||||||
|
[[-8.8895, -5.4187, -6.8153], [-8.4706, -6.1668, -7.6184], [-9.0042, -5.5359, -6.9141]]
|
||||||
|
)
|
||||||
|
expected_boxes = torch.tensor([[0.7828, 0.2208, 0.4323], [0.0892, 0.5996, 0.1319], [0.5524, 0.6389, 0.8914]])
|
||||||
|
|
||||||
|
if with_box_refine and two_stage:
|
||||||
|
expected_logits = torch.tensor(
|
||||||
|
[[-6.7108, -4.3213, -6.3777], [-8.9014, -6.1799, -6.7240], [-6.9315, -4.4735, -6.2298]]
|
||||||
|
)
|
||||||
|
expected_boxes = torch.tensor([[0.2583, 0.5499, 0.4683], [0.7652, 0.9068, 0.4882], [0.5490, 0.2763, 0.0564]])
|
||||||
|
|
||||||
|
print("Logits:", outputs.logits[0, :3, :3])
|
||||||
|
|
||||||
|
assert torch.allclose(outputs.logits[0, :3, :3], expected_logits.to(device), atol=1e-4)
|
||||||
|
assert torch.allclose(outputs.pred_boxes[0, :3, :3], expected_boxes.to(device), atol=1e-4)
|
||||||
|
|
||||||
|
print("Everything ok!")
|
||||||
|
|
||||||
|
# Save model and feature extractor
|
||||||
|
logger.info(f"Saving PyTorch model and feature extractor to {pytorch_dump_folder_path}...")
|
||||||
|
Path(pytorch_dump_folder_path).mkdir(exist_ok=True)
|
||||||
|
model.save_pretrained(pytorch_dump_folder_path)
|
||||||
|
feature_extractor.save_pretrained(pytorch_dump_folder_path)
|
||||||
|
|
||||||
|
# Push to hub
|
||||||
|
if push_to_hub:
|
||||||
|
model_name = "deformable-detr"
|
||||||
|
model_name += "-single-scale" if single_scale else ""
|
||||||
|
model_name += "-dc5" if dilation else ""
|
||||||
|
model_name += "-with-box-refine" if with_box_refine else ""
|
||||||
|
model_name += "-two-stage" if two_stage else ""
|
||||||
|
print("Pushing model to hub...")
|
||||||
|
model.push_to_hub(repo_path_or_name=model_name, organization="nielsr", commit_message="Add model")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
parser = argparse.ArgumentParser()
|
||||||
|
|
||||||
|
parser.add_argument(
|
||||||
|
"--checkpoint_path",
|
||||||
|
type=str,
|
||||||
|
default="/home/niels/checkpoints/deformable_detr/r50_deformable_detr-checkpoint.pth",
|
||||||
|
help="Path to Pytorch checkpoint (.pth file) you'd like to convert.",
|
||||||
|
)
|
||||||
|
parser.add_argument("--single_scale", action="store_true", help="Whether to set config.num_features_levels = 1.")
|
||||||
|
parser.add_argument("--dilation", action="store_true", help="Whether to set config.dilation=True.")
|
||||||
|
parser.add_argument("--with_box_refine", action="store_true", help="Whether to set config.with_box_refine=True.")
|
||||||
|
parser.add_argument("--two_stage", action="store_true", help="Whether to set config.two_stage=True.")
|
||||||
|
parser.add_argument(
|
||||||
|
"--pytorch_dump_folder_path",
|
||||||
|
default=None,
|
||||||
|
type=str,
|
||||||
|
required=True,
|
||||||
|
help="Path to the folder to output PyTorch model.",
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"--push_to_hub", action="store_true", help="Whether or not to push the converted model to the 🤗 hub."
|
||||||
|
)
|
||||||
|
args = parser.parse_args()
|
||||||
|
convert_deformable_detr_checkpoint(
|
||||||
|
args.checkpoint_path,
|
||||||
|
args.single_scale,
|
||||||
|
args.dilation,
|
||||||
|
args.with_box_refine,
|
||||||
|
args.two_stage,
|
||||||
|
args.pytorch_dump_folder_path,
|
||||||
|
args.push_to_hub,
|
||||||
|
)
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
/*!
|
||||||
|
**************************************************************************************************
|
||||||
|
* Deformable DETR
|
||||||
|
* Copyright (c) 2020 SenseTime. All Rights Reserved.
|
||||||
|
* Licensed under the Apache License, Version 2.0 [see LICENSE for details]
|
||||||
|
**************************************************************************************************
|
||||||
|
* Modified from https://github.com/chengdazhi/Deformable-Convolution-V2-PyTorch/tree/pytorch_1.0.0
|
||||||
|
**************************************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#include <ATen/ATen.h>
|
||||||
|
#include <ATen/cuda/CUDAContext.h>
|
||||||
|
|
||||||
|
|
||||||
|
at::Tensor
|
||||||
|
ms_deform_attn_cpu_forward(
|
||||||
|
const at::Tensor &value,
|
||||||
|
const at::Tensor &spatial_shapes,
|
||||||
|
const at::Tensor &level_start_index,
|
||||||
|
const at::Tensor &sampling_loc,
|
||||||
|
const at::Tensor &attn_weight,
|
||||||
|
const int im2col_step)
|
||||||
|
{
|
||||||
|
AT_ERROR("Not implement on cpu");
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<at::Tensor>
|
||||||
|
ms_deform_attn_cpu_backward(
|
||||||
|
const at::Tensor &value,
|
||||||
|
const at::Tensor &spatial_shapes,
|
||||||
|
const at::Tensor &level_start_index,
|
||||||
|
const at::Tensor &sampling_loc,
|
||||||
|
const at::Tensor &attn_weight,
|
||||||
|
const at::Tensor &grad_output,
|
||||||
|
const int im2col_step)
|
||||||
|
{
|
||||||
|
AT_ERROR("Not implement on cpu");
|
||||||
|
}
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
/*!
|
||||||
|
**************************************************************************************************
|
||||||
|
* Deformable DETR
|
||||||
|
* Copyright (c) 2020 SenseTime. All Rights Reserved.
|
||||||
|
* Licensed under the Apache License, Version 2.0 [see LICENSE for details]
|
||||||
|
**************************************************************************************************
|
||||||
|
* Modified from https://github.com/chengdazhi/Deformable-Convolution-V2-PyTorch/tree/pytorch_1.0.0
|
||||||
|
**************************************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#include <torch/extension.h>
|
||||||
|
|
||||||
|
at::Tensor
|
||||||
|
ms_deform_attn_cpu_forward(
|
||||||
|
const at::Tensor &value,
|
||||||
|
const at::Tensor &spatial_shapes,
|
||||||
|
const at::Tensor &level_start_index,
|
||||||
|
const at::Tensor &sampling_loc,
|
||||||
|
const at::Tensor &attn_weight,
|
||||||
|
const int im2col_step);
|
||||||
|
|
||||||
|
std::vector<at::Tensor>
|
||||||
|
ms_deform_attn_cpu_backward(
|
||||||
|
const at::Tensor &value,
|
||||||
|
const at::Tensor &spatial_shapes,
|
||||||
|
const at::Tensor &level_start_index,
|
||||||
|
const at::Tensor &sampling_loc,
|
||||||
|
const at::Tensor &attn_weight,
|
||||||
|
const at::Tensor &grad_output,
|
||||||
|
const int im2col_step);
|
||||||
|
|
||||||
@@ -0,0 +1,156 @@
|
|||||||
|
/*!
|
||||||
|
**************************************************************************************************
|
||||||
|
* Deformable DETR
|
||||||
|
* Copyright (c) 2020 SenseTime. All Rights Reserved.
|
||||||
|
* Licensed under the Apache License, Version 2.0 [see LICENSE for details]
|
||||||
|
**************************************************************************************************
|
||||||
|
* Modified from https://github.com/chengdazhi/Deformable-Convolution-V2-PyTorch/tree/pytorch_1.0.0
|
||||||
|
**************************************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
#include "cuda/ms_deform_im2col_cuda.cuh"
|
||||||
|
|
||||||
|
#include <ATen/ATen.h>
|
||||||
|
#include <ATen/cuda/CUDAContext.h>
|
||||||
|
#include <cuda.h>
|
||||||
|
#include <cuda_runtime.h>
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#include <torch/extension.h>
|
||||||
|
|
||||||
|
|
||||||
|
at::Tensor ms_deform_attn_cuda_forward(
|
||||||
|
const at::Tensor &value,
|
||||||
|
const at::Tensor &spatial_shapes,
|
||||||
|
const at::Tensor &level_start_index,
|
||||||
|
const at::Tensor &sampling_loc,
|
||||||
|
const at::Tensor &attn_weight,
|
||||||
|
const int im2col_step)
|
||||||
|
{
|
||||||
|
AT_ASSERTM(value.is_contiguous(), "value tensor has to be contiguous");
|
||||||
|
AT_ASSERTM(spatial_shapes.is_contiguous(), "spatial_shapes tensor has to be contiguous");
|
||||||
|
AT_ASSERTM(level_start_index.is_contiguous(), "level_start_index tensor has to be contiguous");
|
||||||
|
AT_ASSERTM(sampling_loc.is_contiguous(), "sampling_loc tensor has to be contiguous");
|
||||||
|
AT_ASSERTM(attn_weight.is_contiguous(), "attn_weight tensor has to be contiguous");
|
||||||
|
|
||||||
|
AT_ASSERTM(value.type().is_cuda(), "value must be a CUDA tensor");
|
||||||
|
AT_ASSERTM(spatial_shapes.type().is_cuda(), "spatial_shapes must be a CUDA tensor");
|
||||||
|
AT_ASSERTM(level_start_index.type().is_cuda(), "level_start_index must be a CUDA tensor");
|
||||||
|
AT_ASSERTM(sampling_loc.type().is_cuda(), "sampling_loc must be a CUDA tensor");
|
||||||
|
AT_ASSERTM(attn_weight.type().is_cuda(), "attn_weight must be a CUDA tensor");
|
||||||
|
|
||||||
|
const int batch = value.size(0);
|
||||||
|
const int spatial_size = value.size(1);
|
||||||
|
const int num_heads = value.size(2);
|
||||||
|
const int channels = value.size(3);
|
||||||
|
|
||||||
|
const int num_levels = spatial_shapes.size(0);
|
||||||
|
|
||||||
|
const int num_query = sampling_loc.size(1);
|
||||||
|
const int num_point = sampling_loc.size(4);
|
||||||
|
|
||||||
|
const int im2col_step_ = std::min(batch, im2col_step);
|
||||||
|
|
||||||
|
AT_ASSERTM(batch % im2col_step_ == 0, "batch(%d) must divide im2col_step(%d)", batch, im2col_step_);
|
||||||
|
|
||||||
|
auto output = at::zeros({batch, num_query, num_heads, channels}, value.options());
|
||||||
|
|
||||||
|
const int batch_n = im2col_step_;
|
||||||
|
auto output_n = output.view({batch/im2col_step_, batch_n, num_query, num_heads, channels});
|
||||||
|
auto per_value_size = spatial_size * num_heads * channels;
|
||||||
|
auto per_sample_loc_size = num_query * num_heads * num_levels * num_point * 2;
|
||||||
|
auto per_attn_weight_size = num_query * num_heads * num_levels * num_point;
|
||||||
|
for (int n = 0; n < batch/im2col_step_; ++n)
|
||||||
|
{
|
||||||
|
auto columns = output_n.select(0, n);
|
||||||
|
AT_DISPATCH_FLOATING_TYPES(value.type(), "ms_deform_attn_forward_cuda", ([&] {
|
||||||
|
ms_deformable_im2col_cuda(at::cuda::getCurrentCUDAStream(),
|
||||||
|
value.data<scalar_t>() + n * im2col_step_ * per_value_size,
|
||||||
|
spatial_shapes.data<int64_t>(),
|
||||||
|
level_start_index.data<int64_t>(),
|
||||||
|
sampling_loc.data<scalar_t>() + n * im2col_step_ * per_sample_loc_size,
|
||||||
|
attn_weight.data<scalar_t>() + n * im2col_step_ * per_attn_weight_size,
|
||||||
|
batch_n, spatial_size, num_heads, channels, num_levels, num_query, num_point,
|
||||||
|
columns.data<scalar_t>());
|
||||||
|
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
output = output.view({batch, num_query, num_heads*channels});
|
||||||
|
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
std::vector<at::Tensor> ms_deform_attn_cuda_backward(
|
||||||
|
const at::Tensor &value,
|
||||||
|
const at::Tensor &spatial_shapes,
|
||||||
|
const at::Tensor &level_start_index,
|
||||||
|
const at::Tensor &sampling_loc,
|
||||||
|
const at::Tensor &attn_weight,
|
||||||
|
const at::Tensor &grad_output,
|
||||||
|
const int im2col_step)
|
||||||
|
{
|
||||||
|
|
||||||
|
AT_ASSERTM(value.is_contiguous(), "value tensor has to be contiguous");
|
||||||
|
AT_ASSERTM(spatial_shapes.is_contiguous(), "spatial_shapes tensor has to be contiguous");
|
||||||
|
AT_ASSERTM(level_start_index.is_contiguous(), "level_start_index tensor has to be contiguous");
|
||||||
|
AT_ASSERTM(sampling_loc.is_contiguous(), "sampling_loc tensor has to be contiguous");
|
||||||
|
AT_ASSERTM(attn_weight.is_contiguous(), "attn_weight tensor has to be contiguous");
|
||||||
|
AT_ASSERTM(grad_output.is_contiguous(), "grad_output tensor has to be contiguous");
|
||||||
|
|
||||||
|
AT_ASSERTM(value.type().is_cuda(), "value must be a CUDA tensor");
|
||||||
|
AT_ASSERTM(spatial_shapes.type().is_cuda(), "spatial_shapes must be a CUDA tensor");
|
||||||
|
AT_ASSERTM(level_start_index.type().is_cuda(), "level_start_index must be a CUDA tensor");
|
||||||
|
AT_ASSERTM(sampling_loc.type().is_cuda(), "sampling_loc must be a CUDA tensor");
|
||||||
|
AT_ASSERTM(attn_weight.type().is_cuda(), "attn_weight must be a CUDA tensor");
|
||||||
|
AT_ASSERTM(grad_output.type().is_cuda(), "grad_output must be a CUDA tensor");
|
||||||
|
|
||||||
|
const int batch = value.size(0);
|
||||||
|
const int spatial_size = value.size(1);
|
||||||
|
const int num_heads = value.size(2);
|
||||||
|
const int channels = value.size(3);
|
||||||
|
|
||||||
|
const int num_levels = spatial_shapes.size(0);
|
||||||
|
|
||||||
|
const int num_query = sampling_loc.size(1);
|
||||||
|
const int num_point = sampling_loc.size(4);
|
||||||
|
|
||||||
|
const int im2col_step_ = std::min(batch, im2col_step);
|
||||||
|
|
||||||
|
AT_ASSERTM(batch % im2col_step_ == 0, "batch(%d) must divide im2col_step(%d)", batch, im2col_step_);
|
||||||
|
|
||||||
|
auto grad_value = at::zeros_like(value);
|
||||||
|
auto grad_sampling_loc = at::zeros_like(sampling_loc);
|
||||||
|
auto grad_attn_weight = at::zeros_like(attn_weight);
|
||||||
|
|
||||||
|
const int batch_n = im2col_step_;
|
||||||
|
auto per_value_size = spatial_size * num_heads * channels;
|
||||||
|
auto per_sample_loc_size = num_query * num_heads * num_levels * num_point * 2;
|
||||||
|
auto per_attn_weight_size = num_query * num_heads * num_levels * num_point;
|
||||||
|
auto grad_output_n = grad_output.view({batch/im2col_step_, batch_n, num_query, num_heads, channels});
|
||||||
|
|
||||||
|
for (int n = 0; n < batch/im2col_step_; ++n)
|
||||||
|
{
|
||||||
|
auto grad_output_g = grad_output_n.select(0, n);
|
||||||
|
AT_DISPATCH_FLOATING_TYPES(value.type(), "ms_deform_attn_backward_cuda", ([&] {
|
||||||
|
ms_deformable_col2im_cuda(at::cuda::getCurrentCUDAStream(),
|
||||||
|
grad_output_g.data<scalar_t>(),
|
||||||
|
value.data<scalar_t>() + n * im2col_step_ * per_value_size,
|
||||||
|
spatial_shapes.data<int64_t>(),
|
||||||
|
level_start_index.data<int64_t>(),
|
||||||
|
sampling_loc.data<scalar_t>() + n * im2col_step_ * per_sample_loc_size,
|
||||||
|
attn_weight.data<scalar_t>() + n * im2col_step_ * per_attn_weight_size,
|
||||||
|
batch_n, spatial_size, num_heads, channels, num_levels, num_query, num_point,
|
||||||
|
grad_value.data<scalar_t>() + n * im2col_step_ * per_value_size,
|
||||||
|
grad_sampling_loc.data<scalar_t>() + n * im2col_step_ * per_sample_loc_size,
|
||||||
|
grad_attn_weight.data<scalar_t>() + n * im2col_step_ * per_attn_weight_size);
|
||||||
|
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
grad_value, grad_sampling_loc, grad_attn_weight
|
||||||
|
};
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,29 @@
|
|||||||
|
/*!
|
||||||
|
**************************************************************************************************
|
||||||
|
* Deformable DETR
|
||||||
|
* Copyright (c) 2020 SenseTime. All Rights Reserved.
|
||||||
|
* Licensed under the Apache License, Version 2.0 [see LICENSE for details]
|
||||||
|
**************************************************************************************************
|
||||||
|
* Modified from https://github.com/chengdazhi/Deformable-Convolution-V2-PyTorch/tree/pytorch_1.0.0
|
||||||
|
**************************************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#include <torch/extension.h>
|
||||||
|
|
||||||
|
at::Tensor ms_deform_attn_cuda_forward(
|
||||||
|
const at::Tensor &value,
|
||||||
|
const at::Tensor &spatial_shapes,
|
||||||
|
const at::Tensor &level_start_index,
|
||||||
|
const at::Tensor &sampling_loc,
|
||||||
|
const at::Tensor &attn_weight,
|
||||||
|
const int im2col_step);
|
||||||
|
|
||||||
|
std::vector<at::Tensor> ms_deform_attn_cuda_backward(
|
||||||
|
const at::Tensor &value,
|
||||||
|
const at::Tensor &spatial_shapes,
|
||||||
|
const at::Tensor &level_start_index,
|
||||||
|
const at::Tensor &sampling_loc,
|
||||||
|
const at::Tensor &attn_weight,
|
||||||
|
const at::Tensor &grad_output,
|
||||||
|
const int im2col_step);
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,61 @@
|
|||||||
|
/*!
|
||||||
|
**************************************************************************************************
|
||||||
|
* Deformable DETR
|
||||||
|
* Copyright (c) 2020 SenseTime. All Rights Reserved.
|
||||||
|
* Licensed under the Apache License, Version 2.0 [see LICENSE for details]
|
||||||
|
**************************************************************************************************
|
||||||
|
* Modified from https://github.com/chengdazhi/Deformable-Convolution-V2-PyTorch/tree/pytorch_1.0.0
|
||||||
|
**************************************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "cpu/ms_deform_attn_cpu.h"
|
||||||
|
|
||||||
|
#ifdef WITH_CUDA
|
||||||
|
#include "cuda/ms_deform_attn_cuda.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
at::Tensor
|
||||||
|
ms_deform_attn_forward(
|
||||||
|
const at::Tensor &value,
|
||||||
|
const at::Tensor &spatial_shapes,
|
||||||
|
const at::Tensor &level_start_index,
|
||||||
|
const at::Tensor &sampling_loc,
|
||||||
|
const at::Tensor &attn_weight,
|
||||||
|
const int im2col_step)
|
||||||
|
{
|
||||||
|
if (value.type().is_cuda())
|
||||||
|
{
|
||||||
|
#ifdef WITH_CUDA
|
||||||
|
return ms_deform_attn_cuda_forward(
|
||||||
|
value, spatial_shapes, level_start_index, sampling_loc, attn_weight, im2col_step);
|
||||||
|
#else
|
||||||
|
AT_ERROR("Not compiled with GPU support");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
AT_ERROR("Not implemented on the CPU");
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<at::Tensor>
|
||||||
|
ms_deform_attn_backward(
|
||||||
|
const at::Tensor &value,
|
||||||
|
const at::Tensor &spatial_shapes,
|
||||||
|
const at::Tensor &level_start_index,
|
||||||
|
const at::Tensor &sampling_loc,
|
||||||
|
const at::Tensor &attn_weight,
|
||||||
|
const at::Tensor &grad_output,
|
||||||
|
const int im2col_step)
|
||||||
|
{
|
||||||
|
if (value.type().is_cuda())
|
||||||
|
{
|
||||||
|
#ifdef WITH_CUDA
|
||||||
|
return ms_deform_attn_cuda_backward(
|
||||||
|
value, spatial_shapes, level_start_index, sampling_loc, attn_weight, grad_output, im2col_step);
|
||||||
|
#else
|
||||||
|
AT_ERROR("Not compiled with GPU support");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
AT_ERROR("Not implemented on the CPU");
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
/*!
|
||||||
|
**************************************************************************************************
|
||||||
|
* Deformable DETR
|
||||||
|
* Copyright (c) 2020 SenseTime. All Rights Reserved.
|
||||||
|
* Licensed under the Apache License, Version 2.0 [see LICENSE for details]
|
||||||
|
**************************************************************************************************
|
||||||
|
* Modified from https://github.com/chengdazhi/Deformable-Convolution-V2-PyTorch/tree/pytorch_1.0.0
|
||||||
|
**************************************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "ms_deform_attn.h"
|
||||||
|
|
||||||
|
PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) {
|
||||||
|
m.def("ms_deform_attn_forward", &ms_deform_attn_forward, "ms_deform_attn_forward");
|
||||||
|
m.def("ms_deform_attn_backward", &ms_deform_attn_backward, "ms_deform_attn_backward");
|
||||||
|
}
|
||||||
51
src/transformers/models/deformable_detr/load_custom.py
Normal file
51
src/transformers/models/deformable_detr/load_custom.py
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
# coding=utf-8
|
||||||
|
# Copyright 2022 The HuggingFace Inc. team. All rights reserved.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
""" Loading of Deformable DETR's CUDA kernels"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
|
||||||
|
|
||||||
|
def load_cuda_kernels():
|
||||||
|
from torch.utils.cpp_extension import load
|
||||||
|
|
||||||
|
root = os.path.join(os.path.dirname(os.path.realpath(__file__)), "custom_kernel")
|
||||||
|
src_files = [
|
||||||
|
os.path.join(root, filename)
|
||||||
|
for filename in [
|
||||||
|
"vision.cpp",
|
||||||
|
os.path.join("cpu", "ms_deform_attn_cpu.cpp"),
|
||||||
|
os.path.join("cuda", "ms_deform_attn_cuda.cu"),
|
||||||
|
]
|
||||||
|
]
|
||||||
|
|
||||||
|
load(
|
||||||
|
"MultiScaleDeformableAttention",
|
||||||
|
src_files,
|
||||||
|
# verbose=True,
|
||||||
|
with_cuda=True,
|
||||||
|
extra_include_paths=[root],
|
||||||
|
# build_directory=os.path.dirname(os.path.realpath(__file__)),
|
||||||
|
extra_cflags=["-DWITH_CUDA=1"],
|
||||||
|
extra_cuda_cflags=[
|
||||||
|
"-DCUDA_HAS_FP16=1",
|
||||||
|
"-D__CUDA_NO_HALF_OPERATORS__",
|
||||||
|
"-D__CUDA_NO_HALF_CONVERSIONS__",
|
||||||
|
"-D__CUDA_NO_HALF2_OPERATORS__",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
import MultiScaleDeformableAttention as MSDA
|
||||||
|
|
||||||
|
return MSDA
|
||||||
2465
src/transformers/models/deformable_detr/modeling_deformable_detr.py
Executable file
2465
src/transformers/models/deformable_detr/modeling_deformable_detr.py
Executable file
File diff suppressed because it is too large
Load Diff
@@ -273,7 +273,7 @@ class DetrFrozenBatchNorm2d(nn.Module):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, n):
|
def __init__(self, n):
|
||||||
super(DetrFrozenBatchNorm2d, self).__init__()
|
super().__init__()
|
||||||
self.register_buffer("weight", torch.ones(n))
|
self.register_buffer("weight", torch.ones(n))
|
||||||
self.register_buffer("bias", torch.zeros(n))
|
self.register_buffer("bias", torch.zeros(n))
|
||||||
self.register_buffer("running_mean", torch.zeros(n))
|
self.register_buffer("running_mean", torch.zeros(n))
|
||||||
@@ -286,7 +286,7 @@ class DetrFrozenBatchNorm2d(nn.Module):
|
|||||||
if num_batches_tracked_key in state_dict:
|
if num_batches_tracked_key in state_dict:
|
||||||
del state_dict[num_batches_tracked_key]
|
del state_dict[num_batches_tracked_key]
|
||||||
|
|
||||||
super(DetrFrozenBatchNorm2d, self)._load_from_state_dict(
|
super()._load_from_state_dict(
|
||||||
state_dict, prefix, local_metadata, strict, missing_keys, unexpected_keys, error_msgs
|
state_dict, prefix, local_metadata, strict, missing_keys, unexpected_keys, error_msgs
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -387,14 +387,14 @@ class DetrConvModel(nn.Module):
|
|||||||
return out, pos
|
return out, pos
|
||||||
|
|
||||||
|
|
||||||
def _expand_mask(mask: torch.Tensor, dtype: torch.dtype, tgt_len: Optional[int] = None):
|
def _expand_mask(mask: torch.Tensor, dtype: torch.dtype, target_len: Optional[int] = None):
|
||||||
"""
|
"""
|
||||||
Expands attention_mask from `[bsz, seq_len]` to `[bsz, 1, tgt_seq_len, src_seq_len]`.
|
Expands attention_mask from `[batch_size, seq_len]` to `[batch_size, 1, target_seq_len, source_seq_len]`.
|
||||||
"""
|
"""
|
||||||
bsz, src_len = mask.size()
|
batch_size, source_len = mask.size()
|
||||||
tgt_len = tgt_len if tgt_len is not None else src_len
|
target_len = target_len if target_len is not None else source_len
|
||||||
|
|
||||||
expanded_mask = mask[:, None, None, :].expand(bsz, 1, tgt_len, src_len).to(dtype)
|
expanded_mask = mask[:, None, None, :].expand(batch_size, 1, target_len, source_len).to(dtype)
|
||||||
|
|
||||||
inverted_mask = 1.0 - expanded_mask
|
inverted_mask = 1.0 - expanded_mask
|
||||||
|
|
||||||
@@ -449,12 +449,12 @@ class DetrLearnedPositionEmbedding(nn.Module):
|
|||||||
self.column_embeddings = nn.Embedding(50, embedding_dim)
|
self.column_embeddings = nn.Embedding(50, embedding_dim)
|
||||||
|
|
||||||
def forward(self, pixel_values, pixel_mask=None):
|
def forward(self, pixel_values, pixel_mask=None):
|
||||||
h, w = pixel_values.shape[-2:]
|
height, width = pixel_values.shape[-2:]
|
||||||
i = torch.arange(w, device=pixel_values.device)
|
width_values = torch.arange(width, device=pixel_values.device)
|
||||||
j = torch.arange(h, device=pixel_values.device)
|
height_values = torch.arange(height, device=pixel_values.device)
|
||||||
x_emb = self.column_embeddings(i)
|
x_emb = self.column_embeddings(width_values)
|
||||||
y_emb = self.row_embeddings(j)
|
y_emb = self.row_embeddings(height_values)
|
||||||
pos = torch.cat([x_emb.unsqueeze(0).repeat(h, 1, 1), y_emb.unsqueeze(1).repeat(1, w, 1)], dim=-1)
|
pos = torch.cat([x_emb.unsqueeze(0).repeat(height, 1, 1), y_emb.unsqueeze(1).repeat(1, width, 1)], dim=-1)
|
||||||
pos = pos.permute(2, 0, 1)
|
pos = pos.permute(2, 0, 1)
|
||||||
pos = pos.unsqueeze(0)
|
pos = pos.unsqueeze(0)
|
||||||
pos = pos.repeat(pixel_values.shape[0], 1, 1, 1)
|
pos = pos.repeat(pixel_values.shape[0], 1, 1, 1)
|
||||||
@@ -506,8 +506,8 @@ class DetrAttention(nn.Module):
|
|||||||
self.q_proj = nn.Linear(embed_dim, embed_dim, bias=bias)
|
self.q_proj = nn.Linear(embed_dim, embed_dim, bias=bias)
|
||||||
self.out_proj = nn.Linear(embed_dim, embed_dim, bias=bias)
|
self.out_proj = nn.Linear(embed_dim, embed_dim, bias=bias)
|
||||||
|
|
||||||
def _shape(self, tensor: torch.Tensor, seq_len: int, bsz: int):
|
def _shape(self, tensor: torch.Tensor, seq_len: int, batch_size: int):
|
||||||
return tensor.view(bsz, seq_len, self.num_heads, self.head_dim).transpose(1, 2).contiguous()
|
return tensor.view(batch_size, seq_len, self.num_heads, self.head_dim).transpose(1, 2).contiguous()
|
||||||
|
|
||||||
def with_pos_embed(self, tensor: torch.Tensor, position_embeddings: Optional[Tensor]):
|
def with_pos_embed(self, tensor: torch.Tensor, position_embeddings: Optional[Tensor]):
|
||||||
return tensor if position_embeddings is None else tensor + position_embeddings
|
return tensor if position_embeddings is None else tensor + position_embeddings
|
||||||
@@ -526,7 +526,7 @@ class DetrAttention(nn.Module):
|
|||||||
# if key_value_states are provided this layer is used as a cross-attention layer
|
# if key_value_states are provided this layer is used as a cross-attention layer
|
||||||
# for the decoder
|
# for the decoder
|
||||||
is_cross_attention = key_value_states is not None
|
is_cross_attention = key_value_states is not None
|
||||||
bsz, tgt_len, embed_dim = hidden_states.size()
|
batch_size, target_len, embed_dim = hidden_states.size()
|
||||||
|
|
||||||
# add position embeddings to the hidden states before projecting to queries and keys
|
# add position embeddings to the hidden states before projecting to queries and keys
|
||||||
if position_embeddings is not None:
|
if position_embeddings is not None:
|
||||||
@@ -543,35 +543,36 @@ class DetrAttention(nn.Module):
|
|||||||
# get key, value proj
|
# get key, value proj
|
||||||
if is_cross_attention:
|
if is_cross_attention:
|
||||||
# cross_attentions
|
# cross_attentions
|
||||||
key_states = self._shape(self.k_proj(key_value_states), -1, bsz)
|
key_states = self._shape(self.k_proj(key_value_states), -1, batch_size)
|
||||||
value_states = self._shape(self.v_proj(key_value_states_original), -1, bsz)
|
value_states = self._shape(self.v_proj(key_value_states_original), -1, batch_size)
|
||||||
else:
|
else:
|
||||||
# self_attention
|
# self_attention
|
||||||
key_states = self._shape(self.k_proj(hidden_states), -1, bsz)
|
key_states = self._shape(self.k_proj(hidden_states), -1, batch_size)
|
||||||
value_states = self._shape(self.v_proj(hidden_states_original), -1, bsz)
|
value_states = self._shape(self.v_proj(hidden_states_original), -1, batch_size)
|
||||||
|
|
||||||
proj_shape = (bsz * self.num_heads, -1, self.head_dim)
|
proj_shape = (batch_size * self.num_heads, -1, self.head_dim)
|
||||||
query_states = self._shape(query_states, tgt_len, bsz).view(*proj_shape)
|
query_states = self._shape(query_states, target_len, batch_size).view(*proj_shape)
|
||||||
key_states = key_states.view(*proj_shape)
|
key_states = key_states.view(*proj_shape)
|
||||||
value_states = value_states.view(*proj_shape)
|
value_states = value_states.view(*proj_shape)
|
||||||
|
|
||||||
src_len = key_states.size(1)
|
source_len = key_states.size(1)
|
||||||
|
|
||||||
attn_weights = torch.bmm(query_states, key_states.transpose(1, 2))
|
attn_weights = torch.bmm(query_states, key_states.transpose(1, 2))
|
||||||
|
|
||||||
if attn_weights.size() != (bsz * self.num_heads, tgt_len, src_len):
|
if attn_weights.size() != (batch_size * self.num_heads, target_len, source_len):
|
||||||
raise ValueError(
|
raise ValueError(
|
||||||
f"Attention weights should be of size {(bsz * self.num_heads, tgt_len, src_len)}, but is"
|
f"Attention weights should be of size {(batch_size * self.num_heads, target_len, source_len)}, but is"
|
||||||
f" {attn_weights.size()}"
|
f" {attn_weights.size()}"
|
||||||
)
|
)
|
||||||
|
|
||||||
if attention_mask is not None:
|
if attention_mask is not None:
|
||||||
if attention_mask.size() != (bsz, 1, tgt_len, src_len):
|
if attention_mask.size() != (batch_size, 1, target_len, source_len):
|
||||||
raise ValueError(
|
raise ValueError(
|
||||||
f"Attention mask should be of size {(bsz, 1, tgt_len, src_len)}, but is {attention_mask.size()}"
|
f"Attention mask should be of size {(batch_size, 1, target_len, source_len)}, but is"
|
||||||
|
f" {attention_mask.size()}"
|
||||||
)
|
)
|
||||||
attn_weights = attn_weights.view(bsz, self.num_heads, tgt_len, src_len) + attention_mask
|
attn_weights = attn_weights.view(batch_size, self.num_heads, target_len, source_len) + attention_mask
|
||||||
attn_weights = attn_weights.view(bsz * self.num_heads, tgt_len, src_len)
|
attn_weights = attn_weights.view(batch_size * self.num_heads, target_len, source_len)
|
||||||
|
|
||||||
attn_weights = nn.functional.softmax(attn_weights, dim=-1)
|
attn_weights = nn.functional.softmax(attn_weights, dim=-1)
|
||||||
|
|
||||||
@@ -580,8 +581,8 @@ class DetrAttention(nn.Module):
|
|||||||
# make sure that attn_weights keeps its gradient.
|
# make sure that attn_weights keeps its gradient.
|
||||||
# In order to do so, attn_weights have to reshaped
|
# In order to do so, attn_weights have to reshaped
|
||||||
# twice and have to be reused in the following
|
# twice and have to be reused in the following
|
||||||
attn_weights_reshaped = attn_weights.view(bsz, self.num_heads, tgt_len, src_len)
|
attn_weights_reshaped = attn_weights.view(batch_size, self.num_heads, target_len, source_len)
|
||||||
attn_weights = attn_weights_reshaped.view(bsz * self.num_heads, tgt_len, src_len)
|
attn_weights = attn_weights_reshaped.view(batch_size * self.num_heads, target_len, source_len)
|
||||||
else:
|
else:
|
||||||
attn_weights_reshaped = None
|
attn_weights_reshaped = None
|
||||||
|
|
||||||
@@ -589,15 +590,15 @@ class DetrAttention(nn.Module):
|
|||||||
|
|
||||||
attn_output = torch.bmm(attn_probs, value_states)
|
attn_output = torch.bmm(attn_probs, value_states)
|
||||||
|
|
||||||
if attn_output.size() != (bsz * self.num_heads, tgt_len, self.head_dim):
|
if attn_output.size() != (batch_size * self.num_heads, target_len, self.head_dim):
|
||||||
raise ValueError(
|
raise ValueError(
|
||||||
f"`attn_output` should be of size {(bsz, self.num_heads, tgt_len, self.head_dim)}, but is"
|
f"`attn_output` should be of size {(batch_size, self.num_heads, target_len, self.head_dim)}, but is"
|
||||||
f" {attn_output.size()}"
|
f" {attn_output.size()}"
|
||||||
)
|
)
|
||||||
|
|
||||||
attn_output = attn_output.view(bsz, self.num_heads, tgt_len, self.head_dim)
|
attn_output = attn_output.view(batch_size, self.num_heads, target_len, self.head_dim)
|
||||||
attn_output = attn_output.transpose(1, 2)
|
attn_output = attn_output.transpose(1, 2)
|
||||||
attn_output = attn_output.reshape(bsz, tgt_len, embed_dim)
|
attn_output = attn_output.reshape(batch_size, target_len, embed_dim)
|
||||||
|
|
||||||
attn_output = self.out_proj(attn_output)
|
attn_output = self.out_proj(attn_output)
|
||||||
|
|
||||||
@@ -632,7 +633,8 @@ class DetrEncoderLayer(nn.Module):
|
|||||||
Args:
|
Args:
|
||||||
hidden_states (`torch.FloatTensor`): input to the layer of shape `(seq_len, batch, embed_dim)`
|
hidden_states (`torch.FloatTensor`): input to the layer of shape `(seq_len, batch, embed_dim)`
|
||||||
attention_mask (`torch.FloatTensor`): attention mask of size
|
attention_mask (`torch.FloatTensor`): attention mask of size
|
||||||
`(batch, 1, tgt_len, src_len)` where padding elements are indicated by very large negative values.
|
`(batch, 1, target_len, source_len)` where padding elements are indicated by very large negative
|
||||||
|
values.
|
||||||
position_embeddings (`torch.FloatTensor`, *optional*): position embeddings, to be added to hidden_states.
|
position_embeddings (`torch.FloatTensor`, *optional*): position embeddings, to be added to hidden_states.
|
||||||
output_attentions (`bool`, *optional*):
|
output_attentions (`bool`, *optional*):
|
||||||
Whether or not to return the attentions tensors of all attention layers. See `attentions` under
|
Whether or not to return the attentions tensors of all attention layers. See `attentions` under
|
||||||
@@ -714,7 +716,8 @@ class DetrDecoderLayer(nn.Module):
|
|||||||
Args:
|
Args:
|
||||||
hidden_states (`torch.FloatTensor`): input to the layer of shape `(seq_len, batch, embed_dim)`
|
hidden_states (`torch.FloatTensor`): input to the layer of shape `(seq_len, batch, embed_dim)`
|
||||||
attention_mask (`torch.FloatTensor`): attention mask of size
|
attention_mask (`torch.FloatTensor`): attention mask of size
|
||||||
`(batch, 1, tgt_len, src_len)` where padding elements are indicated by very large negative values.
|
`(batch, 1, target_len, source_len)` where padding elements are indicated by very large negative
|
||||||
|
values.
|
||||||
position_embeddings (`torch.FloatTensor`, *optional*):
|
position_embeddings (`torch.FloatTensor`, *optional*):
|
||||||
position embeddings that are added to the queries and keys
|
position embeddings that are added to the queries and keys
|
||||||
in the cross-attention layer.
|
in the cross-attention layer.
|
||||||
@@ -724,7 +727,8 @@ class DetrDecoderLayer(nn.Module):
|
|||||||
encoder_hidden_states (`torch.FloatTensor`):
|
encoder_hidden_states (`torch.FloatTensor`):
|
||||||
cross attention input to the layer of shape `(seq_len, batch, embed_dim)`
|
cross attention input to the layer of shape `(seq_len, batch, embed_dim)`
|
||||||
encoder_attention_mask (`torch.FloatTensor`): encoder attention mask of size
|
encoder_attention_mask (`torch.FloatTensor`): encoder attention mask of size
|
||||||
`(batch, 1, tgt_len, src_len)` where padding elements are indicated by very large negative values.
|
`(batch, 1, target_len, source_len)` where padding elements are indicated by very large negative
|
||||||
|
values.
|
||||||
output_attentions (`bool`, *optional*):
|
output_attentions (`bool`, *optional*):
|
||||||
Whether or not to return the attentions tensors of all attention layers. See `attentions` under
|
Whether or not to return the attentions tensors of all attention layers. See `attentions` under
|
||||||
returned tensors for more detail.
|
returned tensors for more detail.
|
||||||
@@ -957,7 +961,7 @@ class DetrEncoder(DetrPreTrainedModel):
|
|||||||
|
|
||||||
# expand attention_mask
|
# expand attention_mask
|
||||||
if attention_mask is not None:
|
if attention_mask is not None:
|
||||||
# [bsz, seq_len] -> [bsz, 1, tgt_seq_len, src_seq_len]
|
# [batch_size, seq_len] -> [batch_size, 1, target_seq_len, source_seq_len]
|
||||||
attention_mask = _expand_mask(attention_mask, inputs_embeds.dtype)
|
attention_mask = _expand_mask(attention_mask, inputs_embeds.dtype)
|
||||||
|
|
||||||
encoder_states = () if output_hidden_states else None
|
encoder_states = () if output_hidden_states else None
|
||||||
@@ -1081,15 +1085,17 @@ class DetrDecoder(DetrPreTrainedModel):
|
|||||||
combined_attention_mask = None
|
combined_attention_mask = None
|
||||||
|
|
||||||
if attention_mask is not None and combined_attention_mask is not None:
|
if attention_mask is not None and combined_attention_mask is not None:
|
||||||
# [bsz, seq_len] -> [bsz, 1, tgt_seq_len, src_seq_len]
|
# [batch_size, seq_len] -> [batch_size, 1, target_seq_len, source_seq_len]
|
||||||
combined_attention_mask = combined_attention_mask + _expand_mask(
|
combined_attention_mask = combined_attention_mask + _expand_mask(
|
||||||
attention_mask, inputs_embeds.dtype, tgt_len=input_shape[-1]
|
attention_mask, inputs_embeds.dtype, target_len=input_shape[-1]
|
||||||
)
|
)
|
||||||
|
|
||||||
# expand encoder attention mask
|
# expand encoder attention mask
|
||||||
if encoder_hidden_states is not None and encoder_attention_mask is not None:
|
if encoder_hidden_states is not None and encoder_attention_mask is not None:
|
||||||
# [bsz, seq_len] -> [bsz, 1, tgt_seq_len, src_seq_len]
|
# [batch_size, seq_len] -> [batch_size, 1, target_seq_len, source_seq_len]
|
||||||
encoder_attention_mask = _expand_mask(encoder_attention_mask, inputs_embeds.dtype, tgt_len=input_shape[-1])
|
encoder_attention_mask = _expand_mask(
|
||||||
|
encoder_attention_mask, inputs_embeds.dtype, target_len=input_shape[-1]
|
||||||
|
)
|
||||||
|
|
||||||
# optional intermediate hidden states
|
# optional intermediate hidden states
|
||||||
intermediate = () if self.config.auxiliary_loss else None
|
intermediate = () if self.config.auxiliary_loss else None
|
||||||
@@ -1889,21 +1895,22 @@ def sigmoid_focal_loss(inputs, targets, num_boxes, alpha: float = 0.25, gamma: f
|
|||||||
Loss used in RetinaNet for dense detection: https://arxiv.org/abs/1708.02002.
|
Loss used in RetinaNet for dense detection: https://arxiv.org/abs/1708.02002.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
inputs: A float tensor of arbitrary shape.
|
inputs (`torch.FloatTensor` of arbitrary shape):
|
||||||
The predictions for each example.
|
The predictions for each example.
|
||||||
targets: A float tensor with the same shape as inputs. Stores the binary
|
targets (`torch.FloatTensor` with the same shape as `inputs`)
|
||||||
classification label for each element in inputs (0 for the negative class and 1 for the positive
|
A tensor storing the binary classification label for each element in the `inputs` (0 for the negative class
|
||||||
class).
|
and 1 for the positive class).
|
||||||
alpha: (optional) Weighting factor in range (0,1) to balance
|
alpha (`float`, *optional*, defaults to `0.25`):
|
||||||
positive vs negative examples. Default = -1 (no weighting).
|
Optional weighting factor in the range (0,1) to balance positive vs. negative examples.
|
||||||
gamma: Exponent of the modulating factor (1 - p_t) to
|
gamma (`int`, *optional*, defaults to `2`):
|
||||||
balance easy vs hard examples.
|
Exponent of the modulating factor (1 - p_t) to balance easy vs hard examples.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
Loss tensor
|
Loss tensor
|
||||||
"""
|
"""
|
||||||
prob = inputs.sigmoid()
|
prob = inputs.sigmoid()
|
||||||
ce_loss = nn.functional.binary_cross_entropy_with_logits(inputs, targets, reduction="none")
|
ce_loss = nn.functional.binary_cross_entropy_with_logits(inputs, targets, reduction="none")
|
||||||
|
# add modulating factor
|
||||||
p_t = prob * targets + (1 - prob) * (1 - targets)
|
p_t = prob * targets + (1 - prob) * (1 - targets)
|
||||||
loss = ce_loss * ((1 - p_t) ** gamma)
|
loss = ce_loss * ((1 - p_t) ** gamma)
|
||||||
|
|
||||||
@@ -1981,10 +1988,10 @@ class DetrLoss(nn.Module):
|
|||||||
"""
|
"""
|
||||||
logits = outputs["logits"]
|
logits = outputs["logits"]
|
||||||
device = logits.device
|
device = logits.device
|
||||||
tgt_lengths = torch.as_tensor([len(v["class_labels"]) for v in targets], device=device)
|
target_lengths = torch.as_tensor([len(v["class_labels"]) for v in targets], device=device)
|
||||||
# Count the number of predictions that are NOT "no-object" (which is the last class)
|
# Count the number of predictions that are NOT "no-object" (which is the last class)
|
||||||
card_pred = (logits.argmax(-1) != logits.shape[-1] - 1).sum(1)
|
card_pred = (logits.argmax(-1) != logits.shape[-1] - 1).sum(1)
|
||||||
card_err = nn.functional.l1_loss(card_pred.float(), tgt_lengths.float())
|
card_err = nn.functional.l1_loss(card_pred.float(), target_lengths.float())
|
||||||
losses = {"cardinality_error": card_err}
|
losses = {"cardinality_error": card_err}
|
||||||
return losses
|
return losses
|
||||||
|
|
||||||
@@ -2191,19 +2198,19 @@ class DetrHungarianMatcher(nn.Module):
|
|||||||
out_bbox = outputs["pred_boxes"].flatten(0, 1) # [batch_size * num_queries, 4]
|
out_bbox = outputs["pred_boxes"].flatten(0, 1) # [batch_size * num_queries, 4]
|
||||||
|
|
||||||
# Also concat the target labels and boxes
|
# Also concat the target labels and boxes
|
||||||
tgt_ids = torch.cat([v["class_labels"] for v in targets])
|
target_ids = torch.cat([v["class_labels"] for v in targets])
|
||||||
tgt_bbox = torch.cat([v["boxes"] for v in targets])
|
target_bbox = torch.cat([v["boxes"] for v in targets])
|
||||||
|
|
||||||
# Compute the classification cost. Contrary to the loss, we don't use the NLL,
|
# Compute the classification cost. Contrary to the loss, we don't use the NLL,
|
||||||
# but approximate it in 1 - proba[target class].
|
# but approximate it in 1 - proba[target class].
|
||||||
# The 1 is a constant that doesn't change the matching, it can be ommitted.
|
# The 1 is a constant that doesn't change the matching, it can be ommitted.
|
||||||
class_cost = -out_prob[:, tgt_ids]
|
class_cost = -out_prob[:, target_ids]
|
||||||
|
|
||||||
# Compute the L1 cost between boxes
|
# Compute the L1 cost between boxes
|
||||||
bbox_cost = torch.cdist(out_bbox, tgt_bbox, p=1)
|
bbox_cost = torch.cdist(out_bbox, target_bbox, p=1)
|
||||||
|
|
||||||
# Compute the giou cost between boxes
|
# Compute the giou cost between boxes
|
||||||
giou_cost = -generalized_box_iou(center_to_corners_format(out_bbox), center_to_corners_format(tgt_bbox))
|
giou_cost = -generalized_box_iou(center_to_corners_format(out_bbox), center_to_corners_format(target_bbox))
|
||||||
|
|
||||||
# Final cost matrix
|
# Final cost matrix
|
||||||
cost_matrix = self.bbox_cost * bbox_cost + self.class_cost * class_cost + self.giou_cost * giou_cost
|
cost_matrix = self.bbox_cost * bbox_cost + self.class_cost * class_cost + self.giou_cost * giou_cost
|
||||||
@@ -2267,15 +2274,17 @@ def generalized_box_iou(boxes1, boxes2):
|
|||||||
"""
|
"""
|
||||||
# degenerate boxes gives inf / nan results
|
# degenerate boxes gives inf / nan results
|
||||||
# so do an early check
|
# so do an early check
|
||||||
assert (boxes1[:, 2:] >= boxes1[:, :2]).all()
|
if not (boxes1[:, 2:] >= boxes1[:, :2]).all():
|
||||||
assert (boxes2[:, 2:] >= boxes2[:, :2]).all()
|
raise ValueError(f"boxes1 must be in [x0, y0, x1, y1] (corner) format, but got {boxes1}")
|
||||||
|
if not (boxes2[:, 2:] >= boxes2[:, :2]).all():
|
||||||
|
raise ValueError(f"boxes2 must be in [x0, y0, x1, y1] (corner) format, but got {boxes2}")
|
||||||
iou, union = box_iou(boxes1, boxes2)
|
iou, union = box_iou(boxes1, boxes2)
|
||||||
|
|
||||||
lt = torch.min(boxes1[:, None, :2], boxes2[:, :2])
|
top_left = torch.min(boxes1[:, None, :2], boxes2[:, :2])
|
||||||
rb = torch.max(boxes1[:, None, 2:], boxes2[:, 2:])
|
bottom_right = torch.max(boxes1[:, None, 2:], boxes2[:, 2:])
|
||||||
|
|
||||||
wh = (rb - lt).clamp(min=0) # [N,M,2]
|
width_height = (bottom_right - top_left).clamp(min=0) # [N,M,2]
|
||||||
area = wh[:, :, 0] * wh[:, :, 1]
|
area = width_height[:, :, 0] * width_height[:, :, 1]
|
||||||
|
|
||||||
return iou - (area - union) / area
|
return iou - (area - union) / area
|
||||||
|
|
||||||
@@ -2317,11 +2326,11 @@ def nested_tensor_from_tensor_list(tensor_list: List[Tensor]):
|
|||||||
if tensor_list[0].ndim == 3:
|
if tensor_list[0].ndim == 3:
|
||||||
max_size = _max_by_axis([list(img.shape) for img in tensor_list])
|
max_size = _max_by_axis([list(img.shape) for img in tensor_list])
|
||||||
batch_shape = [len(tensor_list)] + max_size
|
batch_shape = [len(tensor_list)] + max_size
|
||||||
b, c, h, w = batch_shape
|
batch_size, num_channels, height, width = batch_shape
|
||||||
dtype = tensor_list[0].dtype
|
dtype = tensor_list[0].dtype
|
||||||
device = tensor_list[0].device
|
device = tensor_list[0].device
|
||||||
tensor = torch.zeros(batch_shape, dtype=dtype, device=device)
|
tensor = torch.zeros(batch_shape, dtype=dtype, device=device)
|
||||||
mask = torch.ones((b, h, w), dtype=torch.bool, device=device)
|
mask = torch.ones((batch_size, height, width), dtype=torch.bool, device=device)
|
||||||
for img, pad_img, m in zip(tensor_list, tensor, mask):
|
for img, pad_img, m in zip(tensor_list, tensor, mask):
|
||||||
pad_img[: img.shape[0], : img.shape[1], : img.shape[2]].copy_(img)
|
pad_img[: img.shape[0], : img.shape[1], : img.shape[2]].copy_(img)
|
||||||
m[: img.shape[1], : img.shape[2]] = False
|
m[: img.shape[1], : img.shape[2]] = False
|
||||||
|
|||||||
@@ -1211,8 +1211,8 @@ class DetrAttention(nn.Module):
|
|||||||
self.q_proj = nn.Linear(embed_dim, embed_dim, bias=bias)
|
self.q_proj = nn.Linear(embed_dim, embed_dim, bias=bias)
|
||||||
self.out_proj = nn.Linear(embed_dim, embed_dim, bias=bias)
|
self.out_proj = nn.Linear(embed_dim, embed_dim, bias=bias)
|
||||||
|
|
||||||
def _shape(self, tensor: torch.Tensor, seq_len: int, bsz: int):
|
def _shape(self, tensor: torch.Tensor, seq_len: int, batch_size: int):
|
||||||
return tensor.view(bsz, seq_len, self.num_heads, self.head_dim).transpose(1, 2).contiguous()
|
return tensor.view(batch_size, seq_len, self.num_heads, self.head_dim).transpose(1, 2).contiguous()
|
||||||
|
|
||||||
def with_pos_embed(self, tensor: torch.Tensor, position_embeddings: Optional[Tensor]):
|
def with_pos_embed(self, tensor: torch.Tensor, position_embeddings: Optional[Tensor]):
|
||||||
return tensor if position_embeddings is None else tensor + position_embeddings
|
return tensor if position_embeddings is None else tensor + position_embeddings
|
||||||
@@ -1231,7 +1231,7 @@ class DetrAttention(nn.Module):
|
|||||||
# if key_value_states are provided this layer is used as a cross-attention layer
|
# if key_value_states are provided this layer is used as a cross-attention layer
|
||||||
# for the decoder
|
# for the decoder
|
||||||
is_cross_attention = key_value_states is not None
|
is_cross_attention = key_value_states is not None
|
||||||
bsz, tgt_len, embed_dim = hidden_states.size()
|
batch_size, target_len, embed_dim = hidden_states.size()
|
||||||
|
|
||||||
# add position embeddings to the hidden states before projecting to queries and keys
|
# add position embeddings to the hidden states before projecting to queries and keys
|
||||||
if position_embeddings is not None:
|
if position_embeddings is not None:
|
||||||
@@ -1248,35 +1248,36 @@ class DetrAttention(nn.Module):
|
|||||||
# get key, value proj
|
# get key, value proj
|
||||||
if is_cross_attention:
|
if is_cross_attention:
|
||||||
# cross_attentions
|
# cross_attentions
|
||||||
key_states = self._shape(self.k_proj(key_value_states), -1, bsz)
|
key_states = self._shape(self.k_proj(key_value_states), -1, batch_size)
|
||||||
value_states = self._shape(self.v_proj(key_value_states_original), -1, bsz)
|
value_states = self._shape(self.v_proj(key_value_states_original), -1, batch_size)
|
||||||
else:
|
else:
|
||||||
# self_attention
|
# self_attention
|
||||||
key_states = self._shape(self.k_proj(hidden_states), -1, bsz)
|
key_states = self._shape(self.k_proj(hidden_states), -1, batch_size)
|
||||||
value_states = self._shape(self.v_proj(hidden_states_original), -1, bsz)
|
value_states = self._shape(self.v_proj(hidden_states_original), -1, batch_size)
|
||||||
|
|
||||||
proj_shape = (bsz * self.num_heads, -1, self.head_dim)
|
proj_shape = (batch_size * self.num_heads, -1, self.head_dim)
|
||||||
query_states = self._shape(query_states, tgt_len, bsz).view(*proj_shape)
|
query_states = self._shape(query_states, target_len, batch_size).view(*proj_shape)
|
||||||
key_states = key_states.view(*proj_shape)
|
key_states = key_states.view(*proj_shape)
|
||||||
value_states = value_states.view(*proj_shape)
|
value_states = value_states.view(*proj_shape)
|
||||||
|
|
||||||
src_len = key_states.size(1)
|
source_len = key_states.size(1)
|
||||||
|
|
||||||
attn_weights = torch.bmm(query_states, key_states.transpose(1, 2))
|
attn_weights = torch.bmm(query_states, key_states.transpose(1, 2))
|
||||||
|
|
||||||
if attn_weights.size() != (bsz * self.num_heads, tgt_len, src_len):
|
if attn_weights.size() != (batch_size * self.num_heads, target_len, source_len):
|
||||||
raise ValueError(
|
raise ValueError(
|
||||||
f"Attention weights should be of size {(bsz * self.num_heads, tgt_len, src_len)}, but is"
|
f"Attention weights should be of size {(batch_size * self.num_heads, target_len, source_len)}, but is"
|
||||||
f" {attn_weights.size()}"
|
f" {attn_weights.size()}"
|
||||||
)
|
)
|
||||||
|
|
||||||
if attention_mask is not None:
|
if attention_mask is not None:
|
||||||
if attention_mask.size() != (bsz, 1, tgt_len, src_len):
|
if attention_mask.size() != (batch_size, 1, target_len, source_len):
|
||||||
raise ValueError(
|
raise ValueError(
|
||||||
f"Attention mask should be of size {(bsz, 1, tgt_len, src_len)}, but is {attention_mask.size()}"
|
f"Attention mask should be of size {(batch_size, 1, target_len, source_len)}, but is"
|
||||||
|
f" {attention_mask.size()}"
|
||||||
)
|
)
|
||||||
attn_weights = attn_weights.view(bsz, self.num_heads, tgt_len, src_len) + attention_mask
|
attn_weights = attn_weights.view(batch_size, self.num_heads, target_len, source_len) + attention_mask
|
||||||
attn_weights = attn_weights.view(bsz * self.num_heads, tgt_len, src_len)
|
attn_weights = attn_weights.view(batch_size * self.num_heads, target_len, source_len)
|
||||||
|
|
||||||
attn_weights = nn.functional.softmax(attn_weights, dim=-1)
|
attn_weights = nn.functional.softmax(attn_weights, dim=-1)
|
||||||
|
|
||||||
@@ -1285,8 +1286,8 @@ class DetrAttention(nn.Module):
|
|||||||
# make sure that attn_weights keeps its gradient.
|
# make sure that attn_weights keeps its gradient.
|
||||||
# In order to do so, attn_weights have to reshaped
|
# In order to do so, attn_weights have to reshaped
|
||||||
# twice and have to be reused in the following
|
# twice and have to be reused in the following
|
||||||
attn_weights_reshaped = attn_weights.view(bsz, self.num_heads, tgt_len, src_len)
|
attn_weights_reshaped = attn_weights.view(batch_size, self.num_heads, target_len, source_len)
|
||||||
attn_weights = attn_weights_reshaped.view(bsz * self.num_heads, tgt_len, src_len)
|
attn_weights = attn_weights_reshaped.view(batch_size * self.num_heads, target_len, source_len)
|
||||||
else:
|
else:
|
||||||
attn_weights_reshaped = None
|
attn_weights_reshaped = None
|
||||||
|
|
||||||
@@ -1294,15 +1295,15 @@ class DetrAttention(nn.Module):
|
|||||||
|
|
||||||
attn_output = torch.bmm(attn_probs, value_states)
|
attn_output = torch.bmm(attn_probs, value_states)
|
||||||
|
|
||||||
if attn_output.size() != (bsz * self.num_heads, tgt_len, self.head_dim):
|
if attn_output.size() != (batch_size * self.num_heads, target_len, self.head_dim):
|
||||||
raise ValueError(
|
raise ValueError(
|
||||||
f"`attn_output` should be of size {(bsz, self.num_heads, tgt_len, self.head_dim)}, but is"
|
f"`attn_output` should be of size {(batch_size, self.num_heads, target_len, self.head_dim)}, but is"
|
||||||
f" {attn_output.size()}"
|
f" {attn_output.size()}"
|
||||||
)
|
)
|
||||||
|
|
||||||
attn_output = attn_output.view(bsz, self.num_heads, tgt_len, self.head_dim)
|
attn_output = attn_output.view(batch_size, self.num_heads, target_len, self.head_dim)
|
||||||
attn_output = attn_output.transpose(1, 2)
|
attn_output = attn_output.transpose(1, 2)
|
||||||
attn_output = attn_output.reshape(bsz, tgt_len, embed_dim)
|
attn_output = attn_output.reshape(batch_size, target_len, embed_dim)
|
||||||
|
|
||||||
attn_output = self.out_proj(attn_output)
|
attn_output = self.out_proj(attn_output)
|
||||||
|
|
||||||
@@ -1351,7 +1352,8 @@ class DetrDecoderLayer(nn.Module):
|
|||||||
Args:
|
Args:
|
||||||
hidden_states (`torch.FloatTensor`): input to the layer of shape `(seq_len, batch, embed_dim)`
|
hidden_states (`torch.FloatTensor`): input to the layer of shape `(seq_len, batch, embed_dim)`
|
||||||
attention_mask (`torch.FloatTensor`): attention mask of size
|
attention_mask (`torch.FloatTensor`): attention mask of size
|
||||||
`(batch, 1, tgt_len, src_len)` where padding elements are indicated by very large negative values.
|
`(batch, 1, target_len, source_len)` where padding elements are indicated by very large negative
|
||||||
|
values.
|
||||||
position_embeddings (`torch.FloatTensor`, *optional*):
|
position_embeddings (`torch.FloatTensor`, *optional*):
|
||||||
position embeddings that are added to the queries and keys
|
position embeddings that are added to the queries and keys
|
||||||
in the cross-attention layer.
|
in the cross-attention layer.
|
||||||
@@ -1361,7 +1363,8 @@ class DetrDecoderLayer(nn.Module):
|
|||||||
encoder_hidden_states (`torch.FloatTensor`):
|
encoder_hidden_states (`torch.FloatTensor`):
|
||||||
cross attention input to the layer of shape `(seq_len, batch, embed_dim)`
|
cross attention input to the layer of shape `(seq_len, batch, embed_dim)`
|
||||||
encoder_attention_mask (`torch.FloatTensor`): encoder attention mask of size
|
encoder_attention_mask (`torch.FloatTensor`): encoder attention mask of size
|
||||||
`(batch, 1, tgt_len, src_len)` where padding elements are indicated by very large negative values.
|
`(batch, 1, target_len, source_len)` where padding elements are indicated by very large negative
|
||||||
|
values.
|
||||||
output_attentions (`bool`, *optional*):
|
output_attentions (`bool`, *optional*):
|
||||||
Whether or not to return the attentions tensors of all attention layers. See `attentions` under
|
Whether or not to return the attentions tensors of all attention layers. See `attentions` under
|
||||||
returned tensors for more detail.
|
returned tensors for more detail.
|
||||||
@@ -1416,14 +1419,14 @@ class DetrDecoderLayer(nn.Module):
|
|||||||
|
|
||||||
|
|
||||||
# Copied from transformers.models.detr.modeling_detr._expand_mask
|
# Copied from transformers.models.detr.modeling_detr._expand_mask
|
||||||
def _expand_mask(mask: torch.Tensor, dtype: torch.dtype, tgt_len: Optional[int] = None):
|
def _expand_mask(mask: torch.Tensor, dtype: torch.dtype, target_len: Optional[int] = None):
|
||||||
"""
|
"""
|
||||||
Expands attention_mask from `[bsz, seq_len]` to `[bsz, 1, tgt_seq_len, src_seq_len]`.
|
Expands attention_mask from `[batch_size, seq_len]` to `[batch_size, 1, target_seq_len, source_seq_len]`.
|
||||||
"""
|
"""
|
||||||
bsz, src_len = mask.size()
|
batch_size, source_len = mask.size()
|
||||||
tgt_len = tgt_len if tgt_len is not None else src_len
|
target_len = target_len if target_len is not None else source_len
|
||||||
|
|
||||||
expanded_mask = mask[:, None, None, :].expand(bsz, 1, tgt_len, src_len).to(dtype)
|
expanded_mask = mask[:, None, None, :].expand(batch_size, 1, target_len, source_len).to(dtype)
|
||||||
|
|
||||||
inverted_mask = 1.0 - expanded_mask
|
inverted_mask = 1.0 - expanded_mask
|
||||||
|
|
||||||
|
|||||||
@@ -874,21 +874,22 @@ def sigmoid_focal_loss(inputs, targets, num_boxes, alpha: float = 0.25, gamma: f
|
|||||||
Loss used in RetinaNet for dense detection: https://arxiv.org/abs/1708.02002.
|
Loss used in RetinaNet for dense detection: https://arxiv.org/abs/1708.02002.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
inputs: A float tensor of arbitrary shape.
|
inputs (`torch.FloatTensor` of arbitrary shape):
|
||||||
The predictions for each example.
|
The predictions for each example.
|
||||||
targets: A float tensor with the same shape as inputs. Stores the binary
|
targets (`torch.FloatTensor` with the same shape as `inputs`)
|
||||||
classification label for each element in inputs (0 for the negative class and 1 for the positive
|
A tensor storing the binary classification label for each element in the `inputs` (0 for the negative class
|
||||||
class).
|
and 1 for the positive class).
|
||||||
alpha: (optional) Weighting factor in range (0,1) to balance
|
alpha (`float`, *optional*, defaults to `0.25`):
|
||||||
positive vs negative examples. Default = -1 (no weighting).
|
Optional weighting factor in the range (0,1) to balance positive vs. negative examples.
|
||||||
gamma: Exponent of the modulating factor (1 - p_t) to
|
gamma (`int`, *optional*, defaults to `2`):
|
||||||
balance easy vs hard examples.
|
Exponent of the modulating factor (1 - p_t) to balance easy vs hard examples.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
Loss tensor
|
Loss tensor
|
||||||
"""
|
"""
|
||||||
prob = inputs.sigmoid()
|
prob = inputs.sigmoid()
|
||||||
ce_loss = nn.functional.binary_cross_entropy_with_logits(inputs, targets, reduction="none")
|
ce_loss = nn.functional.binary_cross_entropy_with_logits(inputs, targets, reduction="none")
|
||||||
|
# add modulating factor
|
||||||
p_t = prob * targets + (1 - prob) * (1 - targets)
|
p_t = prob * targets + (1 - prob) * (1 - targets)
|
||||||
loss = ce_loss * ((1 - p_t) ** gamma)
|
loss = ce_loss * ((1 - p_t) ** gamma)
|
||||||
|
|
||||||
@@ -966,10 +967,10 @@ class YolosLoss(nn.Module):
|
|||||||
"""
|
"""
|
||||||
logits = outputs["logits"]
|
logits = outputs["logits"]
|
||||||
device = logits.device
|
device = logits.device
|
||||||
tgt_lengths = torch.as_tensor([len(v["class_labels"]) for v in targets], device=device)
|
target_lengths = torch.as_tensor([len(v["class_labels"]) for v in targets], device=device)
|
||||||
# Count the number of predictions that are NOT "no-object" (which is the last class)
|
# Count the number of predictions that are NOT "no-object" (which is the last class)
|
||||||
card_pred = (logits.argmax(-1) != logits.shape[-1] - 1).sum(1)
|
card_pred = (logits.argmax(-1) != logits.shape[-1] - 1).sum(1)
|
||||||
card_err = nn.functional.l1_loss(card_pred.float(), tgt_lengths.float())
|
card_err = nn.functional.l1_loss(card_pred.float(), target_lengths.float())
|
||||||
losses = {"cardinality_error": card_err}
|
losses = {"cardinality_error": card_err}
|
||||||
return losses
|
return losses
|
||||||
|
|
||||||
@@ -1176,19 +1177,19 @@ class YolosHungarianMatcher(nn.Module):
|
|||||||
out_bbox = outputs["pred_boxes"].flatten(0, 1) # [batch_size * num_queries, 4]
|
out_bbox = outputs["pred_boxes"].flatten(0, 1) # [batch_size * num_queries, 4]
|
||||||
|
|
||||||
# Also concat the target labels and boxes
|
# Also concat the target labels and boxes
|
||||||
tgt_ids = torch.cat([v["class_labels"] for v in targets])
|
target_ids = torch.cat([v["class_labels"] for v in targets])
|
||||||
tgt_bbox = torch.cat([v["boxes"] for v in targets])
|
target_bbox = torch.cat([v["boxes"] for v in targets])
|
||||||
|
|
||||||
# Compute the classification cost. Contrary to the loss, we don't use the NLL,
|
# Compute the classification cost. Contrary to the loss, we don't use the NLL,
|
||||||
# but approximate it in 1 - proba[target class].
|
# but approximate it in 1 - proba[target class].
|
||||||
# The 1 is a constant that doesn't change the matching, it can be ommitted.
|
# The 1 is a constant that doesn't change the matching, it can be ommitted.
|
||||||
class_cost = -out_prob[:, tgt_ids]
|
class_cost = -out_prob[:, target_ids]
|
||||||
|
|
||||||
# Compute the L1 cost between boxes
|
# Compute the L1 cost between boxes
|
||||||
bbox_cost = torch.cdist(out_bbox, tgt_bbox, p=1)
|
bbox_cost = torch.cdist(out_bbox, target_bbox, p=1)
|
||||||
|
|
||||||
# Compute the giou cost between boxes
|
# Compute the giou cost between boxes
|
||||||
giou_cost = -generalized_box_iou(center_to_corners_format(out_bbox), center_to_corners_format(tgt_bbox))
|
giou_cost = -generalized_box_iou(center_to_corners_format(out_bbox), center_to_corners_format(target_bbox))
|
||||||
|
|
||||||
# Final cost matrix
|
# Final cost matrix
|
||||||
cost_matrix = self.bbox_cost * bbox_cost + self.class_cost * class_cost + self.giou_cost * giou_cost
|
cost_matrix = self.bbox_cost * bbox_cost + self.class_cost * class_cost + self.giou_cost * giou_cost
|
||||||
@@ -1252,15 +1253,17 @@ def generalized_box_iou(boxes1, boxes2):
|
|||||||
"""
|
"""
|
||||||
# degenerate boxes gives inf / nan results
|
# degenerate boxes gives inf / nan results
|
||||||
# so do an early check
|
# so do an early check
|
||||||
assert (boxes1[:, 2:] >= boxes1[:, :2]).all()
|
if not (boxes1[:, 2:] >= boxes1[:, :2]).all():
|
||||||
assert (boxes2[:, 2:] >= boxes2[:, :2]).all()
|
raise ValueError(f"boxes1 must be in [x0, y0, x1, y1] (corner) format, but got {boxes1}")
|
||||||
|
if not (boxes2[:, 2:] >= boxes2[:, :2]).all():
|
||||||
|
raise ValueError(f"boxes2 must be in [x0, y0, x1, y1] (corner) format, but got {boxes2}")
|
||||||
iou, union = box_iou(boxes1, boxes2)
|
iou, union = box_iou(boxes1, boxes2)
|
||||||
|
|
||||||
lt = torch.min(boxes1[:, None, :2], boxes2[:, :2])
|
top_left = torch.min(boxes1[:, None, :2], boxes2[:, :2])
|
||||||
rb = torch.max(boxes1[:, None, 2:], boxes2[:, 2:])
|
bottom_right = torch.max(boxes1[:, None, 2:], boxes2[:, 2:])
|
||||||
|
|
||||||
wh = (rb - lt).clamp(min=0) # [N,M,2]
|
width_height = (bottom_right - top_left).clamp(min=0) # [N,M,2]
|
||||||
area = wh[:, :, 0] * wh[:, :, 1]
|
area = width_height[:, :, 0] * width_height[:, :, 1]
|
||||||
|
|
||||||
return iou - (area - union) / area
|
return iou - (area - union) / area
|
||||||
|
|
||||||
@@ -1302,11 +1305,11 @@ def nested_tensor_from_tensor_list(tensor_list: List[Tensor]):
|
|||||||
if tensor_list[0].ndim == 3:
|
if tensor_list[0].ndim == 3:
|
||||||
max_size = _max_by_axis([list(img.shape) for img in tensor_list])
|
max_size = _max_by_axis([list(img.shape) for img in tensor_list])
|
||||||
batch_shape = [len(tensor_list)] + max_size
|
batch_shape = [len(tensor_list)] + max_size
|
||||||
b, c, h, w = batch_shape
|
batch_size, num_channels, height, width = batch_shape
|
||||||
dtype = tensor_list[0].dtype
|
dtype = tensor_list[0].dtype
|
||||||
device = tensor_list[0].device
|
device = tensor_list[0].device
|
||||||
tensor = torch.zeros(batch_shape, dtype=dtype, device=device)
|
tensor = torch.zeros(batch_shape, dtype=dtype, device=device)
|
||||||
mask = torch.ones((b, h, w), dtype=torch.bool, device=device)
|
mask = torch.ones((batch_size, height, width), dtype=torch.bool, device=device)
|
||||||
for img, pad_img, m in zip(tensor_list, tensor, mask):
|
for img, pad_img, m in zip(tensor_list, tensor, mask):
|
||||||
pad_img[: img.shape[0], : img.shape[1], : img.shape[2]].copy_(img)
|
pad_img[: img.shape[0], : img.shape[1], : img.shape[2]].copy_(img)
|
||||||
m[: img.shape[1], : img.shape[2]] = False
|
m[: img.shape[1], : img.shape[2]] = False
|
||||||
|
|||||||
@@ -3,6 +3,30 @@
|
|||||||
from ..utils import DummyObject, requires_backends
|
from ..utils import DummyObject, requires_backends
|
||||||
|
|
||||||
|
|
||||||
|
DEFORMABLE_DETR_PRETRAINED_MODEL_ARCHIVE_LIST = None
|
||||||
|
|
||||||
|
|
||||||
|
class DeformableDetrForObjectDetection(metaclass=DummyObject):
|
||||||
|
_backends = ["timm", "vision"]
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
requires_backends(self, ["timm", "vision"])
|
||||||
|
|
||||||
|
|
||||||
|
class DeformableDetrModel(metaclass=DummyObject):
|
||||||
|
_backends = ["timm", "vision"]
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
requires_backends(self, ["timm", "vision"])
|
||||||
|
|
||||||
|
|
||||||
|
class DeformableDetrPreTrainedModel(metaclass=DummyObject):
|
||||||
|
_backends = ["timm", "vision"]
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
requires_backends(self, ["timm", "vision"])
|
||||||
|
|
||||||
|
|
||||||
DETR_PRETRAINED_MODEL_ARCHIVE_LIST = None
|
DETR_PRETRAINED_MODEL_ARCHIVE_LIST = None
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,32 +0,0 @@
|
|||||||
# This file is autogenerated by the command `make fix-copies`, do not edit.
|
|
||||||
from ..utils import requires_backends
|
|
||||||
|
|
||||||
|
|
||||||
DETR_PRETRAINED_MODEL_ARCHIVE_LIST = None
|
|
||||||
|
|
||||||
|
|
||||||
class DetrForObjectDetection:
|
|
||||||
def __init__(self, *args, **kwargs):
|
|
||||||
requires_backends(self, ["timm"])
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def from_pretrained(cls, *args, **kwargs):
|
|
||||||
requires_backends(cls, ["timm"])
|
|
||||||
|
|
||||||
|
|
||||||
class DetrForSegmentation:
|
|
||||||
def __init__(self, *args, **kwargs):
|
|
||||||
requires_backends(self, ["timm"])
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def from_pretrained(cls, *args, **kwargs):
|
|
||||||
requires_backends(cls, ["timm"])
|
|
||||||
|
|
||||||
|
|
||||||
class DetrModel:
|
|
||||||
def __init__(self, *args, **kwargs):
|
|
||||||
requires_backends(self, ["timm"])
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def from_pretrained(cls, *args, **kwargs):
|
|
||||||
requires_backends(cls, ["timm"])
|
|
||||||
0
tests/models/deformable_detr/__init__.py
Normal file
0
tests/models/deformable_detr/__init__.py
Normal file
625
tests/models/deformable_detr/test_modeling_deformable_detr.py
Normal file
625
tests/models/deformable_detr/test_modeling_deformable_detr.py
Normal file
@@ -0,0 +1,625 @@
|
|||||||
|
# coding=utf-8
|
||||||
|
# Copyright 2022 The HuggingFace Inc. team. All rights reserved.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
""" Testing suite for the PyTorch Deformable DETR model. """
|
||||||
|
|
||||||
|
|
||||||
|
import inspect
|
||||||
|
import math
|
||||||
|
import unittest
|
||||||
|
from typing import Dict, List, Tuple
|
||||||
|
|
||||||
|
from transformers import DeformableDetrConfig, is_timm_available, is_vision_available
|
||||||
|
from transformers.file_utils import cached_property
|
||||||
|
from transformers.testing_utils import require_timm, require_torch_gpu, require_vision, slow, torch_device
|
||||||
|
|
||||||
|
from ...generation.test_generation_utils import GenerationTesterMixin
|
||||||
|
from ...test_configuration_common import ConfigTester
|
||||||
|
from ...test_modeling_common import ModelTesterMixin, _config_zero_init, floats_tensor
|
||||||
|
|
||||||
|
|
||||||
|
if is_timm_available():
|
||||||
|
import torch
|
||||||
|
|
||||||
|
from transformers import DeformableDetrForObjectDetection, DeformableDetrModel
|
||||||
|
|
||||||
|
|
||||||
|
if is_vision_available():
|
||||||
|
from PIL import Image
|
||||||
|
|
||||||
|
from transformers import AutoFeatureExtractor
|
||||||
|
|
||||||
|
|
||||||
|
class DeformableDetrModelTester:
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
parent,
|
||||||
|
batch_size=8,
|
||||||
|
is_training=True,
|
||||||
|
use_labels=True,
|
||||||
|
hidden_size=256,
|
||||||
|
num_hidden_layers=2,
|
||||||
|
num_attention_heads=8,
|
||||||
|
intermediate_size=4,
|
||||||
|
hidden_act="gelu",
|
||||||
|
hidden_dropout_prob=0.1,
|
||||||
|
attention_probs_dropout_prob=0.1,
|
||||||
|
num_queries=12,
|
||||||
|
num_channels=3,
|
||||||
|
image_size=196,
|
||||||
|
n_targets=8,
|
||||||
|
num_labels=91,
|
||||||
|
num_feature_levels=4,
|
||||||
|
encoder_n_points=2,
|
||||||
|
decoder_n_points=6,
|
||||||
|
):
|
||||||
|
self.parent = parent
|
||||||
|
self.batch_size = batch_size
|
||||||
|
self.is_training = is_training
|
||||||
|
self.use_labels = use_labels
|
||||||
|
self.hidden_size = hidden_size
|
||||||
|
self.num_hidden_layers = num_hidden_layers
|
||||||
|
self.num_attention_heads = num_attention_heads
|
||||||
|
self.intermediate_size = intermediate_size
|
||||||
|
self.hidden_act = hidden_act
|
||||||
|
self.hidden_dropout_prob = hidden_dropout_prob
|
||||||
|
self.attention_probs_dropout_prob = attention_probs_dropout_prob
|
||||||
|
self.num_queries = num_queries
|
||||||
|
self.num_channels = num_channels
|
||||||
|
self.image_size = image_size
|
||||||
|
self.n_targets = n_targets
|
||||||
|
self.num_labels = num_labels
|
||||||
|
self.num_feature_levels = num_feature_levels
|
||||||
|
self.encoder_n_points = encoder_n_points
|
||||||
|
self.decoder_n_points = decoder_n_points
|
||||||
|
|
||||||
|
# we also set the expected seq length for both encoder and decoder
|
||||||
|
self.encoder_seq_length = (
|
||||||
|
math.ceil(self.image_size / 8) ** 2
|
||||||
|
+ math.ceil(self.image_size / 16) ** 2
|
||||||
|
+ math.ceil(self.image_size / 32) ** 2
|
||||||
|
+ math.ceil(self.image_size / 64) ** 2
|
||||||
|
)
|
||||||
|
self.decoder_seq_length = self.num_queries
|
||||||
|
|
||||||
|
def prepare_config_and_inputs(self):
|
||||||
|
pixel_values = floats_tensor([self.batch_size, self.num_channels, self.image_size, self.image_size])
|
||||||
|
|
||||||
|
pixel_mask = torch.ones([self.batch_size, self.image_size, self.image_size], device=torch_device)
|
||||||
|
|
||||||
|
labels = None
|
||||||
|
if self.use_labels:
|
||||||
|
# labels is a list of Dict (each Dict being the labels for a given example in the batch)
|
||||||
|
labels = []
|
||||||
|
for i in range(self.batch_size):
|
||||||
|
target = {}
|
||||||
|
target["class_labels"] = torch.randint(
|
||||||
|
high=self.num_labels, size=(self.n_targets,), device=torch_device
|
||||||
|
)
|
||||||
|
target["boxes"] = torch.rand(self.n_targets, 4, device=torch_device)
|
||||||
|
target["masks"] = torch.rand(self.n_targets, self.image_size, self.image_size, device=torch_device)
|
||||||
|
labels.append(target)
|
||||||
|
|
||||||
|
config = self.get_config()
|
||||||
|
return config, pixel_values, pixel_mask, labels
|
||||||
|
|
||||||
|
def get_config(self):
|
||||||
|
return DeformableDetrConfig(
|
||||||
|
d_model=self.hidden_size,
|
||||||
|
encoder_layers=self.num_hidden_layers,
|
||||||
|
decoder_layers=self.num_hidden_layers,
|
||||||
|
encoder_attention_heads=self.num_attention_heads,
|
||||||
|
decoder_attention_heads=self.num_attention_heads,
|
||||||
|
encoder_ffn_dim=self.intermediate_size,
|
||||||
|
decoder_ffn_dim=self.intermediate_size,
|
||||||
|
dropout=self.hidden_dropout_prob,
|
||||||
|
attention_dropout=self.attention_probs_dropout_prob,
|
||||||
|
num_queries=self.num_queries,
|
||||||
|
num_labels=self.num_labels,
|
||||||
|
num_feature_levels=self.num_feature_levels,
|
||||||
|
encoder_n_points=self.encoder_n_points,
|
||||||
|
decoder_n_points=self.decoder_n_points,
|
||||||
|
)
|
||||||
|
|
||||||
|
def prepare_config_and_inputs_for_common(self):
|
||||||
|
config, pixel_values, pixel_mask, labels = self.prepare_config_and_inputs()
|
||||||
|
inputs_dict = {"pixel_values": pixel_values, "pixel_mask": pixel_mask}
|
||||||
|
return config, inputs_dict
|
||||||
|
|
||||||
|
def create_and_check_deformable_detr_model(self, config, pixel_values, pixel_mask, labels):
|
||||||
|
model = DeformableDetrModel(config=config)
|
||||||
|
model.to(torch_device)
|
||||||
|
model.eval()
|
||||||
|
|
||||||
|
result = model(pixel_values=pixel_values, pixel_mask=pixel_mask)
|
||||||
|
result = model(pixel_values)
|
||||||
|
|
||||||
|
self.parent.assertEqual(result.last_hidden_state.shape, (self.batch_size, self.num_queries, self.hidden_size))
|
||||||
|
|
||||||
|
def create_and_check_deformable_detr_object_detection_head_model(self, config, pixel_values, pixel_mask, labels):
|
||||||
|
model = DeformableDetrForObjectDetection(config=config)
|
||||||
|
model.to(torch_device)
|
||||||
|
model.eval()
|
||||||
|
|
||||||
|
result = model(pixel_values=pixel_values, pixel_mask=pixel_mask)
|
||||||
|
result = model(pixel_values)
|
||||||
|
|
||||||
|
self.parent.assertEqual(result.logits.shape, (self.batch_size, self.num_queries, self.num_labels))
|
||||||
|
self.parent.assertEqual(result.pred_boxes.shape, (self.batch_size, self.num_queries, 4))
|
||||||
|
|
||||||
|
result = model(pixel_values=pixel_values, pixel_mask=pixel_mask, labels=labels)
|
||||||
|
|
||||||
|
self.parent.assertEqual(result.loss.shape, ())
|
||||||
|
self.parent.assertEqual(result.logits.shape, (self.batch_size, self.num_queries, self.num_labels))
|
||||||
|
self.parent.assertEqual(result.pred_boxes.shape, (self.batch_size, self.num_queries, 4))
|
||||||
|
|
||||||
|
|
||||||
|
@require_timm
|
||||||
|
class DeformableDetrModelTest(ModelTesterMixin, GenerationTesterMixin, unittest.TestCase):
|
||||||
|
all_model_classes = (DeformableDetrModel, DeformableDetrForObjectDetection) if is_timm_available() else ()
|
||||||
|
is_encoder_decoder = True
|
||||||
|
test_torchscript = False
|
||||||
|
test_pruning = False
|
||||||
|
test_head_masking = False
|
||||||
|
test_missing_keys = False
|
||||||
|
|
||||||
|
# special case for head models
|
||||||
|
def _prepare_for_class(self, inputs_dict, model_class, return_labels=False):
|
||||||
|
inputs_dict = super()._prepare_for_class(inputs_dict, model_class, return_labels=return_labels)
|
||||||
|
|
||||||
|
if return_labels:
|
||||||
|
if model_class.__name__ == "DeformableDetrForObjectDetection":
|
||||||
|
labels = []
|
||||||
|
for i in range(self.model_tester.batch_size):
|
||||||
|
target = {}
|
||||||
|
target["class_labels"] = torch.ones(
|
||||||
|
size=(self.model_tester.n_targets,), device=torch_device, dtype=torch.long
|
||||||
|
)
|
||||||
|
target["boxes"] = torch.ones(
|
||||||
|
self.model_tester.n_targets, 4, device=torch_device, dtype=torch.float
|
||||||
|
)
|
||||||
|
target["masks"] = torch.ones(
|
||||||
|
self.model_tester.n_targets,
|
||||||
|
self.model_tester.image_size,
|
||||||
|
self.model_tester.image_size,
|
||||||
|
device=torch_device,
|
||||||
|
dtype=torch.float,
|
||||||
|
)
|
||||||
|
labels.append(target)
|
||||||
|
inputs_dict["labels"] = labels
|
||||||
|
|
||||||
|
return inputs_dict
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
self.model_tester = DeformableDetrModelTester(self)
|
||||||
|
self.config_tester = ConfigTester(self, config_class=DeformableDetrConfig, has_text_modality=False)
|
||||||
|
|
||||||
|
def test_config(self):
|
||||||
|
# we don't test common_properties and arguments_init as these don't apply for Deformable DETR
|
||||||
|
self.config_tester.create_and_test_config_to_json_string()
|
||||||
|
self.config_tester.create_and_test_config_to_json_file()
|
||||||
|
self.config_tester.create_and_test_config_from_and_save_pretrained()
|
||||||
|
self.config_tester.create_and_test_config_with_num_labels()
|
||||||
|
self.config_tester.check_config_can_be_init_without_params()
|
||||||
|
|
||||||
|
def test_deformable_detr_model(self):
|
||||||
|
config_and_inputs = self.model_tester.prepare_config_and_inputs()
|
||||||
|
self.model_tester.create_and_check_deformable_detr_model(*config_and_inputs)
|
||||||
|
|
||||||
|
def test_deformable_detr_object_detection_head_model(self):
|
||||||
|
config_and_inputs = self.model_tester.prepare_config_and_inputs()
|
||||||
|
self.model_tester.create_and_check_deformable_detr_object_detection_head_model(*config_and_inputs)
|
||||||
|
|
||||||
|
@unittest.skip(reason="Deformable DETR does not use inputs_embeds")
|
||||||
|
def test_inputs_embeds(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
@unittest.skip(reason="Deformable DETR does not have a get_input_embeddings method")
|
||||||
|
def test_model_common_attributes(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
@unittest.skip(reason="Deformable DETR is not a generative model")
|
||||||
|
def test_generate_without_input_ids(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
@unittest.skip(reason="Deformable DETR does not use token embeddings")
|
||||||
|
def test_resize_tokens_embeddings(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
@unittest.skip(reason="Feed forward chunking is not implemented")
|
||||||
|
def test_feed_forward_chunking(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def test_attention_outputs(self):
|
||||||
|
config, inputs_dict = self.model_tester.prepare_config_and_inputs_for_common()
|
||||||
|
config.return_dict = True
|
||||||
|
|
||||||
|
for model_class in self.all_model_classes:
|
||||||
|
inputs_dict["output_attentions"] = True
|
||||||
|
inputs_dict["output_hidden_states"] = False
|
||||||
|
config.return_dict = True
|
||||||
|
model = model_class(config)
|
||||||
|
model.to(torch_device)
|
||||||
|
model.eval()
|
||||||
|
with torch.no_grad():
|
||||||
|
outputs = model(**self._prepare_for_class(inputs_dict, model_class))
|
||||||
|
attentions = outputs.encoder_attentions
|
||||||
|
self.assertEqual(len(attentions), self.model_tester.num_hidden_layers)
|
||||||
|
|
||||||
|
# check that output_attentions also work using config
|
||||||
|
del inputs_dict["output_attentions"]
|
||||||
|
config.output_attentions = True
|
||||||
|
model = model_class(config)
|
||||||
|
model.to(torch_device)
|
||||||
|
model.eval()
|
||||||
|
with torch.no_grad():
|
||||||
|
outputs = model(**self._prepare_for_class(inputs_dict, model_class))
|
||||||
|
attentions = outputs.encoder_attentions
|
||||||
|
self.assertEqual(len(attentions), self.model_tester.num_hidden_layers)
|
||||||
|
|
||||||
|
self.assertListEqual(
|
||||||
|
list(attentions[0].shape[-3:]),
|
||||||
|
[
|
||||||
|
self.model_tester.num_attention_heads,
|
||||||
|
self.model_tester.num_feature_levels,
|
||||||
|
self.model_tester.encoder_n_points,
|
||||||
|
],
|
||||||
|
)
|
||||||
|
out_len = len(outputs)
|
||||||
|
|
||||||
|
correct_outlen = 8
|
||||||
|
|
||||||
|
# loss is at first position
|
||||||
|
if "labels" in inputs_dict:
|
||||||
|
correct_outlen += 1 # loss is added to beginning
|
||||||
|
# Object Detection model returns pred_logits and pred_boxes
|
||||||
|
if model_class.__name__ == "DeformableDetrForObjectDetection":
|
||||||
|
correct_outlen += 2
|
||||||
|
|
||||||
|
self.assertEqual(out_len, correct_outlen)
|
||||||
|
|
||||||
|
# decoder attentions
|
||||||
|
decoder_attentions = outputs.decoder_attentions
|
||||||
|
self.assertIsInstance(decoder_attentions, (list, tuple))
|
||||||
|
self.assertEqual(len(decoder_attentions), self.model_tester.num_hidden_layers)
|
||||||
|
self.assertListEqual(
|
||||||
|
list(decoder_attentions[0].shape[-3:]),
|
||||||
|
[self.model_tester.num_attention_heads, self.model_tester.num_queries, self.model_tester.num_queries],
|
||||||
|
)
|
||||||
|
|
||||||
|
# cross attentions
|
||||||
|
cross_attentions = outputs.cross_attentions
|
||||||
|
self.assertIsInstance(cross_attentions, (list, tuple))
|
||||||
|
self.assertEqual(len(cross_attentions), self.model_tester.num_hidden_layers)
|
||||||
|
self.assertListEqual(
|
||||||
|
list(cross_attentions[0].shape[-3:]),
|
||||||
|
[
|
||||||
|
self.model_tester.num_attention_heads,
|
||||||
|
self.model_tester.num_feature_levels,
|
||||||
|
self.model_tester.decoder_n_points,
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
# Check attention is always last and order is fine
|
||||||
|
inputs_dict["output_attentions"] = True
|
||||||
|
inputs_dict["output_hidden_states"] = True
|
||||||
|
model = model_class(config)
|
||||||
|
model.to(torch_device)
|
||||||
|
model.eval()
|
||||||
|
with torch.no_grad():
|
||||||
|
outputs = model(**self._prepare_for_class(inputs_dict, model_class))
|
||||||
|
|
||||||
|
if hasattr(self.model_tester, "num_hidden_states_types"):
|
||||||
|
added_hidden_states = self.model_tester.num_hidden_states_types
|
||||||
|
elif self.is_encoder_decoder:
|
||||||
|
added_hidden_states = 2
|
||||||
|
else:
|
||||||
|
added_hidden_states = 1
|
||||||
|
self.assertEqual(out_len + added_hidden_states, len(outputs))
|
||||||
|
|
||||||
|
self_attentions = outputs.encoder_attentions
|
||||||
|
|
||||||
|
self.assertEqual(len(self_attentions), self.model_tester.num_hidden_layers)
|
||||||
|
self.assertListEqual(
|
||||||
|
list(self_attentions[0].shape[-3:]),
|
||||||
|
[
|
||||||
|
self.model_tester.num_attention_heads,
|
||||||
|
self.model_tester.num_feature_levels,
|
||||||
|
self.model_tester.encoder_n_points,
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_model_outputs_equivalence(self):
|
||||||
|
config, inputs_dict = self.model_tester.prepare_config_and_inputs_for_common()
|
||||||
|
|
||||||
|
def set_nan_tensor_to_zero(t):
|
||||||
|
t[t != t] = 0
|
||||||
|
return t
|
||||||
|
|
||||||
|
def check_equivalence(model, tuple_inputs, dict_inputs, additional_kwargs={}):
|
||||||
|
with torch.no_grad():
|
||||||
|
tuple_output = model(**tuple_inputs, return_dict=False, **additional_kwargs)
|
||||||
|
dict_output = model(**dict_inputs, return_dict=True, **additional_kwargs).to_tuple()
|
||||||
|
|
||||||
|
def recursive_check(tuple_object, dict_object):
|
||||||
|
if isinstance(tuple_object, (List, Tuple)):
|
||||||
|
for tuple_iterable_value, dict_iterable_value in zip(tuple_object, dict_object):
|
||||||
|
recursive_check(tuple_iterable_value, dict_iterable_value)
|
||||||
|
elif isinstance(tuple_object, Dict):
|
||||||
|
for tuple_iterable_value, dict_iterable_value in zip(
|
||||||
|
tuple_object.values(), dict_object.values()
|
||||||
|
):
|
||||||
|
recursive_check(tuple_iterable_value, dict_iterable_value)
|
||||||
|
elif tuple_object is None:
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
self.assertTrue(
|
||||||
|
torch.allclose(
|
||||||
|
set_nan_tensor_to_zero(tuple_object), set_nan_tensor_to_zero(dict_object), atol=1e-5
|
||||||
|
),
|
||||||
|
msg=(
|
||||||
|
"Tuple and dict output are not equal. Difference:"
|
||||||
|
f" {torch.max(torch.abs(tuple_object - dict_object))}. Tuple has `nan`:"
|
||||||
|
f" {torch.isnan(tuple_object).any()} and `inf`: {torch.isinf(tuple_object)}. Dict has"
|
||||||
|
f" `nan`: {torch.isnan(dict_object).any()} and `inf`: {torch.isinf(dict_object)}."
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
recursive_check(tuple_output, dict_output)
|
||||||
|
|
||||||
|
for model_class in self.all_model_classes:
|
||||||
|
print("Model class:", model_class)
|
||||||
|
model = model_class(config)
|
||||||
|
model.to(torch_device)
|
||||||
|
model.eval()
|
||||||
|
|
||||||
|
tuple_inputs = self._prepare_for_class(inputs_dict, model_class)
|
||||||
|
dict_inputs = self._prepare_for_class(inputs_dict, model_class)
|
||||||
|
check_equivalence(model, tuple_inputs, dict_inputs)
|
||||||
|
|
||||||
|
tuple_inputs = self._prepare_for_class(inputs_dict, model_class, return_labels=True)
|
||||||
|
dict_inputs = self._prepare_for_class(inputs_dict, model_class, return_labels=True)
|
||||||
|
check_equivalence(model, tuple_inputs, dict_inputs)
|
||||||
|
|
||||||
|
tuple_inputs = self._prepare_for_class(inputs_dict, model_class)
|
||||||
|
dict_inputs = self._prepare_for_class(inputs_dict, model_class)
|
||||||
|
check_equivalence(model, tuple_inputs, dict_inputs, {"output_hidden_states": True})
|
||||||
|
|
||||||
|
tuple_inputs = self._prepare_for_class(inputs_dict, model_class)
|
||||||
|
dict_inputs = self._prepare_for_class(inputs_dict, model_class)
|
||||||
|
check_equivalence(model, tuple_inputs, dict_inputs, {"output_attentions": True})
|
||||||
|
|
||||||
|
tuple_inputs = self._prepare_for_class(inputs_dict, model_class, return_labels=True)
|
||||||
|
dict_inputs = self._prepare_for_class(inputs_dict, model_class, return_labels=True)
|
||||||
|
check_equivalence(model, tuple_inputs, dict_inputs, {"output_hidden_states": True})
|
||||||
|
|
||||||
|
tuple_inputs = self._prepare_for_class(inputs_dict, model_class, return_labels=True)
|
||||||
|
dict_inputs = self._prepare_for_class(inputs_dict, model_class, return_labels=True)
|
||||||
|
check_equivalence(model, tuple_inputs, dict_inputs, {"output_attentions": True})
|
||||||
|
|
||||||
|
tuple_inputs = self._prepare_for_class(inputs_dict, model_class, return_labels=True)
|
||||||
|
dict_inputs = self._prepare_for_class(inputs_dict, model_class, return_labels=True)
|
||||||
|
check_equivalence(
|
||||||
|
model, tuple_inputs, dict_inputs, {"output_hidden_states": True, "output_attentions": True}
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_retain_grad_hidden_states_attentions(self):
|
||||||
|
# removed retain_grad and grad on decoder_hidden_states, as queries don't require grad
|
||||||
|
|
||||||
|
config, inputs_dict = self.model_tester.prepare_config_and_inputs_for_common()
|
||||||
|
config.output_hidden_states = True
|
||||||
|
config.output_attentions = True
|
||||||
|
|
||||||
|
# no need to test all models as different heads yield the same functionality
|
||||||
|
model_class = self.all_model_classes[0]
|
||||||
|
model = model_class(config)
|
||||||
|
model.to(torch_device)
|
||||||
|
|
||||||
|
inputs = self._prepare_for_class(inputs_dict, model_class)
|
||||||
|
|
||||||
|
outputs = model(**inputs)
|
||||||
|
|
||||||
|
# we take the second output since last_hidden_state is the second item
|
||||||
|
output = outputs[1]
|
||||||
|
|
||||||
|
encoder_hidden_states = outputs.encoder_hidden_states[0]
|
||||||
|
encoder_attentions = outputs.encoder_attentions[0]
|
||||||
|
encoder_hidden_states.retain_grad()
|
||||||
|
encoder_attentions.retain_grad()
|
||||||
|
|
||||||
|
decoder_attentions = outputs.decoder_attentions[0]
|
||||||
|
decoder_attentions.retain_grad()
|
||||||
|
|
||||||
|
cross_attentions = outputs.cross_attentions[0]
|
||||||
|
cross_attentions.retain_grad()
|
||||||
|
|
||||||
|
output.flatten()[0].backward(retain_graph=True)
|
||||||
|
|
||||||
|
self.assertIsNotNone(encoder_hidden_states.grad)
|
||||||
|
self.assertIsNotNone(encoder_attentions.grad)
|
||||||
|
self.assertIsNotNone(decoder_attentions.grad)
|
||||||
|
self.assertIsNotNone(cross_attentions.grad)
|
||||||
|
|
||||||
|
def test_forward_signature(self):
|
||||||
|
config, _ = self.model_tester.prepare_config_and_inputs_for_common()
|
||||||
|
|
||||||
|
for model_class in self.all_model_classes:
|
||||||
|
model = model_class(config)
|
||||||
|
signature = inspect.signature(model.forward)
|
||||||
|
# signature.parameters is an OrderedDict => so arg_names order is deterministic
|
||||||
|
arg_names = [*signature.parameters.keys()]
|
||||||
|
|
||||||
|
if model.config.is_encoder_decoder:
|
||||||
|
expected_arg_names = ["pixel_values", "pixel_mask"]
|
||||||
|
expected_arg_names.extend(
|
||||||
|
["head_mask", "decoder_head_mask", "encoder_outputs"]
|
||||||
|
if "head_mask" and "decoder_head_mask" in arg_names
|
||||||
|
else []
|
||||||
|
)
|
||||||
|
self.assertListEqual(arg_names[: len(expected_arg_names)], expected_arg_names)
|
||||||
|
else:
|
||||||
|
expected_arg_names = ["pixel_values", "pixel_mask"]
|
||||||
|
self.assertListEqual(arg_names[:1], expected_arg_names)
|
||||||
|
|
||||||
|
def test_different_timm_backbone(self):
|
||||||
|
config, inputs_dict = self.model_tester.prepare_config_and_inputs_for_common()
|
||||||
|
|
||||||
|
# let's pick a random timm backbone
|
||||||
|
config.backbone = "tf_mobilenetv3_small_075"
|
||||||
|
|
||||||
|
for model_class in self.all_model_classes:
|
||||||
|
model = model_class(config)
|
||||||
|
model.to(torch_device)
|
||||||
|
model.eval()
|
||||||
|
with torch.no_grad():
|
||||||
|
outputs = model(**self._prepare_for_class(inputs_dict, model_class))
|
||||||
|
|
||||||
|
if model_class.__name__ == "DeformableDetrForObjectDetection":
|
||||||
|
expected_shape = (
|
||||||
|
self.model_tester.batch_size,
|
||||||
|
self.model_tester.num_queries,
|
||||||
|
self.model_tester.num_labels,
|
||||||
|
)
|
||||||
|
self.assertEqual(outputs.logits.shape, expected_shape)
|
||||||
|
|
||||||
|
self.assertTrue(outputs)
|
||||||
|
|
||||||
|
def test_initialization(self):
|
||||||
|
config, inputs_dict = self.model_tester.prepare_config_and_inputs_for_common()
|
||||||
|
|
||||||
|
configs_no_init = _config_zero_init(config)
|
||||||
|
for model_class in self.all_model_classes:
|
||||||
|
print("Model class:", model_class)
|
||||||
|
model = model_class(config=configs_no_init)
|
||||||
|
for name, param in model.named_parameters():
|
||||||
|
if param.requires_grad:
|
||||||
|
if param.requires_grad:
|
||||||
|
if (
|
||||||
|
"level_embed" in name
|
||||||
|
or "sampling_offsets.bias" in name
|
||||||
|
or "value_proj" in name
|
||||||
|
or "output_proj" in name
|
||||||
|
or "reference_points" in name
|
||||||
|
):
|
||||||
|
continue
|
||||||
|
self.assertIn(
|
||||||
|
((param.data.mean() * 1e9).round() / 1e9).item(),
|
||||||
|
[0.0, 1.0],
|
||||||
|
msg=f"Parameter {name} of model {model_class} seems not properly initialized",
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
TOLERANCE = 1e-4
|
||||||
|
|
||||||
|
|
||||||
|
# We will verify our results on an image of cute cats
|
||||||
|
def prepare_img():
|
||||||
|
image = Image.open("./tests/fixtures/tests_samples/COCO/000000039769.png")
|
||||||
|
return image
|
||||||
|
|
||||||
|
|
||||||
|
@require_timm
|
||||||
|
@require_vision
|
||||||
|
@slow
|
||||||
|
class DeformableDetrModelIntegrationTests(unittest.TestCase):
|
||||||
|
@cached_property
|
||||||
|
def default_feature_extractor(self):
|
||||||
|
return AutoFeatureExtractor.from_pretrained("SenseTime/deformable-detr") if is_vision_available() else None
|
||||||
|
|
||||||
|
def test_inference_object_detection_head(self):
|
||||||
|
model = DeformableDetrForObjectDetection.from_pretrained("SenseTime/deformable-detr").to(torch_device)
|
||||||
|
|
||||||
|
feature_extractor = self.default_feature_extractor
|
||||||
|
image = prepare_img()
|
||||||
|
encoding = feature_extractor(images=image, return_tensors="pt").to(torch_device)
|
||||||
|
pixel_values = encoding["pixel_values"].to(torch_device)
|
||||||
|
pixel_mask = encoding["pixel_mask"].to(torch_device)
|
||||||
|
|
||||||
|
with torch.no_grad():
|
||||||
|
outputs = model(pixel_values, pixel_mask)
|
||||||
|
|
||||||
|
expected_shape_logits = torch.Size((1, model.config.num_queries, model.config.num_labels))
|
||||||
|
self.assertEqual(outputs.logits.shape, expected_shape_logits)
|
||||||
|
|
||||||
|
expected_logits = torch.tensor(
|
||||||
|
[[-9.6645, -4.3449, -5.8705], [-9.7035, -3.8504, -5.0724], [-10.5634, -5.3379, -7.5116]]
|
||||||
|
).to(torch_device)
|
||||||
|
expected_boxes = torch.tensor(
|
||||||
|
[[0.8693, 0.2289, 0.2492], [0.3150, 0.5489, 0.5845], [0.5563, 0.7580, 0.8518]]
|
||||||
|
).to(torch_device)
|
||||||
|
|
||||||
|
self.assertTrue(torch.allclose(outputs.logits[0, :3, :3], expected_logits, atol=1e-4))
|
||||||
|
|
||||||
|
expected_shape_boxes = torch.Size((1, model.config.num_queries, 4))
|
||||||
|
self.assertEqual(outputs.pred_boxes.shape, expected_shape_boxes)
|
||||||
|
self.assertTrue(torch.allclose(outputs.pred_boxes[0, :3, :3], expected_boxes, atol=1e-4))
|
||||||
|
|
||||||
|
def test_inference_object_detection_head_with_box_refine_two_stage(self):
|
||||||
|
model = DeformableDetrForObjectDetection.from_pretrained(
|
||||||
|
"SenseTime/deformable-detr-with-box-refine-two-stage"
|
||||||
|
).to(torch_device)
|
||||||
|
|
||||||
|
feature_extractor = self.default_feature_extractor
|
||||||
|
image = prepare_img()
|
||||||
|
encoding = feature_extractor(images=image, return_tensors="pt").to(torch_device)
|
||||||
|
pixel_values = encoding["pixel_values"].to(torch_device)
|
||||||
|
pixel_mask = encoding["pixel_mask"].to(torch_device)
|
||||||
|
|
||||||
|
with torch.no_grad():
|
||||||
|
outputs = model(pixel_values, pixel_mask)
|
||||||
|
|
||||||
|
expected_shape_logits = torch.Size((1, model.config.num_queries, model.config.num_labels))
|
||||||
|
self.assertEqual(outputs.logits.shape, expected_shape_logits)
|
||||||
|
|
||||||
|
expected_logits = torch.tensor(
|
||||||
|
[[-6.7108, -4.3213, -6.3777], [-8.9014, -6.1799, -6.7240], [-6.9315, -4.4735, -6.2298]]
|
||||||
|
).to(torch_device)
|
||||||
|
expected_boxes = torch.tensor(
|
||||||
|
[[0.2583, 0.5499, 0.4683], [0.7652, 0.9068, 0.4882], [0.5490, 0.2763, 0.0564]]
|
||||||
|
).to(torch_device)
|
||||||
|
|
||||||
|
self.assertTrue(torch.allclose(outputs.logits[0, :3, :3], expected_logits, atol=1e-4))
|
||||||
|
|
||||||
|
expected_shape_boxes = torch.Size((1, model.config.num_queries, 4))
|
||||||
|
self.assertEqual(outputs.pred_boxes.shape, expected_shape_boxes)
|
||||||
|
self.assertTrue(torch.allclose(outputs.pred_boxes[0, :3, :3], expected_boxes, atol=1e-4))
|
||||||
|
|
||||||
|
@require_torch_gpu
|
||||||
|
def test_inference_object_detection_head_equivalence_cpu_gpu(self):
|
||||||
|
feature_extractor = self.default_feature_extractor
|
||||||
|
image = prepare_img()
|
||||||
|
encoding = feature_extractor(images=image, return_tensors="pt")
|
||||||
|
pixel_values = encoding["pixel_values"]
|
||||||
|
pixel_mask = encoding["pixel_mask"]
|
||||||
|
|
||||||
|
# 1. run model on CPU
|
||||||
|
model = DeformableDetrForObjectDetection.from_pretrained("SenseTime/deformable-detr-single-scale")
|
||||||
|
|
||||||
|
with torch.no_grad():
|
||||||
|
cpu_outputs = model(pixel_values, pixel_mask)
|
||||||
|
|
||||||
|
# 2. run model on GPU
|
||||||
|
model.to("cuda")
|
||||||
|
|
||||||
|
with torch.no_grad():
|
||||||
|
gpu_outputs = model(pixel_values.to("cuda"), pixel_mask.to("cuda"))
|
||||||
|
|
||||||
|
# 3. assert equivalence
|
||||||
|
for key in cpu_outputs.keys():
|
||||||
|
assert torch.allclose(cpu_outputs[key], gpu_outputs[key].cpu(), atol=1e-4)
|
||||||
|
|
||||||
|
expected_logits = torch.tensor(
|
||||||
|
[[-9.9051, -4.2541, -6.4852], [-9.6947, -4.0854, -6.8033], [-10.0665, -5.8470, -7.7003]]
|
||||||
|
)
|
||||||
|
assert torch.allclose(cpu_outputs.logits[0, :3, :3], expected_logits, atol=1e-4)
|
||||||
@@ -53,6 +53,12 @@ class ObjectDetectionPipelineTests(unittest.TestCase, metaclass=PipelineTestCase
|
|||||||
model_mapping = MODEL_FOR_OBJECT_DETECTION_MAPPING
|
model_mapping = MODEL_FOR_OBJECT_DETECTION_MAPPING
|
||||||
|
|
||||||
def get_test_pipeline(self, model, tokenizer, feature_extractor):
|
def get_test_pipeline(self, model, tokenizer, feature_extractor):
|
||||||
|
if model.__class__.__name__ == "DeformableDetrForObjectDetection":
|
||||||
|
self.skipTest(
|
||||||
|
"""Deformable DETR requires a custom CUDA kernel.
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
|
||||||
object_detector = ObjectDetectionPipeline(model=model, feature_extractor=feature_extractor)
|
object_detector = ObjectDetectionPipeline(model=model, feature_extractor=feature_extractor)
|
||||||
return object_detector, ["./tests/fixtures/tests_samples/COCO/000000039769.png"]
|
return object_detector, ["./tests/fixtures/tests_samples/COCO/000000039769.png"]
|
||||||
|
|
||||||
|
|||||||
@@ -46,6 +46,8 @@ PRIVATE_MODELS = [
|
|||||||
# Being in this list is an exception and should **not** be the rule.
|
# Being in this list is an exception and should **not** be the rule.
|
||||||
IGNORE_NON_TESTED = PRIVATE_MODELS.copy() + [
|
IGNORE_NON_TESTED = PRIVATE_MODELS.copy() + [
|
||||||
# models to ignore for not tested
|
# models to ignore for not tested
|
||||||
|
"DeformableDetrEncoder", # Building part of bigger (tested) model.
|
||||||
|
"DeformableDetrDecoder", # Building part of bigger (tested) model.
|
||||||
"OPTDecoder", # Building part of bigger (tested) model.
|
"OPTDecoder", # Building part of bigger (tested) model.
|
||||||
"DecisionTransformerGPT2Model", # Building part of bigger (tested) model.
|
"DecisionTransformerGPT2Model", # Building part of bigger (tested) model.
|
||||||
"SegformerDecodeHead", # Building part of bigger (tested) model.
|
"SegformerDecodeHead", # Building part of bigger (tested) model.
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ src/transformers/models/data2vec/modeling_data2vec_audio.py
|
|||||||
src/transformers/models/data2vec/modeling_data2vec_vision.py
|
src/transformers/models/data2vec/modeling_data2vec_vision.py
|
||||||
src/transformers/models/deberta/modeling_deberta.py
|
src/transformers/models/deberta/modeling_deberta.py
|
||||||
src/transformers/models/deberta_v2/modeling_deberta_v2.py
|
src/transformers/models/deberta_v2/modeling_deberta_v2.py
|
||||||
|
src/transformers/models/deformable_detr/modeling_deformable_detr.py
|
||||||
src/transformers/models/deit/modeling_deit.py
|
src/transformers/models/deit/modeling_deit.py
|
||||||
src/transformers/models/deit/modeling_tf_deit.py
|
src/transformers/models/deit/modeling_tf_deit.py
|
||||||
src/transformers/models/detr/modeling_detr.py
|
src/transformers/models/detr/modeling_detr.py
|
||||||
|
|||||||
Reference in New Issue
Block a user