class_docstr: Side-Aware Boundary Localization (SABL) for RetinaNet.
  
  The anchor generation, assigning and sampling in SABLRetinaHead
  are the same as GuidedAnchorHead for guided anchoring.
  
  Please refer to https://arxiv.org/abs/1912.04260 for more details.
  
  Args:
      num_classes (int): Number of classes.
      in_channels (int): Number of channels in the input feature map.
      stacked_convs (int): Number of Convs for classification             and regression branches. Defaults to 4.
      feat_channels (int): Number of hidden channels.             Defaults to 256.
      approx_anchor_generator (dict): Config dict for approx generator.
      square_anchor_generator (dict): Config dict for square generator.
      conv_cfg (dict): Config dict for ConvModule. Defaults to None.
      norm_cfg (dict): Config dict for Norm Layer. Defaults to None.
      bbox_coder (dict): Config dict for bbox coder.
      reg_decoded_bbox (bool): Whether to regress decoded bbox.             Defaults to False.
      train_cfg (dict): Training config of SABLRetinaHead.
      test_cfg (dict): Testing config of SABLRetinaHead.
      loss_cls (dict): Config of classification loss.
      loss_bbox_cls (dict): Config of classification loss for bbox branch.
      loss_bbox_reg (dict): Config of regression loss for bbox branch.
docstr: Compute regression and classification targets for anchors in a
  single image.
  
  Args:
      flat_approxs (Tensor): flat approxs of a single image,
          shape (n, 4)
      inside_flags (Tensor): inside flags of a single image,
          shape (n, ).
      flat_squares (Tensor): flat squares of a single image,
          shape (approxs_per_octave * n, 4)
      gt_bboxes (Tensor): Ground truth bboxes of a single 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.
      sampling (bool): Sample Anchors or not.
      unmap_outputs (bool): unmap outputs or not.
  
  Returns:
      tuple:
  
          - labels_list (Tensor): Labels in a single image
          - label_weights (Tensor): Label weights in a single image
          - bbox_cls_targets (Tensor): BBox cls targets in a single image
          - bbox_cls_weights (Tensor): BBox cls weights in a single image
          - bbox_reg_targets (Tensor): BBox reg targets in a single image
          - bbox_reg_weights (Tensor): BBox reg weights in a single image
          - num_total_pos (int): Number of positive samples                     in a single image
          - num_total_neg (int): Number of negative samples                     in a single image
