class_docstr: Bridging the Gap Between Anchor-based and Anchor-free Detection via
  Adaptive Training Sample Selection.
  
  ATSS head structure is similar with FCOS, however ATSS use anchor boxes
  and assign label by Adaptive Training Sample Selection instead max-iou.
  
  https://arxiv.org/abs/1912.02424
class_docstr_tok: ["Bridging","the","Gap","Between","Anchor-based","and","Anchor-free","Detection","via","Adaptive","Training","Sample","Selection",".","ATSS","head","structure","is","similar","with","FCOS",",","however","ATSS","use","anchor","boxes","and","assign","label","by","Adaptive","Training","Sample","Selection","instead","max-iou",".","https",":","\/\/arxiv.org\/abs\/1912.02424"]
docstr: Compute regression, classification targets for anchors in a single
  image.
  
  Args:
      flat_anchors (Tensor): Multi-level anchors of the image, which are
          concatenated into a single tensor of shape (num_anchors ,4)
      valid_flags (Tensor): Multi level valid flags of the image,
          which are concatenated into a single tensor of
              shape (num_anchors,).
      num_level_anchors Tensor): Number of anchors of each scale level.
      gt_bboxes (Tensor): Ground truth bboxes of the image,
          shape (num_gts, 4).
      gt_bboxes_ignore (Tensor): Ground truth bboxes to be
          ignored, shape (num_ignored_gts, 4).
      gt_labels (Tensor): Ground truth labels of each box,
          shape (num_gts,).
      img_meta (dict): Meta info of the image.
      label_channels (int): Channel of label.
      unmap_outputs (bool): Whether to map outputs back to the original
          set of anchors.
  
  Returns:
      tuple: N is the number of total anchors in the image.
          labels (Tensor): Labels of all anchors in the image with shape
              (N,).
          label_weights (Tensor): Label weights of all anchor in the
              image with shape (N,).
          bbox_targets (Tensor): BBox targets of all anchors in the
              image with shape (N, 4).
          bbox_weights (Tensor): BBox weights of all anchors in the
              image with shape (N, 4)
          pos_inds (Tensor): Indices of postive anchor with shape
              (num_pos,).
          neg_inds (Tensor): Indices of negative anchor with shape
              (num_neg,).
