diff --git a/test/test_transforms_v2_refactored.py b/test/test_transforms_v2_refactored.py index b2e21fc4aca..f8a47c7cf39 100644 --- a/test/test_transforms_v2_refactored.py +++ b/test/test_transforms_v2_refactored.py @@ -1380,7 +1380,6 @@ def test_transform_noop(self, make_input, device): assert_equal(output, input) -@pytest.mark.filterwarnings("ignore:The provided center argument has no effect") class TestRotate: _EXHAUSTIVE_TYPE_AFFINE_KWARGS = dict( # float, int diff --git a/torchvision/transforms/v2/_geometry.py b/torchvision/transforms/v2/_geometry.py index 721e9b7e452..8d79fb6fd24 100644 --- a/torchvision/transforms/v2/_geometry.py +++ b/torchvision/transforms/v2/_geometry.py @@ -590,9 +590,16 @@ class RandomRotation(Transform): expand (bool, optional): Optional expansion flag. If true, expands the output to make it large enough to hold the entire rotated image. If false or omitted, make the output image the same size as the input image. - Note that the expand flag assumes rotation around the center and no translation. + Note that the expand flag assumes rotation around the center (see note below) and no translation. center (sequence, optional): Optional center of rotation, (x, y). Origin is the upper left corner. Default is the center of the image. + + .. note:: + + In theory, setting ``center`` has no effect if ``expand=True``, since the image center will become the + center of rotation. In practice however, due to numerical precision, this can lead to off-by-one + differences of the resulting image size compared to using the image center in the first place. Thus, when + setting ``expand=True``, it's best to leave ``center=None`` (default). fill (number or tuple or dict, optional): Pixel fill value used when the ``padding_mode`` is constant. Default is 0. If a tuple of length 3, it is used to fill R, G, B channels respectively. Fill value can be also a dictionary mapping data type to the fill value, e.g. diff --git a/torchvision/transforms/v2/functional/_geometry.py b/torchvision/transforms/v2/functional/_geometry.py index 8c74f600285..387be3ff9ba 100644 --- a/torchvision/transforms/v2/functional/_geometry.py +++ b/torchvision/transforms/v2/functional/_geometry.py @@ -977,9 +977,6 @@ def rotate_image( center_f = [0.0, 0.0] if center is not None: - if expand: - # TODO: Do we actually want to warn, or just document this? - warnings.warn("The provided center argument has no effect on the result if expand is True") # Center values should be in pixel coordinates but translated such that (0, 0) corresponds to image center. center_f = [(c - s * 0.5) for c, s in zip(center, [width, height])] @@ -1017,9 +1014,6 @@ def _rotate_image_pil( ) -> PIL.Image.Image: interpolation = _check_interpolation(interpolation) - if center is not None and expand: - warnings.warn("The provided center argument has no effect on the result if expand is True") - return _FP.rotate( image, angle, interpolation=pil_modes_mapping[interpolation], expand=expand, fill=fill, center=center ) @@ -1033,9 +1027,6 @@ def rotate_bounding_boxes( expand: bool = False, center: Optional[List[float]] = None, ) -> Tuple[torch.Tensor, Tuple[int, int]]: - if center is not None and expand: - warnings.warn("The provided center argument has no effect on the result if expand is True") - return _affine_bounding_boxes_with_expand( bounding_boxes, format=format,