Files
kornia--kornia/tests/augmentation/test_auto_operation.py
T
wehub-resource-sync 3a2c66702c
Tests on CPU (scheduled) / check-skip (push) Has been cancelled
Tests on CPU (scheduled) / pre-tests (push) Has been cancelled
Tests on CPU (scheduled) / tests-cpu-ubuntu (float32) (push) Has been cancelled
Tests on CPU (scheduled) / tests-cpu-ubuntu (float64) (push) Has been cancelled
Tests on CPU (scheduled) / tests-cpu-windows (3.11, float32, 2.5.1) (push) Has been cancelled
Tests on CPU (scheduled) / tests-cpu-windows (3.11, float32, 2.9.1) (push) Has been cancelled
Tests on CPU (scheduled) / tests-cpu-windows (3.11, float64, 2.5.1) (push) Has been cancelled
Tests on CPU (scheduled) / tests-cpu-windows (3.11, float64, 2.9.1) (push) Has been cancelled
Tests on CPU (scheduled) / tests-cpu-windows (3.12, float32, 2.5.1) (push) Has been cancelled
Tests on CPU (scheduled) / tests-cpu-windows (3.12, float32, 2.9.1) (push) Has been cancelled
Tests on CPU (scheduled) / tests-cpu-windows (3.12, float64, 2.5.1) (push) Has been cancelled
Tests on CPU (scheduled) / tests-cpu-windows (3.12, float64, 2.9.1) (push) Has been cancelled
Tests on CPU (scheduled) / tests-cpu-windows (3.13, float32, 2.9.1) (push) Has been cancelled
Tests on CPU (scheduled) / tests-cpu-windows (3.13, float64, 2.9.1) (push) Has been cancelled
Tests on CPU (scheduled) / tests-cpu-mac (3.11, float32, 2.5.1) (push) Has been cancelled
Tests on CPU (scheduled) / tests-cpu-mac (3.11, float32, 2.9.1) (push) Has been cancelled
Tests on CPU (scheduled) / tests-cpu-mac (3.12, float32, 2.5.1) (push) Has been cancelled
Tests on CPU (scheduled) / tests-cpu-mac (3.12, float32, 2.9.1) (push) Has been cancelled
Tests on CPU (scheduled) / tests-cpu-mac (3.13, float32, 2.9.1) (push) Has been cancelled
Tests on CPU (scheduled) / coverage (push) Has been cancelled
Tests on CPU (scheduled) / typing (push) Has been cancelled
Tests on CPU (scheduled) / tutorials (push) Has been cancelled
Tests on CPU (scheduled) / docs (push) Has been cancelled
Lint / TOML Format (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:49:27 +08:00

145 lines
6.0 KiB
Python

# LICENSE HEADER MANAGED BY add-license-header
#
# Copyright 2018 Kornia Team
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
import inspect
from typing import List
import pytest
import torch
from kornia.augmentation.auto.autoaugment import AutoAugment
from kornia.augmentation.auto.operations import OperationBase, ops
from kornia.augmentation.auto.rand_augment.rand_augment import RandAugment
from kornia.augmentation.auto.rand_augment.rand_augment import default_policy as randaug_config
from kornia.augmentation.auto.trivial_augment import TrivialAugment
from kornia.augmentation.container import AugmentationSequential
from kornia.geometry.bbox import bbox_to_mask
from testing.augmentation.utils import reproducibility_test
from testing.base import BaseTester
def _find_all_ops() -> List[OperationBase]:
_ops = [op for _, op in inspect.getmembers(ops, inspect.isclass)]
return [op() for op in _ops if issubclass(op, OperationBase) and op != OperationBase]
def _test_sequential(augment_method, device, dtype):
inp = torch.rand(1, 3, 1000, 500, device=device, dtype=dtype)
bbox = torch.tensor([[[355, 10], [660, 10], [660, 250], [355, 250]]], device=device, dtype=dtype)
keypoints = torch.tensor([[[465, 115], [545, 116]]], device=device, dtype=dtype)
mask = bbox_to_mask(
torch.tensor([[[155, 0], [900, 0], [900, 400], [155, 400]]], device=device, dtype=dtype), 1000, 500
)[:, None]
aug = AugmentationSequential(augment_method, data_keys=["input", "mask", "bbox", "keypoints"])
out = aug(inp, mask, bbox, keypoints)
assert out[0].shape == inp.shape
assert out[1].shape == mask.shape
assert out[2].shape == bbox.shape
assert out[3].shape == keypoints.shape
assert set(out[1].unique().tolist()).issubset(set(mask.unique().tolist()))
out_inv = aug.inverse(*out)
assert out_inv[0].shape == inp.shape
assert out_inv[1].shape == mask.shape
assert out_inv[2].shape == bbox.shape
assert out_inv[3].shape == keypoints.shape
assert set(out_inv[1].unique().tolist()).issubset(set(mask.unique().tolist()))
reproducibility_test((inp, mask, bbox, keypoints), aug)
class TestAutoAugment(BaseTester):
@pytest.mark.parametrize("policy", ["imagenet", "cifar10", "svhn", [[("shear_x", 0.9, 4), ("invert", 0.2, None)]]])
def test_smoke(self, policy, device, dtype):
aug = AutoAugment(policy)
in_tensor = torch.rand(10, 3, 50, 50, device=device, dtype=dtype, requires_grad=True)
aug(in_tensor)
aug.is_intensity_only()
def test_transform_mat(self, device, dtype):
aug = AutoAugment([[("shear_x", 0.9, 4), ("invert", 0.2, None)]], transformation_matrix_mode="silence")
in_tensor = torch.rand(10, 3, 50, 50, device=device, dtype=dtype, requires_grad=True)
aug(in_tensor)
trans = aug.get_transformation_matrix(in_tensor, params=aug._params)
self.assert_close(trans, aug.transform_matrix)
def test_reproduce(self, device, dtype):
aug = AutoAugment()
in_tensor = torch.rand(10, 3, 50, 50, device=device, dtype=dtype, requires_grad=True)
out_tensor = aug(in_tensor)
out_tensor_2 = aug(in_tensor, params=aug._params)
self.assert_close(out_tensor, out_tensor_2)
def test_sequential(augment_method, device, dtype):
_test_sequential(AutoAugment(), device=device, dtype=dtype)
class TestRandAugment(BaseTester):
@pytest.mark.parametrize("policy", [None, [[("translate_y", -0.5, 0.5)]]])
def test_smoke(self, policy):
if policy is None:
n = len(randaug_config)
else:
n = 1
aug = RandAugment(n=n, m=15, policy=policy)
in_tensor = torch.rand(10, 3, 50, 50, requires_grad=True)
aug(in_tensor)
def test_transform_mat(self, device, dtype):
aug = RandAugment(n=3, m=15)
in_tensor = torch.rand(10, 3, 50, 50, device=device, dtype=dtype, requires_grad=True)
aug(in_tensor)
trans = aug.get_transformation_matrix(in_tensor, params=aug._params)
self.assert_close(trans, aug.transform_matrix)
def test_reproduce(self, device, dtype):
aug = RandAugment(n=3, m=15)
in_tensor = torch.rand(10, 3, 50, 50, device=device, dtype=dtype, requires_grad=True)
out_tensor = aug(in_tensor)
out_tensor_2 = aug(in_tensor, params=aug._params)
self.assert_close(out_tensor, out_tensor_2)
def test_sequential(augment_method, device, dtype):
_test_sequential(RandAugment(n=3, m=15), device=device, dtype=dtype)
class TestTrivialAugment(BaseTester):
@pytest.mark.parametrize("policy", [None, [[("translate_y", -0.5, 0.5)]]])
def test_smoke(self, policy):
aug = TrivialAugment(policy=policy)
in_tensor = torch.rand(10, 3, 50, 50, requires_grad=True)
aug(in_tensor)
def test_transform_mat(self, device, dtype):
aug = TrivialAugment()
in_tensor = torch.rand(10, 3, 50, 50, device=device, dtype=dtype, requires_grad=True)
aug(in_tensor)
aug(in_tensor)
trans = aug.get_transformation_matrix(in_tensor, params=aug._params)
self.assert_close(trans, aug.transform_matrix)
def test_reproduce(self, device, dtype):
aug = TrivialAugment()
in_tensor = torch.rand(10, 3, 50, 50, device=device, dtype=dtype, requires_grad=True)
out_tensor = aug(in_tensor)
out_tensor_2 = aug(in_tensor, params=aug._params)
self.assert_close(out_tensor, out_tensor_2)
def test_sequential(augment_method, device, dtype):
_test_sequential(TrivialAugment(), device=device, dtype=dtype)