Commit c5aba735 authored by narugo1992's avatar narugo1992
Browse files

dev(narugo): add full unittest for pillow_resize class

parent ee38b50d
Loading
Loading
Loading
Loading
+20 −22
Original line number Diff line number Diff line
import copy
import io
from textwrap import indent
from typing import Union, Sequence, Optional, Tuple
from typing import Union, Optional, Tuple, List

import numpy as np
from PIL import Image
@@ -60,16 +60,21 @@ class PillowResize:
    # noinspection PyUnresolvedReferences
    def __init__(
            self,
            size: Union[int, Sequence[int]],
            size: Union[int, List[int], Tuple[int, ...]],
            interpolation: int = Image.BILINEAR,
            max_size: Optional[int] = None,
            antialias: bool = True
    ):
        if not isinstance(size, (int, Sequence)):
        if not isinstance(size, (int, list, tuple)):
            raise TypeError(f"Size should be int or sequence. Got {type(size)}")
        if isinstance(size, Sequence) and len(size) not in (1, 2):
        if isinstance(size, (list, tuple)) and len(size) not in (1, 2):
            raise ValueError("If size is a sequence, it should have 1 or 2 values")
        if max_size is not None and isinstance(size, (list, tuple)) and len(size) != 1:
            raise ValueError(
                "max_size is only supported for single int size or sequence of length 1"
            )

        # noinspection PyTypeChecker
        self.size = size
        self.interpolation = interpolation
        self.max_size = max_size
@@ -77,12 +82,8 @@ class PillowResize:

    def _get_resize_size(self, img: Image.Image) -> Tuple[int, int]:
        w, h = img.size

        if isinstance(self.size, int) or (isinstance(self.size, Sequence) and len(self.size) == 1):
        if isinstance(self.size, int) or (isinstance(self.size, (list, tuple)) and len(self.size) == 1):
            size = self.size if isinstance(self.size, int) else self.size[0]
            if (w <= h and w == size) or (h <= w and h == size):
                return w, h

            if w < h:
                ow = size
                oh = int(size * h / w)
@@ -91,7 +92,6 @@ class PillowResize:
                ow = int(size * w / h)

            if self.max_size is not None:
                if isinstance(self.size, int) or len(self.size) == 1:
                max_size = self.max_size
                if max(oh, ow) > max_size:
                    if oh > ow:
@@ -100,10 +100,6 @@ class PillowResize:
                    else:
                        oh = int(max_size * oh / ow)
                        ow = max_size
                else:
                    raise ValueError(
                        "max_size is only supported for single int size or sequence of length 1"
                    )

            return ow, oh
        else:
@@ -122,6 +118,8 @@ class PillowResize:
                return img.resize(size, self.interpolation, reducing_gap=None if self.antialias else 1.0)
            else:
                return img.resize(size, self.interpolation)
        else:
            return img

    def __repr__(self) -> str:
        interpolate_str = _PILLOW_TO_STR[self.interpolation]
+243 −4
Original line number Diff line number Diff line
from unittest import skipUnless

import numpy as np
import pytest
from PIL import Image
from hbutils.testing import tmatrix
@@ -18,15 +19,59 @@ else:

