class_docstr: The class for implementing DRRG loss. This is partially adapted from
  https://github.com/GXYM/DRRG licensed under the MIT license.
  
  DRRG: `Deep Relational Reasoning Graph Network for Arbitrary Shape Text
  Detection <https://arxiv.org/abs/1908.05900>`_.
  
  Args:
      ohem_ratio (float): The negative/positive ratio in ohem. Defaults to
          3.0.
      downsample_ratio (float): Downsample ratio. Defaults to 1.0. TODO:
          remove it.
      orientation_thr (float): The threshold for distinguishing between
          head edge and tail edge among the horizontal and vertical edges
          of a quadrangle. Defaults to 2.0.
      resample_step (float): The step size for resampling the text center
          line. Defaults to 8.0.
      num_min_comps (int): The minimum number of text components, which
          should be larger than k_hop1 mentioned in paper. Defaults to 9.
      num_max_comps (int): The maximum number of text components. Defaults
          to 600.
      min_width (float): The minimum width of text components. Defaults to
          8.0.
      max_width (float): The maximum width of text components. Defaults to
          24.0.
      center_region_shrink_ratio (float): The shrink ratio of text center
          regions. Defaults to 0.3.
      comp_shrink_ratio (float): The shrink ratio of text components.
          Defaults to 1.0.
      comp_w_h_ratio (float): The width to height ratio of text components.
          Defaults to 0.3.
      min_rand_half_height(float): The minimum half-height of random text
          components. Defaults to 8.0.
      max_rand_half_height (float): The maximum half-height of random
          text components. Defaults to 24.0.
      jitter_level (float): The jitter level of text component geometric
          features. Defaults to 0.2.
      loss_text (dict): The loss config used to calculate the text loss.
          Defaults to ``dict(type='MaskedBalancedBCEWithLogitsLoss',
          fallback_negative_num=100, eps=1e-5)``.
      loss_center (dict): The loss config used to calculate the center loss.
          Defaults to ``dict(type='MaskedBCEWithLogitsLoss')``.
      loss_top (dict): The loss config used to calculate the top loss, which
          is a part of the height loss. Defaults to
          ``dict(type='SmoothL1Loss', reduction='none')``.
      loss_btm (dict): The loss config used to calculate the bottom loss,
          which is a part of the height loss. Defaults to
          ``dict(type='SmoothL1Loss', reduction='none')``.
      loss_sin (dict): The loss config used to calculate the sin loss.
          Defaults to ``dict(type='MaskedSmoothL1Loss')``.
      loss_cos (dict): The loss config used to calculate the cos loss.
          Defaults to ``dict(type='MaskedSmoothL1Loss')``.
      loss_gcn (dict): The loss config used to calculate the GCN loss.
          Defaults to ``dict(type='CrossEntropyLoss')``.
code: def __init__(
      self,
      ohem_ratio: float = 3.0,
      downsample_ratio: float = 1.0,
      orientation_thr: float = 2.0,
      resample_step: float = 8.0,
      num_min_comps: int = 9,
      num_max_comps: int = 600,
      min_width: float = 8.0,
      max_width: float = 24.0,
      center_region_shrink_ratio: float = 0.3,
      comp_shrink_ratio: float = 1.0,
      comp_w_h_ratio: float = 0.3,
      text_comp_nms_thr: float = 0.25,
      min_rand_half_height: float = 8.0,
      max_rand_half_height: float = 24.0,
      jitter_level: float = 0.2,
      loss_text: Dict = dict(
          type="MaskedBalancedBCEWithLogitsLoss",
          fallback_negative_num=100,
          eps=1e-5,
      ),
      loss_center: Dict = dict(type="MaskedBCEWithLogitsLoss"),
      loss_top: Dict = dict(type="SmoothL1Loss", reduction="none"),
      loss_btm: Dict = dict(type="SmoothL1Loss", reduction="none"),
      loss_sin: Dict = dict(type="MaskedSmoothL1Loss"),
      loss_cos: Dict = dict(type="MaskedSmoothL1Loss"),
      loss_gcn: Dict = dict(type="CrossEntropyLoss"),
  ) -> None:
      super().__init__()
      self.ohem_ratio = ohem_ratio
      self.downsample_ratio = downsample_ratio
      self.orientation_thr = orientation_thr
      self.resample_step = resample_step
      self.num_max_comps = num_max_comps
      self.num_min_comps = num_min_comps
      self.min_width = min_width
      self.max_width = max_width
      self.center_region_shrink_ratio = center_region_shrink_ratio
      self.comp_shrink_ratio = comp_shrink_ratio
      self.comp_w_h_ratio = comp_w_h_ratio
      self.text_comp_nms_thr = text_comp_nms_thr
      self.min_rand_half_height = min_rand_half_height
      self.max_rand_half_height = max_rand_half_height
      self.jitter_level = jitter_level
      self.loss_text = MODELS.build(loss_text)
      self.loss_center = MODELS.build(loss_center)
      self.loss_top = MODELS.build(loss_top)
      self.loss_btm = MODELS.build(loss_btm)
      self.loss_sin = MODELS.build(loss_sin)
      self.loss_cos = MODELS.build(loss_cos)
      self.loss_gcn = MODELS.build(loss_gcn)
  
imports: from typing import Dict, List, Sequence, Tuple
  import cv2
  import numpy
  import torch
  from mmcv.image import imrescale
  from mmdet.models.utils import multi_apply
  from numpy import ndarray
  from numpy.linalg import norm
  from torch import Tensor
  from mmocr.registry import MODELS
  from mmocr.structures import TextDetDataSample
  from mmocr.utils import check_argument
  from .textsnake_module_loss import TextSnakeModuleLoss
label_desc: Use image node_id 1 to create a new DRRGModuleLoss object from inherited base classes: TextSnakeModuleLoss with example: obj = DRRGModuleLoss(ohem_ratio, downsample_ratio, orientation_thr, resample_step, num_min_comps, num_max_comps, min_width, max_width, center_region_shrink_ratio, comp_shrink_ratio, comp_w_h_ratio, text_comp_nms_thr, min_rand_half_height, max_rand_half_height, jitter_level, loss_text, loss_center, loss_top, loss_btm, loss_sin, loss_cos, loss_gcn)