From 570aa3b9ff69148ddab08e2cdcdfa0dc3f5bbc45 Mon Sep 17 00:00:00 2001 From: Anirudh Dagar Date: Wed, 9 Jun 2021 04:34:45 +0530 Subject: [PATCH 01/10] add test_x_crop, refactor test_resize & test_resized_crop --- test/test_transforms_tensor.py | 269 +++++++++++++++------------------ 1 file changed, 125 insertions(+), 144 deletions(-) diff --git a/test/test_transforms_tensor.py b/test/test_transforms_tensor.py index 63b25fb7f11..57b88286d6a 100644 --- a/test/test_transforms_tensor.py +++ b/test/test_transforms_tensor.py @@ -7,6 +7,7 @@ import numpy as np import unittest +import pytest from typing import Sequence from common_utils import ( @@ -17,6 +18,7 @@ _create_data_batch, _assert_equal_tensor_to_pil, _assert_approx_equal_tensor_to_pil, + cpu_and_gpu ) from _assert_utils import assert_equal @@ -274,150 +276,6 @@ def test_center_crop(self): with get_tmp_dir() as tmp_dir: scripted_fn.save(os.path.join(tmp_dir, "t_center_crop.pt")) - def _test_op_list_output(self, func, method, out_length, fn_kwargs=None, meth_kwargs=None): - if fn_kwargs is None: - fn_kwargs = {} - if meth_kwargs is None: - meth_kwargs = {} - - fn = getattr(F, func) - scripted_fn = torch.jit.script(fn) - - tensor, pil_img = _create_data(height=20, width=20, device=self.device) - transformed_t_list = fn(tensor, **fn_kwargs) - transformed_p_list = fn(pil_img, **fn_kwargs) - self.assertEqual(len(transformed_t_list), len(transformed_p_list)) - self.assertEqual(len(transformed_t_list), out_length) - for transformed_tensor, transformed_pil_img in zip(transformed_t_list, transformed_p_list): - _assert_equal_tensor_to_pil(transformed_tensor, transformed_pil_img) - - transformed_t_list_script = scripted_fn(tensor.detach().clone(), **fn_kwargs) - self.assertEqual(len(transformed_t_list), len(transformed_t_list_script)) - self.assertEqual(len(transformed_t_list_script), out_length) - for transformed_tensor, transformed_tensor_script in zip(transformed_t_list, transformed_t_list_script): - assert_equal( - transformed_tensor, - transformed_tensor_script, - msg="{} vs {}".format(transformed_tensor, transformed_tensor_script), - ) - - # test for class interface - fn = getattr(T, method)(**meth_kwargs) - scripted_fn = torch.jit.script(fn) - output = scripted_fn(tensor) - self.assertEqual(len(output), len(transformed_t_list_script)) - - # test on batch of tensors - batch_tensors = _create_data_batch(height=23, width=34, channels=3, num_samples=4, device=self.device) - torch.manual_seed(12) - transformed_batch_list = fn(batch_tensors) - - for i in range(len(batch_tensors)): - img_tensor = batch_tensors[i, ...] - torch.manual_seed(12) - transformed_img_list = fn(img_tensor) - for transformed_img, transformed_batch in zip(transformed_img_list, transformed_batch_list): - assert_equal( - transformed_img, - transformed_batch[i, ...], - msg="{} vs {}".format(transformed_img, transformed_batch[i, ...]), - ) - - with get_tmp_dir() as tmp_dir: - scripted_fn.save(os.path.join(tmp_dir, "t_op_list_{}.pt".format(method))) - - def test_five_crop(self): - fn_kwargs = meth_kwargs = {"size": (5,)} - self._test_op_list_output( - "five_crop", "FiveCrop", out_length=5, fn_kwargs=fn_kwargs, meth_kwargs=meth_kwargs - ) - fn_kwargs = meth_kwargs = {"size": [5, ]} - self._test_op_list_output( - "five_crop", "FiveCrop", out_length=5, fn_kwargs=fn_kwargs, meth_kwargs=meth_kwargs - ) - fn_kwargs = meth_kwargs = {"size": (4, 5)} - self._test_op_list_output( - "five_crop", "FiveCrop", out_length=5, fn_kwargs=fn_kwargs, meth_kwargs=meth_kwargs - ) - fn_kwargs = meth_kwargs = {"size": [4, 5]} - self._test_op_list_output( - "five_crop", "FiveCrop", out_length=5, fn_kwargs=fn_kwargs, meth_kwargs=meth_kwargs - ) - - def test_ten_crop(self): - fn_kwargs = meth_kwargs = {"size": (5,)} - self._test_op_list_output( - "ten_crop", "TenCrop", out_length=10, fn_kwargs=fn_kwargs, meth_kwargs=meth_kwargs - ) - fn_kwargs = meth_kwargs = {"size": [5, ]} - self._test_op_list_output( - "ten_crop", "TenCrop", out_length=10, fn_kwargs=fn_kwargs, meth_kwargs=meth_kwargs - ) - fn_kwargs = meth_kwargs = {"size": (4, 5)} - self._test_op_list_output( - "ten_crop", "TenCrop", out_length=10, fn_kwargs=fn_kwargs, meth_kwargs=meth_kwargs - ) - fn_kwargs = meth_kwargs = {"size": [4, 5]} - self._test_op_list_output( - "ten_crop", "TenCrop", out_length=10, fn_kwargs=fn_kwargs, meth_kwargs=meth_kwargs - ) - - def test_resize(self): - - # TODO: Minimal check for bug-fix, improve this later - x = torch.rand(3, 32, 46) - t = T.Resize(size=38) - y = t(x) - # If size is an int, smaller edge of the image will be matched to this number. - # i.e, if height > width, then image will be rescaled to (size * height / width, size). - self.assertTrue(isinstance(y, torch.Tensor)) - self.assertEqual(y.shape[1], 38) - self.assertEqual(y.shape[2], int(38 * 46 / 32)) - - tensor, _ = _create_data(height=34, width=36, device=self.device) - batch_tensors = torch.randint(0, 256, size=(4, 3, 44, 56), dtype=torch.uint8, device=self.device) - - for dt in [None, torch.float32, torch.float64]: - if dt is not None: - # This is a trivial cast to float of uint8 data to test all cases - tensor = tensor.to(dt) - for size in [32, 34, [32, ], [32, 32], (32, 32), [34, 35]]: - for max_size in (None, 35, 1000): - if max_size is not None and isinstance(size, Sequence) and len(size) != 1: - continue # Not supported - for interpolation in [BILINEAR, BICUBIC, NEAREST]: - - if isinstance(size, int): - script_size = [size, ] - else: - script_size = size - - transform = T.Resize(size=script_size, interpolation=interpolation, max_size=max_size) - s_transform = torch.jit.script(transform) - _test_transform_vs_scripted(transform, s_transform, tensor) - _test_transform_vs_scripted_on_batch(transform, s_transform, batch_tensors) - - with get_tmp_dir() as tmp_dir: - s_transform.save(os.path.join(tmp_dir, "t_resize.pt")) - - def test_resized_crop(self): - tensor = torch.randint(0, 256, size=(3, 44, 56), dtype=torch.uint8, device=self.device) - batch_tensors = torch.randint(0, 256, size=(4, 3, 44, 56), dtype=torch.uint8, device=self.device) - - for scale in [(0.7, 1.2), [0.7, 1.2]]: - for ratio in [(0.75, 1.333), [0.75, 1.333]]: - for size in [(32, ), [44, ], [32, ], [32, 32], (32, 32), [44, 55]]: - for interpolation in [NEAREST, BILINEAR, BICUBIC]: - transform = T.RandomResizedCrop( - size=size, scale=scale, ratio=ratio, interpolation=interpolation - ) - s_transform = torch.jit.script(transform) - _test_transform_vs_scripted(transform, s_transform, tensor) - _test_transform_vs_scripted_on_batch(transform, s_transform, batch_tensors) - - with get_tmp_dir() as tmp_dir: - s_transform.save(os.path.join(tmp_dir, "t_resized_crop.pt")) - def test_random_affine(self): tensor = torch.randint(0, 256, size=(3, 44, 56), dtype=torch.uint8, device=self.device) batch_tensors = torch.randint(0, 256, size=(4, 3, 44, 56), dtype=torch.uint8, device=self.device) @@ -710,6 +568,129 @@ def test_autoaugment(self): s_transform.save(os.path.join(tmp_dir, "t_autoaugment.pt")) +@pytest.mark.parametrize('device', cpu_and_gpu()) +@pytest.mark.parametrize('func, method, out_length', [ + # test_five_crop + ("five_crop", "FiveCrop", 5), + # test_ten_crop + ("ten_crop", "TenCrop", 10) +]) +@pytest.mark.parametrize('fn_kwargs', [ + {"size": (5,)}, + {"size": [5, ]}, + {"size": (4, 5)}, + {"size": [4, 5]} +]) +def test_x_crop(func, method, out_length, fn_kwargs, device): + meth_kwargs = fn_kwargs + + fn = getattr(F, func) + scripted_fn = torch.jit.script(fn) + + tensor, pil_img = _create_data(height=20, width=20, device=device) + transformed_t_list = fn(tensor, **fn_kwargs) + transformed_p_list = fn(pil_img, **fn_kwargs) + assert len(transformed_t_list) == len(transformed_p_list) + assert len(transformed_t_list) == out_length + for transformed_tensor, transformed_pil_img in zip(transformed_t_list, transformed_p_list): + _assert_equal_tensor_to_pil(transformed_tensor, transformed_pil_img) + + transformed_t_list_script = scripted_fn(tensor.detach().clone(), **fn_kwargs) + assert len(transformed_t_list) == len(transformed_t_list_script) + assert len(transformed_t_list_script) == out_length + for transformed_tensor, transformed_tensor_script in zip(transformed_t_list, transformed_t_list_script): + assert_equal( + transformed_tensor, + transformed_tensor_script, + msg="{} vs {}".format(transformed_tensor, transformed_tensor_script), + ) + + # test for class interface + fn = getattr(T, method)(**meth_kwargs) + scripted_fn = torch.jit.script(fn) + output = scripted_fn(tensor) + assert len(output) == len(transformed_t_list_script) + + # test on batch of tensors + batch_tensors = _create_data_batch(height=23, width=34, channels=3, num_samples=4, device=device) + torch.manual_seed(12) + transformed_batch_list = fn(batch_tensors) + + for i in range(len(batch_tensors)): + img_tensor = batch_tensors[i, ...] + torch.manual_seed(12) + transformed_img_list = fn(img_tensor) + for transformed_img, transformed_batch in zip(transformed_img_list, transformed_batch_list): + assert_equal( + transformed_img, + transformed_batch[i, ...], + msg="{} vs {}".format(transformed_img, transformed_batch[i, ...]), + ) + + with get_tmp_dir() as tmp_dir: + scripted_fn.save(os.path.join(tmp_dir, "t_op_list_{}.pt".format(method))) + + +@pytest.mark.parametrize('device', cpu_and_gpu()) +@pytest.mark.parametrize('dt', [None, torch.float32, torch.float64]) +@pytest.mark.parametrize('size', [32, 34, [32, ], [32, 32], (32, 32), [34, 35]]) +@pytest.mark.parametrize('max_size', [None, 35, 1000]) +@pytest.mark.parametrize('interpolation', [BILINEAR, BICUBIC, NEAREST]) +def test_resize(dt, size, max_size, interpolation, device): + + # TODO: Minimal check for bug-fix, improve this later + x = torch.rand(3, 32, 46) + t = T.Resize(size=38) + y = t(x) + # If size is an int, smaller edge of the image will be matched to this number. + # i.e, if height > width, then image will be rescaled to (size * height / width, size). + assert isinstance(y, torch.Tensor) + assert y.shape[1] == 38 + assert y.shape[2] == int(38 * 46 / 32) + + tensor, _ = _create_data(height=34, width=36, device=device) + batch_tensors = torch.randint(0, 256, size=(4, 3, 44, 56), dtype=torch.uint8, device=device) + + if dt is not None: + # This is a trivial cast to float of uint8 data to test all cases + tensor = tensor.to(dt) + if max_size is not None and isinstance(size, Sequence) and len(size) != 1: + pass # Not supported + else: + if isinstance(size, int): + script_size = [size, ] + else: + script_size = size + + transform = T.Resize(size=script_size, interpolation=interpolation, max_size=max_size) + s_transform = torch.jit.script(transform) + _test_transform_vs_scripted(transform, s_transform, tensor) + _test_transform_vs_scripted_on_batch(transform, s_transform, batch_tensors) + + with get_tmp_dir() as tmp_dir: + s_transform.save(os.path.join(tmp_dir, "t_resize.pt")) + + +@pytest.mark.parametrize('device', cpu_and_gpu()) +@pytest.mark.parametrize('scale', [(0.7, 1.2), [0.7, 1.2]]) +@pytest.mark.parametrize('ratio', [(0.75, 1.333), [0.75, 1.333]]) +@pytest.mark.parametrize('size', [(32, ), [44, ], [32, ], [32, 32], (32, 32), [44, 55]]) +@pytest.mark.parametrize('interpolation', [NEAREST, BILINEAR, BICUBIC]) +def test_resized_crop(scale, ratio, size, interpolation, device): + tensor = torch.randint(0, 256, size=(3, 44, 56), dtype=torch.uint8, device=device) + batch_tensors = torch.randint(0, 256, size=(4, 3, 44, 56), dtype=torch.uint8, device=device) + + transform = T.RandomResizedCrop( + size=size, scale=scale, ratio=ratio, interpolation=interpolation + ) + s_transform = torch.jit.script(transform) + _test_transform_vs_scripted(transform, s_transform, tensor) + _test_transform_vs_scripted_on_batch(transform, s_transform, batch_tensors) + + with get_tmp_dir() as tmp_dir: + s_transform.save(os.path.join(tmp_dir, "t_resized_crop.pt")) + + @unittest.skipIf(not torch.cuda.is_available(), reason="Skip if no CUDA device") class CUDATester(Tester): From e55fec040771a9e62775f0d50b664e19c27d716f Mon Sep 17 00:00:00 2001 From: Anirudh Dagar Date: Wed, 9 Jun 2021 04:36:40 +0530 Subject: [PATCH 02/10] pytest: remove redundant msg --- test/test_transforms_tensor.py | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/test/test_transforms_tensor.py b/test/test_transforms_tensor.py index 57b88286d6a..dc1d44e296c 100644 --- a/test/test_transforms_tensor.py +++ b/test/test_transforms_tensor.py @@ -599,11 +599,7 @@ def test_x_crop(func, method, out_length, fn_kwargs, device): assert len(transformed_t_list) == len(transformed_t_list_script) assert len(transformed_t_list_script) == out_length for transformed_tensor, transformed_tensor_script in zip(transformed_t_list, transformed_t_list_script): - assert_equal( - transformed_tensor, - transformed_tensor_script, - msg="{} vs {}".format(transformed_tensor, transformed_tensor_script), - ) + assert_equal(transformed_tensor, transformed_tensor_script) # test for class interface fn = getattr(T, method)(**meth_kwargs) @@ -621,11 +617,7 @@ def test_x_crop(func, method, out_length, fn_kwargs, device): torch.manual_seed(12) transformed_img_list = fn(img_tensor) for transformed_img, transformed_batch in zip(transformed_img_list, transformed_batch_list): - assert_equal( - transformed_img, - transformed_batch[i, ...], - msg="{} vs {}".format(transformed_img, transformed_batch[i, ...]), - ) + assert_equal(transformed_img, transformed_batch[i, ...]) with get_tmp_dir() as tmp_dir: scripted_fn.save(os.path.join(tmp_dir, "t_op_list_{}.pt".format(method))) From 40c7be5ac400c590f10a5d3f2f303cce2153d2d0 Mon Sep 17 00:00:00 2001 From: Anirudh Dagar Date: Wed, 9 Jun 2021 07:52:01 +0530 Subject: [PATCH 03/10] separate save tests --- test/test_transforms_tensor.py | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/test/test_transforms_tensor.py b/test/test_transforms_tensor.py index dc1d44e296c..ff87eb8dd5e 100644 --- a/test/test_transforms_tensor.py +++ b/test/test_transforms_tensor.py @@ -18,7 +18,8 @@ _create_data_batch, _assert_equal_tensor_to_pil, _assert_approx_equal_tensor_to_pil, - cpu_and_gpu + cpu_and_gpu, + cpu_only ) from _assert_utils import assert_equal @@ -619,6 +620,12 @@ def test_x_crop(func, method, out_length, fn_kwargs, device): for transformed_img, transformed_batch in zip(transformed_img_list, transformed_batch_list): assert_equal(transformed_img, transformed_batch[i, ...]) + +@cpu_only +@pytest.mark.parametrize('method', ["FiveCrop", "TenCrop"]) +def test_x_crop_save(method): + fn = getattr(T, method)(size=[5, ]) + scripted_fn = torch.jit.script(fn) with get_tmp_dir() as tmp_dir: scripted_fn.save(os.path.join(tmp_dir, "t_op_list_{}.pt".format(method))) @@ -659,8 +666,13 @@ def test_resize(dt, size, max_size, interpolation, device): _test_transform_vs_scripted(transform, s_transform, tensor) _test_transform_vs_scripted_on_batch(transform, s_transform, batch_tensors) - with get_tmp_dir() as tmp_dir: - s_transform.save(os.path.join(tmp_dir, "t_resize.pt")) + +@cpu_only +def test_resize_save(): + transform = T.Resize(size=[32, ]) + s_transform = torch.jit.script(transform) + with get_tmp_dir() as tmp_dir: + s_transform.save(os.path.join(tmp_dir, "t_resize.pt")) @pytest.mark.parametrize('device', cpu_and_gpu()) @@ -671,14 +683,16 @@ def test_resize(dt, size, max_size, interpolation, device): def test_resized_crop(scale, ratio, size, interpolation, device): tensor = torch.randint(0, 256, size=(3, 44, 56), dtype=torch.uint8, device=device) batch_tensors = torch.randint(0, 256, size=(4, 3, 44, 56), dtype=torch.uint8, device=device) - - transform = T.RandomResizedCrop( - size=size, scale=scale, ratio=ratio, interpolation=interpolation - ) + transform = T.RandomResizedCrop(size=size, scale=scale, ratio=ratio, interpolation=interpolation) s_transform = torch.jit.script(transform) _test_transform_vs_scripted(transform, s_transform, tensor) _test_transform_vs_scripted_on_batch(transform, s_transform, batch_tensors) + +@cpu_only +def test_resized_crop_save(): + transform = T.RandomResizedCrop(size=[32, ]) + s_transform = torch.jit.script(transform) with get_tmp_dir() as tmp_dir: s_transform.save(os.path.join(tmp_dir, "t_resized_crop.pt")) From 8941b8fe8d13c91c7a11b823d14d3a7d23585337 Mon Sep 17 00:00:00 2001 From: Anirudh Dagar Date: Wed, 9 Jun 2021 15:41:03 +0530 Subject: [PATCH 04/10] fix test bug: remove if statement --- test/test_transforms_tensor.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/test/test_transforms_tensor.py b/test/test_transforms_tensor.py index 82f66bf4d03..c8a8f9367fa 100644 --- a/test/test_transforms_tensor.py +++ b/test/test_transforms_tensor.py @@ -671,11 +671,6 @@ def test_resize(dt, size, max_size, interpolation, device): if max_size is not None and isinstance(size, Sequence) and len(size) != 1: pass # Not supported else: - if isinstance(size, int): - script_size = [size, ] - else: - script_size = size - transform = T.Resize(size=script_size, interpolation=interpolation, max_size=max_size) s_transform = torch.jit.script(transform) _test_transform_vs_scripted(transform, s_transform, tensor) From f03ea68d1181c90de952906818fd6dbc53bbf159 Mon Sep 17 00:00:00 2001 From: Anirudh Dagar Date: Wed, 9 Jun 2021 15:57:57 +0530 Subject: [PATCH 05/10] revert: if statement removal --- test/test_transforms_tensor.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test/test_transforms_tensor.py b/test/test_transforms_tensor.py index c8a8f9367fa..c0c3dec7773 100644 --- a/test/test_transforms_tensor.py +++ b/test/test_transforms_tensor.py @@ -435,6 +435,7 @@ def test_autoaugment(self): s_transform.save(os.path.join(tmp_dir, "t_autoaugment.pt")) +@pytest.mark.parametrize('device', cpu_and_gpu()) class TestColorJitter: @pytest.mark.parametrize('brightness', [0.1, 0.5, 1.0, 1.34, (0.3, 0.7), [0.4, 0.5]]) @@ -671,6 +672,11 @@ def test_resize(dt, size, max_size, interpolation, device): if max_size is not None and isinstance(size, Sequence) and len(size) != 1: pass # Not supported else: + if isinstance(size, int): + script_size = [size, ] + else: + script_size = size + transform = T.Resize(size=script_size, interpolation=interpolation, max_size=max_size) s_transform = torch.jit.script(transform) _test_transform_vs_scripted(transform, s_transform, tensor) From 1a75d615528fda08af12f225fdf042ed3149b436 Mon Sep 17 00:00:00 2001 From: Anirudh Dagar Date: Wed, 9 Jun 2021 16:40:58 +0530 Subject: [PATCH 06/10] add test_resize_int --- test/test_transforms_tensor.py | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/test/test_transforms_tensor.py b/test/test_transforms_tensor.py index c0c3dec7773..01811f1ce5e 100644 --- a/test/test_transforms_tensor.py +++ b/test/test_transforms_tensor.py @@ -646,23 +646,27 @@ def test_x_crop_save(method): scripted_fn.save(os.path.join(tmp_dir, "t_op_list_{}.pt".format(method))) -@pytest.mark.parametrize('device', cpu_and_gpu()) -@pytest.mark.parametrize('dt', [None, torch.float32, torch.float64]) -@pytest.mark.parametrize('size', [32, 34, [32, ], [32, 32], (32, 32), [34, 35]]) -@pytest.mark.parametrize('max_size', [None, 35, 1000]) -@pytest.mark.parametrize('interpolation', [BILINEAR, BICUBIC, NEAREST]) -def test_resize(dt, size, max_size, interpolation, device): +@cpu_only +@pytest.mark.parametrize('size', [32, 34, 35, 36, 38]) +def test_resize_int(size): # TODO: Minimal check for bug-fix, improve this later x = torch.rand(3, 32, 46) - t = T.Resize(size=38) + t = T.Resize(size=size) y = t(x) # If size is an int, smaller edge of the image will be matched to this number. # i.e, if height > width, then image will be rescaled to (size * height / width, size). assert isinstance(y, torch.Tensor) - assert y.shape[1] == 38 - assert y.shape[2] == int(38 * 46 / 32) + assert y.shape[1] == size + assert y.shape[2] == int(size * 46 / 32) + +@pytest.mark.parametrize('device', cpu_and_gpu()) +@pytest.mark.parametrize('dt', [None, torch.float32, torch.float64]) +@pytest.mark.parametrize('size', [[32, ], [32, 32], (32, 32), [34, 35]]) +@pytest.mark.parametrize('max_size', [None, 35, 1000]) +@pytest.mark.parametrize('interpolation', [BILINEAR, BICUBIC, NEAREST]) +def test_resize_scripted(dt, size, max_size, interpolation, device): tensor, _ = _create_data(height=34, width=36, device=device) batch_tensors = torch.randint(0, 256, size=(4, 3, 44, 56), dtype=torch.uint8, device=device) From 59d6270ea9a2ae3b5454e380760838f2a215d1b3 Mon Sep 17 00:00:00 2001 From: Anirudh Dagar Date: Wed, 9 Jun 2021 16:41:26 +0530 Subject: [PATCH 07/10] add xfail --- 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 01811f1ce5e..32421140fdd 100644 --- a/test/test_transforms_tensor.py +++ b/test/test_transforms_tensor.py @@ -674,7 +674,7 @@ def test_resize_scripted(dt, size, max_size, interpolation, device): # This is a trivial cast to float of uint8 data to test all cases tensor = tensor.to(dt) if max_size is not None and isinstance(size, Sequence) and len(size) != 1: - pass # Not supported + pytest.xfail() else: if isinstance(size, int): script_size = [size, ] From 00b9a2ce713709119e4cc299e5cfbfe5435bab12 Mon Sep 17 00:00:00 2001 From: Anirudh Dagar Date: Wed, 9 Jun 2021 16:42:12 +0530 Subject: [PATCH 08/10] remove if else since now we only test on list sizes for scripted --- test/test_transforms_tensor.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/test/test_transforms_tensor.py b/test/test_transforms_tensor.py index 32421140fdd..e5a8421062d 100644 --- a/test/test_transforms_tensor.py +++ b/test/test_transforms_tensor.py @@ -676,11 +676,6 @@ def test_resize_scripted(dt, size, max_size, interpolation, device): if max_size is not None and isinstance(size, Sequence) and len(size) != 1: pytest.xfail() else: - if isinstance(size, int): - script_size = [size, ] - else: - script_size = size - transform = T.Resize(size=script_size, interpolation=interpolation, max_size=max_size) s_transform = torch.jit.script(transform) _test_transform_vs_scripted(transform, s_transform, tensor) From 1c7fa7dfb5405c7b87052e47a2d7d0493f28d985 Mon Sep 17 00:00:00 2001 From: Anirudh Dagar Date: Wed, 9 Jun 2021 16:43:58 +0530 Subject: [PATCH 09/10] fix lint: remove empty line --- test/test_transforms_tensor.py | 1 - 1 file changed, 1 deletion(-) diff --git a/test/test_transforms_tensor.py b/test/test_transforms_tensor.py index e5a8421062d..5c36aa1aebb 100644 --- a/test/test_transforms_tensor.py +++ b/test/test_transforms_tensor.py @@ -646,7 +646,6 @@ def test_x_crop_save(method): scripted_fn.save(os.path.join(tmp_dir, "t_op_list_{}.pt".format(method))) - @cpu_only @pytest.mark.parametrize('size', [32, 34, 35, 36, 38]) def test_resize_int(size): From 6e9113106d20d6d12bec3a68bcd44f10bfaac241 Mon Sep 17 00:00:00 2001 From: Anirudh Dagar Date: Wed, 9 Jun 2021 17:16:44 +0530 Subject: [PATCH 10/10] resolve comments --- test/test_transforms_tensor.py | 134 +++++++++++++++------------------ 1 file changed, 62 insertions(+), 72 deletions(-) diff --git a/test/test_transforms_tensor.py b/test/test_transforms_tensor.py index 5c36aa1aebb..faf4d4dd00e 100644 --- a/test/test_transforms_tensor.py +++ b/test/test_transforms_tensor.py @@ -586,22 +586,15 @@ def test_center_crop(device): @pytest.mark.parametrize('device', cpu_and_gpu()) -@pytest.mark.parametrize('func, method, out_length', [ +@pytest.mark.parametrize('fn, method, out_length', [ # test_five_crop - ("five_crop", "FiveCrop", 5), + (F.five_crop, T.FiveCrop, 5), # test_ten_crop - ("ten_crop", "TenCrop", 10) + (F.ten_crop, T.TenCrop, 10) ]) -@pytest.mark.parametrize('fn_kwargs', [ - {"size": (5,)}, - {"size": [5, ]}, - {"size": (4, 5)}, - {"size": [4, 5]} -]) -def test_x_crop(func, method, out_length, fn_kwargs, device): - meth_kwargs = fn_kwargs - - fn = getattr(F, func) +@pytest.mark.parametrize('size', [(5, ), [5, ], (4, 5), [4, 5]]) +def test_x_crop(fn, method, out_length, size, device): + meth_kwargs = fn_kwargs = {'size': size} scripted_fn = torch.jit.script(fn) tensor, pil_img = _create_data(height=20, width=20, device=device) @@ -619,7 +612,7 @@ def test_x_crop(func, method, out_length, fn_kwargs, device): assert_equal(transformed_tensor, transformed_tensor_script) # test for class interface - fn = getattr(T, method)(**meth_kwargs) + fn = method(**meth_kwargs) scripted_fn = torch.jit.script(fn) output = scripted_fn(tensor) assert len(output) == len(transformed_t_list_script) @@ -646,69 +639,66 @@ def test_x_crop_save(method): scripted_fn.save(os.path.join(tmp_dir, "t_op_list_{}.pt".format(method))) -@cpu_only -@pytest.mark.parametrize('size', [32, 34, 35, 36, 38]) -def test_resize_int(size): - # TODO: Minimal check for bug-fix, improve this later - x = torch.rand(3, 32, 46) - t = T.Resize(size=size) - y = t(x) - # If size is an int, smaller edge of the image will be matched to this number. - # i.e, if height > width, then image will be rescaled to (size * height / width, size). - assert isinstance(y, torch.Tensor) - assert y.shape[1] == size - assert y.shape[2] == int(size * 46 / 32) - - -@pytest.mark.parametrize('device', cpu_and_gpu()) -@pytest.mark.parametrize('dt', [None, torch.float32, torch.float64]) -@pytest.mark.parametrize('size', [[32, ], [32, 32], (32, 32), [34, 35]]) -@pytest.mark.parametrize('max_size', [None, 35, 1000]) -@pytest.mark.parametrize('interpolation', [BILINEAR, BICUBIC, NEAREST]) -def test_resize_scripted(dt, size, max_size, interpolation, device): - tensor, _ = _create_data(height=34, width=36, device=device) - batch_tensors = torch.randint(0, 256, size=(4, 3, 44, 56), dtype=torch.uint8, device=device) - - if dt is not None: - # This is a trivial cast to float of uint8 data to test all cases - tensor = tensor.to(dt) - if max_size is not None and isinstance(size, Sequence) and len(size) != 1: - pytest.xfail() - else: - transform = T.Resize(size=script_size, interpolation=interpolation, max_size=max_size) +class TestResize: + @cpu_only + @pytest.mark.parametrize('size', [32, 34, 35, 36, 38]) + def test_resize_int(self, size): + # TODO: Minimal check for bug-fix, improve this later + x = torch.rand(3, 32, 46) + t = T.Resize(size=size) + y = t(x) + # If size is an int, smaller edge of the image will be matched to this number. + # i.e, if height > width, then image will be rescaled to (size * height / width, size). + assert isinstance(y, torch.Tensor) + assert y.shape[1] == size + assert y.shape[2] == int(size * 46 / 32) + + @pytest.mark.parametrize('device', cpu_and_gpu()) + @pytest.mark.parametrize('dt', [None, torch.float32, torch.float64]) + @pytest.mark.parametrize('size', [[32, ], [32, 32], (32, 32), [34, 35]]) + @pytest.mark.parametrize('max_size', [None, 35, 1000]) + @pytest.mark.parametrize('interpolation', [BILINEAR, BICUBIC, NEAREST]) + def test_resize_scripted(self, dt, size, max_size, interpolation, device): + tensor, _ = _create_data(height=34, width=36, device=device) + batch_tensors = torch.randint(0, 256, size=(4, 3, 44, 56), dtype=torch.uint8, device=device) + + if dt is not None: + # This is a trivial cast to float of uint8 data to test all cases + tensor = tensor.to(dt) + if max_size is not None and len(size) != 1: + pytest.xfail("with max_size, size must be a sequence with 2 elements") + + transform = T.Resize(size=size, interpolation=interpolation, max_size=max_size) s_transform = torch.jit.script(transform) _test_transform_vs_scripted(transform, s_transform, tensor) _test_transform_vs_scripted_on_batch(transform, s_transform, batch_tensors) + @cpu_only + def test_resize_save(self): + transform = T.Resize(size=[32, ]) + s_transform = torch.jit.script(transform) + with get_tmp_dir() as tmp_dir: + s_transform.save(os.path.join(tmp_dir, "t_resize.pt")) + + @pytest.mark.parametrize('device', cpu_and_gpu()) + @pytest.mark.parametrize('scale', [(0.7, 1.2), [0.7, 1.2]]) + @pytest.mark.parametrize('ratio', [(0.75, 1.333), [0.75, 1.333]]) + @pytest.mark.parametrize('size', [(32, ), [44, ], [32, ], [32, 32], (32, 32), [44, 55]]) + @pytest.mark.parametrize('interpolation', [NEAREST, BILINEAR, BICUBIC]) + def test_resized_crop(self, scale, ratio, size, interpolation, device): + tensor = torch.randint(0, 256, size=(3, 44, 56), dtype=torch.uint8, device=device) + batch_tensors = torch.randint(0, 256, size=(4, 3, 44, 56), dtype=torch.uint8, device=device) + transform = T.RandomResizedCrop(size=size, scale=scale, ratio=ratio, interpolation=interpolation) + s_transform = torch.jit.script(transform) + _test_transform_vs_scripted(transform, s_transform, tensor) + _test_transform_vs_scripted_on_batch(transform, s_transform, batch_tensors) -@cpu_only -def test_resize_save(): - transform = T.Resize(size=[32, ]) - s_transform = torch.jit.script(transform) - with get_tmp_dir() as tmp_dir: - s_transform.save(os.path.join(tmp_dir, "t_resize.pt")) - - -@pytest.mark.parametrize('device', cpu_and_gpu()) -@pytest.mark.parametrize('scale', [(0.7, 1.2), [0.7, 1.2]]) -@pytest.mark.parametrize('ratio', [(0.75, 1.333), [0.75, 1.333]]) -@pytest.mark.parametrize('size', [(32, ), [44, ], [32, ], [32, 32], (32, 32), [44, 55]]) -@pytest.mark.parametrize('interpolation', [NEAREST, BILINEAR, BICUBIC]) -def test_resized_crop(scale, ratio, size, interpolation, device): - tensor = torch.randint(0, 256, size=(3, 44, 56), dtype=torch.uint8, device=device) - batch_tensors = torch.randint(0, 256, size=(4, 3, 44, 56), dtype=torch.uint8, device=device) - transform = T.RandomResizedCrop(size=size, scale=scale, ratio=ratio, interpolation=interpolation) - s_transform = torch.jit.script(transform) - _test_transform_vs_scripted(transform, s_transform, tensor) - _test_transform_vs_scripted_on_batch(transform, s_transform, batch_tensors) - - -@cpu_only -def test_resized_crop_save(): - transform = T.RandomResizedCrop(size=[32, ]) - s_transform = torch.jit.script(transform) - with get_tmp_dir() as tmp_dir: - s_transform.save(os.path.join(tmp_dir, "t_resized_crop.pt")) + @cpu_only + def test_resized_crop_save(self): + transform = T.RandomResizedCrop(size=[32, ]) + s_transform = torch.jit.script(transform) + with get_tmp_dir() as tmp_dir: + s_transform.save(os.path.join(tmp_dir, "t_resized_crop.pt")) @unittest.skipIf(not torch.cuda.is_available(), reason="Skip if no CUDA device")