|
- import cv2
- import numpy as np
- import paddle
- import patta as tta
- import pytest
-
-
- @pytest.mark.parametrize(
- "transform",
- [
- tta.HorizontalFlip(),
- tta.VerticalFlip(),
- tta.HorizontalShift(shifts=[0.1, 0.2, 0.4]),
- tta.VerticalShift(shifts=[0.1, 0.2, 0.4]),
- tta.Rotate90(angles=[0, 90, 180, 270]),
- tta.Scale(scales=[1, 2, 4], interpolation="nearest"),
- tta.Resize(sizes=[(4, 5), (8, 10)], original_size=(4, 5), interpolation="nearest"),
- ],
- )
- def test_aug_deaug_mask(transform):
- a = paddle.arange(20).reshape((1, 1, 4, 5)).astype(paddle.float32)
- for p in transform.params:
- aug = transform.apply_aug_image(a, **{transform.pname: p})
- deaug = transform.apply_deaug_mask(aug, **{transform.pname: p})
- assert paddle.allclose(a, deaug)
-
-
- @pytest.mark.parametrize(
- "transform",
- [
- tta.HorizontalFlip(),
- tta.VerticalFlip(),
- tta.HorizontalShift(shifts=[0.1, 0.2, 0.4]),
- tta.VerticalShift(shifts=[0.1, 0.2, 0.4]),
- tta.Rotate90(angles=[0, 90, 180, 270]),
- tta.Scale(scales=[1, 2, 4], interpolation="nearest"),
- tta.Add(values=[-1, 0, 1, 2]),
- tta.Multiply(factors=[-1, 0, 1, 2]),
- tta.FiveCrops(crop_height=3, crop_width=5),
- tta.Resize(sizes=[(4, 5), (8, 10), (2, 2)], interpolation="nearest"),
- tta.AdjustBrightness(factors=[0.5, 1.0, 1.5]),
- tta.AdjustContrast(factors=[0.5, 1.0, 1.5]),
- tta.AverageBlur(kernel_sizes=[(3, 3), (5, 3)]),
- tta.GaussianBlur(kernel_sizes=[(3, 3), (5, 3)], sigma=0.3),
- tta.Sharpen(kernel_sizes=[3]),
- ],
- )
- def test_label_is_same(transform):
- a = paddle.arange(20).reshape((1, 1, 4, 5)).astype(paddle.float32)
- for p in transform.params:
- aug = transform.apply_aug_image(a, **{transform.pname: p})
- deaug = transform.apply_deaug_label(aug, **{transform.pname: p})
- assert paddle.allclose(aug, deaug)
-
-
- @pytest.mark.parametrize(
- "transform",
- [
- tta.HorizontalFlip(),
- tta.VerticalFlip(),
- ],
- )
- def test_flip_keypoints(transform):
- keypoints = paddle.to_tensor([[0.1, 0.1], [0.1, 0.9], [0.9, 0.1], [0.9, 0.9], [0.4, 0.3]])
- for p in transform.params:
- aug = transform.apply_deaug_keypoints(keypoints.detach().clone(), **{transform.pname: p})
- deaug = transform.apply_deaug_keypoints(aug, **{transform.pname: p})
- assert paddle.allclose(keypoints, deaug)
-
-
- @pytest.mark.parametrize(
- "transform",
- [
- tta.Rotate90(angles=[0, 90, 180, 270]),
- tta.HorizontalShift(shifts=[0.1, 0.2, 0.4]),
- tta.VerticalShift(shifts=[0.1, 0.2, 0.4]),
- ],
- )
- def test_rotate90_and_shift_keypoints(transform):
- keypoints = paddle.to_tensor([[0.1, 0.1], [0.1, 0.9], [0.9, 0.1], [0.9, 0.9], [0.4, 0.3]])
- for p in transform.params:
- aug = transform.apply_deaug_keypoints(keypoints.detach().clone(), **{transform.pname: p})
- deaug = transform.apply_deaug_keypoints(aug, **{transform.pname: -p})
- assert paddle.allclose(keypoints, deaug)
-
-
- def test_add_transform():
- transform = tta.Add(values=[-1, 0, 1])
- a = paddle.arange(20).reshape((1, 1, 4, 5)).astype(paddle.float32)
- for p in transform.params:
- aug = transform.apply_aug_image(a, **{transform.pname: p})
- assert paddle.allclose(aug, a + p)
-
-
- def test_multiply_transform():
- transform = tta.Multiply(factors=[-1, 0, 1])
- a = paddle.arange(20).reshape((1, 1, 4, 5)).astype(paddle.float32)
- for p in transform.params:
- aug = transform.apply_aug_image(a, **{transform.pname: p})
- assert paddle.allclose(aug, a * p)
-
-
- def test_fivecrop_transform():
- transform = tta.FiveCrops(crop_height=1, crop_width=1)
- a = paddle.arange(25).reshape((1, 1, 5, 5)).astype(paddle.float32)
- output = [0, 20, 24, 4, 12]
- for i, p in enumerate(transform.params):
- aug = transform.apply_aug_image(a, **{transform.pname: p})
- assert aug.item() == output[i]
-
-
- def test_resize_transform():
- transform = tta.Resize(sizes=[(10, 10), (5, 5)], original_size=(5, 5))
- a = paddle.arange(25).reshape((1, 1, 5, 5)).astype(paddle.float32)
- output = [
- [
- [0, 0, 1, 1, 2, 2, 3, 3, 4, 4],
- [0, 0, 1, 1, 2, 2, 3, 3, 4, 4],
- [5, 5, 6, 6, 7, 7, 8, 8, 9, 9],
- [5, 5, 6, 6, 7, 7, 8, 8, 9, 9],
- [10, 10, 11, 11, 12, 12, 13, 13, 14, 14],
- [10, 10, 11, 11, 12, 12, 13, 13, 14, 14],
- [15, 15, 16, 16, 17, 17, 18, 18, 19, 19],
- [15, 15, 16, 16, 17, 17, 18, 18, 19, 19],
- [20, 20, 21, 21, 22, 22, 23, 23, 24, 24],
- [20, 20, 21, 21, 22, 22, 23, 23, 24, 24],
- ],
- [
- [0, 1, 2, 3, 4],
- [5, 6, 7, 8, 9],
- [10, 11, 12, 13, 14],
- [15, 16, 17, 18, 19],
- [20, 21, 22, 23, 24],
- ],
- ]
-
- for i, p in enumerate(transform.params):
- aug = transform.apply_aug_image(a, **{transform.pname: p})
- assert paddle.allclose(aug.reshape((aug.shape[-2], aug.shape[-1])), paddle.to_tensor(output[i], paddle.float32))
-
-
- def test_adjust_brightness_transform():
- transform = tta.AdjustBrightness(factors=[0.5, 1.5])
- a = paddle.arange(25).reshape((1, 1, 5, 5)).astype(paddle.float32)
- a = paddle.concat([a, a, a], axis=1)
- output = [
- [
- [0, 1, 2, 3, 4],
- [5, 6, 7, 8, 9],
- [10, 11, 12, 13, 14],
- [15, 16, 17, 18, 19],
- [20, 21, 22, 23, 24],
- ],
- [
- [0, 0, 1, 1, 2],
- [2, 3, 3, 4, 4],
- [5, 5, 6, 6, 7],
- [7, 8, 8, 9, 9],
- [10, 10, 11, 11, 12],
- ],
- [
- [0, 1, 3, 4, 6],
- [7, 9, 10, 12, 13],
- [15, 16, 18, 19, 21],
- [22, 24, 25, 27, 28],
- [30, 31, 33, 34, 36],
- ],
- ]
- for i, p in enumerate(transform.params):
- aug = transform.apply_aug_image(a, **{transform.pname: p})
- assert paddle.allclose(aug[0, 0], paddle.to_tensor(output[i], paddle.float32))
-
-
- def test_adjust_contrast_transform():
- transform = tta.AdjustContrast(factors=[0.5, 1.2])
- a = paddle.arange(25).reshape((1, 1, 5, 5)).astype(paddle.float32)
- a = paddle.concat([a, a, a], axis=1)
- output = [
- [
- [0, 1, 2, 3, 4],
- [5, 6, 7, 8, 9],
- [10, 11, 12, 13, 14],
- [15, 16, 17, 18, 19],
- [20, 21, 22, 23, 24],
- ],
- [
- [37, 37, 38, 38, 39],
- [39, 40, 40, 41, 41],
- [42, 42, 43, 43, 44],
- [44, 45, 45, 46, 46],
- [47, 47, 48, 48, 49],
- ],
- [
- [0, 0, 0, 0, 0],
- [0, 0, 0, 0, 0],
- [0, 0, 0, 0, 2],
- [3, 4, 5, 6, 8],
- [9, 10, 11, 12, 14],
- ],
- ]
- for i, p in enumerate(transform.params):
- aug = transform.apply_aug_image(a, **{transform.pname: p})
- assert paddle.allclose(aug[0, 0], paddle.to_tensor(output[i], paddle.float32))
-
-
- def test_average_blur_transform():
- transform = tta.AverageBlur(kernel_sizes=[(3, 3), (5, 7)])
- img = np.random.randint(0, 255, size=(224, 224, 3)).astype(np.float32)
-
- for i, kernel_size in enumerate(transform.params):
- if isinstance(kernel_size, int):
- kernel_size = (kernel_size, kernel_size)
-
- if kernel_size == (1, 1):
- img_aug_cv2 = img
- else:
- img_aug_cv2 = cv2.blur(img, kernel_size)
-
- img_tensor = paddle.to_tensor(img).unsqueeze(0).transpose((0, 3, 1, 2))
- img_tensor_aug = transform.apply_aug_image(img_tensor, kernel_size=kernel_size)
- img_tensor_aug = img_tensor_aug.transpose((0, 2, 3, 1)).squeeze(0)
- img_aug = img_tensor_aug.numpy()
-
- pad_x = (kernel_size[0] - 1) // 2
- pad_y = (kernel_size[1] - 1) // 2
- if kernel_size[0] == 1:
- assert np.allclose(img_aug_cv2, img_aug)
- else:
- assert np.allclose(img_aug_cv2[pad_y : -pad_y, pad_x: -pad_x], img_aug[pad_y : -pad_y, pad_x: -pad_x])
-
-
- @pytest.mark.parametrize(
- "sigma",
- [
- (0.3, 0.3),
- (0.5, 0.7),
- ],
- )
- def test_gaussian_blur_transform(sigma):
- transform = tta.GaussianBlur(kernel_sizes=[(3, 3), (5, 7)], sigma=sigma)
- img = np.random.randint(0, 255, size=(224, 224, 3)).astype(np.float32)
-
- for i, kernel_size in enumerate(transform.params):
- if isinstance(kernel_size, int):
- kernel_size = (kernel_size, kernel_size)
-
- if kernel_size == (1, 1):
- img_aug_cv2 = img
- else:
- img_aug_cv2 = cv2.GaussianBlur(img, kernel_size, sigmaX=sigma[0], sigmaY=sigma[1])
-
- img_tensor = paddle.to_tensor(img).unsqueeze(0).transpose((0, 3, 1, 2))
- img_tensor_aug = transform.apply_aug_image(img_tensor, kernel_size=kernel_size)
- img_tensor_aug = img_tensor_aug.transpose((0, 2, 3, 1)).squeeze(0)
- img_aug = img_tensor_aug.numpy()
-
- pad_x = (kernel_size[0] - 1) // 2
- pad_y = (kernel_size[1] - 1) // 2
- if kernel_size[0] == 1:
- assert np.allclose(img_aug_cv2, img_aug)
- else:
- assert np.allclose(img_aug_cv2[pad_y : -pad_y, pad_x: -pad_x], img_aug[pad_y : -pad_y, pad_x: -pad_x])
-
-
- def test_sharpen_transform():
- transform = tta.Sharpen(kernel_sizes=[3, 5, 7])
- img = np.linspace(0, 240, 224 * 224 * 3).reshape(224, 224, 3).astype(np.float32)
- noise = np.random.randint(0, 5, size=(224, 224, 3)).astype(np.float32)
- img += noise
-
- for i, kernel_size in enumerate(transform.params):
- if kernel_size == 1:
- img_aug_cv2 = img
- else:
- img_laplacian_kernel = tta.functional.get_laplacian_kernel(kernel_size).astype(np.float32)
- img_laplacian = cv2.filter2D(img, -1, img_laplacian_kernel)
- img_aug_cv2 = cv2.addWeighted(img, 1, img_laplacian, -1, 0)
- img_aug_cv2 = np.clip(img_aug_cv2, 0, 255)
-
- img_tensor = paddle.to_tensor(img).unsqueeze(0).transpose((0, 3, 1, 2))
- img_tensor_aug = transform.apply_aug_image(img_tensor, kernel_size=kernel_size)
- img_tensor_aug = img_tensor_aug.transpose((0, 2, 3, 1)).squeeze(0)
- img_aug = img_tensor_aug.numpy()
-
- pad = (kernel_size - 1) // 2
- if kernel_size == 1:
- assert np.allclose(img_aug_cv2, img_aug)
- else:
- # 按理说这应该过的,而且本地也是 100% 通过,但 CI 上就是有精度误差,因此暂时放宽限制
- # assert np.allclose(img_aug_cv2[pad:-pad, pad:-pad], img_aug[pad:-pad, pad:-pad])
- assert np.abs(img_aug_cv2[pad:-pad, pad:-pad] - img_aug[pad:-pad, pad:-pad]).max() < 1e-2
|