@pytest.mark.unittest
class TestPreprocessPillow:
    def test_get_pillow_resample_int(self):
        assert _get_pillow_resample(0) == Image.NEAREST
        assert _get_pillow_resample(1) == Image.LANCZOS
        assert _get_pillow_resample(2) == Image.BILINEAR
        assert _get_pillow_resample(3) == Image.BICUBIC
        assert _get_pillow_resample(4) == Image.BOX
        assert _get_pillow_resample(5) == Image.HAMMING

    def test_get_pillow_resample_str(self):
        assert _get_pillow_resample('nearest') == Image.NEAREST
        assert _get_pillow_resample('NEAREST') == Image.NEAREST
        assert _get_pillow_resample('bilinear') == Image.BILINEAR
        assert _get_pillow_resample('bicubic') == Image.BICUBIC
        assert _get_pillow_resample('box') == Image.BOX
        assert _get_pillow_resample('hamming') == Image.HAMMING
        assert _get_pillow_resample('lanczos') == Image.LANCZOS

    def test_invalid_int(self):
        with pytest.raises(ValueError, match='Invalid interpolation value - 6.'):
            _get_pillow_resample(6)

    def test_invalid_str(self):
        with pytest.raises(ValueError, match='Invalid interpolation value - \'invalid\'.'):
            _get_pillow_resample('invalid')

    def test_invalid_type(self):
        with pytest.raises(TypeError, match='Input type must be int or str, got <class \'float\'>'):
            _get_pillow_resample(1.0)

    def test_resize_invalid(self):
        with pytest.raises(TypeError):
            _ = PillowResize(size='888')
        with pytest.raises(ValueError):
            _ = PillowResize(size=())
        with pytest.raises(ValueError):
            _ = PillowResize(size=(1, 1, 4, 5, 1, 4))

    def test_resize_invalid_input(self):
        resize = PillowResize(size=640)
        with pytest.raises(TypeError):
            _ = resize(np.random.randn(3, 284, 284))

    @skipUnless(_TORCHVISION_AVAILABLE, 'Torchvision unavailable.')
    @pytest.mark.parametrize(*tmatrix({
        'src_image': [
            'png_full.png',
            'png_full_m90.png',
            'png_640.png',
            'png_640_m90.png',
        ],
        'size': [
            224,
            384,
            640,
            888,
        ],
        'resample': [
            'bilinear',
@@ -53,13 +98,14 @@ class TestPreprocessPillow:
    @skipUnless(_TORCHVISION_AVAILABLE, 'Torchvision unavailable.')
    @pytest.mark.parametrize(*tmatrix({
        'src_image': [
            'png_full.png',
            'png_full_m90.png',
            'png_640.png',
            'png_640_m90.png',
        ],
        'size': [
            (224, 384),
            (384, 224),
            (256,),
            (999, 888),
        ],
        'resample': [
            'bilinear',
@@ -82,3 +128,196 @@ class TestPreprocessPillow:
            interpolation=_get_interpolation_mode(resample),
        )
        assert image_diff(presize(image), tresize(image), throw_exception=False) < 1e-3

    @skipUnless(_TORCHVISION_AVAILABLE, 'Torchvision unavailable.')
    @pytest.mark.parametrize(*tmatrix({
        'src_image': [
            'png_640.png',
            'png_640_m90.png',
        ],
        ('size', 'max_size'): [
            (224, 384),
            (224, 256),
            (224, 225),
            (256, 384),
            (256, 257),
        ],
        'resample': [
            'bilinear',
            'bicubic',
            'lanczos',
            'box',
            'hamming',
            'nearest',
        ]
    }))
    def test_resize_pair_max_sizes(self, src_image, size, max_size, resample, image_diff):
        from torchvision.transforms import Resize
        image = Image.open(get_testfile(src_image))
        presize = PillowResize(
            size=size,
            interpolation=_get_pillow_resample(resample),
            max_size=max_size,
        )
        tresize = Resize(
            size=size,
            interpolation=_get_interpolation_mode(resample),
            max_size=max_size,
        )
        assert image_diff(presize(image), tresize(image), throw_exception=False) < 1e-3

    @pytest.mark.parametrize(['size', 'interpolation', 'max_size', 'antialias', 'repr_text'], [
        (224, 0, None, True, 'PillowResize(size=224, interpolation=nearest, max_size=None, antialias=True)'),
        (224, 0, None, False, 'PillowResize(size=224, interpolation=nearest, max_size=None, antialias=False)'),
        (224, 2, None, True, 'PillowResize(size=224, interpolation=bilinear, max_size=None, antialias=True)'),
        (224, 2, None, False, 'PillowResize(size=224, interpolation=bilinear, max_size=None, antialias=False)'),
        (224, 3, None, True, 'PillowResize(size=224, interpolation=bicubic, max_size=None, antialias=True)'),
        (224, 3, None, False, 'PillowResize(size=224, interpolation=bicubic, max_size=None, antialias=False)'),
        (224, 4, None, True, 'PillowResize(size=224, interpolation=box, max_size=None, antialias=True)'),
        (224, 4, None, False, 'PillowResize(size=224, interpolation=box, max_size=None, antialias=False)'),
        (224, 5, None, True, 'PillowResize(size=224, interpolation=hamming, max_size=None, antialias=True)'),
        (224, 5, None, False, 'PillowResize(size=224, interpolation=hamming, max_size=None, antialias=False)'),
        (224, 1, None, True, 'PillowResize(size=224, interpolation=lanczos, max_size=None, antialias=True)'),
        (224, 1, None, False, 'PillowResize(size=224, interpolation=lanczos, max_size=None, antialias=False)'),
        (224, 0, 384, True, 'PillowResize(size=224, interpolation=nearest, max_size=384, antialias=True)'),
        (224, 0, 384, False, 'PillowResize(size=224, interpolation=nearest, max_size=384, antialias=False)'),
        (224, 2, 384, True, 'PillowResize(size=224, interpolation=bilinear, max_size=384, antialias=True)'),
        (224, 2, 384, False, 'PillowResize(size=224, interpolation=bilinear, max_size=384, antialias=False)'),
        (224, 3, 384, True, 'PillowResize(size=224, interpolation=bicubic, max_size=384, antialias=True)'),
        (224, 3, 384, False, 'PillowResize(size=224, interpolation=bicubic, max_size=384, antialias=False)'),
        (224, 4, 384, True, 'PillowResize(size=224, interpolation=box, max_size=384, antialias=True)'),
        (224, 4, 384, False, 'PillowResize(size=224, interpolation=box, max_size=384, antialias=False)'),
        (224, 5, 384, True, 'PillowResize(size=224, interpolation=hamming, max_size=384, antialias=True)'),
        (224, 5, 384, False, 'PillowResize(size=224, interpolation=hamming, max_size=384, antialias=False)'),
        (224, 1, 384, True, 'PillowResize(size=224, interpolation=lanczos, max_size=384, antialias=True)'),
        (224, 1, 384, False, 'PillowResize(size=224, interpolation=lanczos, max_size=384, antialias=False)'),
        (224, 0, 640, True, 'PillowResize(size=224, interpolation=nearest, max_size=640, antialias=True)'),
        (224, 0, 640, False, 'PillowResize(size=224, interpolation=nearest, max_size=640, antialias=False)'),
        (224, 2, 640, True, 'PillowResize(size=224, interpolation=bilinear, max_size=640, antialias=True)'),
        (224, 2, 640, False, 'PillowResize(size=224, interpolation=bilinear, max_size=640, antialias=False)'),
        (224, 3, 640, True, 'PillowResize(size=224, interpolation=bicubic, max_size=640, antialias=True)'),
        (224, 3, 640, False, 'PillowResize(size=224, interpolation=bicubic, max_size=640, antialias=False)'),
        (224, 4, 640, True, 'PillowResize(size=224, interpolation=box, max_size=640, antialias=True)'),
        (224, 4, 640, False, 'PillowResize(size=224, interpolation=box, max_size=640, antialias=False)'),
        (224, 5, 640, True, 'PillowResize(size=224, interpolation=hamming, max_size=640, antialias=True)'),
        (224, 5, 640, False, 'PillowResize(size=224, interpolation=hamming, max_size=640, antialias=False)'),
        (224, 1, 640, True, 'PillowResize(size=224, interpolation=lanczos, max_size=640, antialias=True)'),
        (224, 1, 640, False, 'PillowResize(size=224, interpolation=lanczos, max_size=640, antialias=False)'),
        (224, 0, 888, True, 'PillowResize(size=224, interpolation=nearest, max_size=888, antialias=True)'),
        (224, 0, 888, False, 'PillowResize(size=224, interpolation=nearest, max_size=888, antialias=False)'),
        (224, 2, 888, True, 'PillowResize(size=224, interpolation=bilinear, max_size=888, antialias=True)'),
        (224, 2, 888, False, 'PillowResize(size=224, interpolation=bilinear, max_size=888, antialias=False)'),
        (224, 3, 888, True, 'PillowResize(size=224, interpolation=bicubic, max_size=888, antialias=True)'),
        (224, 3, 888, False, 'PillowResize(size=224, interpolation=bicubic, max_size=888, antialias=False)'),
        (224, 4, 888, True, 'PillowResize(size=224, interpolation=box, max_size=888, antialias=True)'),
        (224, 4, 888, False, 'PillowResize(size=224, interpolation=box, max_size=888, antialias=False)'),
        (224, 5, 888, True, 'PillowResize(size=224, interpolation=hamming, max_size=888, antialias=True)'),
        (224, 5, 888, False, 'PillowResize(size=224, interpolation=hamming, max_size=888, antialias=False)'),
        (224, 1, 888, True, 'PillowResize(size=224, interpolation=lanczos, max_size=888, antialias=True)'),
        (224, 1, 888, False, 'PillowResize(size=224, interpolation=lanczos, max_size=888, antialias=False)'),
        (384, 0, None, True, 'PillowResize(size=384, interpolation=nearest, max_size=None, antialias=True)'),
        (384, 0, None, False, 'PillowResize(size=384, interpolation=nearest, max_size=None, antialias=False)'),
        (384, 2, None, True, 'PillowResize(size=384, interpolation=bilinear, max_size=None, antialias=True)'),
        (384, 2, None, False, 'PillowResize(size=384, interpolation=bilinear, max_size=None, antialias=False)'),
        (384, 3, None, True, 'PillowResize(size=384, interpolation=bicubic, max_size=None, antialias=True)'),
        (384, 3, None, False, 'PillowResize(size=384, interpolation=bicubic, max_size=None, antialias=False)'),
        (384, 4, None, True, 'PillowResize(size=384, interpolation=box, max_size=None, antialias=True)'),
        (384, 4, None, False, 'PillowResize(size=384, interpolation=box, max_size=None, antialias=False)'),
        (384, 5, None, True, 'PillowResize(size=384, interpolation=hamming, max_size=None, antialias=True)'),
        (384, 5, None, False, 'PillowResize(size=384, interpolation=hamming, max_size=None, antialias=False)'),
        (384, 1, None, True, 'PillowResize(size=384, interpolation=lanczos, max_size=None, antialias=True)'),
        (384, 1, None, False, 'PillowResize(size=384, interpolation=lanczos, max_size=None, antialias=False)'),
        (384, 0, 384, True, 'PillowResize(size=384, interpolation=nearest, max_size=384, antialias=True)'),
        (384, 0, 384, False, 'PillowResize(size=384, interpolation=nearest, max_size=384, antialias=False)'),
        (384, 2, 384, True, 'PillowResize(size=384, interpolation=bilinear, max_size=384, antialias=True)'),
        (384, 2, 384, False, 'PillowResize(size=384, interpolation=bilinear, max_size=384, antialias=False)'),
        (384, 3, 384, True, 'PillowResize(size=384, interpolation=bicubic, max_size=384, antialias=True)'),
        (384, 3, 384, False, 'PillowResize(size=384, interpolation=bicubic, max_size=384, antialias=False)'),
        (384, 4, 384, True, 'PillowResize(size=384, interpolation=box, max_size=384, antialias=True)'),
        (384, 4, 384, False, 'PillowResize(size=384, interpolation=box, max_size=384, antialias=False)'),
        (384, 5, 384, True, 'PillowResize(size=384, interpolation=hamming, max_size=384, antialias=True)'),
        (384, 5, 384, False, 'PillowResize(size=384, interpolation=hamming, max_size=384, antialias=False)'),
        (384, 1, 384, True, 'PillowResize(size=384, interpolation=lanczos, max_size=384, antialias=True)'),
        (384, 1, 384, False, 'PillowResize(size=384, interpolation=lanczos, max_size=384, antialias=False)'),
        (384, 0, 640, True, 'PillowResize(size=384, interpolation=nearest, max_size=640, antialias=True)'),
        (384, 0, 640, False, 'PillowResize(size=384, interpolation=nearest, max_size=640, antialias=False)'),
        (384, 2, 640, True, 'PillowResize(size=384, interpolation=bilinear, max_size=640, antialias=True)'),
        (384, 2, 640, False, 'PillowResize(size=384, interpolation=bilinear, max_size=640, antialias=False)'),
        (384, 3, 640, True, 'PillowResize(size=384, interpolation=bicubic, max_size=640, antialias=True)'),
        (384, 3, 640, False, 'PillowResize(size=384, interpolation=bicubic, max_size=640, antialias=False)'),
        (384, 4, 640, True, 'PillowResize(size=384, interpolation=box, max_size=640, antialias=True)'),
        (384, 4, 640, False, 'PillowResize(size=384, interpolation=box, max_size=640, antialias=False)'),
        (384, 5, 640, True, 'PillowResize(size=384, interpolation=hamming, max_size=640, antialias=True)'),
        (384, 5, 640, False, 'PillowResize(size=384, interpolation=hamming, max_size=640, antialias=False)'),
        (384, 1, 640, True, 'PillowResize(size=384, interpolation=lanczos, max_size=640, antialias=True)'),
        (384, 1, 640, False, 'PillowResize(size=384, interpolation=lanczos, max_size=640, antialias=False)'),
        (384, 0, 888, True, 'PillowResize(size=384, interpolation=nearest, max_size=888, antialias=True)'),
        (384, 0, 888, False, 'PillowResize(size=384, interpolation=nearest, max_size=888, antialias=False)'),
        (384, 2, 888, True, 'PillowResize(size=384, interpolation=bilinear, max_size=888, antialias=True)'),
        (384, 2, 888, False, 'PillowResize(size=384, interpolation=bilinear, max_size=888, antialias=False)'),
        (384, 3, 888, True, 'PillowResize(size=384, interpolation=bicubic, max_size=888, antialias=True)'),
        (384, 3, 888, False, 'PillowResize(size=384, interpolation=bicubic, max_size=888, antialias=False)'),
        (384, 4, 888, True, 'PillowResize(size=384, interpolation=box, max_size=888, antialias=True)'),
        (384, 4, 888, False, 'PillowResize(size=384, interpolation=box, max_size=888, antialias=False)'),
        (384, 5, 888, True, 'PillowResize(size=384, interpolation=hamming, max_size=888, antialias=True)'),
        (384, 5, 888, False, 'PillowResize(size=384, interpolation=hamming, max_size=888, antialias=False)'),
        (384, 1, 888, True, 'PillowResize(size=384, interpolation=lanczos, max_size=888, antialias=True)'),
        (384, 1, 888, False, 'PillowResize(size=384, interpolation=lanczos, max_size=888, antialias=False)'),
        ((224, 384), 0, None, True,
         'PillowResize(size=(224, 384), interpolation=nearest, max_size=None, antialias=True)'),
        ((224, 384), 0, None, False,
         'PillowResize(size=(224, 384), interpolation=nearest, max_size=None, antialias=False)'),
        ((224, 384), 2, None, True,
         'PillowResize(size=(224, 384), interpolation=bilinear, max_size=None, antialias=True)'),
        ((224, 384), 2, None, False,
         'PillowResize(size=(224, 384), interpolation=bilinear, max_size=None, antialias=False)'),
        ((224, 384), 3, None, True,
         'PillowResize(size=(224, 384), interpolation=bicubic, max_size=None, antialias=True)'),
        ((224, 384), 3, None, False,
         'PillowResize(size=(224, 384), interpolation=bicubic, max_size=None, antialias=False)'),
        ((224, 384), 4, None, True, 'PillowResize(size=(224, 384), interpolation=box, max_size=None, antialias=True)'),
        (
                (224, 384), 4, None, False,
                'PillowResize(size=(224, 384), interpolation=box, max_size=None, antialias=False)'),
        ((224, 384), 5, None, True,
         'PillowResize(size=(224, 384), interpolation=hamming, max_size=None, antialias=True)'),
        ((224, 384), 5, None, False,
         'PillowResize(size=(224, 384), interpolation=hamming, max_size=None, antialias=False)'),
        ((224, 384), 1, None, True,
         'PillowResize(size=(224, 384), interpolation=lanczos, max_size=None, antialias=True)'),
        ((224, 384), 1, None, False,
         'PillowResize(size=(224, 384), interpolation=lanczos, max_size=None, antialias=False)'),
        ([224, 284], 0, None, True,
         'PillowResize(size=[224, 284], interpolation=nearest, max_size=None, antialias=True)'),
        ([224, 284], 0, None, False,
         'PillowResize(size=[224, 284], interpolation=nearest, max_size=None, antialias=False)'),
        ([224, 284], 2, None, True,
         'PillowResize(size=[224, 284], interpolation=bilinear, max_size=None, antialias=True)'),
        ([224, 284], 2, None, False,
         'PillowResize(size=[224, 284], interpolation=bilinear, max_size=None, antialias=False)'),
        ([224, 284], 3, None, True,
         'PillowResize(size=[224, 284], interpolation=bicubic, max_size=None, antialias=True)'),
        ([224, 284], 3, None, False,
         'PillowResize(size=[224, 284], interpolation=bicubic, max_size=None, antialias=False)'),
        ([224, 284], 4, None, True, 'PillowResize(size=[224, 284], interpolation=box, max_size=None, antialias=True)'),
        (
                [224, 284], 4, None, False,
                'PillowResize(size=[224, 284], interpolation=box, max_size=None, antialias=False)'),
        ([224, 284], 5, None, True,
         'PillowResize(size=[224, 284], interpolation=hamming, max_size=None, antialias=True)'),
        ([224, 284], 5, None, False,
         'PillowResize(size=[224, 284], interpolation=hamming, max_size=None, antialias=False)'),
        ([224, 284], 1, None, True,
         'PillowResize(size=[224, 284], interpolation=lanczos, max_size=None, antialias=True)'),
        ([224, 284], 1, None, False,
         'PillowResize(size=[224, 284], interpolation=lanczos, max_size=None, antialias=False)'),

    ])
    def test_resize_repr(self, size, interpolation, max_size, antialias, repr_text):
        size = PillowResize(
            size=size,
            interpolation=interpolation,
            max_size=max_size,
            antialias=antialias,
        )
        assert repr(size) == repr_text
+820 KiB
Loading image diff...
+821 KiB
Loading image diff...