configuration_detr.py 10.4 KB
Newer Older
NielsRogge's avatar
NielsRogge committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# coding=utf-8
# Copyright 2021 Facebook AI Research 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.
Sylvain Gugger's avatar
Sylvain Gugger committed
15
""" DETR model configuration"""
NielsRogge's avatar
NielsRogge committed
16

regisss's avatar
regisss committed
17
18
19
20
21
from collections import OrderedDict
from typing import Mapping

from packaging import version

NielsRogge's avatar
NielsRogge committed
22
from ...configuration_utils import PretrainedConfig
regisss's avatar
regisss committed
23
from ...onnx import OnnxConfig
NielsRogge's avatar
NielsRogge committed
24
25
26
27
28
29
30
31
32
33
34
35
36
from ...utils import logging


logger = logging.get_logger(__name__)

DETR_PRETRAINED_CONFIG_ARCHIVE_MAP = {
    "facebook/detr-resnet-50": "https://huggingface.co/facebook/detr-resnet-50/resolve/main/config.json",
    # See all DETR models at https://huggingface.co/models?filter=detr
}


class DetrConfig(PretrainedConfig):
    r"""
Sylvain Gugger's avatar
Sylvain Gugger committed
37
38
39
40
    This is the configuration class to store the configuration of a [`DetrModel`]. It is used to instantiate a 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 DETR
    [facebook/detr-resnet-50](https://huggingface.co/facebook/detr-resnet-50) architecture.
NielsRogge's avatar
NielsRogge committed
41

Sylvain Gugger's avatar
Sylvain Gugger committed
42
43
    Configuration objects inherit from [`PretrainedConfig`] and can be used to control the model outputs. Read the
    documentation from [`PretrainedConfig`] for more information.
NielsRogge's avatar
NielsRogge committed
44
45
46


    Args:
47
        num_queries (`int`, *optional*, defaults to 100):
Sylvain Gugger's avatar
Sylvain Gugger committed
48
49
            Number of object queries, i.e. detection slots. This is the maximal number of objects [`DetrModel`] can
            detect in a single image. For COCO, we recommend 100 queries.
50
        d_model (`int`, *optional*, defaults to 256):
NielsRogge's avatar
NielsRogge committed
51
            Dimension of the layers.
52
        encoder_layers (`int`, *optional*, defaults to 6):
NielsRogge's avatar
NielsRogge committed
53
            Number of encoder layers.
54
        decoder_layers (`int`, *optional*, defaults to 6):
NielsRogge's avatar
NielsRogge committed
55
            Number of decoder layers.
56
        encoder_attention_heads (`int`, *optional*, defaults to 8):
NielsRogge's avatar
NielsRogge committed
57
            Number of attention heads for each attention layer in the Transformer encoder.
58
        decoder_attention_heads (`int`, *optional*, defaults to 8):
NielsRogge's avatar
NielsRogge committed
59
            Number of attention heads for each attention layer in the Transformer decoder.
60
        decoder_ffn_dim (`int`, *optional*, defaults to 2048):
NielsRogge's avatar
NielsRogge committed
61
            Dimension of the "intermediate" (often named feed-forward) layer in decoder.
62
        encoder_ffn_dim (`int`, *optional*, defaults to 2048):
NielsRogge's avatar
NielsRogge committed
63
            Dimension of the "intermediate" (often named feed-forward) layer in decoder.
64
        activation_function (`str` or `function`, *optional*, defaults to `"relu"`):
Sylvain Gugger's avatar
Sylvain Gugger committed
65
66
            The non-linear activation function (function or string) in the encoder and pooler. If string, `"gelu"`,
            `"relu"`, `"silu"` and `"gelu_new"` are supported.
67
        dropout (`float`, *optional*, defaults to 0.1):
NielsRogge's avatar
NielsRogge committed
68
            The dropout probability for all fully connected layers in the embeddings, encoder, and pooler.
69
        attention_dropout (`float`, *optional*, defaults to 0.0):
NielsRogge's avatar
NielsRogge committed
70
            The dropout ratio for the attention probabilities.
71
        activation_dropout (`float`, *optional*, defaults to 0.0):
NielsRogge's avatar
NielsRogge committed
72
            The dropout ratio for activations inside the fully connected layer.
73
        init_std (`float`, *optional*, defaults to 0.02):
NielsRogge's avatar
NielsRogge committed
74
            The standard deviation of the truncated_normal_initializer for initializing all weight matrices.
75
        init_xavier_std (`float`, *optional*, defaults to 1):
NielsRogge's avatar
NielsRogge committed
76
            The scaling factor used for the Xavier initialization gain in the HM Attention map module.
Juyoung Kim's avatar
Juyoung Kim committed
77
        encoder_layerdrop (`float`, *optional*, defaults to 0.0):
Sylvain Gugger's avatar
Sylvain Gugger committed
78
79
            The LayerDrop probability for the encoder. See the [LayerDrop paper](see https://arxiv.org/abs/1909.11556)
            for more details.
Juyoung Kim's avatar
Juyoung Kim committed
80
        decoder_layerdrop (`float`, *optional*, defaults to 0.0):
Sylvain Gugger's avatar
Sylvain Gugger committed
81
82
            The LayerDrop probability for the decoder. See the [LayerDrop paper](see https://arxiv.org/abs/1909.11556)
            for more details.
83
        auxiliary_loss (`bool`, *optional*, defaults to `False`):
NielsRogge's avatar
NielsRogge committed
84
            Whether auxiliary decoding losses (loss at each decoder layer) are to be used.
85
        position_embedding_type (`str`, *optional*, defaults to `"sine"`):
Sylvain Gugger's avatar
Sylvain Gugger committed
86
            Type of position embeddings to be used on top of the image features. One of `"sine"` or `"learned"`.
87
        backbone (`str`, *optional*, defaults to `"resnet50"`):
NielsRogge's avatar
NielsRogge committed
88
            Name of convolutional backbone to use. Supports any convolutional backbone from the timm package. For a
Sylvain Gugger's avatar
Sylvain Gugger committed
89
90
            list of all available models, see [this
            page](https://rwightman.github.io/pytorch-image-models/#load-a-pretrained-model).
91
92
        use_pretrained_backbone (`bool`, *optional*, defaults to `True`):
            Whether to use pretrained weights for the backbone.
93
        dilation (`bool`, *optional*, defaults to `False`):
NielsRogge's avatar
NielsRogge committed
94
            Whether to replace stride with dilation in the last convolutional block (DC5).
95
        class_cost (`float`, *optional*, defaults to 1):
NielsRogge's avatar
NielsRogge committed
96
            Relative weight of the classification error in the Hungarian matching cost.
97
        bbox_cost (`float`, *optional*, defaults to 5):
NielsRogge's avatar
NielsRogge committed
98
            Relative weight of the L1 error of the bounding box coordinates in the Hungarian matching cost.
99
        giou_cost (`float`, *optional*, defaults to 2):
NielsRogge's avatar
NielsRogge committed
100
            Relative weight of the generalized IoU loss of the bounding box in the Hungarian matching cost.
101
        mask_loss_coefficient (`float`, *optional*, defaults to 1):
NielsRogge's avatar
NielsRogge committed
102
            Relative weight of the Focal loss in the panoptic segmentation loss.
103
        dice_loss_coefficient (`float`, *optional*, defaults to 1):
NielsRogge's avatar
NielsRogge committed
104
            Relative weight of the DICE/F-1 loss in the panoptic segmentation loss.
105
        bbox_loss_coefficient (`float`, *optional*, defaults to 5):
NielsRogge's avatar
NielsRogge committed
106
            Relative weight of the L1 bounding box loss in the object detection loss.
107
        giou_loss_coefficient (`float`, *optional*, defaults to 2):
NielsRogge's avatar
NielsRogge committed
108
            Relative weight of the generalized IoU loss in the object detection loss.
109
        eos_coefficient (`float`, *optional*, defaults to 0.1):
NielsRogge's avatar
NielsRogge committed
110
111
            Relative classification weight of the 'no-object' class in the object detection loss.

112
    Examples:
NielsRogge's avatar
NielsRogge committed
113

114
115
    ```python
    >>> from transformers import DetrModel, DetrConfig
NielsRogge's avatar
NielsRogge committed
116

117
118
    >>> # Initializing a DETR facebook/detr-resnet-50 style configuration
    >>> configuration = DetrConfig()
NielsRogge's avatar
NielsRogge committed
119

120
121
    >>> # Initializing a model from the facebook/detr-resnet-50 style configuration
    >>> model = DetrModel(configuration)
NielsRogge's avatar
NielsRogge committed
122

123
124
125
    >>> # Accessing the model configuration
    >>> configuration = model.config
    ```"""