docstr_tok: ["Compute","regression","and","classification","targets","for","anchors","in","a","single","image",".","Args",":","flat_approxs","(","Tensor",")",":","flat","approxs","of","a","single","image",",","shape","(","n",",","4",")","inside_flags","(","Tensor",")",":","inside","flags","of","a","single","image",",","shape","(","n",",",")",".","flat_squares","(","Tensor",")",":","flat","squares","of","a","single","image",",","shape","(","approxs_per_octave","*","n",",","4",")","gt_bboxes","(","Tensor",")",":","Ground","truth","bboxes","of","a","single","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",".","sampling","(","bool",")",":","Sample","Anchors","or","not",".","unmap_outputs","(","bool",")",":","unmap","outputs","or","not",".","Returns",":","tuple",":","-","labels_list","(","Tensor",")",":","Labels","in","a","single","image","-","label_weights","(","Tensor",")",":","Label","weights","in","a","single","image","-","bbox_cls_targets","(","Tensor",")",":","BBox","cls","targets","in","a","single","image","-","bbox_cls_weights","(","Tensor",")",":","BBox","cls","weights","in","a","single","image","-","bbox_reg_targets","(","Tensor",")",":","BBox","reg","targets","in","a","single","image","-","bbox_reg_weights","(","Tensor",")",":","BBox","reg","weights","in","a","single","image","-","num_total_pos","(","int",")",":","Number","of","positive","samples","in","a","single","image","-","num_total_neg","(","int",")",":","Number","of","negative","samples","in","a","single","image"]
code: def _get_target_single(
      self,
      flat_approxs,
      inside_flags,
      flat_squares,
      gt_bboxes,
      gt_bboxes_ignore,
      gt_labels,
      img_meta,
      label_channels=None,
      sampling=True,
      unmap_outputs=True,
  ):
      """Compute regression and classification targets for anchors in a
          single image.
  
          Args:
              flat_approxs (Tensor): flat approxs of a single image,
                  shape (n, 4)
              inside_flags (Tensor): inside flags of a single image,
                  shape (n, ).
              flat_squares (Tensor): flat squares of a single image,
                  shape (approxs_per_octave * n, 4)
              gt_bboxes (Tensor): Ground truth bboxes of a single 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.
              sampling (bool): Sample Anchors or not.
              unmap_outputs (bool): unmap outputs or not.
  
          Returns:
              tuple:
  
                  - labels_list (Tensor): Labels in a single image
                  - label_weights (Tensor): Label weights in a single image
                  - bbox_cls_targets (Tensor): BBox cls targets in a single image
                  - bbox_cls_weights (Tensor): BBox cls weights in a single image
                  - bbox_reg_targets (Tensor): BBox reg targets in a single image
                  - bbox_reg_weights (Tensor): BBox reg weights in a single image
                  - num_total_pos (int): Number of positive samples \
                      in a single image
                  - num_total_neg (int): Number of negative samples \
                      in a single image
          """
      if not inside_flags.any():
          return (None,) * 8
      # assign gt and sample anchors
      expand_inside_flags = (
          inside_flags[:, None]
          .expand(-1, self.approxs_per_octave)
          .reshape(-1)
      )
      approxs = flat_approxs[expand_inside_flags, :]
      squares = flat_squares[inside_flags, :]
  
      assign_result = self.assigner.assign(
          approxs,
          squares,
          self.approxs_per_octave,
          gt_bboxes,
          gt_bboxes_ignore,
      )
      sampling_result = self.sampler.sample(
          assign_result, squares, gt_bboxes
      )
  
      num_valid_squares = squares.shape[0]
      bbox_cls_targets = squares.new_zeros(
          (num_valid_squares, self.side_num * 4)
      )
      bbox_cls_weights = squares.new_zeros(
          (num_valid_squares, self.side_num * 4)
      )
      bbox_reg_targets = squares.new_zeros(
          (num_valid_squares, self.side_num * 4)
      )
      bbox_reg_weights = squares.new_zeros(
          (num_valid_squares, self.side_num * 4)
      )
      labels = squares.new_full(
          (num_valid_squares,), self.num_classes, dtype=torch.long
      )
      label_weights = squares.new_zeros(
          num_valid_squares, dtype=torch.float
      )
  
      pos_inds = sampling_result.pos_inds
      neg_inds = sampling_result.neg_inds
      if len(pos_inds) > 0:
          (
              pos_bbox_reg_targets,
              pos_bbox_reg_weights,
              pos_bbox_cls_targets,
              pos_bbox_cls_weights,
          ) = self.bbox_coder.encode(
              sampling_result.pos_bboxes, sampling_result.pos_gt_bboxes
          )
  
          bbox_cls_targets[pos_inds, :] = pos_bbox_cls_targets
          bbox_reg_targets[pos_inds, :] = pos_bbox_reg_targets
          bbox_cls_weights[pos_inds, :] = pos_bbox_cls_weights
          bbox_reg_weights[pos_inds, :] = pos_bbox_reg_weights
          if gt_labels is None:
              # Only rpn gives gt_labels as None
              # Foreground is the first class
              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_squares.size(0)
          labels = unmap(
              labels,
              num_total_anchors,
              inside_flags,
              fill=self.num_classes,
          )
          label_weights = unmap(
              label_weights, num_total_anchors, inside_flags
          )
          bbox_cls_targets = unmap(
              bbox_cls_targets, num_total_anchors, inside_flags
          )
          bbox_cls_weights = unmap(
              bbox_cls_weights, num_total_anchors, inside_flags
          )
          bbox_reg_targets = unmap(
              bbox_reg_targets, num_total_anchors, inside_flags
          )
          bbox_reg_weights = unmap(
              bbox_reg_weights, num_total_anchors, inside_flags
          )
      return (
          labels,
          label_weights,
          bbox_cls_targets,
          bbox_cls_weights,
          bbox_reg_targets,
          bbox_reg_weights,
          pos_inds,
          neg_inds,
      )
  
imports: import numpy
  import torch
  import torch.nn
  from mmcv.cnn import ConvModule, bias_init_with_prob, normal_init
  from mmcv.runner import force_fp32
  from mmdet.core import build_anchor_generator, build_assigner, build_bbox_coder, build_sampler, images_to_levels, multi_apply, multiclass_nms, unmap
  from ..builder import HEADS, build_loss
  from .base_dense_head import BaseDenseHead
  from .guided_anchor_head import GuidedAnchorHead
label_desc: Use image node_id 8 for calling the SABLRetinaHead obj's underlying member method code with example usage: obj._get_target_single(flat_approxs, inside_flags, flat_squares, gt_bboxes, gt_bboxes_ignore, gt_labels, img_meta, label_channels, sampling, unmap_outputs) and returns: labels,  label_weights,  bbox_cls_targets,  bbox_cls_weights,  bbox_reg_targets,  bbox_reg_weights,  pos_inds,  neg_inds, unknown