From d9b44cf1e1f406df2b1f5798926afba4c3e54c51 Mon Sep 17 00:00:00 2001 From: Hemanath400 Date: Fri, 28 Aug 2026 01:37:07 +0530 Subject: [PATCH] Preserve channels-last memory format in to_image --- test/test_transforms_v2.py | 10 ++++++++++ .../transforms/v2/functional/_type_conversion.py | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/test/test_transforms_v2.py b/test/test_transforms_v2.py index 6d9f9732552..f120a01b49a 100644 --- a/test/test_transforms_v2.py +++ b/test/test_transforms_v2.py @@ -6794,6 +6794,16 @@ def test_functional_error(self): with pytest.raises(TypeError, match="Input can either be a pure Tensor, a numpy array, or a PIL image"): F.to_image(object()) + def test_numpy_channels_last_memory_format(self): + input = np.zeros((224, 224, 3), dtype=np.uint8) + + output = F.to_image(input) + + assert output.shape == (3, 224, 224) + + assert output.unsqueeze(0).is_contiguous( + memory_format=torch.channels_last + ) class TestToPILImage: @pytest.mark.parametrize("make_input", [make_image_tensor, make_image, make_image_numpy]) diff --git a/torchvision/transforms/v2/functional/_type_conversion.py b/torchvision/transforms/v2/functional/_type_conversion.py index c5a731fe143..3ba818feee9 100644 --- a/torchvision/transforms/v2/functional/_type_conversion.py +++ b/torchvision/transforms/v2/functional/_type_conversion.py @@ -11,7 +11,7 @@ def to_image(inpt: Union[torch.Tensor, PIL.Image.Image, np.ndarray]) -> tv_tensors.Image: """See :class:`~torchvision.transforms.v2.ToImage` for details.""" if isinstance(inpt, np.ndarray): - output = torch.from_numpy(np.atleast_3d(inpt)).permute((2, 0, 1)).contiguous() + output = torch.from_numpy(np.atleast_3d(inpt)).permute((2, 0, 1)) elif isinstance(inpt, PIL.Image.Image): output = pil_to_tensor(inpt) elif isinstance(inpt, torch.Tensor):