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.
          Defaults to 4.
      conv_cfg (:obj:`ConfigDict` or dict, optional): dictionary to construct
          and config conv layer. Defaults to None.
      norm_cfg (:obj:`ConfigDict` or dict): dictionary to construct and
          config norm layer. Default: dict(type='GN', num_groups=32,
          requires_grad=True).
      loss_qfl (:obj:`ConfigDict` or dict): Config of Quality Focal Loss
          (QFL).
      bbox_coder (:obj:`ConfigDict` or dict): Config of bbox coder. Defaults
           to 'DistancePointBBoxCoder'.
      reg_max (int): Max value of integral set :math: ``{0, ..., reg_max}``
          in QFL setting. Defaults to 16.
      init_cfg (:obj:`ConfigDict` or dict or list[dict] or
          list[:obj:`ConfigDict`]): Initialization config dict.
  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",".","Defaults","to","4.","conv_cfg","(",":","obj",":","`","ConfigDict","`","or","dict",",","optional",")",":","dictionary","to","construct","and","config","conv","layer",".","Defaults","to","None",".","norm_cfg","(",":","obj",":","`","ConfigDict","`","or","dict",")",":","dictionary","to","construct","and","config","norm","layer",".","Default",":","dict","(","type='GN","'",",","num_groups=32",",","requires_grad=True",")",".","loss_qfl","(",":","obj",":","`","ConfigDict","`","or","dict",")",":","Config","of","Quality","Focal","Loss","(","QFL",")",".","bbox_coder","(",":","obj",":","`","ConfigDict","`","or","dict",")",":","Config","of","bbox","coder",".","Defaults","to","'DistancePointBBoxCoder","'",".","reg_max","(","int",")",":","Max","value","of","integral","set",":","math",":","``","{","0",",","...",",","reg_max","}","``","in","QFL","setting",".","Defaults","to","16.","init_cfg","(",":","obj",":","`","ConfigDict","`","or","dict","or","list","[","dict","]","or","list","[",":","obj",":","`","ConfigDict","`","]",")",":","Initialization","config","dict",".","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: Calculate the loss of a single scale level based on the features
  extracted by the detection head.
  
  Args:
      anchors (Tensor): Box reference for each scale level with shape
          (N, num_total_anchors, 4).
      cls_score (Tensor): Cls and quality joint scores for each scale
          level has shape (N, num_classes, H, W).
      bbox_pred (Tensor): Box distribution logits for each scale
          level with shape (N, 4*(n+1), H, W), n is max value of integral
          set.
      labels (Tensor): Labels of each anchors with shape
          (N, num_total_anchors).
      label_weights (Tensor): Label weights of each anchor with shape
          (N, num_total_anchors)
      bbox_targets (Tensor): BBox regression targets of each anchor with
          shape (N, num_total_anchors, 4).
      stride (Tuple[int]): Stride in this scale level.
      avg_factor (int): Average factor that is used to average
          the loss. When using sampling method, avg_factor is usually
          the sum of positive and negative priors. When using
          `PseudoSampler`, `avg_factor` is usually equal to the number
          of positive priors.
  
  Returns:
      dict[str, Tensor]: A dictionary of loss components.
