code: def parse_dataset(self):
      gt_db = []
      num_joints = self.num_joints
      coco = self.coco
      img_ids = coco.getImgIds()
      for img_id in img_ids:
          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]
                      )
  
                      gt_db.append(
                          {
                              "bbox": obj[f"{type}hand_box"],
                              "gt_joints": joints,
                              "joints_vis": joints_vis,
                          }
                      )
      self.db = gt_db
  
imports: import os
  import json
  from collections import defaultdict, OrderedDict
  import numpy
  import paddle
  from pycocotools.coco import COCO
  from pycocotools.cocoeval import COCOeval
  from ..modeling.keypoint_utils import oks_nms, keypoint_pck_accuracy, keypoint_auc, keypoint_epe
  from scipy.io import loadmat, savemat
  from ppdet.utils.logger import setup_logger
label_desc: Use image node_id 2 for calling the KeyPointTopDownCOCOWholeBadyHandEval obj's underlying member method code with example usage: obj.parse_dataset() without return types