Skip to content

Commit 937c31f

Browse files
committed
fix: move cvcuda tests to centralized class, more guards againist no import, explicit imports in func
1 parent 9f8bec5 commit 937c31f

File tree

3 files changed

+64
-45
lines changed

3 files changed

+64
-45
lines changed

test/test_transforms_v2.py

Lines changed: 29 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -3884,7 +3884,15 @@ def test_kernel_video(self):
38843884

38853885
@pytest.mark.parametrize(
38863886
"make_input",
3887-
[make_image_tensor, make_image_pil, make_image, make_video],
3887+
[
3888+
make_image_tensor,
3889+
make_image_pil,
3890+
make_image,
3891+
make_video,
3892+
pytest.param(
3893+
make_image_cvcuda, marks=pytest.mark.skipif(not CVCUDA_AVAILABLE, reason="CVCUDA is not available")
3894+
),
3895+
],
38883896
)
38893897
def test_functional(self, make_input):
38903898
check_functional(F.gaussian_blur, make_input(), kernel_size=(3, 3))
@@ -3896,14 +3904,29 @@ def test_functional(self, make_input):
38963904
(F._misc._gaussian_blur_image_pil, PIL.Image.Image),
38973905
(F.gaussian_blur_image, tv_tensors.Image),
38983906
(F.gaussian_blur_video, tv_tensors.Video),
3907+
pytest.param(
3908+
F._misc._gaussian_blur_cvcuda,
3909+
cvcuda.Tensor,
3910+
marks=pytest.mark.skipif(not CVCUDA_AVAILABLE, reason="CVCUDA is not available"),
3911+
),
38993912
],
39003913
)
39013914
def test_functional_signature(self, kernel, input_type):
39023915
check_functional_kernel_signature_match(F.gaussian_blur, kernel=kernel, input_type=input_type)
39033916

