code: def point_sample(input, point_coords, **kwargs):
      """
      A wrapper around :function:`torch.nn.functional.grid_sample` to support 3D point_coords tensors.
      Unlike :function:`torch.nn.functional.grid_sample` it assumes `point_coords` to lie inside
      [0, 1] x [0, 1] square.
  
      Args:
          input (Tensor): A tensor of shape (N, C, H, W) that contains features map on a H x W grid.
          point_coords (Tensor): A tensor of shape (N, P, 2) or (N, Hgrid, Wgrid, 2) that contains
          [0, 1] x [0, 1] normalized point coordinates.
  
      Returns:
          output (Tensor): A tensor of shape (N, C, P) or (N, C, Hgrid, Wgrid) that contains
              features for points in `point_coords`. The features are obtained via bilinear
              interplation from `input` the same way as :function:`torch.nn.functional.grid_sample`.
      """
      add_dim = False
      if point_coords.dim() == 3:
          add_dim = True
          point_coords = point_coords.unsqueeze(2)
      output = F.grid_sample(input, 2.0 * point_coords - 1.0, **kwargs)
      if add_dim:
          output = output.squeeze(3)
      return output
  
file_path: detectron2/projects/PointRend/point_rend/point_features.py
imports: import torch
  from torch.nn import functional
  from detectron2.layers import cat, shapes_to_tensor
  from detectron2.structures import BitMasks, Boxes
label_desc: Use image node_id 1 for calling a global function with example usage: point_sample(input, point_coords) and returns: output