code: import matplotlib.pyplot as plt
  from mmdet import cv_core
  import numpy as np
  import torch
  from mmdet.cv_core.parallel import collate
  from mmdet.cv_core.runner import load_checkpoint
  
  from mmdet.datasets.pipelines import Compose
  from mmdet.models import build_detector
  from mmdet.datasets import build_dataset
  
  
  def init_detector(config, checkpoint=None, device='cuda:0'):
      """Initialize a detector from config file.
  
      Args:
          config (str or :obj:`mmdet.cv_core.Config`): Config file path or the config
              object.
          checkpoint (str, optional): Checkpoint path. If left as None, the model
              will not load any weights.
  
      Returns:
          nn.Module: The constructed detector.
      """
      if isinstance(config, str):
          config = cv_core.Config.fromfile(config)
      elif not isinstance(config, cv_core.Config):
          raise TypeError('config must be a filename or Config object, '
                          f'but got {type(config)}')
      config.model.pretrained = None
      model = build_detector(config.model, test_cfg=config.test_cfg)
      if checkpoint is not None:
          map_loc = 'cpu' if device == 'cpu' else None
          checkpoint = load_checkpoint(model, checkpoint, map_location=map_loc)
          if 'meta' in checkpoint and 'CLASSES' in checkpoint['meta']:
              model.CLASSES = checkpoint['meta']['CLASSES']
          else:
              dataset = build_dataset(config.data.test)
              model.CLASSES = dataset.CLASSES
  
      model.cfg = config  # save the config in the model for convenience
      model.to(device)
      model.eval()
      return model
  
  
  class LoadImage(object):
      """A simple pipeline to load image."""
  
      def __call__(self, results):
          """Call function to load images into results.
  
          Args:
              results (dict): A result dict contains the file name
                  of the image to be read.
  
          Returns:
              dict: ``results`` will be returned containing loaded image.
          """
          if isinstance(results['img'], str):
              results['filename'] = results['img']
              results['ori_filename'] = results['img']
          else:
              results['filename'] = None
              results['ori_filename'] = None
          img = cv_core.imread(results['img'])
          results['img'] = img
          results['img_fields'] = ['img']
          results['img_shape'] = img.shape
          results['ori_shape'] = img.shape
          return results
  
  
  def inference_detector(model, img):
      """Inference image(s) with the detector.
  
      Args:
          model (nn.Module): The loaded detector.
          imgs (str/ndarray or list[str/ndarray]): Either image files or loaded
              images.
  
      Returns:
          If imgs is a str, a generator will be returned, otherwise return the
          detection results directly.
      """
      cfg = model.cfg
      data = dict(img_info=dict(filename=img), img_prefix=None)
      # build the data pipeline
      test_pipeline = Compose(cfg.data.test.pipeline)
      data = test_pipeline(data)
      data = collate([data], samples_per_gpu=1)
      if next(model.parameters()).is_cuda:
          data['img'][0] = data['img'][0].cuda()
          data['img_metas'] = data['img_metas'][0].data
      else:
          # just get the actual data from DataContainer
          data['img_metas'] = data['img_metas'][0].data
  
      # forward the model
      with torch.no_grad():
          result = model(return_loss=False, rescale=True, **data)[0]
      return result
  
  
  def show_result_pyplot(model, img, result, score_thr=0.3, fig_size=(15, 10)):
      """Visualize the detection results on the image.
  
      Args:
          model (nn.Module): The loaded detector.
          img (str or np.ndarray): Image filename or loaded image.
          result (tuple[list] or list): The detection result, can be either
              (bbox, segm) or just bbox.
          score_thr (float): The threshold to visualize the bboxes and masks.
          fig_size (tuple): Figure size of the pyplot figure.
      """
      if hasattr(model, 'module'):
          model = model.module
      img = model.show_result(img, result, score_thr=score_thr, show=False)
      cv_core.imshow(img)
      # plt.figure(figsize=fig_size)
      # plt.imshow(cv_core.bgr2rgb(img))
      # plt.show()
  
apis: torch.no_grad