|
import copy |
|
import os.path as osp |
|
|
|
import mmcv |
|
import numpy as np |
|
import pytest |
|
from mmcv.utils import build_from_cfg |
|
from PIL import Image |
|
|
|
from mmseg.datasets.builder import PIPELINES |
|
|
|
|
|
def test_resize(): |
|
|
|
with pytest.raises(AssertionError): |
|
transform = dict(type='Resize', img_scale=[1333, 800], keep_ratio=True) |
|
build_from_cfg(transform, PIPELINES) |
|
|
|
|
|
with pytest.raises(AssertionError): |
|
transform = dict( |
|
type='Resize', |
|
img_scale=[(1333, 800), (1333, 600)], |
|
ratio_range=(0.9, 1.1), |
|
keep_ratio=True) |
|
build_from_cfg(transform, PIPELINES) |
|
|
|
|
|
with pytest.raises(AssertionError): |
|
transform = dict( |
|
type='Resize', |
|
img_scale=[(1333, 800), (1333, 600)], |
|
keep_ratio=True, |
|
multiscale_mode='2333') |
|
build_from_cfg(transform, PIPELINES) |
|
|
|
transform = dict(type='Resize', img_scale=(1333, 800), keep_ratio=True) |
|
resize_module = build_from_cfg(transform, PIPELINES) |
|
|
|
results = dict() |
|
|
|
img = mmcv.imread( |
|
osp.join(osp.dirname(__file__), '../data/color.jpg'), 'color') |
|
results['img'] = img |
|
results['img_shape'] = img.shape |
|
results['ori_shape'] = img.shape |
|
|
|
results['pad_shape'] = img.shape |
|
results['scale_factor'] = 1.0 |
|
|
|
resized_results = resize_module(results.copy()) |
|
assert resized_results['img_shape'] == (750, 1333, 3) |
|
|
|
|
|
transform = dict( |
|
type='Resize', |
|
img_scale=(1280, 800), |
|
multiscale_mode='value', |
|
keep_ratio=False) |
|
resize_module = build_from_cfg(transform, PIPELINES) |
|
resized_results = resize_module(results.copy()) |
|
assert resized_results['img_shape'] == (800, 1280, 3) |
|
|
|
|
|
transform = dict( |
|
type='Resize', |
|
img_scale=[(1333, 400), (1333, 1200)], |
|
multiscale_mode='range', |
|
keep_ratio=True) |
|
resize_module = build_from_cfg(transform, PIPELINES) |
|
resized_results = resize_module(results.copy()) |
|
assert max(resized_results['img_shape'][:2]) <= 1333 |
|
assert min(resized_results['img_shape'][:2]) >= 400 |
|
assert min(resized_results['img_shape'][:2]) <= 1200 |
|
|
|
|
|
transform = dict( |
|
type='Resize', |
|
img_scale=[(1333, 800), (1333, 400)], |
|
multiscale_mode='value', |
|
keep_ratio=True) |
|
resize_module = build_from_cfg(transform, PIPELINES) |
|
resized_results = resize_module(results.copy()) |
|
assert resized_results['img_shape'] in [(750, 1333, 3), (400, 711, 3)] |
|
|
|
|
|
transform = dict( |
|
type='Resize', |
|
img_scale=(1333, 800), |
|
ratio_range=(0.9, 1.1), |
|
keep_ratio=True) |
|
resize_module = build_from_cfg(transform, PIPELINES) |
|
resized_results = resize_module(results.copy()) |
|
assert max(resized_results['img_shape'][:2]) <= 1333 * 1.1 |
|
|
|
|
|
|
|
transform = dict( |
|
type='Resize', img_scale=None, ratio_range=(0.5, 2.0), keep_ratio=True) |
|
resize_module = build_from_cfg(transform, PIPELINES) |
|
resized_results = resize_module(results.copy()) |
|
assert int(288 * 0.5) <= resized_results['img_shape'][0] <= 288 * 2.0 |
|
assert int(512 * 0.5) <= resized_results['img_shape'][1] <= 512 * 2.0 |
|
|
|
|
|
def test_flip(): |
|
|
|
with pytest.raises(AssertionError): |
|
transform = dict(type='RandomFlip', prob=1.5) |
|
build_from_cfg(transform, PIPELINES) |
|
|
|
|
|
with pytest.raises(AssertionError): |
|
transform = dict(type='RandomFlip', prob=1, direction='horizonta') |
|
build_from_cfg(transform, PIPELINES) |
|
|
|
transform = dict(type='RandomFlip', prob=1) |
|
flip_module = build_from_cfg(transform, PIPELINES) |
|
|
|
results = dict() |
|
img = mmcv.imread( |
|
osp.join(osp.dirname(__file__), '../data/color.jpg'), 'color') |
|
original_img = copy.deepcopy(img) |
|
seg = np.array( |
|
Image.open(osp.join(osp.dirname(__file__), '../data/seg.png'))) |
|
original_seg = copy.deepcopy(seg) |
|
results['img'] = img |
|
results['gt_semantic_seg'] = seg |
|
results['seg_fields'] = ['gt_semantic_seg'] |
|
results['img_shape'] = img.shape |
|
results['ori_shape'] = img.shape |
|
|
|
results['pad_shape'] = img.shape |
|
results['scale_factor'] = 1.0 |
|
|
|
results = flip_module(results) |
|
|
|
flip_module = build_from_cfg(transform, PIPELINES) |
|
results = flip_module(results) |
|
assert np.equal(original_img, results['img']).all() |
|
assert np.equal(original_seg, results['gt_semantic_seg']).all() |
|
|
|
|
|
def test_random_crop(): |
|
|
|
with pytest.raises(AssertionError): |
|
transform = dict(type='RandomCrop', crop_size=(-1, 0)) |
|
build_from_cfg(transform, PIPELINES) |
|
|
|
results = dict() |
|
img = mmcv.imread( |
|
osp.join(osp.dirname(__file__), '../data/color.jpg'), 'color') |
|
seg = np.array( |
|
Image.open(osp.join(osp.dirname(__file__), '../data/seg.png'))) |
|
results['img'] = img |
|
results['gt_semantic_seg'] = seg |
|
results['seg_fields'] = ['gt_semantic_seg'] |
|
results['img_shape'] = img.shape |
|
results['ori_shape'] = img.shape |
|
|
|
results['pad_shape'] = img.shape |
|
results['scale_factor'] = 1.0 |
|
|
|
h, w, _ = img.shape |
|
transform = dict(type='RandomCrop', crop_size=(h - 20, w - 20)) |
|
crop_module = build_from_cfg(transform, PIPELINES) |
|
results = crop_module(results) |
|
assert results['img'].shape[:2] == (h - 20, w - 20) |
|
assert results['img_shape'][:2] == (h - 20, w - 20) |
|
assert results['gt_semantic_seg'].shape[:2] == (h - 20, w - 20) |
|
|
|
|
|
def test_pad(): |
|
|
|
with pytest.raises(AssertionError): |
|
transform = dict(type='Pad') |
|
build_from_cfg(transform, PIPELINES) |
|
|
|
transform = dict(type='Pad', size_divisor=32) |
|
transform = build_from_cfg(transform, PIPELINES) |
|
results = dict() |
|
img = mmcv.imread( |
|
osp.join(osp.dirname(__file__), '../data/color.jpg'), 'color') |
|
original_img = copy.deepcopy(img) |
|
results['img'] = img |
|
results['img_shape'] = img.shape |
|
results['ori_shape'] = img.shape |
|
|
|
results['pad_shape'] = img.shape |
|
results['scale_factor'] = 1.0 |
|
|
|
results = transform(results) |
|
|
|
assert np.equal(results['img'], original_img).all() |
|
img_shape = results['img'].shape |
|
assert img_shape[0] % 32 == 0 |
|
assert img_shape[1] % 32 == 0 |
|
|
|
resize_transform = dict( |
|
type='Resize', img_scale=(1333, 800), keep_ratio=True) |
|
resize_module = build_from_cfg(resize_transform, PIPELINES) |
|
results = resize_module(results) |
|
results = transform(results) |
|
img_shape = results['img'].shape |
|
assert img_shape[0] % 32 == 0 |
|
assert img_shape[1] % 32 == 0 |
|
|
|
|
|
def test_rotate(): |
|
|
|
with pytest.raises(AssertionError): |
|
transform = dict(type='RandomRotate', prob=0.5, degree=-10) |
|
build_from_cfg(transform, PIPELINES) |
|
|
|
with pytest.raises(AssertionError): |
|
transform = dict(type='RandomRotate', prob=0.5, degree=(10., 20., 30.)) |
|
build_from_cfg(transform, PIPELINES) |
|
|
|
transform = dict(type='RandomRotate', degree=10., prob=1.) |
|
transform = build_from_cfg(transform, PIPELINES) |
|
|
|
assert str(transform) == f'RandomRotate(' \ |
|
f'prob={1.}, ' \ |
|
f'degree=({-10.}, {10.}), ' \ |
|
f'pad_val={0}, ' \ |
|
f'seg_pad_val={255}, ' \ |
|
f'center={None}, ' \ |
|
f'auto_bound={False})' |
|
|
|
results = dict() |
|
img = mmcv.imread( |
|
osp.join(osp.dirname(__file__), '../data/color.jpg'), 'color') |
|
h, w, _ = img.shape |
|
seg = np.array( |
|
Image.open(osp.join(osp.dirname(__file__), '../data/seg.png'))) |
|
results['img'] = img |
|
results['gt_semantic_seg'] = seg |
|
results['seg_fields'] = ['gt_semantic_seg'] |
|
results['img_shape'] = img.shape |
|
results['ori_shape'] = img.shape |
|
|
|
results['pad_shape'] = img.shape |
|
results['scale_factor'] = 1.0 |
|
|
|
results = transform(results) |
|
assert results['img'].shape[:2] == (h, w) |
|
assert results['gt_semantic_seg'].shape[:2] == (h, w) |
|
|
|
|
|
def test_normalize(): |
|
img_norm_cfg = dict( |
|
mean=[123.675, 116.28, 103.53], |
|
std=[58.395, 57.12, 57.375], |
|
to_rgb=True) |
|
transform = dict(type='Normalize', **img_norm_cfg) |
|
transform = build_from_cfg(transform, PIPELINES) |
|
results = dict() |
|
img = mmcv.imread( |
|
osp.join(osp.dirname(__file__), '../data/color.jpg'), 'color') |
|
original_img = copy.deepcopy(img) |
|
results['img'] = img |
|
results['img_shape'] = img.shape |
|
results['ori_shape'] = img.shape |
|
|
|
results['pad_shape'] = img.shape |
|
results['scale_factor'] = 1.0 |
|
|
|
results = transform(results) |
|
|
|
mean = np.array(img_norm_cfg['mean']) |
|
std = np.array(img_norm_cfg['std']) |
|
converted_img = (original_img[..., ::-1] - mean) / std |
|
assert np.allclose(results['img'], converted_img) |
|
|
|
|
|
def test_rgb2gray(): |
|
|
|
with pytest.raises(AssertionError): |
|
transform = dict(type='RGB2Gray', out_channels=-1) |
|
build_from_cfg(transform, PIPELINES) |
|
|
|
with pytest.raises(AssertionError): |
|
transform = dict(type='RGB2Gray', out_channels=1, weights=1.1) |
|
build_from_cfg(transform, PIPELINES) |
|
|
|
|
|
transform = dict(type='RGB2Gray') |
|
transform = build_from_cfg(transform, PIPELINES) |
|
|
|
assert str(transform) == f'RGB2Gray(' \ |
|
f'out_channels={None}, ' \ |
|
f'weights={(0.299, 0.587, 0.114)})' |
|
|
|
results = dict() |
|
img = mmcv.imread( |
|
osp.join(osp.dirname(__file__), '../data/color.jpg'), 'color') |
|
h, w, c = img.shape |
|
seg = np.array( |
|
Image.open(osp.join(osp.dirname(__file__), '../data/seg.png'))) |
|
results['img'] = img |
|
results['gt_semantic_seg'] = seg |
|
results['seg_fields'] = ['gt_semantic_seg'] |
|
results['img_shape'] = img.shape |
|
results['ori_shape'] = img.shape |
|
|
|
results['pad_shape'] = img.shape |
|
results['scale_factor'] = 1.0 |
|
|
|
results = transform(results) |
|
assert results['img'].shape == (h, w, c) |
|
assert results['img_shape'] == (h, w, c) |
|
assert results['ori_shape'] == (h, w, c) |
|
|
|
|
|
transform = dict(type='RGB2Gray', out_channels=2) |
|
transform = build_from_cfg(transform, PIPELINES) |
|
|
|
assert str(transform) == f'RGB2Gray(' \ |
|
f'out_channels={2}, ' \ |
|
f'weights={(0.299, 0.587, 0.114)})' |
|
|
|
results = dict() |
|
img = mmcv.imread( |
|
osp.join(osp.dirname(__file__), '../data/color.jpg'), 'color') |
|
h, w, c = img.shape |
|
seg = np.array( |
|
Image.open(osp.join(osp.dirname(__file__), '../data/seg.png'))) |
|
results['img'] = img |
|
results['gt_semantic_seg'] = seg |
|
results['seg_fields'] = ['gt_semantic_seg'] |
|
results['img_shape'] = img.shape |
|
results['ori_shape'] = img.shape |
|
|
|
results['pad_shape'] = img.shape |
|
results['scale_factor'] = 1.0 |
|
|
|
results = transform(results) |
|
assert results['img'].shape == (h, w, 2) |
|
assert results['img_shape'] == (h, w, 2) |
|
assert results['ori_shape'] == (h, w, c) |
|
|
|
|
|
def test_adjust_gamma(): |
|
|
|
with pytest.raises(AssertionError): |
|
transform = dict(type='AdjustGamma', gamma=0) |
|
build_from_cfg(transform, PIPELINES) |
|
|
|
|
|
with pytest.raises(AssertionError): |
|
transform = dict(type='AdjustGamma', gamma=[1.2]) |
|
build_from_cfg(transform, PIPELINES) |
|
|
|
|
|
transform = dict(type='AdjustGamma', gamma=1.2) |
|
transform = build_from_cfg(transform, PIPELINES) |
|
results = dict() |
|
img = mmcv.imread( |
|
osp.join(osp.dirname(__file__), '../data/color.jpg'), 'color') |
|
original_img = copy.deepcopy(img) |
|
results['img'] = img |
|
results['img_shape'] = img.shape |
|
results['ori_shape'] = img.shape |
|
|
|
results['pad_shape'] = img.shape |
|
results['scale_factor'] = 1.0 |
|
|
|
results = transform(results) |
|
|
|
inv_gamma = 1.0 / 1.2 |
|
table = np.array([((i / 255.0)**inv_gamma) * 255 |
|
for i in np.arange(0, 256)]).astype('uint8') |
|
converted_img = mmcv.lut_transform( |
|
np.array(original_img, dtype=np.uint8), table) |
|
assert np.allclose(results['img'], converted_img) |
|
assert str(transform) == f'AdjustGamma(gamma={1.2})' |
|
|
|
|
|
def test_rerange(): |
|
|
|
with pytest.raises(AssertionError): |
|
transform = dict(type='Rerange', min_value=[0], max_value=[255]) |
|
build_from_cfg(transform, PIPELINES) |
|
|
|
|
|
with pytest.raises(AssertionError): |
|
transform = dict(type='Rerange', min_value=1, max_value=1) |
|
build_from_cfg(transform, PIPELINES) |
|
|
|
|
|
with pytest.raises(AssertionError): |
|
transform = dict(type='Rerange', min_value=0, max_value=1) |
|
transform = build_from_cfg(transform, PIPELINES) |
|
results = dict() |
|
results['img'] = np.array([[1, 1], [1, 1]]) |
|
transform(results) |
|
|
|
img_rerange_cfg = dict() |
|
transform = dict(type='Rerange', **img_rerange_cfg) |
|
transform = build_from_cfg(transform, PIPELINES) |
|
results = dict() |
|
img = mmcv.imread( |
|
osp.join(osp.dirname(__file__), '../data/color.jpg'), 'color') |
|
original_img = copy.deepcopy(img) |
|
results['img'] = img |
|
results['img_shape'] = img.shape |
|
results['ori_shape'] = img.shape |
|
|
|
results['pad_shape'] = img.shape |
|
results['scale_factor'] = 1.0 |
|
|
|
results = transform(results) |
|
|
|
min_value = np.min(original_img) |
|
max_value = np.max(original_img) |
|
converted_img = (original_img - min_value) / (max_value - min_value) * 255 |
|
|
|
assert np.allclose(results['img'], converted_img) |
|
assert str(transform) == f'Rerange(min_value={0}, max_value={255})' |
|
|
|
|
|
def test_CLAHE(): |
|
|
|
with pytest.raises(AssertionError): |
|
transform = dict(type='CLAHE', clip_limit=None) |
|
build_from_cfg(transform, PIPELINES) |
|
|
|
|
|
with pytest.raises(AssertionError): |
|
transform = dict(type='CLAHE', tile_grid_size=(8.0, 8.0)) |
|
build_from_cfg(transform, PIPELINES) |
|
|
|
|
|
with pytest.raises(AssertionError): |
|
transform = dict(type='CLAHE', tile_grid_size=(9, 9, 9)) |
|
build_from_cfg(transform, PIPELINES) |
|
|
|
transform = dict(type='CLAHE', clip_limit=2) |
|
transform = build_from_cfg(transform, PIPELINES) |
|
results = dict() |
|
img = mmcv.imread( |
|
osp.join(osp.dirname(__file__), '../data/color.jpg'), 'color') |
|
original_img = copy.deepcopy(img) |
|
results['img'] = img |
|
results['img_shape'] = img.shape |
|
results['ori_shape'] = img.shape |
|
|
|
results['pad_shape'] = img.shape |
|
results['scale_factor'] = 1.0 |
|
|
|
results = transform(results) |
|
|
|
converted_img = np.empty(original_img.shape) |
|
for i in range(original_img.shape[2]): |
|
converted_img[:, :, i] = mmcv.clahe( |
|
np.array(original_img[:, :, i], dtype=np.uint8), 2, (8, 8)) |
|
|
|
assert np.allclose(results['img'], converted_img) |
|
assert str(transform) == f'CLAHE(clip_limit={2}, tile_grid_size={(8, 8)})' |
|
|
|
|
|
def test_seg_rescale(): |
|
results = dict() |
|
seg = np.array( |
|
Image.open(osp.join(osp.dirname(__file__), '../data/seg.png'))) |
|
results['gt_semantic_seg'] = seg |
|
results['seg_fields'] = ['gt_semantic_seg'] |
|
h, w = seg.shape |
|
|
|
transform = dict(type='SegRescale', scale_factor=1. / 2) |
|
rescale_module = build_from_cfg(transform, PIPELINES) |
|
rescale_results = rescale_module(results.copy()) |
|
assert rescale_results['gt_semantic_seg'].shape == (h // 2, w // 2) |
|
|
|
transform = dict(type='SegRescale', scale_factor=1) |
|
rescale_module = build_from_cfg(transform, PIPELINES) |
|
rescale_results = rescale_module(results.copy()) |
|
assert rescale_results['gt_semantic_seg'].shape == (h, w) |
|
|