class_docstr: RoI head for `Dynamic R-CNN <https://arxiv.org/abs/2004.06002>`_.
class_docstr_tok: ["RoI","head","for","`","Dynamic","R-CNN","<","https",":","\/\/arxiv.org\/abs\/2004.06002",">","`","_","."]
docstr: Forward function for training.
  
  Args:
      x (tuple[Tensor]): List of multi-level img features.
      rpn_results_list (list[:obj:`InstanceData`]): List of region
          proposals.
      batch_data_samples (list[:obj:`DetDataSample`]): The batch
          data samples. It usually includes information such
          as `gt_instance` or `gt_panoptic_seg` or `gt_sem_seg`.
  
  Returns:
      dict[str, Tensor]: a dictionary of loss components
docstr_tok: ["Forward","function","for","training",".","Args",":","x","(","tuple","[","Tensor","]",")",":","List","of","multi-level","img","features",".","rpn_results_list","(","list","[",":","obj",":","`","InstanceData","`","]",")",":","List","of","region","proposals",".","batch_data_samples","(","list","[",":","obj",":","`","DetDataSample","`","]",")",":","The","batch","data","samples",".","It","usually","includes","information","such","as","`","gt_instance","`","or","`","gt_panoptic_seg","`","or","`","gt_sem_seg","`",".","Returns",":","dict","[","str",",","Tensor","]",":","a","dictionary","of","loss","components"]
code: def loss(
      self,
      x: Tuple[Tensor],
      rpn_results_list: InstanceList,
      batch_data_samples: SampleList,
  ) -> dict:
      """Forward function for training.
  
      Args:
          x (tuple[Tensor]): List of multi-level img features.
          rpn_results_list (list[:obj:`InstanceData`]): List of region
              proposals.
          batch_data_samples (list[:obj:`DetDataSample`]): The batch
              data samples. It usually includes information such
              as `gt_instance` or `gt_panoptic_seg` or `gt_sem_seg`.
  
      Returns:
          dict[str, Tensor]: a dictionary of loss components
      """
      assert len(rpn_results_list) == len(batch_data_samples)
      outputs = unpack_gt_instances(batch_data_samples)
      batch_gt_instances, batch_gt_instances_ignore, _ = outputs
  
      # assign gts and sample proposals
      num_imgs = len(batch_data_samples)
      sampling_results = []
      cur_iou = []
      for i in range(num_imgs):
          # rename rpn_results.bboxes to rpn_results.priors
          rpn_results = rpn_results_list[i]
          rpn_results.priors = rpn_results.pop("bboxes")
  
          assign_result = self.bbox_assigner.assign(
              rpn_results,
              batch_gt_instances[i],
              batch_gt_instances_ignore[i],
          )
          sampling_result = self.bbox_sampler.sample(
              assign_result,
              rpn_results,
              batch_gt_instances[i],
              feats=[lvl_feat[i][None] for lvl_feat in x],
          )
          # record the `iou_topk`-th largest IoU in an image
          iou_topk = min(
              self.train_cfg.dynamic_rcnn.iou_topk,
              len(assign_result.max_overlaps),
          )
          ious, _ = torch.topk(assign_result.max_overlaps, iou_topk)
          cur_iou.append(ious[-1].item())
          sampling_results.append(sampling_result)
      # average the current IoUs over images
      cur_iou = np.mean(cur_iou)
      self.iou_history.append(cur_iou)
  
      losses = dict()
      # bbox head forward and loss
      if self.with_bbox:
          bbox_results = self.bbox_loss(x, sampling_results)
          losses.update(bbox_results["loss_bbox"])
  
      # mask head forward and loss
      if self.with_mask:
          mask_results = self.mask_loss(
              x,
              sampling_results,
              bbox_results["bbox_feats"],
              batch_gt_instances,
          )
          losses.update(mask_results["loss_mask"])
  
      # update IoU threshold and SmoothL1 beta
      update_iter_interval = (
          self.train_cfg.dynamic_rcnn.update_iter_interval
      )
      if len(self.iou_history) % update_iter_interval == 0:
          new_iou_thr, new_beta = self.update_hyperparameters()
  
      return losses
  
file_path: mmdetection/mmdet/models/roi_heads/dynamic_roi_head.py
imports: from typing import List, Tuple
  import numpy
  import torch
  from torch import Tensor
  from mmdet.models.losses import SmoothL1Loss
  from mmdet.models.task_modules.samplers import SamplingResult
  from mmdet.registry import MODELS
  from mmdet.structures import SampleList
  from mmdet.structures.bbox import bbox2roi
  from mmdet.utils import InstanceList
  from ..utils.misc import unpack_gt_instances
  from .standard_roi_head import StandardRoIHead
label_desc: Use image node_id 2 for calling the DynamicRoIHead obj's underlying member method code with example usage: obj.loss(x, rpn_results_list, batch_data_samples) and returns: losses