class_docstr: Head of the Align-DETR: Improving DETR with Simple IoU-aware BCE loss
  
  Code is modified from the `official github repo
  <https://github.com/FelixCaae/AlignDETR>`_.
  
  More details can be found in the `paper
  <https://arxiv.org/abs/2304.07527>`_ .
  
  Args:
      all_layers_num_gt_repeat List[int]: Number to repeat gt for 1-to-k
          matching between ground truth and predictions of each decoder
          layer. Only used for matching queries, not for denoising queries.
          Element count is `num_pred_layer`. If `as_two_stage` is True, then
          the last element is for encoder output, and the others for
          decoder layers. Otherwise, all elements are for decoder layers.
          Defaults to a list of `1` for the last decoder layer and `2` for
          the others.
      alpha (float): Hyper-parameter of classification loss that controls
          the proportion of each item to calculate `t`, the weighted
          geometric average of the confident score and the IoU score, to
          align classification and regression scores. Defaults to `0.25`.
      gamma (float): Hyper-parameter of classification loss to do the hard
          negative mining. Defaults to `2.0`.
      tau (float): Hyper-parameter of classification and regression losses,
          it is the temperature controlling the sharpness of the function
          to calculate positive sample weight. Defaults to `1.5`.
class_docstr_tok: ["Head","of","the","Align-DETR",":","Improving","DETR","with","Simple","IoU-aware","BCE","loss","Code","is","modified","from","the","`","official","github","repo","<","https",":","\/\/github.com\/FelixCaae\/AlignDETR",">","`","_",".","More","details","can","be","found","in","the","`","paper","<","https",":","\/\/arxiv.org\/abs\/2304.07527",">","`","_",".","Args",":","all_layers_num_gt_repeat","List","[","int","]",":","Number","to","repeat","gt","for","1-to-k","matching","between","ground","truth","and","predictions","of","each","decoder","layer",".","Only","used","for","matching","queries",",","not","for","denoising","queries",".","Element","count","is","`","num_pred_layer","`",".","If","`","as_two_stage","`","is","True",",","then","the","last","element","is","for","encoder","output",",","and","the","others","for","decoder","layers",".","Otherwise",",","all","elements","are","for","decoder","layers",".","Defaults","to","a","list","of","`","1","`","for","the","last","decoder","layer","and","`","2","`","for","the","others",".","alpha","(","float",")",":","Hyper-parameter","of","classification","loss","that","controls","the","proportion","of","each","item","to","calculate","`","t","`",",","the","weighted","geometric","average","of","the","confident","score","and","the","IoU","score",",","to","align","classification","and","regression","scores",".","Defaults","to","`","0.25","`",".","gamma","(","float",")",":","Hyper-parameter","of","classification","loss","to","do","the","hard","negative","mining",".","Defaults","to","`","2.0","`",".","tau","(","float",")",":","Hyper-parameter","of","classification","and","regression","losses",",","it","is","the","temperature","controlling","the","sharpness","of","the","function","to","calculate","positive","sample","weight",".","Defaults","to","`","1.5","`","."]
docstr: Get targets in denoising part for one image.
      AlignDETR: This method is based on
      `DINOHead._get_dn_targets_single`.
      and 1) Added passing `dn_cls_score`, `dn_bbox_pred` to this
      method; 2) Modified the way to get targets.
  Args:
      dn_cls_score (Tensor): Box score logits from a single decoder
      layer in denoising part for one image, has shape
          [num_denoising_queries, cls_out_channels].
      dn_bbox_pred (Tensor): Sigmoid outputs from a single decoder
      layer in denoising part for one image, with
          normalized coordinate (cx, cy, w, h) and shape
          [num_denoising_queries, 4].
      gt_instances (:obj:`InstanceData`): Ground truth of instance
          annotations. It should includes ``bboxes`` and ``labels``
          attributes.
      img_meta (dict): Meta information for one image.
      dn_meta (Dict[str, int]): The dictionary saves information about
        group collation, including 'num_denoising_queries' and
        'num_denoising_groups'. It will be used for split outputs of
        denoising and matching parts and loss calculation.
  
  Returns:
      tuple[Tensor]: a tuple containing the following for one image.
  
      - labels (Tensor): Labels of each image.
      - label_weights (Tensor]): Label weights of each image.
      - bbox_targets (Tensor): BBox targets of each image.
      - bbox_weights (Tensor): BBox weights of each image.
      - pos_inds (Tensor): Sampled positive indices for each image.
      - neg_inds (Tensor): Sampled negative indices for each image.
