|
|
|
import copy
|
|
|
|
import mmcv
|
|
import numpy as np
|
|
import pytest
|
|
from mmengine.testing import assert_dict_has_keys
|
|
from numpy.testing import assert_array_almost_equal
|
|
|
|
from mmaction.datasets.transforms import (CenterCrop, ColorJitter, Flip, Fuse,
|
|
MultiScaleCrop, RandomCrop,
|
|
RandomResizedCrop, Resize, TenCrop,
|
|
ThreeCrop)
|
|
|
|
|
|
def check_crop(origin_imgs, result_imgs, result_bbox, num_crops=1):
|
|
"""Check if the result_bbox is in correspond to result_imgs."""
|
|
|
|
def check_single_crop(origin_imgs, result_imgs, result_bbox):
|
|
result_img_shape = result_imgs[0].shape[:2]
|
|
crop_w = result_bbox[2] - result_bbox[0]
|
|
crop_h = result_bbox[3] - result_bbox[1]
|
|
crop_shape = (crop_h, crop_w)
|
|
if not crop_shape == result_img_shape:
|
|
return False
|
|
left, top, right, bottom = result_bbox
|
|
return np.array_equal(
|
|
np.array(origin_imgs)[:, top:bottom, left:right, :],
|
|
np.array(result_imgs))
|
|
|
|
if result_bbox.ndim == 1:
|
|
return check_single_crop(origin_imgs, result_imgs, result_bbox)
|
|
if result_bbox.ndim == 2:
|
|
num_batch = len(origin_imgs)
|
|
for i, bbox in enumerate(result_bbox):
|
|
if num_crops == 10:
|
|
if (i // num_batch) % 2 == 0:
|
|
flag = check_single_crop([origin_imgs[i % num_batch]],
|
|
[result_imgs[i]], bbox)
|
|
else:
|
|
flag = check_single_crop([origin_imgs[i % num_batch]],
|
|
[np.flip(result_imgs[i], axis=1)],
|
|
bbox)
|
|
else:
|
|
flag = check_single_crop([origin_imgs[i % num_batch]],
|
|
[result_imgs[i]], bbox)
|
|
if not flag:
|
|
return False
|
|
return True
|
|
else:
|
|
|
|
return False
|
|
|
|
|
|
def check_flip(origin_imgs, result_imgs, flip_type):
|
|
"""Check if the origin_imgs are flipped correctly into result_imgs in
|
|
different flip_types."""
|
|
n, _, _, _ = np.shape(origin_imgs)
|
|
if flip_type == 'horizontal':
|
|
for i in range(n):
|
|
if np.any(result_imgs[i] != np.fliplr(origin_imgs[i])):
|
|
return False
|
|
else:
|
|
|
|
for i in range(n):
|
|
if np.any(result_imgs[i] != np.transpose(np.fliplr(np.transpose(origin_imgs[i], (1, 0, 2))), (1, 0, 2))):
|
|
return False
|
|
|
|
return True
|
|
|
|
|
|
class TestColor:
|
|
|
|
@staticmethod
|
|
def test_color_jitter():
|
|
imgs = list(
|
|
np.random.randint(0, 255, size=(3, 112, 112, 3), dtype=np.uint8))
|
|
results = dict(imgs=imgs)
|
|
|
|
color_jitter = ColorJitter()
|
|
assert color_jitter.brightness == (0.5, 1.5)
|
|
assert color_jitter.contrast == (0.5, 1.5)
|
|
assert color_jitter.saturation == (0.5, 1.5)
|
|
assert color_jitter.hue == (-0.1, 0.1)
|
|
|
|
color_jitter_results = color_jitter(results)
|
|
target_keys = ['imgs']
|
|
|
|
assert assert_dict_has_keys(color_jitter_results, target_keys)
|
|
assert np.shape(color_jitter_results['imgs']) == (3, 112, 112, 3)
|
|
for img in color_jitter_results['imgs']:
|
|
assert np.all(img >= 0)
|
|
assert np.all(img <= 255)
|
|
|
|
assert repr(color_jitter) == (f'{color_jitter.__class__.__name__}('
|
|
f'brightness={(0.5, 1.5)}, '
|
|
f'contrast={(0.5, 1.5)}, '
|
|
f'saturation={(0.5, 1.5)}, '
|
|
f'hue={-0.1, 0.1})')
|
|
|
|
|
|
class TestCrops:
|
|
|
|
@staticmethod
|
|
def test_random_crop():
|
|
with pytest.raises(TypeError):
|
|
|
|
RandomCrop(size=(112, 112))
|
|
with pytest.raises(AssertionError):
|
|
|
|
imgs = list(np.random.rand(2, 224, 341, 3))
|
|
results = dict(imgs=imgs)
|
|
random_crop = RandomCrop(size=320)
|
|
random_crop(results)
|
|
|
|
target_keys = ['imgs', 'crop_bbox', 'img_shape']
|
|
|
|
|
|
imgs = list(np.random.rand(2, 224, 341, 3))
|
|
results = dict(imgs=imgs)
|
|
random_crop = RandomCrop(size=224)
|
|
results['gt_bboxes'] = np.array([[0, 0, 340, 224]])
|
|
results['proposals'] = np.array([[0, 0, 340, 224]])
|
|
kp = np.array([[160, 120], [160, 120]]).reshape([1, 1, 2, 2])
|
|
results['keypoint'] = kp
|
|
random_crop_result = random_crop(results)
|
|
assert assert_dict_has_keys(random_crop_result, target_keys)
|
|
assert check_crop(imgs, random_crop_result['imgs'],
|
|
results['crop_bbox'])
|
|
h, w = random_crop_result['img_shape']
|
|
assert h == w == 224
|
|
|
|
|
|
imgs = list(np.random.rand(2, 224, 224, 3))
|
|
results = dict(imgs=imgs)
|
|
random_crop = RandomCrop(size=224)
|
|
random_crop_result = random_crop(results)
|
|
assert assert_dict_has_keys(random_crop_result, target_keys)
|
|
assert check_crop(imgs, random_crop_result['imgs'],
|
|
results['crop_bbox'])
|
|
h, w = random_crop_result['img_shape']
|
|
assert h == w == 224
|
|
|
|
|
|
imgs = list(np.random.rand(2, 224, 225, 3))
|
|
results = dict(imgs=imgs)
|
|
random_crop = RandomCrop(size=224)
|
|
random_crop_result = random_crop(results)
|
|
assert assert_dict_has_keys(random_crop_result, target_keys)
|
|
assert check_crop(imgs, random_crop_result['imgs'],
|
|
results['crop_bbox'])
|
|
h, w = random_crop_result['img_shape']
|
|
assert h == w == 224
|
|
|
|
assert repr(random_crop) == (f'{random_crop.__class__.__name__}'
|
|
f'(size={224}, lazy={False})')
|
|
|
|
@staticmethod
|
|
def test_random_resized_crop():
|
|
with pytest.raises(TypeError):
|
|
|
|
RandomResizedCrop(area_range=0.5)
|
|
with pytest.raises(TypeError):
|
|
|
|
RandomResizedCrop(area_range=(0.08, 1.0), aspect_ratio_range=0.1)
|
|
|
|
target_keys = ['imgs', 'crop_bbox', 'img_shape']
|
|
|
|
eps = 0.01
|
|
imgs = list(np.random.rand(2, 256, 341, 3))
|
|
results = dict(imgs=imgs)
|
|
results['gt_bboxes'] = np.array([[0, 0, 340, 256]])
|
|
results['proposals'] = np.array([[0, 0, 340, 256]])
|
|
kp = np.array([[160, 120], [160, 120]]).reshape([1, 1, 2, 2])
|
|
results['keypoint'] = kp
|
|
|
|
with pytest.raises(AssertionError):
|
|
|
|
random_crop = RandomResizedCrop(area_range=(0.9, 0.7))
|
|
random_crop(results)
|
|
with pytest.raises(AssertionError):
|
|
|
|
random_crop = RandomResizedCrop(aspect_ratio_range=(-0.1, 2.0))
|
|
random_crop(results)
|
|
|
|
random_crop = RandomResizedCrop()
|
|
random_crop_result = random_crop(results)
|
|
assert assert_dict_has_keys(random_crop_result, target_keys)
|
|
assert check_crop(imgs, random_crop_result['imgs'],
|
|
results['crop_bbox'])
|
|
h, w = random_crop_result['img_shape']
|
|
assert ((0.08 - eps <= h * w / 256 / 341)
|
|
and (h * w / 256 / 341 <= 1 + eps))
|
|
assert (3. / 4. - eps <= h / w) and (h / w - eps <= 4. / 3.)
|
|
assert repr(random_crop) == (f'{random_crop.__class__.__name__}'
|
|
f'(area_range={(0.08, 1.0)}, '
|
|
f'aspect_ratio_range={(3 / 4, 4 / 3)}, '
|
|
f'lazy={False})')
|
|
|
|
random_crop = RandomResizedCrop(
|
|
area_range=(0.9, 0.9), aspect_ratio_range=(10.0, 10.1))
|
|
|
|
imgs = list(np.random.rand(2, 256, 341, 3))
|
|
results = dict(imgs=imgs)
|
|
random_crop_result = random_crop(results)
|
|
assert assert_dict_has_keys(random_crop_result, target_keys)
|
|
assert check_crop(imgs, random_crop_result['imgs'],
|
|
results['crop_bbox'])
|
|
h, w = random_crop_result['img_shape']
|
|
assert h == w == 256
|
|
|
|
@staticmethod
|
|
def test_multi_scale_crop():
|
|
with pytest.raises(TypeError):
|
|
|
|
MultiScaleCrop(0.5)
|
|
|
|
with pytest.raises(TypeError):
|
|
|
|
MultiScaleCrop('224')
|
|
|
|
with pytest.raises(TypeError):
|
|
|
|
MultiScaleCrop(
|
|
224, scales=[
|
|
1,
|
|
])
|
|
|
|
with pytest.raises(ValueError):
|
|
|
|
MultiScaleCrop(224, num_fixed_crops=6)
|
|
|
|
target_keys = ['imgs', 'crop_bbox', 'img_shape', 'scales']
|
|
|
|
|
|
imgs = list(np.random.rand(2, 256, 341, 3))
|
|
results = dict(imgs=imgs)
|
|
results['gt_bboxes'] = np.array([[0, 0, 340, 256]])
|
|
results['proposals'] = np.array([[0, 0, 340, 256]])
|
|
kp = np.array([[160, 120], [160, 120]]).reshape([1, 1, 2, 2])
|
|
results['keypoint'] = kp
|
|
config = dict(
|
|
input_size=224,
|
|
scales=(1, 0.8),
|
|
random_crop=False,
|
|
max_wh_scale_gap=0)
|
|
multi_scale_crop = MultiScaleCrop(**config)
|
|
multi_scale_crop_results = multi_scale_crop(results)
|
|
assert assert_dict_has_keys(multi_scale_crop_results, target_keys)
|
|
assert check_crop(imgs, multi_scale_crop_results['imgs'],
|
|
multi_scale_crop_results['crop_bbox'])
|
|
assert multi_scale_crop_results['img_shape'] in [(256, 256),
|
|
(204, 204)]
|
|
|
|
|
|
imgs = list(np.random.rand(2, 256, 341, 3))
|
|
results = dict(imgs=imgs)
|
|
config = dict(
|
|
input_size=224,
|
|
scales=(1, 0.8),
|
|
random_crop=False,
|
|
max_wh_scale_gap=0,
|
|
num_fixed_crops=13)
|
|
multi_scale_crop = MultiScaleCrop(**config)
|
|
multi_scale_crop_results = multi_scale_crop(results)
|
|
assert assert_dict_has_keys(multi_scale_crop_results, target_keys)
|
|
assert check_crop(imgs, multi_scale_crop_results['imgs'],
|
|
multi_scale_crop_results['crop_bbox'])
|
|
assert multi_scale_crop_results['img_shape'] in [(256, 256),
|
|
(204, 204)]
|
|
|
|
|
|
imgs = list(np.random.rand(2, 256, 341, 3))
|
|
results = dict(imgs=imgs)
|
|
config = dict(
|
|
input_size=224,
|
|
scales=(1, 0.8),
|
|
random_crop=True,
|
|
max_wh_scale_gap=0)
|
|
multi_scale_crop = MultiScaleCrop(**config)
|
|
multi_scale_crop_results = multi_scale_crop(results)
|
|
assert assert_dict_has_keys(multi_scale_crop_results, target_keys)
|
|
assert check_crop(imgs, multi_scale_crop_results['imgs'],
|
|
multi_scale_crop_results['crop_bbox'])
|
|
assert (multi_scale_crop_results['img_shape'] in [(256, 256),
|
|
(204, 204)])
|
|
|
|
assert repr(multi_scale_crop) == (
|
|
f'{multi_scale_crop.__class__.__name__}'
|
|
f'(input_size={(224, 224)}, scales={(1, 0.8)}, '
|
|
f'max_wh_scale_gap={0}, random_crop={True}, '
|
|
f'num_fixed_crops=5, lazy={False})')
|
|
|
|
@staticmethod
|
|
def test_center_crop():
|
|
with pytest.raises(TypeError):
|
|
|
|
CenterCrop(0.5)
|
|
|
|
with pytest.raises(TypeError):
|
|
|
|
CenterCrop('224')
|
|
|
|
|
|
|
|
imgs = list(np.random.rand(2, 240, 320, 3))
|
|
results = dict(imgs=imgs)
|
|
kp = np.array([[160, 120], [160, 120]]).reshape([1, 1, 2, 2])
|
|
results['keypoint'] = kp
|
|
|
|
results['gt_bboxes'] = np.array([[0, 0, 320, 240]])
|
|
results['proposals'] = np.array([[0, 0, 320, 240]])
|
|
center_crop = CenterCrop(crop_size=224)
|
|
center_crop_results = center_crop(results)
|
|
target_keys = ['imgs', 'crop_bbox', 'img_shape', 'keypoint']
|
|
assert assert_dict_has_keys(center_crop_results, target_keys)
|
|
assert check_crop(imgs, center_crop_results['imgs'],
|
|
center_crop_results['crop_bbox'])
|
|
assert np.all(
|
|
center_crop_results['crop_bbox'] == np.array([48, 8, 272, 232]))
|
|
assert center_crop_results['img_shape'] == (224, 224)
|
|
assert np.all(center_crop_results['keypoint'] == 112)
|
|
|
|
assert repr(center_crop) == (f'{center_crop.__class__.__name__}'
|
|
f'(crop_size={(224, 224)}, lazy={False})')
|
|
|
|
@staticmethod
|
|
def test_three_crop():
|
|
with pytest.raises(TypeError):
|
|
|
|
ThreeCrop(0.5)
|
|
|
|
with pytest.raises(TypeError):
|
|
|
|
ThreeCrop('224')
|
|
|
|
|
|
imgs = list(np.random.rand(2, 240, 120, 3))
|
|
results = dict(imgs=imgs)
|
|
three_crop = ThreeCrop(crop_size=120)
|
|
three_crop_results = three_crop(results)
|
|
target_keys = ['imgs', 'crop_bbox', 'img_shape']
|
|
assert assert_dict_has_keys(three_crop_results, target_keys)
|
|
assert check_crop(imgs, three_crop_results['imgs'],
|
|
three_crop_results['crop_bbox'], 3)
|
|
assert three_crop_results['img_shape'] == (120, 120)
|
|
|
|
|
|
imgs = list(np.random.rand(2, 224, 224, 3))
|
|
results = dict(imgs=imgs)
|
|
three_crop = ThreeCrop(crop_size=224)
|
|
three_crop_results = three_crop(results)
|
|
target_keys = ['imgs', 'crop_bbox', 'img_shape']
|
|
assert assert_dict_has_keys(three_crop_results, target_keys)
|
|
assert check_crop(imgs, three_crop_results['imgs'],
|
|
three_crop_results['crop_bbox'], 3)
|
|
assert three_crop_results['img_shape'] == (224, 224)
|
|
|
|
assert repr(three_crop) == (f'{three_crop.__class__.__name__}'
|
|
f'(crop_size={(224, 224)})')
|
|
|
|
@staticmethod
|
|
def test_ten_crop():
|
|
with pytest.raises(TypeError):
|
|
|
|
TenCrop(0.5)
|
|
|
|
with pytest.raises(TypeError):
|
|
|
|
TenCrop('224')
|
|
|
|
|
|
imgs = list(np.random.rand(2, 256, 256, 3))
|
|
results = dict(imgs=imgs)
|
|
ten_crop = TenCrop(crop_size=224)
|
|
ten_crop_results = ten_crop(results)
|
|
target_keys = ['imgs', 'crop_bbox', 'img_shape']
|
|
assert assert_dict_has_keys(ten_crop_results, target_keys)
|
|
assert check_crop(imgs, ten_crop_results['imgs'],
|
|
ten_crop_results['crop_bbox'], 10)
|
|
assert ten_crop_results['img_shape'] == (224, 224)
|
|
|
|
assert repr(ten_crop) == (f'{ten_crop.__class__.__name__}'
|
|
f'(crop_size={(224, 224)})')
|
|
|
|
|
|
class TestFlip:
|
|
|
|
@staticmethod
|
|
def test_flip():
|
|
with pytest.raises(ValueError):
|
|
|
|
Flip(direction='vertically')
|
|
|
|
target_keys = ['imgs', 'flip_direction', 'modality']
|
|
|
|
|
|
imgs = list(np.random.rand(2, 64, 64, 3))
|
|
results = dict(imgs=copy.deepcopy(imgs), modality='RGB')
|
|
flip = Flip(flip_ratio=0, direction='horizontal')
|
|
flip_results = flip(results)
|
|
assert assert_dict_has_keys(flip_results, target_keys)
|
|
assert np.array_equal(imgs, results['imgs'])
|
|
assert id(flip_results['imgs']) == id(results['imgs'])
|
|
assert np.shape(flip_results['imgs']) == np.shape(imgs)
|
|
|
|
|
|
imgs = list(np.random.rand(2, 64, 64, 3))
|
|
results = dict(imgs=copy.deepcopy(imgs), modality='RGB')
|
|
results['gt_bboxes'] = np.array([[0, 0, 60, 60]])
|
|
results['proposals'] = np.array([[0, 0, 60, 60]])
|
|
flip = Flip(flip_ratio=1, direction='horizontal')
|
|
flip_results = flip(results)
|
|
assert assert_dict_has_keys(flip_results, target_keys)
|
|
if flip_results['flip'] is True:
|
|
assert check_flip(imgs, flip_results['imgs'],
|
|
flip_results['flip_direction'])
|
|
assert id(flip_results['imgs']) == id(results['imgs'])
|
|
assert np.shape(flip_results['imgs']) == np.shape(imgs)
|
|
|
|
|
|
imgs = [
|
|
np.arange(16).reshape(4, 4).astype(np.float32),
|
|
np.arange(16, 32).reshape(4, 4).astype(np.float32)
|
|
]
|
|
results = dict(imgs=copy.deepcopy(imgs), modality='Flow')
|
|
flip = Flip(flip_ratio=1, direction='horizontal')
|
|
flip_results = flip(results)
|
|
assert assert_dict_has_keys(flip_results, target_keys)
|
|
imgs = [x.reshape(4, 4, 1) for x in imgs]
|
|
flip_results['imgs'] = [
|
|
x.reshape(4, 4, 1) for x in flip_results['imgs']
|
|
]
|
|
if flip_results['flip'] is True:
|
|
assert check_flip([imgs[0]],
|
|
[mmcv.iminvert(flip_results['imgs'][0])],
|
|
flip_results['flip_direction'])
|
|
assert check_flip([imgs[1]], [flip_results['imgs'][1]],
|
|
flip_results['flip_direction'])
|
|
assert id(flip_results['imgs']) == id(results['imgs'])
|
|
assert np.shape(flip_results['imgs']) == np.shape(imgs)
|
|
|
|
|
|
imgs = list(np.random.rand(2, 64, 64, 3))
|
|
results = dict(imgs=copy.deepcopy(imgs), modality='RGB')
|
|
flip = Flip(flip_ratio=1, direction='vertical')
|
|
flip_results = flip(results)
|
|
assert assert_dict_has_keys(flip_results, target_keys)
|
|
if flip_results['flip'] is True:
|
|
assert check_flip(imgs, flip_results['imgs'],
|
|
flip_results['flip_direction'])
|
|
assert id(flip_results['imgs']) == id(results['imgs'])
|
|
assert np.shape(flip_results['imgs']) == np.shape(imgs)
|
|
|
|
assert repr(flip) == (f'{flip.__class__.__name__}'
|
|
f'(flip_ratio={1}, direction=vertical, '
|
|
f'flip_label_map={None}, lazy={False})')
|
|
|
|
|
|
_flip_label_map = {4: 6}
|
|
imgs = list(np.random.rand(2, 64, 64, 3))
|
|
|
|
|
|
results = dict(imgs=copy.deepcopy(imgs), modality='RGB', label=4)
|
|
flip = Flip(
|
|
flip_ratio=1,
|
|
direction='horizontal',
|
|
flip_label_map=_flip_label_map)
|
|
flip_results = flip(results)
|
|
assert results['label'] == 6
|
|
|
|
|
|
results = dict(imgs=copy.deepcopy(imgs), modality='RGB', label=3)
|
|
flip = Flip(
|
|
flip_ratio=1,
|
|
direction='horizontal',
|
|
flip_label_map=_flip_label_map)
|
|
flip_results = flip(results)
|
|
assert results['label'] == 3
|
|
|
|
|
|
results = dict(
|
|
keypoint=np.array([[1, 1], [63, 63]]).reshape([1, 1, 2, 2]),
|
|
modality='Pose',
|
|
img_shape=(64, 64))
|
|
flip = Flip(
|
|
flip_ratio=1, direction='horizontal', left_kp=[0], right_kp=[1])
|
|
flip_results = flip(results)
|
|
assert_array_almost_equal(flip_results['keypoint'][0, 0],
|
|
np.array([[1, 63], [63, 1]]))
|
|
|
|
results = dict(
|
|
keypoint=np.array([[1, 1], [63, 63]]).reshape([1, 1, 2, 2]),
|
|
modality='Pose',
|
|
img_shape=(64, 64))
|
|
flip = Flip(
|
|
flip_ratio=1, direction='horizontal', left_kp=[], right_kp=[])
|
|
flip_results = flip(results)
|
|
assert_array_almost_equal(flip_results['keypoint'][0, 0],
|
|
np.array([[63, 1], [1, 63]]))
|
|
|
|
with pytest.raises(AssertionError):
|
|
results = dict(
|
|
keypoint=np.array([[1, 1], [63, 63]]).reshape([1, 1, 2, 2]),
|
|
modality='Pose',
|
|
img_shape=(64, 64))
|
|
flip = Flip(
|
|
flip_ratio=1, direction='vertical', left_kp=[], right_kp=[])
|
|
flip_results = flip(results)
|
|
|
|
|
|
class TestLazy:
|
|
|
|
@staticmethod
|
|
def test_init_lazy():
|
|
from mmaction.datasets.transforms.processing import \
|
|
_init_lazy_if_proper
|
|
with pytest.raises(AssertionError):
|
|
|
|
result = dict(lazy=dict(), img_shape=[64, 64])
|
|
_init_lazy_if_proper(result, False)
|
|
|
|
lazy_keys = [
|
|
'original_shape', 'crop_bbox', 'flip', 'flip_direction',
|
|
'interpolation'
|
|
]
|
|
|
|
|
|
result = dict(imgs=list(np.random.randn(3, 64, 64, 3)))
|
|
_init_lazy_if_proper(result, True)
|
|
assert assert_dict_has_keys(result, ['imgs', 'lazy', 'img_shape'])
|
|
assert assert_dict_has_keys(result['lazy'], lazy_keys)
|
|
|
|
|
|
result = dict(img_shape=[64, 64])
|
|
_init_lazy_if_proper(result, True)
|
|
assert assert_dict_has_keys(result, ['lazy', 'img_shape'])
|
|
assert assert_dict_has_keys(result['lazy'], lazy_keys)
|
|
|
|
|
|
result = dict(img_shape=[64, 64])
|
|
_init_lazy_if_proper(result, False)
|
|
assert assert_dict_has_keys(result, ['img_shape'])
|
|
assert 'lazy' not in result
|
|
|
|
@staticmethod
|
|
def test_random_crop_lazy():
|
|
with pytest.raises(TypeError):
|
|
|
|
RandomCrop(size=(112, 112), lazy=True)
|
|
with pytest.raises(AssertionError):
|
|
|
|
imgs = list(np.random.rand(2, 224, 341, 3))
|
|
results = dict(imgs=imgs)
|
|
random_crop = RandomCrop(size=320, lazy=True)
|
|
random_crop(results)
|
|
|
|
target_keys = ['imgs', 'crop_bbox', 'img_shape', 'lazy']
|
|
|
|
|
|
imgs = list(np.random.rand(2, 224, 341, 3))
|
|
results = dict(imgs=imgs)
|
|
random_crop = RandomCrop(size=224, lazy=True)
|
|
random_crop_result = random_crop(results)
|
|
assert assert_dict_has_keys(random_crop_result, target_keys)
|
|
assert id(imgs) == id(random_crop_result['imgs'])
|
|
random_crop_result_fuse = Fuse()(random_crop_result)
|
|
assert 'lazy' not in random_crop_result_fuse
|
|
assert check_crop(imgs, random_crop_result_fuse['imgs'],
|
|
results['crop_bbox'])
|
|
h, w = random_crop_result_fuse['img_shape']
|
|
assert h == w == 224
|
|
|
|
|
|
imgs = list(np.random.rand(2, 224, 224, 3))
|
|
results = dict(imgs=imgs)
|
|
random_crop = RandomCrop(size=224, lazy=True)
|
|
random_crop_result = random_crop(results)
|
|
assert assert_dict_has_keys(random_crop_result, target_keys)
|
|
assert id(imgs) == id(random_crop_result['imgs'])
|
|
random_crop_result_fuse = Fuse()(random_crop_result)
|
|
assert 'lazy' not in random_crop_result_fuse
|
|
assert check_crop(imgs, random_crop_result_fuse['imgs'],
|
|
results['crop_bbox'])
|
|
h, w = random_crop_result_fuse['img_shape']
|
|
assert h == w == 224
|
|
|
|
|
|
imgs = list(np.random.rand(2, 224, 225, 3))
|
|
results = dict(imgs=imgs)
|
|
random_crop = RandomCrop(size=224, lazy=True)
|
|
random_crop_result = random_crop(results)
|
|
assert assert_dict_has_keys(random_crop_result, target_keys)
|
|
assert id(imgs) == id(random_crop_result['imgs'])
|
|
random_crop_result_fuse = Fuse()(random_crop_result)
|
|
assert 'lazy' not in random_crop_result_fuse
|
|
assert check_crop(imgs, random_crop_result_fuse['imgs'],
|
|
results['crop_bbox'])
|
|
h, w = random_crop_result_fuse['img_shape']
|
|
assert h == w == 224
|
|
|
|
assert repr(random_crop) == (f'{random_crop.__class__.__name__}'
|
|
f'(size={224}, lazy={True})')
|
|
|
|
@staticmethod
|
|
def test_random_resized_crop_lazy():
|
|
target_keys = ['imgs', 'crop_bbox', 'img_shape', 'lazy']
|
|
|
|
eps = 0.01
|
|
imgs = list(np.random.rand(2, 256, 341, 3))
|
|
results = dict(imgs=imgs)
|
|
|
|
with pytest.raises(AssertionError):
|
|
|
|
random_crop = RandomResizedCrop(area_range=(0.9, 0.7), lazy=True)
|
|
random_crop(results)
|
|
with pytest.raises(AssertionError):
|
|
|
|
random_crop = RandomResizedCrop(
|
|
aspect_ratio_range=(-0.1, 2.0), lazy=True)
|
|
random_crop(results)
|
|
|
|
random_crop = RandomResizedCrop(lazy=True)
|
|
random_crop_result = random_crop(results)
|
|
assert assert_dict_has_keys(random_crop_result, target_keys)
|
|
assert id(imgs) == id(random_crop_result['imgs'])
|
|
random_crop_result_fuse = Fuse()(random_crop_result)
|
|
assert check_crop(imgs, random_crop_result_fuse['imgs'],
|
|
results['crop_bbox'])
|
|
h, w = random_crop_result['img_shape']
|
|
assert ((0.08 - eps <= h * w / 256 / 341)
|
|
and (h * w / 256 / 341 <= 1 + eps))
|
|
assert (3. / 4. - eps <= h / w) and (h / w - eps <= 4. / 3.)
|
|
assert repr(random_crop) == (f'{random_crop.__class__.__name__}'
|
|
f'(area_range={(0.08, 1.0)}, '
|
|
f'aspect_ratio_range={(3 / 4, 4 / 3)}, '
|
|
f'lazy={True})')
|
|
|
|
random_crop = RandomResizedCrop(
|
|
area_range=(0.9, 0.9), aspect_ratio_range=(10.0, 10.1), lazy=True)
|
|
|
|
imgs = np.random.rand(2, 256, 341, 3)
|
|
results = dict(imgs=imgs)
|
|
random_crop_result = random_crop(results)
|
|
assert assert_dict_has_keys(random_crop_result, target_keys)
|
|
assert id(imgs) == id(random_crop_result['imgs'])
|
|
random_crop_result_fuse = Fuse()(random_crop_result)
|
|
assert check_crop(imgs, random_crop_result_fuse['imgs'],
|
|
results['crop_bbox'])
|
|
h, w = random_crop_result['img_shape']
|
|
assert h == w == 256
|
|
|
|
@staticmethod
|
|
def test_multi_scale_crop_lazy():
|
|
with pytest.raises(TypeError):
|
|
|
|
MultiScaleCrop(0.5, lazy=True)
|
|
|
|
with pytest.raises(TypeError):
|
|
|
|
MultiScaleCrop('224', lazy=True)
|
|
|
|
with pytest.raises(TypeError):
|
|
|
|
MultiScaleCrop(
|
|
224, scales=[
|
|
1,
|
|
], lazy=True)
|
|
|
|
with pytest.raises(ValueError):
|
|
|
|
MultiScaleCrop(224, num_fixed_crops=6, lazy=True)
|
|
|
|
target_keys = ['imgs', 'crop_bbox', 'img_shape', 'scales']
|
|
|
|
|
|
imgs = list(np.random.rand(2, 256, 341, 3))
|
|
results = dict(imgs=imgs)
|
|
config = dict(
|
|
input_size=224,
|
|
scales=(1, 0.8),
|
|
random_crop=False,
|
|
max_wh_scale_gap=0,
|
|
lazy=True)
|
|
multi_scale_crop = MultiScaleCrop(**config)
|
|
multi_scale_crop_result = multi_scale_crop(results)
|
|
assert id(imgs) == id(multi_scale_crop_result['imgs'])
|
|
assert assert_dict_has_keys(multi_scale_crop_result, target_keys)
|
|
multi_scale_crop_result_fuse = Fuse()(multi_scale_crop_result)
|
|
assert check_crop(imgs, multi_scale_crop_result_fuse['imgs'],
|
|
multi_scale_crop_result['crop_bbox'])
|
|
assert multi_scale_crop_result_fuse['img_shape'] in [(256, 256),
|
|
(204, 204)]
|
|
|
|
|
|
imgs = list(np.random.rand(2, 256, 341, 3))
|
|
results = dict(imgs=imgs)
|
|
config = dict(
|
|
input_size=224,
|
|
scales=(1, 0.8),
|
|
random_crop=False,
|
|
max_wh_scale_gap=0,
|
|
num_fixed_crops=13,
|
|
lazy=True)
|
|
multi_scale_crop = MultiScaleCrop(**config)
|
|
multi_scale_crop_result = multi_scale_crop(results)
|
|
assert id(imgs) == id(multi_scale_crop_result['imgs'])
|
|
assert assert_dict_has_keys(multi_scale_crop_result, target_keys)
|
|
multi_scale_crop_result_fuse = Fuse()(multi_scale_crop_result)
|
|
assert check_crop(imgs, multi_scale_crop_result_fuse['imgs'],
|
|
multi_scale_crop_result['crop_bbox'])
|
|
assert multi_scale_crop_result_fuse['img_shape'] in [(256, 256),
|
|
(204, 204)]
|
|
|
|
|
|
imgs = list(np.random.rand(2, 256, 341, 3))
|
|
results = dict(imgs=imgs)
|
|
config = dict(
|
|
input_size=224,
|
|
scales=(1, 0.8),
|
|
random_crop=True,
|
|
max_wh_scale_gap=0,
|
|
lazy=True)
|
|
multi_scale_crop = MultiScaleCrop(**config)
|
|
multi_scale_crop_result = multi_scale_crop(results)
|
|
assert id(imgs) == id(multi_scale_crop_result['imgs'])
|
|
assert assert_dict_has_keys(multi_scale_crop_result, target_keys)
|
|
multi_scale_crop_result_fuse = Fuse()(multi_scale_crop_result)
|
|
assert check_crop(imgs, multi_scale_crop_result_fuse['imgs'],
|
|
multi_scale_crop_result['crop_bbox'])
|
|
assert (multi_scale_crop_result_fuse['img_shape'] in [(256, 256),
|
|
(204, 204)])
|
|
|
|
assert repr(multi_scale_crop) == (
|
|
f'{multi_scale_crop.__class__.__name__}'
|
|
f'(input_size={(224, 224)}, scales={(1, 0.8)}, '
|
|
f'max_wh_scale_gap={0}, random_crop={True}, '
|
|
f'num_fixed_crops={5}, lazy={True})')
|
|
|
|
@staticmethod
|
|
def test_resize_lazy():
|
|
with pytest.raises(ValueError):
|
|
|
|
Resize(-0.5, lazy=True)
|
|
|
|
with pytest.raises(TypeError):
|
|
|
|
Resize('224', lazy=True)
|
|
|
|
target_keys = [
|
|
'imgs', 'img_shape', 'keep_ratio', 'scale_factor', 'modality'
|
|
]
|
|
|
|
|
|
imgs = list(np.random.rand(2, 240, 320, 3))
|
|
results = dict(imgs=imgs, modality='RGB')
|
|
resize = Resize(scale=(-1, 256), keep_ratio=True, lazy=True)
|
|
resize_results = resize(results)
|
|
assert id(imgs) == id(resize_results['imgs'])
|
|
assert assert_dict_has_keys(resize_results, target_keys)
|
|
resize_results_fuse = Fuse()(resize_results)
|
|
assert np.all(resize_results_fuse['scale_factor'] == np.array(
|
|
[341 / 320, 256 / 240], dtype=np.float32))
|
|
assert resize_results_fuse['img_shape'] == (256, 341)
|
|
|
|
|
|
imgs = list(np.random.rand(2, 240, 320, 3))
|
|
results = dict(imgs=imgs, modality='RGB')
|
|
resize = Resize(scale=(320, 320), keep_ratio=False, lazy=True)
|
|
resize_results = resize(results)
|
|
assert id(imgs) == id(resize_results['imgs'])
|
|
assert assert_dict_has_keys(resize_results, target_keys)
|
|
resize_results_fuse = Fuse()(resize_results)
|
|
assert np.all(resize_results_fuse['scale_factor'] == np.array(
|
|
[1, 320 / 240], dtype=np.float32))
|
|
assert resize_results_fuse['img_shape'] == (320, 320)
|
|
|
|
|
|
imgs = list(np.random.rand(2, 240, 320, 3))
|
|
results = dict(imgs=imgs, modality='RGB')
|
|
resize = Resize(scale=(341, 256), keep_ratio=False, lazy=True)
|
|
resize_results = resize(results)
|
|
assert id(imgs) == id(resize_results['imgs'])
|
|
assert assert_dict_has_keys(resize_results, target_keys)
|
|
resize_results_fuse = Fuse()(resize_results)
|
|
assert np.all(resize_results_fuse['scale_factor'] == np.array(
|
|
[341 / 320, 256 / 240], dtype=np.float32))
|
|
assert resize_results_fuse['img_shape'] == (256, 341)
|
|
|
|
assert repr(resize) == (f'{resize.__class__.__name__}'
|
|
f'(scale={(341, 256)}, keep_ratio={False}, ' +
|
|
f'interpolation=bilinear, lazy={True})')
|
|
|
|
@staticmethod
|
|
def test_flip_lazy():
|
|
with pytest.raises(ValueError):
|
|
Flip(direction='vertically', lazy=True)
|
|
|
|
target_keys = ['imgs', 'flip_direction', 'modality']
|
|
|
|
|
|
imgs = list(np.random.rand(2, 64, 64, 3))
|
|
imgs_tmp = imgs.copy()
|
|
results = dict(imgs=imgs_tmp, modality='RGB')
|
|
flip = Flip(flip_ratio=0, direction='horizontal', lazy=True)
|
|
flip_results = flip(results)
|
|
assert id(imgs_tmp) == id(flip_results['imgs'])
|
|
assert assert_dict_has_keys(flip_results, target_keys)
|
|
flip_results_fuse = Fuse()(flip_results)
|
|
assert np.equal(imgs, results['imgs']).all()
|
|
assert id(flip_results['imgs']) == id(results['imgs'])
|
|
assert flip_results_fuse['imgs'][0].shape == (64, 64, 3)
|
|
|
|
|
|
imgs = list(np.random.rand(2, 64, 64, 3))
|
|
imgs_tmp = imgs.copy()
|
|
results = dict(imgs=imgs_tmp, modality='RGB')
|
|
flip = Flip(flip_ratio=1, direction='horizontal', lazy=True)
|
|
flip_results = flip(results)
|
|
assert id(imgs_tmp) == id(flip_results['imgs'])
|
|
assert assert_dict_has_keys(flip_results, target_keys)
|
|
flip_results_fuse = Fuse()(flip_results)
|
|
assert check_flip(imgs, flip_results['imgs'],
|
|
flip_results['flip_direction'])
|
|
assert id(flip_results['imgs']) == id(results['imgs'])
|
|
assert flip_results_fuse['imgs'][0].shape == (64, 64, 3)
|
|
|
|
|
|
imgs = list(np.random.rand(2, 64, 64, 3))
|
|
imgs_tmp = imgs.copy()
|
|
results = dict(imgs=imgs_tmp, modality='RGB')
|
|
flip = Flip(flip_ratio=1, direction='vertical', lazy=True)
|
|
flip_results = flip(results)
|
|
assert id(imgs_tmp) == id(flip_results['imgs'])
|
|
assert assert_dict_has_keys(flip_results, target_keys)
|
|
flip_results_fuse = Fuse()(flip_results)
|
|
assert check_flip(imgs, flip_results['imgs'],
|
|
flip_results['flip_direction'])
|
|
assert id(flip_results['imgs']) == id(results['imgs'])
|
|
assert flip_results_fuse['imgs'][0].shape == (64, 64, 3)
|
|
|
|
assert repr(flip) == (f'{flip.__class__.__name__}'
|
|
f'(flip_ratio={1}, direction=vertical, '
|
|
f'flip_label_map={None}, lazy={True})')
|
|
|
|
@staticmethod
|
|
def test_center_crop_lazy():
|
|
with pytest.raises(TypeError):
|
|
|
|
CenterCrop(0.5)
|
|
|
|
with pytest.raises(TypeError):
|
|
|
|
CenterCrop('224')
|
|
|
|
|
|
imgs = list(np.random.rand(2, 240, 320, 3))
|
|
results = dict(imgs=imgs)
|
|
center_crop = CenterCrop(crop_size=224, lazy=True)
|
|
center_crop_results = center_crop(results)
|
|
|
|
target_keys = ['imgs', 'crop_bbox', 'img_shape']
|
|
assert assert_dict_has_keys(center_crop_results, target_keys)
|
|
center_crop_results_fuse = Fuse()(center_crop_results)
|
|
assert check_crop(imgs, center_crop_results_fuse['imgs'],
|
|
center_crop_results['crop_bbox'])
|
|
assert np.all(center_crop_results_fuse['crop_bbox'] == np.array(
|
|
[48, 8, 272, 232]))
|
|
assert center_crop_results_fuse['img_shape'] == (224, 224)
|
|
|
|
assert repr(center_crop) == (f'{center_crop.__class__.__name__}'
|
|
f'(crop_size={(224, 224)}, lazy={True})')
|
|
|