docstr_tok: ["Calculate","the","loss","of","a","single","scale","level","based","on","the","features","extracted","by","the","detection","head",".","Args",":","anchors","(","Tensor",")",":","Box","reference","for","each","scale","level","with","shape","(","N",",","num_total_anchors",",","4",")",".","cls_score","(","Tensor",")",":","Cls","and","quality","joint","scores","for","each","scale","level","has","shape","(","N",",","num_classes",",","H",",","W",")",".","bbox_pred","(","Tensor",")",":","Box","distribution","logits","for","each","scale","level","with","shape","(","N",",","4","*","(","n+1",")",",","H",",","W",")",",","n","is","max","value","of","integral","set",".","labels","(","Tensor",")",":","Labels","of","each","anchors","with","shape","(","N",",","num_total_anchors",")",".","label_weights","(","Tensor",")",":","Label","weights","of","each","anchor","with","shape","(","N",",","num_total_anchors",")","bbox_targets","(","Tensor",")",":","BBox","regression","targets","of","each","anchor","with","shape","(","N",",","num_total_anchors",",","4",")",".","stride","(","Tuple","[","int","]",")",":","Stride","in","this","scale","level",".","avg_factor","(","int",")",":","Average","factor","that","is","used","to","average","the","loss",".","When","using","sampling","method",",","avg_factor","is","usually","the","sum","of","positive","and","negative","priors",".","When","using","`","PseudoSampler","`",",","`","avg_factor","`","is","usually","equal","to","the","number","of","positive","priors",".","Returns",":","dict","[","str",",","Tensor","]",":","A","dictionary","of","loss","components","."]
code: def loss_by_feat_single(
      self,
      anchors: Tensor,
      cls_score: Tensor,
      bbox_pred: Tensor,
      labels: Tensor,
      label_weights: Tensor,
      bbox_targets: Tensor,
      stride: Tuple[int],
      avg_factor: int,
  ) -> dict:
      """Calculate the loss of a single scale level based on the features
      extracted by the detection head.
  
      Args:
          anchors (Tensor): Box reference for each scale level with shape
              (N, num_total_anchors, 4).
          cls_score (Tensor): Cls and quality joint scores for each scale
              level has shape (N, num_classes, H, W).
          bbox_pred (Tensor): Box distribution logits for each scale
              level with shape (N, 4*(n+1), H, W), n is max value of integral
              set.
          labels (Tensor): Labels of each anchors with shape
              (N, num_total_anchors).
          label_weights (Tensor): Label weights of each anchor with shape
              (N, num_total_anchors)
          bbox_targets (Tensor): BBox regression targets of each anchor with
              shape (N, num_total_anchors, 4).
          stride (Tuple[int]): Stride in this scale level.
          avg_factor (int): Average factor that is used to average
              the loss. When using sampling method, avg_factor is usually
              the sum of positive and negative priors. When using
              `PseudoSampler`, `avg_factor` is usually equal to the number
              of positive priors.
  
      Returns:
          dict[str, Tensor]: A dictionary of loss components.
      """
      assert (
          stride[0] == stride[1]
      ), "h stride is not equal to w stride!"
      anchors = anchors.reshape(-1, 4)
      cls_score = cls_score.permute(0, 2, 3, 1).reshape(
          -1, self.cls_out_channels
      )
      bbox_pred = bbox_pred.permute(0, 2, 3, 1).reshape(
          -1, 4 * (self.reg_max + 1)
      )
      bbox_targets = bbox_targets.reshape(-1, 4)
      labels = labels.reshape(-1)
      label_weights = label_weights.reshape(-1)
  
      # FG cat_id: [0, num_classes -1], BG cat_id: num_classes
      bg_class_ind = self.num_classes
      pos_inds = (
          ((labels >= 0) & (labels < bg_class_ind)).nonzero().squeeze(1)
      )
      score = label_weights.new_zeros(labels.shape)
  
      if len(pos_inds) > 0:
          pos_bbox_targets = bbox_targets[pos_inds]
          pos_bbox_pred = bbox_pred[pos_inds]
          pos_anchors = anchors[pos_inds]
          pos_anchor_centers = (
              self.anchor_center(pos_anchors) / stride[0]
          )
  
          weight_targets = cls_score.detach().sigmoid()
          weight_targets = weight_targets.max(dim=1)[0][pos_inds]
          pos_bbox_pred_corners = self.integral(pos_bbox_pred)
          pos_decode_bbox_pred = self.bbox_coder.decode(
              pos_anchor_centers, pos_bbox_pred_corners
          )
          pos_decode_bbox_targets = pos_bbox_targets / stride[0]
          score[pos_inds] = bbox_overlaps(
              pos_decode_bbox_pred.detach(),
              pos_decode_bbox_targets,
              is_aligned=True,
          )
          pred_corners = pos_bbox_pred.reshape(-1, self.reg_max + 1)
          target_corners = self.bbox_coder.encode(
              pos_anchor_centers, pos_decode_bbox_targets, self.reg_max
          ).reshape(-1)
  
          # regression loss
          loss_bbox = self.loss_bbox(
              pos_decode_bbox_pred,
              pos_decode_bbox_targets,
              weight=weight_targets,
              avg_factor=1.0,
          )
  
          # dfl loss
          loss_dfl = self.loss_dfl(
              pred_corners,
              target_corners,
              weight=weight_targets[:, None].expand(-1, 4).reshape(-1),
              avg_factor=4.0,
          )
      else:
          loss_bbox = bbox_pred.sum() * 0
          loss_dfl = bbox_pred.sum() * 0
          weight_targets = bbox_pred.new_tensor(0)
  
      # cls (qfl) loss
      loss_cls = self.loss_cls(
          cls_score,
          (labels, score),
          weight=label_weights,
          avg_factor=avg_factor,
      )
  
      return loss_cls, loss_bbox, loss_dfl, weight_targets.sum()
  
imports: from typing import List, Optional, Sequence, Tuple
  import torch
  import torch.nn
  import torch.nn.functional
  from mmcv.cnn import ConvModule, Scale
  from mmengine.config import ConfigDict
  from mmengine.structures import InstanceData
  from torch import Tensor
  from mmdet.registry import MODELS, TASK_UTILS
  from mmdet.structures.bbox import bbox_overlaps
  from mmdet.utils import ConfigType, InstanceList, MultiConfig, OptConfigType, OptInstanceList, reduce_mean
  from ..task_modules.prior_generators import anchor_inside_flags
  from ..task_modules.samplers import PseudoSampler
  from ..utils import filter_scores_and_topk, images_to_levels, multi_apply, unmap
  from .anchor_head import AnchorHead
label_desc: Use image node_id 6 for calling the GFLHead obj's underlying member method code with example usage: obj.loss_by_feat_single(anchors, cls_score, bbox_pred, labels, label_weights, bbox_targets, stride, avg_factor) and returns: loss_cls,  loss_bbox,  loss_dfl,  weight_targets