def compute_perspective_transformation( input: torch.Tensor, params: Dict[str, torch.Tensor]) -> torch.Tensor: r"""Compute the applied transformation matrix :math: `(*, 3, 3)`. Args: input (torch.Tensor): Tensor to be transformed with shape (H, W), (C, H, W), (B, C, H, W). params (Dict[str, torch.Tensor]): - params['start_points']: Tensor containing [top-left, top-right, bottom-right, bottom-left] of the orignal image with shape Bx4x2. - params['end_points']: Tensor containing [top-left, top-right, bottom-right, bottom-left] of the transformed image with shape Bx4x2. Returns: torch.Tensor: The applied transformation matrix :math: `(*, 3, 3)` """ input = _transform_input(input) _validate_input_dtype( input, accepted_dtypes=[torch.float16, torch.float32, torch.float64]) perspective_transform: torch.Tensor = get_perspective_transform( params['start_points'], params['end_points']).type_as(input) transform: torch.Tensor = K.eye_like(3, input) transform = perspective_transform return transform
def compute_perspective_transformation( input: torch.Tensor, params: Dict[str, torch.Tensor]) -> torch.Tensor: input = _transform_input(input) _validate_input_dtype( input, accepted_dtypes=[torch.float16, torch.float32, torch.float64]) transform: torch.Tensor = get_perspective_transform( params['start_points'], params['end_points']).type_as(input) return transform
def compute_crop_transformation(input: torch.Tensor, params: Dict[str, torch.Tensor]): input = _transform_input(input) _validate_input_dtype( input, accepted_dtypes=[torch.float16, torch.float32, torch.float64]) transform: torch.Tensor = get_perspective_transform( params['src'].to(input.dtype), params['dst'].to(input.dtype)) transform = transform.expand(input.shape[0], -1, -1).type_as(input) return transform
def apply_perspective(input: torch.Tensor, params: Dict[str, torch.Tensor], return_transform: bool = False) -> UnionType: r"""Perform perspective transform of the given torch.Tensor or batch of tensors. Args: input (torch.Tensor): Tensor to be transformed with shape (H, W), (C, H, W), (*, C, H, W). start_points (torch.Tensor): Tensor containing [top-left, top-right, bottom-right, bottom-left] of the orignal image with shape Bx4x2. end_points (torch.Tensor): Tensor containing [top-left, top-right, bottom-right, bottom-left] of the transformed image with shape Bx4x2. return_transform (bool): if ``True`` return the matrix describing the transformation applied to each. Default: False. Returns: torch.Tensor: Perspectively transformed tensor. """ input = _transform_input(input) _validate_input_dtype( input, accepted_dtypes=[torch.float16, torch.float32, torch.float64]) # arrange input data x_data: torch.Tensor = input.view(-1, *input.shape[-3:]) _, _, height, width = x_data.shape # compute the homography between the input points transform: torch.Tensor = get_perspective_transform( params['start_points'], params['end_points']).type_as(input) out_data: torch.Tensor = x_data.clone() # process valid samples mask = params['batch_prob'].to(input.device) # TODO: look for a workaround for this hack. In CUDA it fails when no elements found. if bool(mask.sum() > 0): # apply the computed transform height, width = x_data.shape[-2:] resample_name = Resample(params['interpolation'].item()).name.lower() out_data[mask] = warp_perspective(x_data[mask], transform[mask], (height, width), flags=resample_name) if return_transform: return out_data.view_as(input), transform return out_data.view_as(input)
def compute_crop_transformation(input: torch.Tensor, params: Dict[str, torch.Tensor], flags: Dict[str, torch.Tensor]): r"""Compute the applied transformation matrix :math: `(*, 3, 3)`. Args: input (torch.Tensor): Tensor to be transformed with shape :math:`(*, C, H, W)`. params (Dict[str, torch.Tensor]): - params['src']: The applied cropping src matrix :math: `(*, 4, 2)`. - params['dst']: The applied cropping dst matrix :math: `(*, 4, 2)`. Returns: torch.Tensor: The applied transformation matrix :math: `(*, 3, 3)` """ transform: torch.Tensor = get_perspective_transform(params['src'].to(input.dtype), params['dst'].to(input.dtype)) transform = transform.expand(input.shape[0], -1, -1).type_as(input) return transform
def compute_crop_transformation(input: torch.Tensor, params: Dict[str, torch.Tensor]): r"""Compute the applied transformation matrix :math: `(*, 3, 3)`. Args: input (torch.Tensor): input image. params (Dict[str, torch.Tensor]): - params['src']: The applied cropping src matrix :math: `(*, 4, 2)`. - params['dst']: The applied cropping dst matrix :math: `(*, 4, 2)`. Returns: torch.Tensor: The applied transformation matrix :math: `(*, 3, 3)` """ input = _transform_input(input) _validate_input_dtype(input, accepted_dtypes=[torch.float16, torch.float32, torch.float64]) transform: torch.Tensor = get_perspective_transform(params['src'].to(input.dtype), params['dst'].to(input.dtype)) transform = transform.expand(input.shape[0], -1, -1).type_as(input) return transform
def compute_perspective_transformation(input: torch.Tensor, params: Dict[str, torch.Tensor]) -> torch.Tensor: r"""Compute the perspective transformation matrix :math: `(*, 3, 3)`. Args: input (torch.Tensor): Tensor to be transformed with shape :math:`(*, C, H, W)`. params (Dict[str, torch.Tensor]): - params['start_points']: Tensor containing [top-left, top-right, bottom-right, bottom-left] of the orignal image with shape Bx4x2. - params['end_points']: Tensor containing [top-left, top-right, bottom-right, bottom-left] of the transformed image with shape Bx4x2. Returns: torch.Tensor: The perspective transformation matrix :math: `(*, 3, 3)` """ perspective_transform: torch.Tensor = get_perspective_transform( params['start_points'], params['end_points']).type_as(input) transform: torch.Tensor = K.eye_like(3, input) transform = perspective_transform return transform