class_docstr: Base class for bottom-up datasets. 
  
  All datasets should subclass it.
  All subclasses should overwrite:
      Methods:`_get_imganno`
  
  Args:
      dataset_dir (str): Root path to the dataset.
      anno_path (str): Relative path to the annotation file.
      image_dir (str): Path to a directory where images are held.
          Default: None.
      num_joints (int): keypoint numbers
      transform (composed(operators)): A sequence of data transforms.
      shard (list): [rank, worldsize], the distributed env params
      test_mode (bool): Store True when building test or
          validation dataset. Default: False.
code: def __init__(
      self,
      dataset_dir,
      image_dir,
      anno_path,
      num_joints,
      transform=[],
      shard=[0, 1],
      test_mode=False,
  ):
      super().__init__(dataset_dir, image_dir, anno_path)
      self.image_info = {}
      self.ann_info = {}
  
      self.img_prefix = os.path.join(dataset_dir, image_dir)
      self.transform = transform
      self.test_mode = test_mode
  
      self.ann_info["num_joints"] = num_joints
      self.img_ids = []
  
imports: import os
  import cv2
  import numpy
  import json
  import copy
  import pycocotools
  from pycocotools.coco import COCO
  from .dataset import DetDataset
  from ppdet.core.workspace import register, serializable
label_desc: Use image node_id 1 to create a new KeypointBottomUpBaseDataset object from inherited base classes: DetDataset with example: obj = KeypointBottomUpBaseDataset(dataset_dir, image_dir, anno_path, num_joints, transform, shard, test_mode)