compvis / test /color /test_luv.py
Dexter's picture
Upload folder using huggingface_hub
36c95ba verified
import pytest
import torch
from torch.autograd import gradcheck
import kornia
from kornia.testing import _get_precision, assert_close, BaseTester
class TestRgbToLuv(BaseTester):
def test_smoke(self, device, dtype):
C, H, W = 3, 4, 5
img = torch.rand(C, H, W, device=device, dtype=dtype)
assert isinstance(kornia.color.rgb_to_luv(img), torch.Tensor)
@pytest.mark.parametrize("shape", [(1, 3, 4, 4), (2, 3, 2, 4), (3, 3, 4, 1), (3, 2, 1)])
def test_cardinality(self, device, dtype, shape):
img = torch.ones(shape, device=device, dtype=dtype)
assert kornia.color.rgb_to_luv(img).shape == shape
def test_exception(self, device, dtype):
with pytest.raises(TypeError):
assert kornia.color.rgb_to_luv([0.0])
with pytest.raises(ValueError):
img = torch.ones(1, 1, device=device, dtype=dtype)
assert kornia.color.rgb_to_luv(img)
with pytest.raises(ValueError):
img = torch.ones(2, 1, 1, device=device, dtype=dtype)
assert kornia.color.rgb_to_luv(img)
def test_unit(self, device, dtype):
data = torch.tensor(
[
[
[0.0, 1.0, 0.69396782, 0.63581685, 0.09902618],
[0.59459005, 0.74215373, 0.89662376, 0.25920381, 0.89937686],
[0.29857584, 0.28139791, 0.16441015, 0.55507519, 0.06124221],
[0.40908658, 0.10261389, 0.01691456, 0.76006799, 0.32971736],
],
[
[0.0, 1.0, 0.79009938, 0.91742945, 0.60044175],
[0.42812678, 0.18552390, 0.04186043, 0.38030245, 0.15420346],
[0.13552373, 0.53955473, 0.79102736, 0.49050815, 0.75271446],
[0.39861023, 0.80680277, 0.82823833, 0.54438462, 0.22063386],
],
[
[0.0, 1.0, 0.84317145, 0.59529881, 0.15297393],
[0.59235313, 0.36617295, 0.34600773, 0.40304737, 0.61720451],
[0.46040250, 0.42006640, 0.54765106, 0.48982632, 0.13914755],
[0.58402964, 0.89597990, 0.98276161, 0.25019163, 0.69285921],
],
],
device=device,
dtype=dtype,
)
# Reference output generated using skimage: rgb2luv(data)
expected = torch.tensor(
[
[
[0.0, 100.0, 79.75208282, 86.38912964, 55.25164032],
[51.66668701, 43.81214523, 48.93865585, 39.03804398, 52.55152512],
[23.71140671, 52.38661957, 72.54607391, 53.89587402, 67.94892883],
[45.02897263, 75.98315430, 78.25762177, 61.85069656, 33.77972794],
],
[
[-0.0, -0.00054950, -13.54032803, -35.42317200, -49.27433014],
[21.34596062, 94.13956451, 137.11340332, -14.69241238, 102.94833374],
[9.55611229, -30.01761436, -58.94236755, 9.83261871, -62.96137619],
[-1.55336237, -55.22497559, -56.21067810, 43.76751328, 1.46367633],
],
[
[-0.0, 0.00766720, -13.74480152, 52.17128372, 60.92724228],
[-27.01125526, -1.72837746, 6.57535267, -7.83582020, -38.45543289],
[-50.89970779, 17.65329361, 36.54148102, 2.25501800, 78.93702698],
[-38.39783859, -31.71204376, -46.63606644, 50.16629410, -84.74416351],
],
],
device=device,
dtype=dtype,
)
tol_val: float = _get_precision(device, dtype)
assert_close(kornia.color.rgb_to_luv(data), expected, rtol=tol_val, atol=tol_val)
def test_forth_and_back(self, device, dtype):
data = torch.rand(3, 4, 5, device=device, dtype=dtype)
luv = kornia.color.rgb_to_luv
rgb = kornia.color.luv_to_rgb
data_out = luv(rgb(data))
assert_close(data_out, data, rtol=1e-4, atol=1e-4)
@pytest.mark.grad
def test_gradcheck(self, device, dtype):
B, C, H, W = 2, 3, 4, 4
img = torch.rand(B, C, H, W, device=device, dtype=torch.float64, requires_grad=True)
assert gradcheck(kornia.color.rgb_to_luv, (img,), raise_exception=True)
@pytest.mark.jit
def test_jit(self, device, dtype):
B, C, H, W = 2, 3, 4, 4
img = torch.ones(B, C, H, W, device=device, dtype=dtype)
op = kornia.color.rgb_to_luv
op_jit = torch.jit.script(op)
assert_close(op(img), op_jit(img), rtol=1e-3, atol=1e-3)
@pytest.mark.nn
def test_module(self, device, dtype):
B, C, H, W = 2, 3, 4, 4
img = torch.ones(B, C, H, W, device=device, dtype=dtype)
ops = kornia.color.RgbToLuv().to(device, dtype)
fcn = kornia.color.rgb_to_luv
assert_close(ops(img), fcn(img))
class TestLuvToRgb(BaseTester):
def test_smoke(self, device, dtype):
C, H, W = 3, 4, 5
img = torch.rand(C, H, W, device=device, dtype=dtype)
assert isinstance(kornia.color.luv_to_rgb(img), torch.Tensor)
@pytest.mark.parametrize("shape", [(1, 3, 4, 4), (2, 3, 2, 4), (3, 3, 4, 1), (3, 2, 1)])
def test_cardinality(self, device, dtype, shape):
img = torch.ones(shape, device=device, dtype=dtype)
assert kornia.color.luv_to_rgb(img).shape == shape
def test_exception(self, device, dtype):
with pytest.raises(TypeError):
assert kornia.color.luv_to_rgb([0.0])
with pytest.raises(ValueError):
img = torch.ones(1, 1, device=device, dtype=dtype)
assert kornia.color.luv_to_rgb(img)
with pytest.raises(ValueError):
img = torch.ones(2, 1, 1, device=device, dtype=dtype)
assert kornia.color.luv_to_rgb(img)
def test_unit(self, device, dtype):
data = torch.tensor(
[
[
[
[50.21928787, 23.29810143, 14.98279190, 62.50927353, 72.78904724],
[70.86846924, 68.75330353, 52.81696701, 76.17090607, 88.63134003],
[46.87160873, 72.38699341, 37.71450806, 82.57386780, 74.79967499],
[77.33016968, 47.39180374, 61.76217651, 90.83254242, 86.96239471],
],
[
[65.81327057, -3.69859719, 0.16971001, 14.86583614, -65.54960632],
[-41.03258133, -19.52661896, 64.16155243, -58.53935242, -71.78411102],
[112.05227661, -60.13330460, 43.07910538, -51.01456833, -58.25787354],
[-62.37575531, 50.88882065, -39.27450943, 17.00958824, -24.93779755],
],
[
[-69.53346252, -73.34986877, -11.47461891, 66.73863220, 70.43983459],
[51.92737579, 58.77009583, 45.97863388, 24.44452858, 98.81991577],
[-7.60597992, 78.97976685, -69.31867218, 67.33953857, 14.28889370],
[92.31149292, -85.91405487, -32.83668518, -23.45091820, 69.99038696],
],
]
],
device=device,
dtype=dtype,
)
# Reference output generated using skimage: luv2rgb(data)
expected = torch.tensor(
[
[
[
[0.78923208, 0.17048222, 0.14947766, 0.65528989, 0.07863078],
[0.41649094, 0.55222923, 0.72673196, 0.21939684, 0.34298307],
[0.82763243, 0.24021322, 0.58888060, 0.47255886, 0.16407511],
[0.30320778, 0.72233224, 0.21593384, 0.98893607, 0.71707106],
],
[
[0.20532851, 0.13188709, 0.13879408, 0.59964627, 0.80721593],
[0.75411713, 0.70656943, 0.41770950, 0.82750136, 0.99659365],
[0.12436169, 0.79804462, 0.10958754, 0.89803618, 0.81000644],
[0.85726571, 0.17667055, 0.63285238, 0.85567462, 0.91538441],
],
[
[0.73985511, 0.59308004, 0.21156698, 0.03804367, 0.32732114],
[0.42489606, 0.33011687, 0.12804756, 0.64905322, 0.25216782],
[0.41637793, 0.22158240, 0.63437861, 0.46121466, 0.68336427],
[0.06325728, 0.78878325, 0.74280596, 0.99514300, 0.47176042],
],
]
],
device=device,
dtype=dtype,
)
assert_close(kornia.color.luv_to_rgb(data), expected, rtol=1e-4, atol=1e-4)
def test_forth_and_back(self, device, dtype):
data = torch.rand(3, 4, 5, device=device, dtype=dtype)
luv = kornia.color.rgb_to_luv
rgb = kornia.color.luv_to_rgb
data_out = rgb(luv(data))
assert_close(data_out, data, rtol=1e-4, atol=1e-4)
@pytest.mark.grad
def test_gradcheck(self, device, dtype):
B, C, H, W = 2, 3, 4, 4
img = torch.rand(B, C, H, W, device=device, dtype=torch.float64, requires_grad=True)
img = kornia.color.rgb_to_luv(img)
assert gradcheck(kornia.color.luv_to_rgb, (img,), raise_exception=True)
@pytest.mark.jit
def test_jit(self, device, dtype):
B, C, H, W = 2, 3, 4, 4
img = torch.ones(B, C, H, W, device=device, dtype=dtype)
op = kornia.color.luv_to_rgb
op_jit = torch.jit.script(op)
assert_close(op(img), op_jit(img))
@pytest.mark.nn
def test_module(self, device, dtype):
B, C, H, W = 2, 3, 4, 4
img = torch.ones(B, C, H, W, device=device, dtype=dtype)
ops = kornia.color.LuvToRgb().to(device, dtype)
fcn = kornia.color.luv_to_rgb
assert_close(ops(img), fcn(img))