def compute_affine_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['angle']: Degrees of rotation. - params['translations']: Horizontal and vertical translations. - params['center']: Rotation center. - params['scale']: Scaling params. - params['sx']: Shear param toward x-axis. - params['sy']: Shear param toward y-axis. - params['resample']: Integer tensor. NEAREST = 0, BILINEAR = 1. - params['align_corners']: Boolean tensor. 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 = get_affine_matrix2d(params['translations'], params['center'], params['scale'], params['angle'], deg2rad(params['sx']), deg2rad(params['sy'])).type_as(input) return transform
def compute_affine_transformation( input: torch.Tensor, params: Dict[str, torch.Tensor]) -> torch.Tensor: r"""Compute the affine 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['angle']: Degrees of rotation. - params['translations']: Horizontal and vertical translations. - params['center']: Rotation center. - params['scale']: Scaling params. - params['sx']: Shear param toward x-axis. - params['sy']: Shear param toward y-axis. Returns: torch.Tensor: The affine transformation matrix :math: `(*, 3, 3)`. """ transform = get_affine_matrix2d( params['translations'], params['center'], params['scale'], params['angle'], deg2rad(params['sx']), deg2rad(params['sy']), ).type_as(input) return transform
def apply_affine(input: torch.Tensor, params: Dict[str, torch.Tensor], return_transform: bool = False) -> UnionType: if not torch.is_tensor(input): raise TypeError(f"Input type is not a torch.Tensor. Got {type(input)}") r"""Random affine transformation of the image keeping center invariant Args: input (torch.Tensor): Tensor to be transformed with shape (H, W), (C, H, W), (*, C, H, W). degrees (float or tuple): Range of degrees to select from. If degrees is a number instead of sequence like (min, max), the range of degrees will be (-degrees, +degrees). Set to 0 to deactivate rotations. translate (tuple, optional): tuple of maximum absolute fraction for horizontal and vertical translations. For example translate=(a, b), then horizontal shift is randomly sampled in the range -img_width * a < dx < img_width * a and vertical shift is randomly sampled in the range -img_height * b < dy < img_height * b. Will not translate by default. scale (tuple, optional): scaling factor interval, e.g (a, b), then scale is randomly sampled from the range a <= scale <= b. Will keep original scale by default. shear (sequence or float, optional): Range of degrees to select from. If shear is a number, a shear parallel to the x axis in the range (-shear, +shear) will be applied. Else if shear is a tuple or list of 2 values a shear parallel to the x axis in the range (shear[0], shear[1]) will be applied. Else if shear is a tuple or list of 4 values, a x-axis shear in (shear[0], shear[1]) and y-axis shear in (shear[2], shear[3]) will be applied. Will not apply shear by default resample (int): Can be retrieved from Resample. 0 is NEAREST, 1 is BILINEAR. return_transform (bool): if ``True`` return the matrix describing the transformation applied to each. Default: False. mode (str): interpolation mode to calculate output values 'bilinear' | 'nearest'. Default: 'bilinear'. padding_mode (str): padding mode for outside grid values 'zeros' | 'border' | 'reflection'. Default: 'zeros'. """ 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[-2:] # concatenate transforms transform = get_affine_matrix2d(params['translations'], params['center'], params['scale'], params['angle'], deg2rad(params['sx']), deg2rad(params['sy'])).type_as(input) resample_name = Resample(params['resample'].item()).name.lower() out_data: torch.Tensor = warp_affine(x_data, transform[:, :2, :], (height, width), resample_name) if return_transform: return out_data.view_as(input), transform return out_data.view_as(input)
def compute_affine_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 = get_affine_matrix2d(params['translations'], params['center'], params['scale'], params['angle'], deg2rad(params['sx']), deg2rad(params['sy'])).type_as(input) return transform
def compute_affine_transformation3d( input: torch.Tensor, params: Dict[str, torch.Tensor]) -> torch.Tensor: r"""Compute the applied transformation matrix :math: `(*, 4, 4)`. Args: input (torch.Tensor): Tensor to be transformed with shape (D, H, W), (C, D, H, W), (B, C, D, H, W). params (Dict[str, torch.Tensor]): - params['angles']: Degrees of rotation with the shape of :math: `(*, 3)` for yaw, pitch, roll. - params['translations']: Horizontal, vertical and depthical translations (dx,dy,dz). - params['center']: Rotation center (x,y,z). - params['scale']: Isotropic scaling params. - params['sxy']: Shear param toward x-y-axis. - params['sxz']: Shear param toward x-z-axis. - params['syx']: Shear param toward y-x-axis. - params['syz']: Shear param toward y-z-axis. - params['szx']: Shear param toward z-x-axis. - params['szy']: Shear param toward z-y-axis. Returns: torch.Tensor: The applied transformation matrix :math: `(*, 4, 4)` """ input = _transform_input3d(input) _validate_input_dtype( input, accepted_dtypes=[torch.float16, torch.float32, torch.float64]) transform = get_affine_matrix3d(params['translations'], params['center'], params['scale'], params['angles'], deg2rad(params['sxy']), deg2rad(params['sxz']), deg2rad(params['syx']), deg2rad(params['syz']), deg2rad(params['szx']), deg2rad(params['szy'])).type_as(input) return transform
def compute_affine_transformation3d(input: torch.Tensor, params: Dict[str, torch.Tensor]) -> torch.Tensor: r"""Compute the affine transformation matrix :math: `(*, 4, 4)`. Args: input (torch.Tensor): Tensor to be transformed with shape :math:`(*, C, D, H, W)`. params (Dict[str, torch.Tensor]): - params['angles']: Degrees of rotation with the shape of :math: `(*, 3)` for yaw, pitch, roll. - params['translations']: Horizontal, vertical and depthical translations (dx,dy,dz). - params['center']: Rotation center (x,y,z). - params['scale']: Isotropic scaling params. - params['sxy']: Shear param toward x-y-axis. - params['sxz']: Shear param toward x-z-axis. - params['syx']: Shear param toward y-x-axis. - params['syz']: Shear param toward y-z-axis. - params['szx']: Shear param toward z-x-axis. - params['szy']: Shear param toward z-y-axis. Returns: torch.Tensor: The affine transformation matrix :math: `(*, 4, 4)`. """ transform = get_affine_matrix3d( params['translations'], params['center'], params['scale'], params['angles'], deg2rad(params['sxy']), deg2rad(params['sxz']), deg2rad(params['syx']), deg2rad(params['syz']), deg2rad(params['szx']), deg2rad(params['szy']) ).to(input) return transform
def compute_transformation(self, input: torch.Tensor, params: Dict[str, torch.Tensor]) -> torch.Tensor: transform: torch.Tensor = get_affine_matrix3d( params["translations"], params["center"], params["scale"], params["angles"], deg2rad(params["sxy"]), deg2rad(params["sxz"]), deg2rad(params["syx"]), deg2rad(params["syz"]), deg2rad(params["szx"]), deg2rad(params["szy"]), ).to(input) return transform
def compute_transformation(self, input: torch.Tensor, params: Dict[str, torch.Tensor]) -> torch.Tensor: transform: torch.Tensor = get_affine_matrix3d( params['translations'], params['center'], params['scale'], params['angles'], deg2rad(params['sxy']), deg2rad(params['sxz']), deg2rad(params['syx']), deg2rad(params['syz']), deg2rad(params['szx']), deg2rad(params['szy']), ).to(input) return transform