docstr_tok: ["Get","targets","in","denoising","part","for","one","image",".","AlignDETR",":","This","method","is","based","on","`","DINOHead._get_dn_targets_single","`",".","and","1",")","Added","passing","`","dn_cls_score","`",",","`","dn_bbox_pred","`","to","this","method",";","2",")","Modified","the","way","to","get","targets",".","Args",":","dn_cls_score","(","Tensor",")",":","Box","score","logits","from","a","single","decoder","layer","in","denoising","part","for","one","image",",","has","shape","[","num_denoising_queries",",","cls_out_channels","]",".","dn_bbox_pred","(","Tensor",")",":","Sigmoid","outputs","from","a","single","decoder","layer","in","denoising","part","for","one","image",",","with","normalized","coordinate","(","cx",",","cy",",","w",",","h",")","and","shape","[","num_denoising_queries",",","4","]",".","gt_instances","(",":","obj",":","`","InstanceData","`",")",":","Ground","truth","of","instance","annotations",".","It","should","includes","``","bboxes","``","and","``","labels","``","attributes",".","img_meta","(","dict",")",":","Meta","information","for","one","image",".","dn_meta","(","Dict","[","str",",","int","]",")",":","The","dictionary","saves","information","about","group","collation",",","including","'num_denoising_queries","'","and","'num_denoising_groups","'",".","It","will","be","used","for","split","outputs","of","denoising","and","matching","parts","and","loss","calculation",".","Returns",":","tuple","[","Tensor","]",":","a","tuple","containing","the","following","for","one","image",".","-","labels","(","Tensor",")",":","Labels","of","each","image",".","-","label_weights","(","Tensor","]",")",":","Label","weights","of","each","image",".","-","bbox_targets","(","Tensor",")",":","BBox","targets","of","each","image",".","-","bbox_weights","(","Tensor",")",":","BBox","weights","of","each","image",".","-","pos_inds","(","Tensor",")",":","Sampled","positive","indices","for","each","image",".","-","neg_inds","(","Tensor",")",":","Sampled","negative","indices","for","each","image","."]
code: def _get_dn_targets_single(
      self,
      gt_instances: InstanceData,
      img_meta: dict,
      dn_meta: Dict[str, int],
  ) -> tuple:
      """Get targets in denoising part for one image.
          AlignDETR: This method is based on
          `DINOHead._get_dn_targets_single`.
          and 1) Added passing `dn_cls_score`, `dn_bbox_pred` to this
          method; 2) Modified the way to get targets.
      Args:
          dn_cls_score (Tensor): Box score logits from a single decoder
          layer in denoising part for one image, has shape
              [num_denoising_queries, cls_out_channels].
          dn_bbox_pred (Tensor): Sigmoid outputs from a single decoder
          layer in denoising part for one image, with
              normalized coordinate (cx, cy, w, h) and shape
              [num_denoising_queries, 4].
          gt_instances (:obj:`InstanceData`): Ground truth of instance
              annotations. It should includes ``bboxes`` and ``labels``
              attributes.
          img_meta (dict): Meta information for one image.
          dn_meta (Dict[str, int]): The dictionary saves information about
            group collation, including 'num_denoising_queries' and
            'num_denoising_groups'. It will be used for split outputs of
            denoising and matching parts and loss calculation.
  
      Returns:
          tuple[Tensor]: a tuple containing the following for one image.
  
          - labels (Tensor): Labels of each image.
          - label_weights (Tensor]): Label weights of each image.
          - bbox_targets (Tensor): BBox targets of each image.
          - bbox_weights (Tensor): BBox weights of each image.
          - pos_inds (Tensor): Sampled positive indices for each image.
          - neg_inds (Tensor): Sampled negative indices for each image.
      """
      gt_bboxes = gt_instances.bboxes
      gt_labels = gt_instances.labels
      num_groups = dn_meta["num_denoising_groups"]
      num_denoising_queries = dn_meta["num_denoising_queries"]
      num_queries_each_group = int(num_denoising_queries / num_groups)
      device = gt_bboxes.device
  
      if len(gt_labels) > 0:
          t = torch.arange(
              len(gt_labels), dtype=torch.long, device=device
          )
          t = t.unsqueeze(0).repeat(num_groups, 1)
          pos_assigned_gt_inds = t.flatten()
          pos_inds = torch.arange(
              num_groups, dtype=torch.long, device=device
          )
          pos_inds = pos_inds.unsqueeze(1) * num_queries_each_group + t
          pos_inds = pos_inds.flatten()
      else:
          pos_inds = pos_assigned_gt_inds = gt_bboxes.new_tensor(
              [], dtype=torch.long
          )
  
      neg_inds = pos_inds + num_queries_each_group // 2
  
      # AlignDETR: Get meta info and layer outputs.
      img_h, img_w = img_meta["img_shape"]
      dn_cls_score = img_meta["dn_cls_score"]
      dn_bbox_pred = img_meta["dn_bbox_pred"]
      factor = dn_bbox_pred.new_tensor(
          [img_w, img_h, img_w, img_h]
      ).unsqueeze(0)
  
      # AlignDETR: Convert dn_bbox_pred from xywh, normalized to xyxy,
      #   unnormalized.
      dn_bbox_pred = bbox_cxcywh_to_xyxy(dn_bbox_pred)
      dn_bbox_pred = dn_bbox_pred * factor
  
      # AlignDETR: Get label targets, label weights, and bbox weights.
      target_results = self._get_align_detr_targets_single(
          dn_cls_score,
          dn_bbox_pred,
          gt_labels,
          gt_bboxes.repeat([num_groups, 1]),
          pos_inds,
          pos_assigned_gt_inds,
      )
  
      label_targets, label_weights, bbox_weights = target_results
  
      # bbox targets
      bbox_targets = torch.zeros(
          num_denoising_queries, 4, device=device
      )
  
      # DETR regress the relative position of boxes (cxcywh) in the image.
      # Thus the learning target should be normalized by the image size, also
      # the box format should be converted from defaultly x1y1x2y2 to cxcywh.
      gt_bboxes_normalized = gt_bboxes / factor
      gt_bboxes_targets = bbox_xyxy_to_cxcywh(gt_bboxes_normalized)
      bbox_targets[pos_inds] = gt_bboxes_targets.repeat([num_groups, 1])
  
      return (
          label_targets,
          label_weights,
          bbox_targets,
          bbox_weights,
          pos_inds,
          neg_inds,
      )
  
file_path: mmdetection/projects/AlignDETR/align_detr/align_detr_head.py
imports: from typing import Any, Dict, List, Tuple, Union
  import torch
  from mmengine.structures import InstanceData
  from torch import Tensor
  from mmdet.models.dense_heads import DINOHead
  from mmdet.registry import MODELS
  from mmdet.structures.bbox import bbox_cxcywh_to_xyxy, bbox_overlaps, bbox_xyxy_to_cxcywh
  from mmdet.utils import InstanceList
  from .utils import KeysRecorder
label_desc: Use image node_id 7 for calling the AlignDETRHead obj's underlying member method code with example usage: obj._get_dn_targets_single(gt_instances, img_meta, dn_meta) and returns: label_targets,  label_weights,  bbox_targets,  bbox_weights,  pos_inds,  neg_inds