class_docstr: Guided-Anchor-based RPN head.
class_docstr_tok: ["Guided-Anchor-based","RPN","head","."]
code: def _get_bboxes_single(
      self,
      cls_scores,
      bbox_preds,
      mlvl_anchors,
      mlvl_masks,
      img_shape,
      scale_factor,
      cfg,
      rescale=False,
  ):
      cfg = self.test_cfg if cfg is None else cfg
      mlvl_proposals = []
      for idx in range(len(cls_scores)):
          rpn_cls_score = cls_scores[idx]
          rpn_bbox_pred = bbox_preds[idx]
          anchors = mlvl_anchors[idx]
          mask = mlvl_masks[idx]
          assert rpn_cls_score.size()[-2:] == rpn_bbox_pred.size()[-2:]
          # if no location is kept, end.
          if mask.sum() == 0:
              continue
          rpn_cls_score = rpn_cls_score.permute(1, 2, 0)
          if self.use_sigmoid_cls:
              rpn_cls_score = rpn_cls_score.reshape(-1)
              scores = rpn_cls_score.sigmoid()
          else:
              rpn_cls_score = rpn_cls_score.reshape(-1, 2)
              # remind that we set FG labels to [0, num_class-1]
              # since mmdet v2.0
              # BG cat_id: num_class
              scores = rpn_cls_score.softmax(dim=1)[:, :-1]
          # filter scores, bbox_pred w.r.t. mask.
          # anchors are filtered in get_anchors() beforehand.
          scores = scores[mask]
          rpn_bbox_pred = rpn_bbox_pred.permute(1, 2, 0).reshape(-1, 4)[
              mask, :
          ]
          if scores.dim() == 0:
              rpn_bbox_pred = rpn_bbox_pred.unsqueeze(0)
              anchors = anchors.unsqueeze(0)
              scores = scores.unsqueeze(0)
          # filter anchors, bbox_pred, scores w.r.t. scores
          if cfg.nms_pre > 0 and scores.shape[0] > cfg.nms_pre:
              _, topk_inds = scores.topk(cfg.nms_pre)
              rpn_bbox_pred = rpn_bbox_pred[topk_inds, :]
              anchors = anchors[topk_inds, :]
              scores = scores[topk_inds]
          # get proposals w.r.t. anchors and rpn_bbox_pred
          proposals = self.bbox_coder.decode(
              anchors, rpn_bbox_pred, max_shape=img_shape
          )
          # filter out too small bboxes
          if cfg.min_bbox_size > 0:
              w = proposals[:, 2] - proposals[:, 0]
              h = proposals[:, 3] - proposals[:, 1]
              valid_inds = torch.nonzero(
                  (w >= cfg.min_bbox_size) & (h >= cfg.min_bbox_size),
                  as_tuple=False,
              ).squeeze()
              proposals = proposals[valid_inds, :]
              scores = scores[valid_inds]
          # NMS in current level
          proposals, _ = nms(proposals, scores, cfg.nms_thr)
          proposals = proposals[: cfg.nms_post, :]
          mlvl_proposals.append(proposals)
      proposals = torch.cat(mlvl_proposals, 0)
      if cfg.nms_across_levels:
          # NMS across multi levels
          proposals, _ = nms(
              proposals[:, :4], proposals[:, -1], cfg.nms_thr
          )
          proposals = proposals[: cfg.max_num, :]
      else:
          scores = proposals[:, 4]
          num = min(cfg.max_num, proposals.shape[0])
          _, topk_inds = scores.topk(num)
          proposals = proposals[topk_inds, :]
      return proposals
  
file_path: insightface/detection/scrfd/mmdet/models/dense_heads/ga_rpn_head.py
imports: import torch
  import torch.nn
  import torch.nn.functional
  from mmcv.cnn import normal_init
  from mmcv.ops import nms
  from ..builder import HEADS
  from .guided_anchor_head import GuidedAnchorHead
  from .rpn_test_mixin import RPNTestMixin
label_desc: Use image node_id 6 for calling the GARPNHead obj's underlying member method code with example usage: obj._get_bboxes_single(cls_scores, bbox_preds, mlvl_anchors, mlvl_masks, img_shape, scale_factor, cfg, rescale) and returns: proposals