class_docstr: Args:
      packed_annotations: object that contains packed annotations
      j_valid (:obj: `torch.Tensor`): uint8 tensor of size M containing
          0 for points to be discarded and 1 for points to be selected
      y_lo (:obj: `torch.Tensor`): int tensor of indices of upper values
          in z_est for each point
      y_hi (:obj: `torch.Tensor`): int tensor of indices of lower values
          in z_est for each point
      x_lo (:obj: `torch.Tensor`): int tensor of indices of left values
          in z_est for each point
      x_hi (:obj: `torch.Tensor`): int tensor of indices of right values
          in z_est for each point
      w_ylo_xlo (:obj: `torch.Tensor`): float tensor of size M;
          contains upper-left value weight for each point
      w_ylo_xhi (:obj: `torch.Tensor`): float tensor of size M;
          contains upper-right value weight for each point
      w_yhi_xlo (:obj: `torch.Tensor`): float tensor of size M;
          contains lower-left value weight for each point
      w_yhi_xhi (:obj: `torch.Tensor`): float tensor of size M;
          contains lower-right value weight for each point
class_docstr_tok: ["Args",":","packed_annotations",":","object","that","contains","packed","annotations","j_valid","(",":","obj",":","`","torch.Tensor","`",")",":","uint8","tensor","of","size","M","containing","0","for","points","to","be","discarded","and","1","for","points","to","be","selected","y_lo","(",":","obj",":","`","torch.Tensor","`",")",":","int","tensor","of","indices","of","upper","values","in","z_est","for","each","point","y_hi","(",":","obj",":","`","torch.Tensor","`",")",":","int","tensor","of","indices","of","lower","values","in","z_est","for","each","point","x_lo","(",":","obj",":","`","torch.Tensor","`",")",":","int","tensor","of","indices","of","left","values","in","z_est","for","each","point","x_hi","(",":","obj",":","`","torch.Tensor","`",")",":","int","tensor","of","indices","of","right","values","in","z_est","for","each","point","w_ylo_xlo","(",":","obj",":","`","torch.Tensor","`",")",":","float","tensor","of","size","M",";","contains","upper-left","value","weight","for","each","point","w_ylo_xhi","(",":","obj",":","`","torch.Tensor","`",")",":","float","tensor","of","size","M",";","contains","upper-right","value","weight","for","each","point","w_yhi_xlo","(",":","obj",":","`","torch.Tensor","`",")",":","float","tensor","of","size","M",";","contains","lower-left","value","weight","for","each","point","w_yhi_xhi","(",":","obj",":","`","torch.Tensor","`",")",":","float","tensor","of","size","M",";","contains","lower-right","value","weight","for","each","point"]
docstr: Extract ground truth values z_gt for valid point indices and estimated
  values z_est using bilinear interpolation over top-left (y_lo, x_lo),
  top-right (y_lo, x_hi), bottom-left (y_hi, x_lo) and bottom-right
  (y_hi, x_hi) values in z_est with corresponding weights:
  w_ylo_xlo, w_ylo_xhi, w_yhi_xlo and w_yhi_xhi.
  Use slice_fine_segm to slice dim=1 in z_est
docstr_tok: ["Extract","ground","truth","values","z_gt","for","valid","point","indices","and","estimated","values","z_est","using","bilinear","interpolation","over","top-left","(","y_lo",",","x_lo",")",",","top-right","(","y_lo",",","x_hi",")",",","bottom-left","(","y_hi",",","x_lo",")","and","bottom-right","(","y_hi",",","x_hi",")","values","in","z_est","with","corresponding","weights",":","w_ylo_xlo",",","w_ylo_xhi",",","w_yhi_xlo","and","w_yhi_xhi",".","Use","slice_fine_segm","to","slice","dim=1","in","z_est"]
code: def extract_at_points(
      self,
      z_est,
      slice_fine_segm=None,
      w_ylo_xlo=None,
      w_ylo_xhi=None,
      w_yhi_xlo=None,
      w_yhi_xhi=None,
  ):
      """
      Extract ground truth values z_gt for valid point indices and estimated
      values z_est using bilinear interpolation over top-left (y_lo, x_lo),
      top-right (y_lo, x_hi), bottom-left (y_hi, x_lo) and bottom-right
      (y_hi, x_hi) values in z_est with corresponding weights:
      w_ylo_xlo, w_ylo_xhi, w_yhi_xlo and w_yhi_xhi.
      Use slice_fine_segm to slice dim=1 in z_est
      """
      slice_fine_segm = (
          self.packed_annotations.fine_segm_labels_gt
          if slice_fine_segm is None
          else slice_fine_segm
      )
      w_ylo_xlo = self.w_ylo_xlo if w_ylo_xlo is None else w_ylo_xlo
      w_ylo_xhi = self.w_ylo_xhi if w_ylo_xhi is None else w_ylo_xhi
      w_yhi_xlo = self.w_yhi_xlo if w_yhi_xlo is None else w_yhi_xlo
      w_yhi_xhi = self.w_yhi_xhi if w_yhi_xhi is None else w_yhi_xhi
  
      index_bbox = self.packed_annotations.point_bbox_indices
      z_est_sampled = (
          z_est[index_bbox, slice_fine_segm, self.y_lo, self.x_lo]
          * w_ylo_xlo
          + z_est[index_bbox, slice_fine_segm, self.y_lo, self.x_hi]
          * w_ylo_xhi
          + z_est[index_bbox, slice_fine_segm, self.y_hi, self.x_lo]
          * w_yhi_xlo
          + z_est[index_bbox, slice_fine_segm, self.y_hi, self.x_hi]
          * w_yhi_xhi
      )
      return z_est_sampled
  
imports: from abc import ABC, abstractmethod
  from dataclasses import dataclass
  from typing import Any, Dict, List, Optional, Tuple
  import torch
  from torch.nn import functional
  from detectron2.structures import BoxMode, Instances
  from densepose import DensePoseDataRelative
label_desc: Use image node_id 3 for calling the BilinearInterpolationHelper obj's underlying member method code with example usage: obj.extract_at_points(z_est, slice_fine_segm, w_ylo_xlo, w_ylo_xhi, w_yhi_xlo, w_yhi_xhi) and returns: z_est_sampled