docstr: Tests standard roi head loss when truth is empty and non-empty.
docstr_tok: ["Tests","standard","roi","head","loss","when","truth","is","empty","and","non-empty","."]
code: def test_standard_roi_head_loss(self, with_shared_head):
      """Tests standard roi head loss when truth is empty and non-empty."""
      if not torch.cuda.is_available():
          # RoI pooling only support in GPU
          return unittest.skip("test requires GPU and torch+cuda")
      s = 256
      roi_head_cfg = _fake_roi_head(with_shared_head=with_shared_head)
      roi_head = MODELS.build(roi_head_cfg)
      roi_head = roi_head.cuda()
      feats = []
      for i in range(len(roi_head.bbox_roi_extractor.featmap_strides)):
          if not with_shared_head:
              feats.append(
                  torch.rand(
                      1, 1, s // (2 ** (i + 2)), s // (2 ** (i + 2))
                  ).to(device="cuda")
              )
          else:
              feats.append(
                  torch.rand(
                      1, 1024, s // (2 ** (i + 2)), s // (2 ** (i + 2))
                  ).to(device="cuda")
              )
      feats = tuple(feats)
  
      # When truth is non-empty then both cls, box, and mask loss
      # should be nonzero for random inputs
      image_shapes = [(3, s, s)]
      batch_data_samples = demo_mm_inputs(
          batch_size=1,
          image_shapes=image_shapes,
          num_items=[1],
          num_classes=4,
          with_mask=True,
          device="cuda",
      )["data_samples"]
      proposals_list = demo_mm_proposals(
          image_shapes=image_shapes, num_proposals=100, device="cuda"
      )
  
      out = roi_head.loss(feats, proposals_list, batch_data_samples)
      loss_cls = out["loss_cls"]
      loss_bbox = out["loss_bbox"]
      loss_mask = out["loss_mask"]
      self.assertGreater(
          loss_cls.sum(), 0, "cls loss should be non-zero"
      )
      self.assertGreater(
          loss_bbox.sum(), 0, "box loss should be non-zero"
      )
      self.assertGreater(
          loss_mask.sum(), 0, "mask loss should be non-zero"
      )
  
      # When there is no truth, the cls loss should be nonzero but
      # there should be no box and mask loss.
      batch_data_samples = demo_mm_inputs(
          batch_size=1,
          image_shapes=image_shapes,
          num_items=[0],
          num_classes=4,
          with_mask=True,
          device="cuda",
      )["data_samples"]
      proposals_list = demo_mm_proposals(
          image_shapes=image_shapes, num_proposals=100, device="cuda"
      )
      out = roi_head.loss(feats, proposals_list, batch_data_samples)
      empty_cls_loss = out["loss_cls"]
      empty_bbox_loss = out["loss_bbox"]
      empty_mask_loss = out["loss_mask"]
      self.assertGreater(
          empty_cls_loss.sum(), 0, "cls loss should be non-zero"
      )
      self.assertEqual(
          empty_bbox_loss.sum(),
          0,
          "there should be no box loss when there are no true boxes",
      )
      self.assertEqual(
          empty_mask_loss.sum(),
          0,
          "there should be no mask loss when there are no true boxes",
      )
  
file_path: mmdetection/tests/test_models/test_roi_heads/test_standard_roi_head.py
imports: import unittest
  from unittest import TestCase
  import torch
  from mmengine.config import Config
  from parameterized import parameterized
  from mmdet.registry import MODELS
  from mmdet.testing import demo_mm_inputs, demo_mm_proposals
  from mmdet.utils import register_all_modules
label_desc: Use image node_id 2 for calling the TestStandardRoIHead obj's underlying member method code with example usage: obj.test_standard_roi_head_loss(with_shared_head) and returns: unittest