code: def _do_python_eval(json_dataset, salt, output_dir="output"):
      info = voc_info(json_dataset)
      year = info["year"]
      anno_path = info["anno_path"]
      image_set_path = info["image_set_path"]
      devkit_path = info["devkit_path"]
      cachedir = os.path.join(devkit_path, "annotations_cache")
      aps = []
      # The PASCAL VOC metric changed in 2010
      use_07_metric = True if int(year) < 2010 else False
      logger.info("VOC07 metric? " + ("Yes" if use_07_metric else "No"))
      if not os.path.isdir(output_dir):
          os.mkdir(output_dir)
      for _, cls in enumerate(json_dataset.classes):
          if cls == "__background__":
              continue
          filename = _get_voc_results_file_template(
              json_dataset, salt
          ).format(cls)
          rec, prec, ap = voc_eval(
              filename,
              anno_path,
              image_set_path,
              cls,
              cachedir,
              ovthresh=0.5,
              use_07_metric=use_07_metric,
          )
          aps += [ap]
          logger.info("AP for {} = {:.4f}".format(cls, ap))
          res_file = os.path.join(output_dir, cls + "_pr.pkl")
          save_object({"rec": rec, "prec": prec, "ap": ap}, res_file)
      logger.info("Mean AP = {:.4f}".format(np.mean(aps)))
      logger.info("~~~~~~~~")
      logger.info("Results:")
      for ap in aps:
          logger.info("{:.3f}".format(ap))
      logger.info("{:.3f}".format(np.mean(aps)))
      logger.info("~~~~~~~~")
      logger.info("")
      logger.info(
          "----------------------------------------------------------"
      )
      logger.info(
          "Results computed with the **unofficial** Python eval code."
      )
      logger.info(
          "Results should be very close to the official MATLAB code."
      )
      logger.info("Use `./tools/reval.py --matlab ...` for your paper.")
      logger.info("-- Thanks, The Management")
      logger.info(
          "----------------------------------------------------------"
      )
  
file_path: dense-pose/detectron/datasets/voc_dataset_evaluator.py
imports: from __future__ import absolute_import
  from __future__ import division
  from __future__ import print_function
  from __future__ import unicode_literals
  import logging
  import numpy
  import os
  import shutil
  import uuid
  from detectron.core.config import cfg
  from detectron.datasets.dataset_catalog import get_devkit_dir
  from detectron.datasets.voc_eval import voc_eval
  from detectron.utils.io import save_object
label_desc: Use image node_id 4 for calling a global function with example usage: _do_python_eval(json_dataset, salt, output_dir) without return types