class_docstr: Generalized Focal Loss: Learning Qualified and Distributed Bounding
  Boxes for Dense Object Detection.
  
  GFL head structure is similar with ATSS, however GFL uses
  1) joint representation for classification and localization quality, and
  2) flexible General distribution for bounding box locations,
  which are supervised by
  Quality Focal Loss (QFL) and Distribution Focal Loss (DFL), respectively
  
  https://arxiv.org/abs/2006.04388
  
  Args:
      num_classes (int): Number of categories excluding the background
          category.
      in_channels (int): Number of channels in the input feature map.
      stacked_convs (int): Number of conv layers in cls and reg tower.
          Default: 4.
      conv_cfg (dict): dictionary to construct and config conv layer.
          Default: None.
      norm_cfg (dict): dictionary to construct and config norm layer.
          Default: dict(type='GN', num_groups=32, requires_grad=True).
      loss_qfl (dict): Config of Quality Focal Loss (QFL).
      reg_max (int): Max value of integral set :math: `{0, ..., reg_max}`
          in QFL setting. Default: 16.
  Example:
      >>> self = GFLHead(11, 7)
      >>> feats = [torch.rand(1, 7, s, s) for s in [4, 8, 16, 32, 64]]
      >>> cls_quality_score, bbox_pred = self.forward(feats)
      >>> assert len(cls_quality_score) == len(self.scales)
class_docstr_tok: ["Generalized","Focal","Loss",":","Learning","Qualified","and","Distributed","Bounding","Boxes","for","Dense","Object","Detection",".","GFL","head","structure","is","similar","with","ATSS",",","however","GFL","uses","1",")","joint","representation","for","classification","and","localization","quality",",","and","2",")","flexible","General","distribution","for","bounding","box","locations",",","which","are","supervised","by","Quality","Focal","Loss","(","QFL",")","and","Distribution","Focal","Loss","(","DFL",")",",","respectively","https",":","\/\/arxiv.org\/abs\/2006.04388","Args",":","num_classes","(","int",")",":","Number","of","categories","excluding","the","background","category",".","in_channels","(","int",")",":","Number","of","channels","in","the","input","feature","map",".","stacked_convs","(","int",")",":","Number","of","conv","layers","in","cls","and","reg","tower",".","Default",":","4.","conv_cfg","(","dict",")",":","dictionary","to","construct","and","config","conv","layer",".","Default",":","None",".","norm_cfg","(","dict",")",":","dictionary","to","construct","and","config","norm","layer",".","Default",":","dict","(","type='GN","'",",","num_groups=32",",","requires_grad=True",")",".","loss_qfl","(","dict",")",":","Config","of","Quality","Focal","Loss","(","QFL",")",".","reg_max","(","int",")",":","Max","value","of","integral","set",":","math",":","`","{","0",",","...",",","reg_max","}","`","in","QFL","setting",".","Default",":","16",".","Example",":",">",">",">","self","=","GFLHead","(","11",",","7",")",">",">",">","feats","=","[","torch.rand","(","1",",","7",",","s",",","s",")","for","s","in","[","4",",","8",",","16",",","32",",","64","]","]",">",">",">","cls_quality_score",",","bbox_pred","=","self.forward","(","feats",")",">",">",">","assert","len","(","cls_quality_score",")","==","len","(","self.scales",")"]
docstr: Transform outputs for a single batch item into labeled boxes.
  
  Args:
      cls_scores (list[Tensor]): Box scores for a single scale level
          has shape (num_classes, H, W).
      bbox_preds (list[Tensor]): Box distribution logits for a single
          scale level with shape (4*(n+1), H, W), n is max value of
          integral set.
      mlvl_anchors (list[Tensor]): Box reference for a single scale level
          with shape (num_total_anchors, 4).
      img_shape (tuple[int]): Shape of the input image,
          (height, width, 3).
      scale_factor (ndarray): Scale factor of the image arange as
          (w_scale, h_scale, w_scale, h_scale).
      cfg (mmcv.Config | None): Test / postprocessing configuration,
          if None, test_cfg would be used.
      rescale (bool): If True, return boxes in original image space.
          Default: False.
      with_nms (bool): If True, do nms before return boxes.
          Default: True.
  
  Returns:
      tuple(Tensor):
          det_bboxes (Tensor): Bbox predictions in shape (N, 5), where
              the first 4 columns are bounding box positions
              (tl_x, tl_y, br_x, br_y) and the 5-th column is a score
              between 0 and 1.
          det_labels (Tensor): A (N,) tensor where each item is the
              predicted class label of the corresponding box.
