From 3b09d3f05f95629736bf5337ab118fa3327cc8c7 Mon Sep 17 00:00:00 2001 From: Matthew Beckers <17108752+mattlbeck@users.noreply.github.com> Date: Tue, 21 May 2024 13:56:52 +0100 Subject: [PATCH] fix: center_crop occasionally outputs off-by-one dimension matrix (#30934) If required padding for a crop larger than input image is odd-numbered, the padding would be rounded down instead of rounded up, causing the output dimension to be one smaller than it should be. --- src/transformers/image_transforms.py | 5 +++-- tests/test_image_transforms.py | 4 ++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/transformers/image_transforms.py b/src/transformers/image_transforms.py index 016fae4405..65d6413db7 100644 --- a/src/transformers/image_transforms.py +++ b/src/transformers/image_transforms.py @@ -14,6 +14,7 @@ # limitations under the License. import warnings +from math import ceil from typing import Iterable, List, Optional, Tuple, Union import numpy as np @@ -483,9 +484,9 @@ def center_crop( new_image = np.zeros_like(image, shape=new_shape) # If the image is too small, pad it with zeros - top_pad = (new_height - orig_height) // 2 + top_pad = ceil((new_height - orig_height) / 2) bottom_pad = top_pad + orig_height - left_pad = (new_width - orig_width) // 2 + left_pad = ceil((new_width - orig_width) / 2) right_pad = left_pad + orig_width new_image[..., top_pad:bottom_pad, left_pad:right_pad] = image diff --git a/tests/test_image_transforms.py b/tests/test_image_transforms.py index ae86f84def..25775d787e 100644 --- a/tests/test_image_transforms.py +++ b/tests/test_image_transforms.py @@ -369,6 +369,10 @@ class ImageTransformsTester(unittest.TestCase): self.assertEqual(cropped_image.shape, (300, 260, 3)) self.assertTrue(np.allclose(cropped_image, expected_image)) + # Test that odd numbered padding requirement still leads to correct output dimensions + cropped_image = center_crop(image, (300, 259), data_format="channels_last") + self.assertEqual(cropped_image.shape, (300, 259, 3)) + # Test image with 4 channels is cropped correctly image = np.random.randint(0, 256, (224, 224, 4)) expected_image = image[52:172, 82:142, :]