class_docstr: FCOSLoss
  Args:
      loss_alpha (float): alpha in focal loss
      loss_gamma (float): gamma in focal loss
      iou_loss_type (str): location loss type, IoU/GIoU/LINEAR_IoU
      reg_weights (float): weight for location loss
      quality (str): quality branch, centerness/iou
docstr: Calculate the loss for classification, location and centerness
  Args:
      cls_logits (list): list of Tensor, which is predicted
          score for all anchor points with shape [N, M, C]
      bboxes_reg (list): list of Tensor, which is predicted
          offsets for all anchor points with shape [N, M, 4]
      centerness (list): list of Tensor, which is predicted
          centerness for all anchor points with shape [N, M, 1]
      tag_labels (list): list of Tensor, which is category
          targets for each anchor point
      tag_bboxes (list): list of Tensor, which is bounding
          boxes targets for positive samples
      tag_center (list): list of Tensor, which is centerness
          targets for positive samples
  Return:
      loss (dict): loss composed by classification loss, bounding box
docstr_tok: ["Calculate","the","loss","for","classification",",","location","and","centerness","Args",":","cls_logits","(","list",")",":","list","of","Tensor",",","which","is","predicted","score","for","all","anchor","points","with","shape","[","N",",","M",",","C","]","bboxes_reg","(","list",")",":","list","of","Tensor",",","which","is","predicted","offsets","for","all","anchor","points","with","shape","[","N",",","M",",","4","]","centerness","(","list",")",":","list","of","Tensor",",","which","is","predicted","centerness","for","all","anchor","points","with","shape","[","N",",","M",",","1","]","tag_labels","(","list",")",":","list","of","Tensor",",","which","is","category","targets","for","each","anchor","point","tag_bboxes","(","list",")",":","list","of","Tensor",",","which","is","bounding","boxes","targets","for","positive","samples","tag_center","(","list",")",":","list","of","Tensor",",","which","is","centerness","targets","for","positive","samples","Return",":","loss","(","dict",")",":","loss","composed","by","classification","loss",",","bounding","box"]
code: def forward(
      self,
      cls_logits,
      bboxes_reg,
      centerness,
      tag_labels,
      tag_bboxes,
      tag_center,
  ):
      """
      Calculate the loss for classification, location and centerness
      Args:
          cls_logits (list): list of Tensor, which is predicted
              score for all anchor points with shape [N, M, C]
          bboxes_reg (list): list of Tensor, which is predicted
              offsets for all anchor points with shape [N, M, 4]
          centerness (list): list of Tensor, which is predicted
              centerness for all anchor points with shape [N, M, 1]
          tag_labels (list): list of Tensor, which is category
              targets for each anchor point
          tag_bboxes (list): list of Tensor, which is bounding
              boxes targets for positive samples
          tag_center (list): list of Tensor, which is centerness
              targets for positive samples
      Return:
          loss (dict): loss composed by classification loss, bounding box
      """
      cls_logits_flatten_list = []
      bboxes_reg_flatten_list = []
      centerness_flatten_list = []
      tag_labels_flatten_list = []
      tag_bboxes_flatten_list = []
      tag_center_flatten_list = []
      num_lvl = len(cls_logits)
      for lvl in range(num_lvl):
          cls_logits_flatten_list.append(
              flatten_tensor(cls_logits[lvl], True)
          )
          bboxes_reg_flatten_list.append(
              flatten_tensor(bboxes_reg[lvl], True)
          )
          centerness_flatten_list.append(
              flatten_tensor(centerness[lvl], True)
          )
  
          tag_labels_flatten_list.append(
              flatten_tensor(tag_labels[lvl], False)
          )
          tag_bboxes_flatten_list.append(
              flatten_tensor(tag_bboxes[lvl], False)
          )
          tag_center_flatten_list.append(
              flatten_tensor(tag_center[lvl], False)
          )
  
      cls_logits_flatten = paddle.concat(
          cls_logits_flatten_list, axis=0
      )
      bboxes_reg_flatten = paddle.concat(
          bboxes_reg_flatten_list, axis=0
      )
      centerness_flatten = paddle.concat(
          centerness_flatten_list, axis=0
      )
  
      tag_labels_flatten = paddle.concat(
          tag_labels_flatten_list, axis=0
      )
      tag_bboxes_flatten = paddle.concat(
          tag_bboxes_flatten_list, axis=0
      )
      tag_center_flatten = paddle.concat(
          tag_center_flatten_list, axis=0
      )
      tag_labels_flatten.stop_gradient = True
      tag_bboxes_flatten.stop_gradient = True
      tag_center_flatten.stop_gradient = True
  
      mask_positive_bool = tag_labels_flatten > 0
      mask_positive_bool.stop_gradient = True
      mask_positive_float = paddle.cast(
          mask_positive_bool, dtype="float32"
      )
      mask_positive_float.stop_gradient = True
  
      num_positive_fp32 = paddle.sum(mask_positive_float)
      num_positive_fp32.stop_gradient = True
      num_positive_int32 = paddle.cast(num_positive_fp32, dtype="int32")
      num_positive_int32 = num_positive_int32 * 0 + 1
      num_positive_int32.stop_gradient = True
  
      normalize_sum = paddle.sum(
          tag_center_flatten * mask_positive_float
      )
      normalize_sum.stop_gradient = True
  
      # 1. cls_logits: sigmoid_focal_loss
      # expand onehot labels
      num_classes = cls_logits_flatten.shape[-1]
      tag_labels_flatten = paddle.squeeze(tag_labels_flatten, axis=-1)
      tag_labels_flatten_bin = F.one_hot(
          tag_labels_flatten, num_classes=1 + num_classes
      )
      tag_labels_flatten_bin = tag_labels_flatten_bin[:, 1:]
      # sigmoid_focal_loss
      cls_loss = (
          F.sigmoid_focal_loss(
              cls_logits_flatten, tag_labels_flatten_bin
          )
          / num_positive_fp32
      )
  
      if self.quality == "centerness":
          # 2. bboxes_reg: giou_loss
          mask_positive_float = paddle.squeeze(
              mask_positive_float, axis=-1
          )
          tag_center_flatten = paddle.squeeze(
              tag_center_flatten, axis=-1
          )
          reg_loss = self._iou_loss(
              bboxes_reg_flatten,
              tag_bboxes_flatten,
              mask_positive_float,
              weights=tag_center_flatten,
          )
          reg_loss = reg_loss * mask_positive_float / normalize_sum
  
          # 3. centerness: sigmoid_cross_entropy_with_logits_loss
          centerness_flatten = paddle.squeeze(
              centerness_flatten, axis=-1
          )
          quality_loss = ops.sigmoid_cross_entropy_with_logits(
              centerness_flatten, tag_center_flatten
          )
          quality_loss = (
              quality_loss * mask_positive_float / num_positive_fp32
          )
  
      elif self.quality == "iou":
          # 2. bboxes_reg: giou_loss
          mask_positive_float = paddle.squeeze(
              mask_positive_float, axis=-1
          )
          tag_center_flatten = paddle.squeeze(
              tag_center_flatten, axis=-1
          )
          reg_loss = self._iou_loss(
              bboxes_reg_flatten,
              tag_bboxes_flatten,
              mask_positive_float,
              weights=None,
          )
          reg_loss = reg_loss * mask_positive_float / num_positive_fp32
          # num_positive_fp32 is num_foreground
  
          # 3. centerness: sigmoid_cross_entropy_with_logits_loss
          centerness_flatten = paddle.squeeze(
              centerness_flatten, axis=-1
          )
          gt_ious = self._iou_loss(
              bboxes_reg_flatten,
              tag_bboxes_flatten,
              mask_positive_float,
              weights=None,
              return_iou=True,
          )
          quality_loss = ops.sigmoid_cross_entropy_with_logits(
              centerness_flatten, gt_ious
          )
          quality_loss = (
              quality_loss * mask_positive_float / num_positive_fp32
          )
      else:
          raise Exception(f"Unknown quality type: {self.quality}")
  
      loss_all = {
          "loss_cls": paddle.sum(cls_loss),
          "loss_box": paddle.sum(reg_loss),
          "loss_quality": paddle.sum(quality_loss),
      }
      return loss_all
  
imports: from __future__ import absolute_import
  from __future__ import division
  from __future__ import print_function
  import paddle
  import paddle.nn
  import paddle.nn.functional
  from ppdet.core.workspace import register
  from ppdet.modeling import ops
  from functools import partial
label_desc: Use image node_id 3 for calling the FCOSLoss obj's underlying member method code with example usage: obj.forward(cls_logits, bboxes_reg, centerness, tag_labels, tag_bboxes, tag_center) and returns: loss_all