class_docstr: Stores assignments between predicted and truth boxes.
  
  Attributes:
      num_gts (int): the number of truth boxes considered when computing this
          assignment
  
      gt_inds (LongTensor): for each predicted box indicates the 1-based
          index of the assigned truth box. 0 means unassigned and -1 means
          ignore.
  
      max_overlaps (FloatTensor): the iou between the predicted box and its
          assigned truth box.
  
      labels (None | LongTensor): If specified, for each predicted box
          indicates the category label of the assigned truth box.
  
  Example:
      >>> # An assign result between 4 predicted boxes and 9 true boxes
      >>> # where only two boxes were assigned.
      >>> num_gts = 9
      >>> max_overlaps = torch.LongTensor([0, .5, .9, 0])
      >>> gt_inds = torch.LongTensor([-1, 1, 2, 0])
      >>> labels = torch.LongTensor([0, 3, 4, 0])
      >>> self = AssignResult(num_gts, gt_inds, max_overlaps, labels)
      >>> print(str(self))  # xdoctest: +IGNORE_WANT
      <AssignResult(num_gts=9, gt_inds.shape=(4,), max_overlaps.shape=(4,),
                    labels.shape=(4,))>
      >>> # Force addition of gt labels (when adding gt as proposals)
      >>> new_labels = torch.LongTensor([3, 4, 5])
      >>> self.add_gt_(new_labels)
      >>> print(str(self))  # xdoctest: +IGNORE_WANT
      <AssignResult(num_gts=9, gt_inds.shape=(7,), max_overlaps.shape=(7,),
                    labels.shape=(7,))>
docstr: str: a "nice" summary string describing this assign result
code: def __nice__(self):
      """str: a "nice" summary string describing this assign result"""
      parts = []
      parts.append(f"num_gts={self.num_gts!r}")
      if self.gt_inds is None:
          parts.append(f"gt_inds={self.gt_inds!r}")
      else:
          parts.append(f"gt_inds.shape={tuple(self.gt_inds.shape)!r}")
      if self.max_overlaps is None:
          parts.append(f"max_overlaps={self.max_overlaps!r}")
      else:
          parts.append(
              "max_overlaps.shape="
              f"{tuple(self.max_overlaps.shape)!r}"
          )
      if self.labels is None:
          parts.append(f"labels={self.labels!r}")
      else:
          parts.append(f"labels.shape={tuple(self.labels.shape)!r}")
      return ", ".join(parts)
  
file_path: insightface/detection/scrfd/mmdet/core/bbox/assigners/assign_result.py
imports: import torch
  from mmdet.utils import util_mixins
label_desc: Use image node_id 6 for calling the AssignResult obj's underlying member method code with example usage: obj.__nice__() and returns: str