docstr_tok: ["Compute","regression",",","classification","targets","for","anchors","in","a","single","image",".","Args",":","flat_anchors","(","Tensor",")",":","Multi-level","anchors","of","the","image",",","which","are","concatenated","into","a","single","tensor","of","shape","(","num_anchors",",4",")","valid_flags","(","Tensor",")",":","Multi","level","valid","flags","of","the","image",",","which","are","concatenated","into","a","single","tensor","of","shape","(","num_anchors",",",")",".","num_level_anchors","Tensor",")",":","Number","of","anchors","of","each","scale","level",".","gt_bboxes","(","Tensor",")",":","Ground","truth","bboxes","of","the","image",",","shape","(","num_gts",",","4",")",".","gt_bboxes_ignore","(","Tensor",")",":","Ground","truth","bboxes","to","be","ignored",",","shape","(","num_ignored_gts",",","4",")",".","gt_labels","(","Tensor",")",":","Ground","truth","labels","of","each","box",",","shape","(","num_gts",",",")",".","img_meta","(","dict",")",":","Meta","info","of","the","image",".","label_channels","(","int",")",":","Channel","of","label",".","unmap_outputs","(","bool",")",":","Whether","to","map","outputs","back","to","the","original","set","of","anchors",".","Returns",":","tuple",":","N","is","the","number","of","total","anchors","in","the","image",".","labels","(","Tensor",")",":","Labels","of","all","anchors","in","the","image","with","shape","(","N",",",")",".","label_weights","(","Tensor",")",":","Label","weights","of","all","anchor","in","the","image","with","shape","(","N",",",")",".","bbox_targets","(","Tensor",")",":","BBox","targets","of","all","anchors","in","the","image","with","shape","(","N",",","4",")",".","bbox_weights","(","Tensor",")",":","BBox","weights","of","all","anchors","in","the","image","with","shape","(","N",",","4",")","pos_inds","(","Tensor",")",":","Indices","of","postive","anchor","with","shape","(","num_pos",",",")",".","neg_inds","(","Tensor",")",":","Indices","of","negative","anchor","with","shape","(","num_neg",",",")","."]
code: def _get_target_single(
      self,
      flat_anchors,
      valid_flags,
      num_level_anchors,
      gt_bboxes,
      gt_bboxes_ignore,
      gt_labels,
      img_meta,
      label_channels=1,
      unmap_outputs=True,
  ):
      """Compute regression, classification targets for anchors in a single
      image.
  
      Args:
          flat_anchors (Tensor): Multi-level anchors of the image, which are
              concatenated into a single tensor of shape (num_anchors ,4)
          valid_flags (Tensor): Multi level valid flags of the image,
              which are concatenated into a single tensor of
                  shape (num_anchors,).
          num_level_anchors Tensor): Number of anchors of each scale level.
          gt_bboxes (Tensor): Ground truth bboxes of the image,
              shape (num_gts, 4).
          gt_bboxes_ignore (Tensor): Ground truth bboxes to be
              ignored, shape (num_ignored_gts, 4).
          gt_labels (Tensor): Ground truth labels of each box,
              shape (num_gts,).
          img_meta (dict): Meta info of the image.
          label_channels (int): Channel of label.
          unmap_outputs (bool): Whether to map outputs back to the original
              set of anchors.
  
      Returns:
          tuple: N is the number of total anchors in the image.
              labels (Tensor): Labels of all anchors in the image with shape
                  (N,).
              label_weights (Tensor): Label weights of all anchor in the
                  image with shape (N,).
              bbox_targets (Tensor): BBox targets of all anchors in the
                  image with shape (N, 4).
              bbox_weights (Tensor): BBox weights of all anchors in the
                  image with shape (N, 4)
              pos_inds (Tensor): Indices of postive anchor with shape
                  (num_pos,).
              neg_inds (Tensor): Indices of negative anchor with shape
                  (num_neg,).
      """
      inside_flags = anchor_inside_flags(
          flat_anchors,
          valid_flags,
          img_meta["img_shape"][:2],
          self.train_cfg.allowed_border,
      )
      if not inside_flags.any():
          return (None,) * 7
      # assign gt and sample anchors
      anchors = flat_anchors[inside_flags, :]
  
      num_level_anchors_inside = self.get_num_level_anchors_inside(
          num_level_anchors, inside_flags
      )
      assign_result = self.assigner.assign(
          anchors,
          num_level_anchors_inside,
          gt_bboxes,
          gt_bboxes_ignore,
          gt_labels,
      )
  
      sampling_result = self.sampler.sample(
          assign_result, anchors, gt_bboxes
      )
  
      num_valid_anchors = anchors.shape[0]
      bbox_targets = torch.zeros_like(anchors)
      bbox_weights = torch.zeros_like(anchors)
      labels = anchors.new_full(
          (num_valid_anchors,), self.num_classes, dtype=torch.long
      )
      label_weights = anchors.new_zeros(
          num_valid_anchors, dtype=torch.float
      )
  
      pos_inds = sampling_result.pos_inds
      neg_inds = sampling_result.neg_inds
      if len(pos_inds) > 0:
          if hasattr(self, "bbox_coder"):
              pos_bbox_targets = self.bbox_coder.encode(
                  sampling_result.pos_bboxes,
                  sampling_result.pos_gt_bboxes,
              )
          else:
              # used in VFNetHead
              pos_bbox_targets = sampling_result.pos_gt_bboxes
          bbox_targets[pos_inds, :] = pos_bbox_targets
          bbox_weights[pos_inds, :] = 1.0
          if gt_labels is None:
              # Only rpn gives gt_labels as None
              # Foreground is the first class since v2.5.0
              labels[pos_inds] = 0
          else:
              labels[pos_inds] = gt_labels[
                  sampling_result.pos_assigned_gt_inds
              ]
          if self.train_cfg.pos_weight <= 0:
              label_weights[pos_inds] = 1.0
          else:
              label_weights[pos_inds] = self.train_cfg.pos_weight
      if len(neg_inds) > 0:
          label_weights[neg_inds] = 1.0
  
      # map up to original set of anchors
      if unmap_outputs:
          num_total_anchors = flat_anchors.size(0)
          anchors = unmap(anchors, num_total_anchors, inside_flags)
          labels = unmap(
              labels,
              num_total_anchors,
              inside_flags,
              fill=self.num_classes,
          )
          label_weights = unmap(
              label_weights, num_total_anchors, inside_flags
          )
          bbox_targets = unmap(
              bbox_targets, num_total_anchors, inside_flags
          )
          bbox_weights = unmap(
              bbox_weights, num_total_anchors, inside_flags
          )
  
      return (
          anchors,
          labels,
          label_weights,
          bbox_targets,
          bbox_weights,
          pos_inds,
          neg_inds,
      )
  
imports: import torch
  import torch.nn
  from mmcv.cnn import ConvModule, Scale, bias_init_with_prob, normal_init
  from mmcv.runner import force_fp32
  from mmdet.core import anchor_inside_flags, build_assigner, build_sampler, images_to_levels, multi_apply, multiclass_nms, reduce_mean, unmap
  from ..builder import HEADS, build_loss
  from .anchor_head import AnchorHead
label_desc: Use image node_id 12 for calling the ATSSHead obj's underlying member method code with example usage: obj._get_target_single(flat_anchors, valid_flags, num_level_anchors, gt_bboxes, gt_bboxes_ignore, gt_labels, img_meta, label_channels, unmap_outputs) and returns: anchors,  labels,  label_weights,  bbox_targets,  bbox_weights,  pos_inds,  neg_inds, unknown