class_docstr: CocoWholeBody dataset for top-down hand pose estimation. 
  
  The dataset loads raw features and apply specified transforms
  to return a dict containing the image tensors and other information.
  
  COCO-WholeBody Hand keypoint indexes:
  
      0: 'wrist',
      1: 'thumb1',
      2: 'thumb2',
      3: 'thumb3',
      4: 'thumb4',
      5: 'forefinger1',
      6: 'forefinger2',
      7: 'forefinger3',
      8: 'forefinger4',
      9: 'middle_finger1',
      10: 'middle_finger2',
      11: 'middle_finger3',
      12: 'middle_finger4',
      13: 'ring_finger1',
      14: 'ring_finger2',
      15: 'ring_finger3',
      16: 'ring_finger4',
      17: 'pinky_finger1',
      18: 'pinky_finger2',
      19: 'pinky_finger3',
      20: 'pinky_finger4'
  
  Args:
      dataset_dir (str): Root path to the dataset.
      image_dir (str): Path to a directory where images are held.
      anno_path (str): Relative path to the annotation file.
      num_joints (int): Keypoint numbers
      trainsize (list):[w, h] Image target size
      transform (composed(operators)): A sequence of data transforms.
      pixel_std (int): The pixel std of the scale
          Default: 200.
code: def parse_dataset(self):
      gt_db = []
      num_joints = self.ann_info["num_joints"]
      coco = COCO(self.get_anno())
      img_ids = list(coco.imgs.keys())
      for img_id in img_ids:
          im_ann = coco.loadImgs(img_id)[0]
          image_file = os.path.join(
              self.img_prefix, im_ann["file_name"]
          )
          im_id = int(im_ann["id"])
  
          ann_ids = coco.getAnnIds(imgIds=img_id, iscrowd=False)
          objs = coco.loadAnns(ann_ids)
  
          for obj in objs:
              for type in ["left", "right"]:
                  if (
                      obj[f"{type}hand_valid"]
                      and max(obj[f"{type}hand_kpts"]) > 0
                  ):
                      joints = np.zeros(
                          (num_joints, 3), dtype=np.float32
                      )
                      joints_vis = np.zeros(
                          (num_joints, 3), dtype=np.float32
                      )
  
                      keypoints = np.array(obj[f"{type}hand_kpts"])
                      keypoints = keypoints.reshape(-1, 3)
                      joints[:, :2] = keypoints[:, :2]
                      joints_vis[:, :2] = np.minimum(
                          1, keypoints[:, 2:3]
                      )
  
                      center, scale = self._box2cs(
                          obj[f"{type}hand_box"][:4]
                      )
                      gt_db.append(
                          {
                              "image_file": image_file,
                              "center": center,
                              "scale": scale,
                              "gt_joints": joints,
                              "joints_vis": joints_vis,
                              "im_id": im_id,
                          }
                      )
  
      self.db = gt_db
  
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 3 for calling the KeypointTopDownCocoWholeBodyHandDataset obj's underlying member method code with example usage: obj.parse_dataset() without return types