docstr_tok: ["Transform","outputs","for","a","single","batch","item","into","labeled","boxes",".","Args",":","cls_scores","(","list","[","Tensor","]",")",":","Box","scores","for","a","single","scale","level","has","shape","(","num_classes",",","H",",","W",")",".","bbox_preds","(","list","[","Tensor","]",")",":","Box","distribution","logits","for","a","single","scale","level","with","shape","(","4","*","(","n+1",")",",","H",",","W",")",",","n","is","max","value","of","integral","set",".","mlvl_anchors","(","list","[","Tensor","]",")",":","Box","reference","for","a","single","scale","level","with","shape","(","num_total_anchors",",","4",")",".","img_shape","(","tuple","[","int","]",")",":","Shape","of","the","input","image",",","(","height",",","width",",","3",")",".","scale_factor","(","ndarray",")",":","Scale","factor","of","the","image","arange","as","(","w_scale",",","h_scale",",","w_scale",",","h_scale",")",".","cfg","(","mmcv.Config","|","None",")",":","Test","\/","postprocessing","configuration",",","if","None",",","test_cfg","would","be","used",".","rescale","(","bool",")",":","If","True",",","return","boxes","in","original","image","space",".","Default",":","False",".","with_nms","(","bool",")",":","If","True",",","do","nms","before","return","boxes",".","Default",":","True",".","Returns",":","tuple","(","Tensor",")",":","det_bboxes","(","Tensor",")",":","Bbox","predictions","in","shape","(","N",",","5",")",",","where","the","first","4","columns","are","bounding","box","positions","(","tl_x",",","tl_y",",","br_x",",","br_y",")","and","the","5-th","column","is","a","score","between","0","and","1.","det_labels","(","Tensor",")",":","A","(","N",",",")","tensor","where","each","item","is","the","predicted","class","label","of","the","corresponding","box","."]
code: def _get_bboxes_single(
      self,
      cls_scores,
      bbox_preds,
      mlvl_anchors,
      img_shape,
      scale_factor,
      cfg,
      rescale=False,
      with_nms=True,
  ):
      """Transform outputs for a single batch item into labeled boxes.
  
      Args:
          cls_scores (list[Tensor]): Box scores for a single scale level
              has shape (num_classes, H, W).
          bbox_preds (list[Tensor]): Box distribution logits for a single
              scale level with shape (4*(n+1), H, W), n is max value of
              integral set.
          mlvl_anchors (list[Tensor]): Box reference for a single scale level
              with shape (num_total_anchors, 4).
          img_shape (tuple[int]): Shape of the input image,
              (height, width, 3).
          scale_factor (ndarray): Scale factor of the image arange as
              (w_scale, h_scale, w_scale, h_scale).
          cfg (mmcv.Config | None): Test / postprocessing configuration,
              if None, test_cfg would be used.
          rescale (bool): If True, return boxes in original image space.
              Default: False.
          with_nms (bool): If True, do nms before return boxes.
              Default: True.
  
      Returns:
          tuple(Tensor):
              det_bboxes (Tensor): Bbox predictions in shape (N, 5), where
                  the first 4 columns are bounding box positions
                  (tl_x, tl_y, br_x, br_y) and the 5-th column is a score
                  between 0 and 1.
              det_labels (Tensor): A (N,) tensor where each item is the
                  predicted class label of the corresponding box.
      """
      cfg = self.test_cfg if cfg is None else cfg
      assert len(cls_scores) == len(bbox_preds) == len(mlvl_anchors)
      mlvl_bboxes = []
      mlvl_scores = []
      for cls_score, bbox_pred, stride, anchors in zip(
          cls_scores,
          bbox_preds,
          self.anchor_generator.strides,
          mlvl_anchors,
      ):
          assert cls_score.size()[-2:] == bbox_pred.size()[-2:]
          assert stride[0] == stride[1]
  
          scores = (
              cls_score.permute(1, 2, 0)
              .reshape(-1, self.cls_out_channels)
              .sigmoid()
          )
          bbox_pred = bbox_pred.permute(1, 2, 0)
          if self.use_dfl:
              bbox_pred = self.integral(bbox_pred) * stride[0]
          else:
              bbox_pred = bbox_pred.reshape((-1, 4)) * stride[0]
  
          nms_pre = cfg.get("nms_pre", -1)
          if nms_pre > 0 and scores.shape[0] > nms_pre:
              max_scores, _ = scores.max(dim=1)
              _, topk_inds = max_scores.topk(nms_pre)
              anchors = anchors[topk_inds, :]
              bbox_pred = bbox_pred[topk_inds, :]
              scores = scores[topk_inds, :]
  
          bboxes = distance2bbox(
              self.anchor_center(anchors),
              bbox_pred,
              max_shape=img_shape,
          )
          mlvl_bboxes.append(bboxes)
          mlvl_scores.append(scores)
  
      mlvl_bboxes = torch.cat(mlvl_bboxes)
      if rescale:
          mlvl_bboxes /= mlvl_bboxes.new_tensor(scale_factor)
  
      mlvl_scores = torch.cat(mlvl_scores)
      # Add a dummy background class to the backend when using sigmoid
      # remind that we set FG labels to [0, num_class-1] since mmdet v2.0
      # BG cat_id: num_class
      padding = mlvl_scores.new_zeros(mlvl_scores.shape[0], 1)
      mlvl_scores = torch.cat([mlvl_scores, padding], dim=1)
  
      if with_nms:
          det_bboxes, det_labels = multiclass_nms(
              mlvl_bboxes,
              mlvl_scores,
              cfg.score_thr,
              cfg.nms,
              cfg.max_per_img,
          )
          return det_bboxes, det_labels
      else:
          return mlvl_bboxes, mlvl_scores
  
imports: import numpy
  import torch
  import torch.nn
  import torch.nn.functional
  from mmcv.cnn import ConvModule, Scale, bias_init_with_prob, normal_init, DepthwiseSeparableConvModule
  from mmcv.cnn import constant_init, kaiming_init
  from mmcv.runner import force_fp32
  from mmdet.core import anchor_inside_flags, bbox2distance, bbox_overlaps, build_assigner, build_sampler, distance2bbox, distance2kps, kps2distance, images_to_levels, multi_apply, multiclass_nms, reduce_mean, unmap
  from ..builder import HEADS, build_loss
  from .anchor_head import AnchorHead
  from .base_dense_head import BaseDenseHead
  from .dense_test_mixins import BBoxTestMixin
label_desc: Use image node_id 13 for calling the SCRFDHead obj's underlying member method code with example usage: obj._get_bboxes_single(cls_scores, bbox_preds, mlvl_anchors, img_shape, scale_factor, cfg, rescale, with_nms) and returns: det_bboxes,  det_labels, mlvl_bboxes,  mlvl_scores