NielsRogge's avatar
NielsRogge committed
126
127
    model_type = "detr"
    keys_to_ignore_at_inference = ["past_key_values"]
128
129
130
131
    attribute_map = {
        "hidden_size": "d_model",
        "num_attention_heads": "encoder_attention_heads",
    }
NielsRogge's avatar
NielsRogge committed
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157

    def __init__(
        self,
        num_queries=100,
        max_position_embeddings=1024,
        encoder_layers=6,
        encoder_ffn_dim=2048,
        encoder_attention_heads=8,
        decoder_layers=6,
        decoder_ffn_dim=2048,
        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,
        classifier_dropout=0.0,
        scale_embedding=False,
        auxiliary_loss=False,
        position_embedding_type="sine",
        backbone="resnet50",
158
        use_pretrained_backbone=True,
NielsRogge's avatar
NielsRogge committed
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
        dilation=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.num_hidden_layers = encoder_layers
        self.scale_embedding = scale_embedding  # scale factor will be sqrt(d_model) if True
        self.auxiliary_loss = auxiliary_loss
        self.position_embedding_type = position_embedding_type
        self.backbone = backbone
192
        self.use_pretrained_backbone = use_pretrained_backbone
NielsRogge's avatar
NielsRogge committed
193
194
195
196
197
198
199
200
201
202
203
        self.dilation = dilation
        # 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
204
        super().__init__(is_encoder_decoder=is_encoder_decoder, **kwargs)
NielsRogge's avatar
NielsRogge committed
205
206
207
208
209
210
211
212

    @property
    def num_attention_heads(self) -> int:
        return self.encoder_attention_heads

    @property
    def hidden_size(self) -> int:
        return self.d_model
regisss's avatar
regisss committed
213
214
215
216
217
218
219
220
221
222


class DetrOnnxConfig(OnnxConfig):

    torch_onnx_minimum_version = version.parse("1.11")

    @property
    def inputs(self) -> Mapping[str, Mapping[int, str]]:
        return OrderedDict(
            [
223
224
                ("pixel_values", {0: "batch", 1: "num_channels"}),
                ("pixel_mask", {0: "batch"}),
regisss's avatar
regisss committed
225
226
227
228
229
230
231
232
233
234
            ]
        )

    @property
    def atol_for_validation(self) -> float:
        return 1e-5

    @property
    def default_onnx_opset(self) -> int:
        return 12