39043917
@pytest.mark.parametrize(
39053918
"make_input",
3906-
[make_image_tensor, make_image_pil, make_image, make_bounding_boxes, make_segmentation_mask, make_video],
3919+
[
3920+
make_image_tensor,
3921+
make_image_pil,
3922+
make_image,
3923+
make_bounding_boxes,
3924+
make_segmentation_mask,
3925+
make_video,
3926+
pytest.param(
3927+
make_image_cvcuda, marks=pytest.mark.skipif(not CVCUDA_AVAILABLE, reason="CVCUDA is not available")
3928+
),
3929+
],
39073930
)
39083931
@pytest.mark.parametrize("device", cpu_and_cuda())
39093932
@pytest.mark.parametrize("sigma", [5, 2.0, (0.5, 2), [1.3, 2.7]])
@@ -3994,39 +4017,8 @@ def test_functional_image_correctness(self, dimensions, kernel_size, sigma, dtyp
39944017

39954018
torch.testing.assert_close(actual, expected, rtol=0, atol=1)
39964019

3997-
3998-
@pytest.mark.skipif(not CVCUDA_AVAILABLE, reason="test requires CVCUDA")
3999-
@needs_cuda
4000-
class TestGaussianBlurCVCUDA:
4001-
def test_kernel_image_errors(self):
4002-
image = make_image_cvcuda(batch_dims=(1,))
4003-
4004-
with pytest.raises(ValueError, match="kernel_size is a sequence its length should be 2"):
4005-
F.gaussian_blur_cvcuda(image, kernel_size=[1, 2, 3])
4006-
4007-
for kernel_size in [2, -1]:
4008-
with pytest.raises(ValueError, match="kernel_size should have odd and positive integers"):
4009-
F.gaussian_blur_cvcuda(image, kernel_size=kernel_size)
4010-
4011-
with pytest.raises(ValueError, match="sigma is a sequence, its length should be 2"):
4012-
F.gaussian_blur_cvcuda(image, kernel_size=1, sigma=[1, 2, 3])
4013-
4014-
with pytest.raises(TypeError, match="sigma should be either float or sequence of floats"):
4015-
F.gaussian_blur_cvcuda(image, kernel_size=1, sigma=object())
4016-
4017-
with pytest.raises(ValueError, match="sigma should have positive values"):
4018-
F.gaussian_blur_cvcuda(image, kernel_size=1, sigma=-1)
4019-
4020-
def test_functional(self):
4021-
check_functional(F.gaussian_blur, make_image_cvcuda(batch_dims=(1,)), kernel_size=(3, 3))
4022-
4023-
@pytest.mark.parametrize("device", cpu_and_cuda())
4024-
@pytest.mark.parametrize("sigma", [5, 2.0, (0.5, 2), [1.3, 2.7]])
4025-
def test_transform(self, device, sigma):
4026-
check_transform(
4027-
transforms.GaussianBlur(kernel_size=3, sigma=sigma), make_image_cvcuda(batch_dims=(1,), device=device)
4028-
)
4029-
4020+
@pytest.mark.skipif(not CVCUDA_AVAILABLE, reason="test requires CVCUDA")
4021+
@needs_cuda
40304022
@pytest.mark.parametrize(
40314023
("dimensions", "kernel_size", "sigma"),
40324024
[
@@ -4040,7 +4032,7 @@ def test_transform(self, device, sigma):
40404032
@pytest.mark.parametrize("color_space", ["RGB", "GRAY"])
40414033
@pytest.mark.parametrize("batch_dims", [(1,), (2,), (4,)])
40424034
@pytest.mark.parametrize("dtype", [torch.uint8, torch.float32])
4043-
def test_functional_image_correctness(self, dimensions, kernel_size, sigma, color_space, batch_dims, dtype):
4035+
def test_functional_cvcuda_parity(self, dimensions, kernel_size, sigma, color_space, batch_dims, dtype):
40444036
height, width = dimensions
40454037

40464038
image_tensor = make_image(
@@ -4049,7 +4041,7 @@ def test_functional_image_correctness(self, dimensions, kernel_size, sigma, colo
40494041
image_cvcuda = F.to_cvcuda_tensor(image_tensor)
40504042

40514043
expected = F.gaussian_blur_image(image_tensor, kernel_size=kernel_size, sigma=sigma)
4052-
actual = F.gaussian_blur_cvcuda(image_cvcuda, kernel_size=kernel_size, sigma=sigma)
4044+
actual = F._misc._gaussian_blur_cvcuda(image_cvcuda, kernel_size=kernel_size, sigma=sigma)
40534045
actual_torch = F.cvcuda_to_tensor(actual)
40544046

40554047
if dtype.is_floating_point:

torchvision/transforms/v2/functional/__init__.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,6 @@
147147
from ._misc import (
148148
convert_image_dtype,
149149
gaussian_blur,
150-
gaussian_blur_cvcuda,
151150
gaussian_blur_image,
152151
gaussian_blur_video,
153152
gaussian_noise,

torchvision/transforms/v2/functional/_misc.py

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ def _validate_kernel_size_and_sigma(
110110
kernel_size: Sequence[int] | int,
111111
sigma: Sequence[float | int] | float | int | None = None,
112112
) -> tuple[list[int], list[float]]:
113-
# TODO: consider deprecating integers from sigma on the future
113+
# duplicated logic from gaussian_blur_image for use in gaussian_blur_cvcuda
114114
if isinstance(kernel_size, int):
115115
kernel_size = [kernel_size, kernel_size]
116116
elif len(kernel_size) != 2:
@@ -146,7 +146,33 @@ def _validate_kernel_size_and_sigma(
146146
def gaussian_blur_image(
147147
image: torch.Tensor, kernel_size: list[int], sigma: Optional[list[float]] = None
148148
) -> torch.Tensor:
149-
kernel_size, sigma = _validate_kernel_size_and_sigma(kernel_size, sigma)
149+
# TODO: consider deprecating integers from sigma on the future
150+
if isinstance(kernel_size, int):
151+
kernel_size = [kernel_size, kernel_size]
152+
elif len(kernel_size) != 2:
153+
raise ValueError(f"If kernel_size is a sequence its length should be 2. Got {len(kernel_size)}")
154+
for ksize in kernel_size:
155+
if ksize % 2 == 0 or ksize < 0:
156+
raise ValueError(f"kernel_size should have odd and positive integers. Got {kernel_size}")
157+
158+
if sigma is None:
159+
sigma = [ksize * 0.15 + 0.35 for ksize in kernel_size]
160+
else:
161+
if isinstance(sigma, (list, tuple)):
162+
length = len(sigma)
163+
if length == 1:
164+
s = sigma[0]
165+
sigma = [s, s]
166+
elif length != 2:
167+
raise ValueError(f"If sigma is a sequence, its length should be 2. Got {length}")
168+
elif isinstance(sigma, (int, float)):
169+
s = float(sigma)
170+
sigma = [s, s]
171+
else:
172+
raise TypeError(f"sigma should be either float or sequence of floats. Got {type(sigma)}")
173+
for s in sigma:
174+
if s <= 0.0:
175+
raise ValueError(f"sigma should have positive values. Got {sigma}")
150176

151177
if image.numel() == 0:
152178
return image
@@ -197,11 +223,11 @@ def gaussian_blur_video(
197223
return gaussian_blur_image(video, kernel_size, sigma)
198224

199225

200-
def gaussian_blur_cvcuda(
201-
image: "cvcuda.Tensor",
202-
kernel_size: Sequence[int] | int,
203-
sigma: Sequence[float | int] | float | int | None = None,
226+
def _gaussian_blur_cvcuda(
227+
image: "cvcuda.Tensor", kernel_size: list[int], sigma: Optional[list[float]] = None
204228
) -> "cvcuda.Tensor":
229+
cvcuda = _import_cvcuda()
230+
205231
kernel_size, sigma = _validate_kernel_size_and_sigma(kernel_size, sigma)
206232

207233
return cvcuda.gaussian(
@@ -213,7 +239,9 @@ def gaussian_blur_cvcuda(
213239

214240

215241
if CVCUDA_AVAILABLE:
216-
_gaussian_blur_cvcuda = _register_kernel_internal(gaussian_blur, cvcuda.Tensor)(gaussian_blur_cvcuda)
242+
_gaussian_blur_cvcuda_registered = _register_kernel_internal(gaussian_blur, _import_cvcuda().Tensor)(
243+
_gaussian_blur_cvcuda
244+
)
217245

218246

219247
def gaussian_noise(inpt: torch.Tensor, mean: float = 0.0, sigma: float = 0.1, clip: bool = True) -> torch.Tensor:

0 commit comments

Comments
 (0)