Unverified Commit 50468715 authored by Rajat Jaiswal's avatar Rajat Jaiswal Committed by GitHub
Browse files

port the rest of test_transforms.py to pytest (#4026)

parent 5d614bd1
...@@ -219,8 +219,9 @@ def freeze_rng_state(): ...@@ -219,8 +219,9 @@ def freeze_rng_state():
def cycle_over(objs): def cycle_over(objs):
for idx, obj in enumerate(objs): for idx, obj1 in enumerate(objs):
yield obj, objs[:idx] + objs[idx + 1:] for obj2 in objs[:idx] + objs[idx + 1:]:
yield obj1, obj2
def int_dtypes(): def int_dtypes():
......
import itertools
import os import os
import torch import torch
import torchvision.transforms as transforms import torchvision.transforms as transforms
import torchvision.transforms.functional as F import torchvision.transforms.functional as F
import torchvision.transforms.functional_tensor as F_t import torchvision.transforms.functional_tensor as F_t
from torch._utils_internal import get_file_path_2 from torch._utils_internal import get_file_path_2
from numpy.testing import assert_array_almost_equal
import unittest
import math import math
import random import random
import numpy as np import numpy as np
...@@ -30,126 +27,118 @@ GRACE_HOPPER = get_file_path_2( ...@@ -30,126 +27,118 @@ GRACE_HOPPER = get_file_path_2(
os.path.dirname(os.path.abspath(__file__)), 'assets', 'encode_jpeg', 'grace_hopper_517x606.jpg') os.path.dirname(os.path.abspath(__file__)), 'assets', 'encode_jpeg', 'grace_hopper_517x606.jpg')
class Tester(unittest.TestCase): class TestConvertImageDtype:
@pytest.mark.parametrize('input_dtype, output_dtype', cycle_over(float_dtypes()))
def test_convert_image_dtype_float_to_float(self): def test_float_to_float(self, input_dtype, output_dtype):
for input_dtype, output_dtypes in cycle_over(float_dtypes()): input_image = torch.tensor((0.0, 1.0), dtype=input_dtype)
input_image = torch.tensor((0.0, 1.0), dtype=input_dtype) transform = transforms.ConvertImageDtype(output_dtype)
for output_dtype in output_dtypes: transform_script = torch.jit.script(F.convert_image_dtype)
with self.subTest(input_dtype=input_dtype, output_dtype=output_dtype):
transform = transforms.ConvertImageDtype(output_dtype) output_image = transform(input_image)
transform_script = torch.jit.script(F.convert_image_dtype) output_image_script = transform_script(input_image, output_dtype)
output_image = transform(input_image) torch.testing.assert_close(output_image_script, output_image, rtol=0.0, atol=1e-6)
output_image_script = transform_script(input_image, output_dtype)
actual_min, actual_max = output_image.tolist()
torch.testing.assert_close(output_image_script, output_image, rtol=0.0, atol=1e-6) desired_min, desired_max = 0.0, 1.0
actual_min, actual_max = output_image.tolist() assert abs(actual_min - desired_min) < 1e-7
desired_min, desired_max = 0.0, 1.0 assert abs(actual_max - desired_max) < 1e-7
self.assertAlmostEqual(actual_min, desired_min) @pytest.mark.parametrize('input_dtype', float_dtypes())
self.assertAlmostEqual(actual_max, desired_max) @pytest.mark.parametrize('output_dtype', int_dtypes())
def test_float_to_int(self, input_dtype, output_dtype):
def test_convert_image_dtype_float_to_int(self): input_image = torch.tensor((0.0, 1.0), dtype=input_dtype)
for input_dtype in float_dtypes(): transform = transforms.ConvertImageDtype(output_dtype)
input_image = torch.tensor((0.0, 1.0), dtype=input_dtype) transform_script = torch.jit.script(F.convert_image_dtype)
for output_dtype in int_dtypes():
with self.subTest(input_dtype=input_dtype, output_dtype=output_dtype): if (input_dtype == torch.float32 and output_dtype in (torch.int32, torch.int64)) or (
transform = transforms.ConvertImageDtype(output_dtype) input_dtype == torch.float64 and output_dtype == torch.int64
transform_script = torch.jit.script(F.convert_image_dtype) ):
with pytest.raises(RuntimeError):
if (input_dtype == torch.float32 and output_dtype in (torch.int32, torch.int64)) or ( transform(input_image)
input_dtype == torch.float64 and output_dtype == torch.int64 else:
): output_image = transform(input_image)
with self.assertRaises(RuntimeError): output_image_script = transform_script(input_image, output_dtype)
transform(input_image)
else: torch.testing.assert_close(output_image_script, output_image, rtol=0.0, atol=1e-6)
output_image = transform(input_image)
output_image_script = transform_script(input_image, output_dtype) actual_min, actual_max = output_image.tolist()
desired_min, desired_max = 0, torch.iinfo(output_dtype).max
torch.testing.assert_close(output_image_script, output_image, rtol=0.0, atol=1e-6)
assert actual_min == desired_min
actual_min, actual_max = output_image.tolist() assert actual_max == desired_max
desired_min, desired_max = 0, torch.iinfo(output_dtype).max
@pytest.mark.parametrize('input_dtype', int_dtypes())
self.assertEqual(actual_min, desired_min) @pytest.mark.parametrize('output_dtype', float_dtypes())
self.assertEqual(actual_max, desired_max) def test_int_to_float(self, input_dtype, output_dtype):
input_image = torch.tensor((0, torch.iinfo(input_dtype).max), dtype=input_dtype)
def test_convert_image_dtype_int_to_float(self): transform = transforms.ConvertImageDtype(output_dtype)
for input_dtype in int_dtypes(): transform_script = torch.jit.script(F.convert_image_dtype)
input_image = torch.tensor((0, torch.iinfo(input_dtype).max), dtype=input_dtype)
for output_dtype in float_dtypes(): output_image = transform(input_image)
with self.subTest(input_dtype=input_dtype, output_dtype=output_dtype): output_image_script = transform_script(input_image, output_dtype)
transform = transforms.ConvertImageDtype(output_dtype)
transform_script = torch.jit.script(F.convert_image_dtype) torch.testing.assert_close(output_image_script, output_image, rtol=0.0, atol=1e-6)
output_image = transform(input_image) actual_min, actual_max = output_image.tolist()
output_image_script = transform_script(input_image, output_dtype) desired_min, desired_max = 0.0, 1.0
torch.testing.assert_close(output_image_script, output_image, rtol=0.0, atol=1e-6) assert abs(actual_min - desired_min) < 1e-7
assert actual_min >= desired_min
actual_min, actual_max = output_image.tolist() assert abs(actual_max - desired_max) < 1e-7
desired_min, desired_max = 0.0, 1.0 assert actual_max <= desired_max
self.assertAlmostEqual(actual_min, desired_min) @pytest.mark.parametrize('input_dtype, output_dtype', cycle_over(int_dtypes()))
self.assertGreaterEqual(actual_min, desired_min) def test_dtype_int_to_int(self, input_dtype, output_dtype):
self.assertAlmostEqual(actual_max, desired_max) input_max = torch.iinfo(input_dtype).max
self.assertLessEqual(actual_max, desired_max) input_image = torch.tensor((0, input_max), dtype=input_dtype)
output_max = torch.iinfo(output_dtype).max
def test_convert_image_dtype_int_to_int(self):
for input_dtype, output_dtypes in cycle_over(int_dtypes()): transform = transforms.ConvertImageDtype(output_dtype)
input_max = torch.iinfo(input_dtype).max transform_script = torch.jit.script(F.convert_image_dtype)
input_image = torch.tensor((0, input_max), dtype=input_dtype)
for output_dtype in output_dtypes: output_image = transform(input_image)
output_max = torch.iinfo(output_dtype).max output_image_script = transform_script(input_image, output_dtype)
with self.subTest(input_dtype=input_dtype, output_dtype=output_dtype): torch.testing.assert_close(
transform = transforms.ConvertImageDtype(output_dtype) output_image_script,
transform_script = torch.jit.script(F.convert_image_dtype) output_image,
rtol=0.0,
output_image = transform(input_image) atol=1e-6,
output_image_script = transform_script(input_image, output_dtype) msg="{} vs {}".format(output_image_script, output_image),
)
torch.testing.assert_close(
output_image_script, actual_min, actual_max = output_image.tolist()
output_image, desired_min, desired_max = 0, output_max
rtol=0.0,
atol=1e-6, # see https://github.com/pytorch/vision/pull/2078#issuecomment-641036236 for details
msg="{} vs {}".format(output_image_script, output_image), if input_max >= output_max:
) error_term = 0
else:
actual_min, actual_max = output_image.tolist() error_term = 1 - (torch.iinfo(output_dtype).max + 1) // (torch.iinfo(input_dtype).max + 1)
desired_min, desired_max = 0, output_max
assert actual_min == desired_min
# see https://github.com/pytorch/vision/pull/2078#issuecomment-641036236 for details assert actual_max == (desired_max + error_term)
if input_max >= output_max:
error_term = 0 @pytest.mark.parametrize('input_dtype, output_dtype', cycle_over(int_dtypes()))
else: def test_int_to_int_consistency(self, input_dtype, output_dtype):
error_term = 1 - (torch.iinfo(output_dtype).max + 1) // (torch.iinfo(input_dtype).max + 1) input_max = torch.iinfo(input_dtype).max
input_image = torch.tensor((0, input_max), dtype=input_dtype)
self.assertEqual(actual_min, desired_min)
self.assertEqual(actual_max, desired_max + error_term) output_max = torch.iinfo(output_dtype).max
if output_max <= input_max:
def test_convert_image_dtype_int_to_int_consistency(self): return
for input_dtype, output_dtypes in cycle_over(int_dtypes()):
input_max = torch.iinfo(input_dtype).max transform = transforms.ConvertImageDtype(output_dtype)
input_image = torch.tensor((0, input_max), dtype=input_dtype) inverse_transfrom = transforms.ConvertImageDtype(input_dtype)
for output_dtype in output_dtypes: output_image = inverse_transfrom(transform(input_image))
output_max = torch.iinfo(output_dtype).max
if output_max <= input_max: actual_min, actual_max = output_image.tolist()
continue desired_min, desired_max = 0, input_max
with self.subTest(input_dtype=input_dtype, output_dtype=output_dtype): assert actual_min == desired_min
transform = transforms.ConvertImageDtype(output_dtype) assert actual_max == desired_max
inverse_transfrom = transforms.ConvertImageDtype(input_dtype)
output_image = inverse_transfrom(transform(input_image))
actual_min, actual_max = output_image.tolist()
desired_min, desired_max = 0, input_max
self.assertEqual(actual_min, desired_min)
self.assertEqual(actual_max, desired_max)
@pytest.mark.skipif(accimage is None, reason="accimage not available") @pytest.mark.skipif(accimage is None, reason="accimage not available")
...@@ -2120,4 +2109,4 @@ def test_random_affine(): ...@@ -2120,4 +2109,4 @@ def test_random_affine():
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() pytest.main([__file__])
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment