code: def perspective(
      img: Tensor,
      startpoints: List[List[int]],
      endpoints: List[List[int]],
      interpolation: InterpolationMode = InterpolationMode.BILINEAR,
      fill: Optional[List[float]] = None,
  ) -> Tensor:
      """Perform perspective transform of the given image.
      If the image is torch Tensor, it is expected
      to have [..., H, W] shape, where ... means an arbitrary number of leading dimensions.
  
      Args:
          img (PIL Image or Tensor): Image to be transformed.
          startpoints (list of list of ints): List containing four lists of two integers corresponding to four corners
              ``[top-left, top-right, bottom-right, bottom-left]`` of the original image.
          endpoints (list of list of ints): List containing four lists of two integers corresponding to four corners
              ``[top-left, top-right, bottom-right, bottom-left]`` of the transformed image.
          interpolation (InterpolationMode): Desired interpolation enum defined by
              :class:`torchvision.transforms.InterpolationMode`. Default is ``InterpolationMode.BILINEAR``.
              If input is Tensor, only ``InterpolationMode.NEAREST``, ``InterpolationMode.BILINEAR`` are supported.
              The corresponding Pillow integer constants, e.g. ``PIL.Image.BILINEAR`` are accepted as well.
          fill (sequence or number, optional): Pixel fill value for the area outside the transformed
              image. If given a number, the value is used for all bands respectively.
  
              .. note::
                  In torchscript mode single int/float value is not supported, please use a sequence
                  of length 1: ``[value, ]``.
  
      Returns:
          PIL Image or Tensor: transformed Image.
      """
      if not torch.jit.is_scripting() and not torch.jit.is_tracing():
          _log_api_usage_once(perspective)
  
      coeffs = _get_perspective_coeffs(startpoints, endpoints)
  
      if isinstance(interpolation, int):
          interpolation = _interpolation_modes_from_int(interpolation)
      elif not isinstance(interpolation, InterpolationMode):
          raise TypeError(
              "Argument interpolation should be a InterpolationMode or a corresponding Pillow integer constant"
          )
  
      if not isinstance(img, torch.Tensor):
          pil_interpolation = pil_modes_mapping[interpolation]
          return F_pil.perspective(
              img, coeffs, interpolation=pil_interpolation, fill=fill
          )
  
      return F_t.perspective(
          img, coeffs, interpolation=interpolation.value, fill=fill
      )
  
imports: import math
  import numbers
  import sys
  import warnings
  from enum import Enum
  from typing import Any, List, Optional, Tuple, Union
  import numpy
  import torch
  from PIL import Image
  from torch import Tensor
  from ..utils import _log_api_usage_once
  from .None import _functional_pil, _functional_tensor
label_desc: Use image node_id 20 for calling a global function with example usage: perspective(img, startpoints, endpoints, interpolation, fill) and returns: F_t, F_pil