code: def get_whs(self):
      whs_cache_path = os.path.join(self.cache_path, "whs.npy")
      shapes_cache_path = os.path.join(self.cache_path, "shapes.npy")
      if (
          self.cache
          and os.path.exists(whs_cache_path)
          and os.path.exists(shapes_cache_path)
      ):
          self.whs = np.load(whs_cache_path)
          self.shapes = np.load(shapes_cache_path)
          return self.whs, self.shapes
      whs = np.zeros((0, 2))
      shapes = np.zeros((0, 2))
      self.dataset.parse_dataset()
      roidbs = self.dataset.roidbs
      for rec in tqdm(roidbs):
          h, w = rec["h"], rec["w"]
          bbox = rec["gt_bbox"]
          wh = bbox[:, 2:4] - bbox[:, 0:2] + 1
          wh = wh / np.array([[w, h]])
          shape = np.ones_like(wh) * np.array([[w, h]])
          whs = np.vstack((whs, wh))
          shapes = np.vstack((shapes, shape))
  
      if self.cache:
          os.makedirs(self.cache_path, exist_ok=True)
          np.save(whs_cache_path, whs)
          np.save(shapes_cache_path, shapes)
  
      self.whs = whs
      self.shapes = shapes
      return self.whs, self.shapes
  
imports: from __future__ import absolute_import
  from __future__ import division
  from __future__ import print_function
  import os
  import sys
  from ppdet.utils.logger import setup_logger
  from scipy.cluster.vq import kmeans
  import numpy
  from tqdm import tqdm
  from ppdet.utils.cli import ArgsParser
  from ppdet.utils.check import check_gpu, check_version, check_config
  from ppdet.core.workspace import load_config, merge_config
label_desc: Use image node_id 3 for calling the BaseAnchorCluster obj's underlying member method code with example usage: obj.get_whs() and returns: self,  self, self,  self