docstr: DARK post-pocessing. Implemented by udp. Paper ref: Huang et al. The
  Devil is in the Details: Delving into Unbiased Data Processing for Human
  Pose Estimation (CVPR 2020). Zhang et al. Distribution-Aware Coordinate
  Representation for Human Pose Estimation (CVPR 2020).
  
  Note:
      - batch size: B
      - num keypoints: K
      - num persons: N
      - height of heatmaps: H
      - width of heatmaps: W
  
      B=1 for bottom_up paradigm where all persons share the same heatmap.
      B=N for top_down paradigm where each person has its own heatmaps.
  
  Args:
      coords (np.ndarray[N, K, 2]): Initial coordinates of human pose.
      batch_heatmaps (np.ndarray[B, K, H, W]): batch_heatmaps
      kernel (int): Gaussian kernel size (K) for modulation.
  
  Returns:
      np.ndarray([N, K, 2]): Refined coordinates.
docstr_tok: ["DARK","post-pocessing",".","Implemented","by","udp",".","Paper","ref",":","Huang","et","al",".","The","Devil","is","in","the","Details",":","Delving","into","Unbiased","Data","Processing","for","Human","Pose","Estimation","(","CVPR","2020",")",".","Zhang","et","al",".","Distribution-Aware","Coordinate","Representation","for","Human","Pose","Estimation","(","CVPR","2020",")",".","Note",":","-","batch","size",":","B","-","num","keypoints",":","K","-","num","persons",":","N","-","height","of","heatmaps",":","H","-","width","of","heatmaps",":","W","B=1","for","bottom_up","paradigm","where","all","persons","share","the","same","heatmap",".","B=N","for","top_down","paradigm","where","each","person","has","its","own","heatmaps",".","Args",":","coords","(","np.ndarray","[","N",",","K",",","2","]",")",":","Initial","coordinates","of","human","pose",".","batch_heatmaps","(","np.ndarray","[","B",",","K",",","H",",","W","]",")",":","batch_heatmaps","kernel","(","int",")",":","Gaussian","kernel","size","(","K",")","for","modulation",".","Returns",":","np.ndarray","(","[","N",",","K",",","2","]",")",":","Refined","coordinates","."]
code: def post_datk_udp(self, coords, batch_heatmaps, kernel=3):
      """DARK post-pocessing. Implemented by udp. Paper ref: Huang et al. The
      Devil is in the Details: Delving into Unbiased Data Processing for Human
      Pose Estimation (CVPR 2020). Zhang et al. Distribution-Aware Coordinate
      Representation for Human Pose Estimation (CVPR 2020).
  
      Note:
          - batch size: B
          - num keypoints: K
          - num persons: N
          - height of heatmaps: H
          - width of heatmaps: W
  
          B=1 for bottom_up paradigm where all persons share the same heatmap.
          B=N for top_down paradigm where each person has its own heatmaps.
  
      Args:
          coords (np.ndarray[N, K, 2]): Initial coordinates of human pose.
          batch_heatmaps (np.ndarray[B, K, H, W]): batch_heatmaps
          kernel (int): Gaussian kernel size (K) for modulation.
  
      Returns:
          np.ndarray([N, K, 2]): Refined coordinates.
      """
      if not isinstance(batch_heatmaps, np.ndarray):
          batch_heatmaps = batch_heatmaps.cpu().numpy()
      B, K, H, W = batch_heatmaps.shape
      N = coords.shape[0]
      assert B == 1 or B == N
      for heatmaps in batch_heatmaps:
          for heatmap in heatmaps:
              cv2.GaussianBlur(heatmap, (kernel, kernel), 0, heatmap)
      np.clip(batch_heatmaps, 0.001, 50, batch_heatmaps)
      np.log(batch_heatmaps, batch_heatmaps)
  
      batch_heatmaps_pad = np.pad(
          batch_heatmaps, ((0, 0), (0, 0), (1, 1), (1, 1)), mode="edge"
      ).flatten()
  
      index = coords[..., 0] + 1 + (coords[..., 1] + 1) * (W + 2)
      index += (W + 2) * (H + 2) * np.arange(0, B * K).reshape(-1, K)
      index = index.astype(int).reshape(-1, 1)
      i_ = batch_heatmaps_pad[index]
      ix1 = batch_heatmaps_pad[index + 1]
      iy1 = batch_heatmaps_pad[index + W + 2]
      ix1y1 = batch_heatmaps_pad[index + W + 3]
      ix1_y1_ = batch_heatmaps_pad[index - W - 3]
      ix1_ = batch_heatmaps_pad[index - 1]
      iy1_ = batch_heatmaps_pad[index - 2 - W]
  
      dx = 0.5 * (ix1 - ix1_)
      dy = 0.5 * (iy1 - iy1_)
      derivative = np.concatenate([dx, dy], axis=1)
      derivative = derivative.reshape(N, K, 2, 1)
      dxx = ix1 - 2 * i_ + ix1_
      dyy = iy1 - 2 * i_ + iy1_
      dxy = 0.5 * (ix1y1 - ix1 - iy1 + i_ + i_ - ix1_ - iy1_ + ix1_y1_)
      hessian = np.concatenate([dxx, dxy, dxy, dyy], axis=1)
      hessian = hessian.reshape(N, K, 2, 2)
      hessian = np.linalg.inv(
          hessian + np.finfo(np.float32).eps * np.eye(2)
      )
      coords -= np.einsum(
          "ijmn,ijnk->ijmk", hessian, derivative
      ).squeeze()
      return coords
  
imports: from __future__ import absolute_import
  from __future__ import division
  from __future__ import print_function
  import paddle
  import numpy
  import math
  import cv2
  from ppdet.core.workspace import register, create, serializable
  from .meta_arch import BaseArch
  from ..keypoint_utils import transform_preds
  from ..None import layers
label_desc: Use image node_id 3 for calling the VitPosePostProcess obj's underlying member method code with example usage: obj.post_datk_udp(coords, batch_heatmaps, kernel) and returns: coords