docstr: Run per image evaluation on given images and store results (a list
  of dict) in self.evalImgs.
  
  :return: None
docstr_tok: ["Run","per","image","evaluation","on","given","images","and","store","results","(","a","list","of","dict",")","in","self.evalImgs",".",":","return",":","None"]
code: def evaluate(self):
      """Run per image evaluation on given images and store results (a list
      of dict) in self.evalImgs.
  
      :return: None
      """
      tic = time.time()
      print("Running per image evaluation...")
      p = self.params
      # add backward compatibility if useSegm is specified in params
      if p.useSegm is not None:
          p.iouType = "segm" if p.useSegm == 1 else "bbox"
          print(
              "useSegm (deprecated) is not None. Running {} evaluation".format(
                  p.iouType
              )
          )
      print("Evaluate annotation type *{}*".format(p.iouType))
      p.imgIds = list(np.unique(p.imgIds))
      if p.useCats:
          p.catIds = list(np.unique(p.catIds))
      p.maxDets = sorted(p.maxDets)
      self.params = p
  
      # loop through images, area range, max detection number
      catIds = p.catIds if p.useCats else [-1]
  
      nproc = 8
      split_size = len(catIds) // nproc
      mp_params = []
      for i in range(nproc):
          begin = i * split_size
          end = (i + 1) * split_size
          if i == nproc - 1:
              end = len(catIds)
          mp_params.append((catIds[begin:end],))
  
      MMLogger.get_current_instance().info(
          "start multi processing evaluation ..."
      )
      with mp.Pool(nproc) as pool:
          self.evalImgs = pool.starmap(self._evaluateImg, mp_params)
  
      self.evalImgs = list(itertools.chain(*self.evalImgs))
  
      self._paramsEval = copy.deepcopy(self.params)
      toc = time.time()
      print("DONE (t={:0.2f}s).".format(toc - tic))
  
file_path: mmdetection/mmdet/datasets/api_wrappers/cocoeval_mp.py
imports: import copy
  import itertools
  import time
  from collections import defaultdict
  import numpy
  import torch.multiprocessing
  from mmengine.logging import MMLogger
  from pycocotools.cocoeval import COCOeval
  from tqdm import tqdm
label_desc: Use image node_id 2 for calling the COCOevalMP obj's underlying member method code with example usage: obj.evaluate() without return types