From 5a56a4b9ba0d77963445df2ff2015b0899cc7b31 Mon Sep 17 00:00:00 2001 From: Nicolas Hug Date: Tue, 20 Apr 2021 18:21:10 +0100 Subject: [PATCH 1/3] fix test --- test/common_utils.py | 3 +++ test/test_transforms_tensor.py | 17 +++++++++++------ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/test/common_utils.py b/test/common_utils.py index 7e16864d56c..b3c5796ec68 100644 --- a/test/common_utils.py +++ b/test/common_utils.py @@ -376,6 +376,9 @@ def approxEqualTensorToPIL(self, tensor, pil_image, tol=1e-5, msg=None, agg_meth np_pil_image = np_pil_image[:, :, None] pil_tensor = torch.as_tensor(np_pil_image.transpose((2, 0, 1))).to(tensor) # error value can be mean absolute error, max abs error + # Convert to float to avoid underflow when computing absolute difference + tensor = tensor.to(torch.float) + pil_tensor = pil_tensor.to(torch.float) err = getattr(torch, agg_method)(torch.abs(tensor - pil_tensor)).item() self.assertTrue( err < tol, diff --git a/test/test_transforms_tensor.py b/test/test_transforms_tensor.py index 1bd0099af63..a4514993f28 100644 --- a/test/test_transforms_tensor.py +++ b/test/test_transforms_tensor.py @@ -20,7 +20,7 @@ class Tester(TransformsTester): def setUp(self): self.device = "cpu" - def _test_functional_op(self, func, fn_kwargs): + def _test_functional_op(self, func, fn_kwargs, test_exact_match=True, **match_kwargs): if fn_kwargs is None: fn_kwargs = {} @@ -28,7 +28,10 @@ def _test_functional_op(self, func, fn_kwargs): tensor, pil_img = self._create_data(height=10, width=10, device=self.device) transformed_tensor = f(tensor, **fn_kwargs) transformed_pil_img = f(pil_img, **fn_kwargs) - self.compareTensorToPIL(transformed_tensor, transformed_pil_img) + if test_exact_match: + self.compareTensorToPIL(transformed_tensor, transformed_pil_img, **match_kwargs) + else: + self.approxEqualTensorToPIL(transformed_tensor, transformed_pil_img, **match_kwargs) def _test_transform_vs_scripted(self, transform, s_transform, tensor, msg=None): torch.manual_seed(12) @@ -80,9 +83,9 @@ def _test_class_op(self, method, meth_kwargs=None, test_exact_match=True, **matc with get_tmp_dir() as tmp_dir: scripted_fn.save(os.path.join(tmp_dir, "t_{}.pt".format(method))) - def _test_op(self, func, method, fn_kwargs=None, meth_kwargs=None): - self._test_functional_op(func, fn_kwargs) - self._test_class_op(method, meth_kwargs) + def _test_op(self, func, method, fn_kwargs=None, meth_kwargs=None, test_exact_match=True, **match_kwargs): + self._test_functional_op(func, fn_kwargs, test_exact_match=test_exact_match, **match_kwargs) + self._test_class_op(method, meth_kwargs, test_exact_match=test_exact_match, **match_kwargs) def test_random_horizontal_flip(self): self._test_op('hflip', 'RandomHorizontalFlip') @@ -112,7 +115,9 @@ def test_random_adjust_sharpness(self): ) def test_random_autocontrast(self): - self._test_op('autocontrast', 'RandomAutocontrast') + # We check the max abs difference because on some (very rare) pixels, the actual value may be different + # between PIL and tensors due to floating approximations. + self._test_op('autocontrast', 'RandomAutocontrast', test_exact_match=False, agg_method='max', tol=(1 + 1e-5)) def test_random_equalize(self): self._test_op('equalize', 'RandomEqualize') From 243934c11ca8efb6230b2bb0f6c5c95e1424a914 Mon Sep 17 00:00:00 2001 From: Nicolas Hug Date: Tue, 20 Apr 2021 18:33:25 +0100 Subject: [PATCH 2/3] more robust test --- test/common_utils.py | 9 ++++++++- test/test_transforms_tensor.py | 3 ++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/test/common_utils.py b/test/common_utils.py index b3c5796ec68..e9970a20937 100644 --- a/test/common_utils.py +++ b/test/common_utils.py @@ -370,11 +370,18 @@ def compareTensorToPIL(self, tensor, pil_image, msg=None): msg = "tensor:\n{} \ndid not equal PIL tensor:\n{}".format(tensor, pil_tensor) self.assertTrue(tensor.cpu().equal(pil_tensor), msg) - def approxEqualTensorToPIL(self, tensor, pil_image, tol=1e-5, msg=None, agg_method="mean"): + def approxEqualTensorToPIL(self, tensor, pil_image, tol=1e-5, msg=None, agg_method="mean", + allowed_percentage_diff=None): np_pil_image = np.array(pil_image) if np_pil_image.ndim == 2: np_pil_image = np_pil_image[:, :, None] pil_tensor = torch.as_tensor(np_pil_image.transpose((2, 0, 1))).to(tensor) + + if allowed_percentage_diff is not None: + # Assert that less than a given %age of pixels are different + self.assertTrue( + (tensor != pil_tensor).to(torch.float).mean() <= allowed_percentage_diff + ) # error value can be mean absolute error, max abs error # Convert to float to avoid underflow when computing absolute difference tensor = tensor.to(torch.float) diff --git a/test/test_transforms_tensor.py b/test/test_transforms_tensor.py index a4514993f28..09c7b621a9f 100644 --- a/test/test_transforms_tensor.py +++ b/test/test_transforms_tensor.py @@ -117,7 +117,8 @@ def test_random_adjust_sharpness(self): def test_random_autocontrast(self): # We check the max abs difference because on some (very rare) pixels, the actual value may be different # between PIL and tensors due to floating approximations. - self._test_op('autocontrast', 'RandomAutocontrast', test_exact_match=False, agg_method='max', tol=(1 + 1e-5)) + self._test_op('autocontrast', 'RandomAutocontrast', test_exact_match=False, agg_method='max', + tol=(1 + 1e-5), allowed_percentage_diff=.05) def test_random_equalize(self): self._test_op('equalize', 'RandomEqualize') From 9bfa1eaf6796c2fdc582d9bce94c1889396f96f4 Mon Sep 17 00:00:00 2001 From: Nicolas Hug Date: Tue, 20 Apr 2021 18:50:09 +0100 Subject: [PATCH 3/3] flake8 --- test/test_transforms_tensor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_transforms_tensor.py b/test/test_transforms_tensor.py index 09c7b621a9f..4a2f59c6a9b 100644 --- a/test/test_transforms_tensor.py +++ b/test/test_transforms_tensor.py @@ -118,7 +118,7 @@ def test_random_autocontrast(self): # We check the max abs difference because on some (very rare) pixels, the actual value may be different # between PIL and tensors due to floating approximations. self._test_op('autocontrast', 'RandomAutocontrast', test_exact_match=False, agg_method='max', - tol=(1 + 1e-5), allowed_percentage_diff=.05) + tol=(1 + 1e-5), allowed_percentage_diff=.05) def test_random_equalize(self): self._test_op('equalize', 'RandomEqualize')