4
4
import math
5
5
6
6
import numpy as np
7
- from PIL .Image import NEAREST , BILINEAR , BICUBIC
8
7
9
8
import torch
10
9
import torchvision .transforms .functional_tensor as F_t
11
10
import torchvision .transforms .functional_pil as F_pil
12
11
import torchvision .transforms .functional as F
12
+ from torchvision .transforms import InterpolationModes
13
13
14
14
from common_utils import TransformsTester
15
15
16
16
17
+ NEAREST , BILINEAR , BICUBIC = InterpolationModes .NEAREST , InterpolationModes .BILINEAR , InterpolationModes .BICUBIC
18
+
19
+
17
20
class Tester (TransformsTester ):
18
21
19
22
def setUp (self ):
@@ -365,7 +368,7 @@ def test_adjust_gamma(self):
365
368
)
366
369
367
370
def test_resize (self ):
368
- script_fn = torch .jit .script (F_t .resize )
371
+ script_fn = torch .jit .script (F .resize )
369
372
tensor , pil_img = self ._create_data (26 , 36 , device = self .device )
370
373
batch_tensors = self ._create_data_batch (16 , 18 , num_samples = 4 , device = self .device )
371
374
@@ -382,14 +385,14 @@ def test_resize(self):
382
385
383
386
for size in [32 , 26 , [32 , ], [32 , 32 ], (32 , 32 ), [26 , 35 ]]:
384
387
for interpolation in [BILINEAR , BICUBIC , NEAREST ]:
385
- resized_tensor = F_t .resize (tensor , size = size , interpolation = interpolation )
386
- resized_pil_img = F_pil .resize (pil_img , size = size , interpolation = interpolation )
388
+ resized_tensor = F .resize (tensor , size = size , interpolation = interpolation )
389
+ resized_pil_img = F .resize (pil_img , size = size , interpolation = interpolation )
387
390
388
391
self .assertEqual (
389
392
resized_tensor .size ()[1 :], resized_pil_img .size [::- 1 ], msg = "{}, {}" .format (size , interpolation )
390
393
)
391
394
392
- if interpolation != NEAREST :
395
+ if interpolation not in [ NEAREST , ] :
393
396
# We can not check values if mode = NEAREST, as results are different
394
397
# E.g. resized_tensor = [[a, a, b, c, d, d, e, ...]]
395
398
# E.g. resized_pil_img = [[a, b, c, c, d, e, f, ...]]
@@ -407,24 +410,32 @@ def test_resize(self):
407
410
script_size = [size , ]
408
411
else :
409
412
script_size = size
413
+
410
414
resize_result = script_fn (tensor , size = script_size , interpolation = interpolation )
411
415
self .assertTrue (resized_tensor .equal (resize_result ), msg = "{}, {}" .format (size , interpolation ))
412
416
413
417
self ._test_fn_on_batch (
414
418
batch_tensors , F .resize , size = script_size , interpolation = interpolation
415
419
)
416
420
421
+ # assert changed type warning
422
+ with self .assertWarnsRegex (UserWarning , r"Argument interpolation should be of type InterpolationModes" ):
423
+ res1 = F .resize (tensor , size = 32 , interpolation = 2 )
424
+ res2 = F .resize (tensor , size = 32 , interpolation = BILINEAR )
425
+ self .assertTrue (res1 .equal (res2 ))
426
+
417
427
def test_resized_crop (self ):
418
428
# test values of F.resized_crop in several cases:
419
429
# 1) resize to the same size, crop to the same size => should be identity
420
430
tensor , _ = self ._create_data (26 , 36 , device = self .device )
421
- for i in [0 , 2 , 3 ]:
422
- out_tensor = F .resized_crop (tensor , top = 0 , left = 0 , height = 26 , width = 36 , size = [26 , 36 ], interpolation = i )
431
+
432
+ for mode in [NEAREST , BILINEAR , BICUBIC ]:
433
+ out_tensor = F .resized_crop (tensor , top = 0 , left = 0 , height = 26 , width = 36 , size = [26 , 36 ], interpolation = mode )
423
434
self .assertTrue (tensor .equal (out_tensor ), msg = "{} vs {}" .format (out_tensor [0 , :5 , :5 ], tensor [0 , :5 , :5 ]))
424
435
425
436
# 2) resize by half and crop a TL corner
426
437
tensor , _ = self ._create_data (26 , 36 , device = self .device )
427
- out_tensor = F .resized_crop (tensor , top = 0 , left = 0 , height = 20 , width = 30 , size = [10 , 15 ], interpolation = 0 )
438
+ out_tensor = F .resized_crop (tensor , top = 0 , left = 0 , height = 20 , width = 30 , size = [10 , 15 ], interpolation = NEAREST )
428
439
expected_out_tensor = tensor [:, :20 :2 , :30 :2 ]
429
440
self .assertTrue (
430
441
expected_out_tensor .equal (out_tensor ),
@@ -433,17 +444,19 @@ def test_resized_crop(self):
433
444
434
445
batch_tensors = self ._create_data_batch (26 , 36 , num_samples = 4 , device = self .device )
435
446
self ._test_fn_on_batch (
436
- batch_tensors , F .resized_crop , top = 1 , left = 2 , height = 20 , width = 30 , size = [10 , 15 ], interpolation = 0
447
+ batch_tensors , F .resized_crop , top = 1 , left = 2 , height = 20 , width = 30 , size = [10 , 15 ], interpolation = NEAREST
437
448
)
438
449
439
450
def _test_affine_identity_map (self , tensor , scripted_affine ):
440
451
# 1) identity map
441
- out_tensor = F .affine (tensor , angle = 0 , translate = [0 , 0 ], scale = 1.0 , shear = [0.0 , 0.0 ], resample = 0 )
452
+ out_tensor = F .affine (tensor , angle = 0 , translate = [0 , 0 ], scale = 1.0 , shear = [0.0 , 0.0 ], interpolation = NEAREST )
442
453
443
454
self .assertTrue (
444
455
tensor .equal (out_tensor ), msg = "{} vs {}" .format (out_tensor [0 , :5 , :5 ], tensor [0 , :5 , :5 ])
445
456
)
446
- out_tensor = scripted_affine (tensor , angle = 0 , translate = [0 , 0 ], scale = 1.0 , shear = [0.0 , 0.0 ], resample = 0 )
457
+ out_tensor = scripted_affine (
458
+ tensor , angle = 0 , translate = [0 , 0 ], scale = 1.0 , shear = [0.0 , 0.0 ], interpolation = NEAREST
459
+ )
447
460
self .assertTrue (
448
461
tensor .equal (out_tensor ), msg = "{} vs {}" .format (out_tensor [0 , :5 , :5 ], tensor [0 , :5 , :5 ])
449
462
)
@@ -461,13 +474,13 @@ def _test_affine_square_rotations(self, tensor, pil_img, scripted_affine):
461
474
]
462
475
for a , true_tensor in test_configs :
463
476
out_pil_img = F .affine (
464
- pil_img , angle = a , translate = [0 , 0 ], scale = 1.0 , shear = [0.0 , 0.0 ], resample = 0
477
+ pil_img , angle = a , translate = [0 , 0 ], scale = 1.0 , shear = [0.0 , 0.0 ], interpolation = NEAREST
465
478
)
466
479
out_pil_tensor = torch .from_numpy (np .array (out_pil_img ).transpose ((2 , 0 , 1 ))).to (self .device )
467
480
468
481
for fn in [F .affine , scripted_affine ]:
469
482
out_tensor = fn (
470
- tensor , angle = a , translate = [0 , 0 ], scale = 1.0 , shear = [0.0 , 0.0 ], resample = 0
483
+ tensor , angle = a , translate = [0 , 0 ], scale = 1.0 , shear = [0.0 , 0.0 ], interpolation = NEAREST
471
484
)
472
485
if true_tensor is not None :
473
486
self .assertTrue (
@@ -496,13 +509,13 @@ def _test_affine_rect_rotations(self, tensor, pil_img, scripted_affine):
496
509
for a in test_configs :
497
510
498
511
out_pil_img = F .affine (
499
- pil_img , angle = a , translate = [0 , 0 ], scale = 1.0 , shear = [0.0 , 0.0 ], resample = 0
512
+ pil_img , angle = a , translate = [0 , 0 ], scale = 1.0 , shear = [0.0 , 0.0 ], interpolation = NEAREST
500
513
)
501
514
out_pil_tensor = torch .from_numpy (np .array (out_pil_img ).transpose ((2 , 0 , 1 )))
502
515
503
516
for fn in [F .affine , scripted_affine ]:
504
517
out_tensor = fn (
505
- tensor , angle = a , translate = [0 , 0 ], scale = 1.0 , shear = [0.0 , 0.0 ], resample = 0
518
+ tensor , angle = a , translate = [0 , 0 ], scale = 1.0 , shear = [0.0 , 0.0 ], interpolation = NEAREST
506
519
).cpu ()
507
520
508
521
if out_tensor .dtype != torch .uint8 :
@@ -526,10 +539,10 @@ def _test_affine_translations(self, tensor, pil_img, scripted_affine):
526
539
]
527
540
for t in test_configs :
528
541
529
- out_pil_img = F .affine (pil_img , angle = 0 , translate = t , scale = 1.0 , shear = [0.0 , 0.0 ], resample = 0 )
542
+ out_pil_img = F .affine (pil_img , angle = 0 , translate = t , scale = 1.0 , shear = [0.0 , 0.0 ], interpolation = NEAREST )
530
543
531
544
for fn in [F .affine , scripted_affine ]:
532
- out_tensor = fn (tensor , angle = 0 , translate = t , scale = 1.0 , shear = [0.0 , 0.0 ], resample = 0 )
545
+ out_tensor = fn (tensor , angle = 0 , translate = t , scale = 1.0 , shear = [0.0 , 0.0 ], interpolation = NEAREST )
533
546
534
547
if out_tensor .dtype != torch .uint8 :
535
548
out_tensor = out_tensor .to (torch .uint8 )
@@ -550,13 +563,13 @@ def _test_affine_all_ops(self, tensor, pil_img, scripted_affine):
550
563
(- 45 , [- 10 , - 10 ], 1.2 , [4.0 , 5.0 ]),
551
564
(- 90 , [0 , 0 ], 1.0 , [0.0 , 0.0 ]),
552
565
]
553
- for r in [0 , ]:
566
+ for r in [NEAREST , ]:
554
567
for a , t , s , sh in test_configs :
555
- out_pil_img = F .affine (pil_img , angle = a , translate = t , scale = s , shear = sh , resample = r )
568
+ out_pil_img = F .affine (pil_img , angle = a , translate = t , scale = s , shear = sh , interpolation = r )
556
569
out_pil_tensor = torch .from_numpy (np .array (out_pil_img ).transpose ((2 , 0 , 1 )))
557
570
558
571
for fn in [F .affine , scripted_affine ]:
559
- out_tensor = fn (tensor , angle = a , translate = t , scale = s , shear = sh , resample = r ).cpu ()
572
+ out_tensor = fn (tensor , angle = a , translate = t , scale = s , shear = sh , interpolation = r ).cpu ()
560
573
561
574
if out_tensor .dtype != torch .uint8 :
562
575
out_tensor = out_tensor .to (torch .uint8 )
@@ -605,18 +618,36 @@ def test_affine(self):
605
618
batch_tensors , F .affine , angle = - 43 , translate = [- 3 , 4 ], scale = 1.2 , shear = [4.0 , 5.0 ]
606
619
)
607
620
621
+ tensor , pil_img = data [0 ]
622
+ # assert deprecation warning and non-BC
623
+ with self .assertWarnsRegex (UserWarning , r"Argument resample is deprecated and will be removed" ):
624
+ res1 = F .affine (tensor , 45 , translate = [0 , 0 ], scale = 1.0 , shear = [0.0 , 0.0 ], resample = 2 )
625
+ res2 = F .affine (tensor , 45 , translate = [0 , 0 ], scale = 1.0 , shear = [0.0 , 0.0 ], interpolation = BILINEAR )
626
+ self .assertTrue (res1 .equal (res2 ))
627
+
628
+ # assert changed type warning
629
+ with self .assertWarnsRegex (UserWarning , r"Argument interpolation should be of type InterpolationModes" ):
630
+ res1 = F .affine (tensor , 45 , translate = [0 , 0 ], scale = 1.0 , shear = [0.0 , 0.0 ], interpolation = 2 )
631
+ res2 = F .affine (tensor , 45 , translate = [0 , 0 ], scale = 1.0 , shear = [0.0 , 0.0 ], interpolation = BILINEAR )
632
+ self .assertTrue (res1 .equal (res2 ))
633
+
634
+ with self .assertWarnsRegex (UserWarning , r"Argument fillcolor is deprecated and will be removed" ):
635
+ res1 = F .affine (pil_img , 45 , translate = [0 , 0 ], scale = 1.0 , shear = [0.0 , 0.0 ], fillcolor = 10 )
636
+ res2 = F .affine (pil_img , 45 , translate = [0 , 0 ], scale = 1.0 , shear = [0.0 , 0.0 ], fill = 10 )
637
+ self .assertEqual (res1 , res2 )
638
+
608
639
def _test_rotate_all_options (self , tensor , pil_img , scripted_rotate , centers ):
609
640
img_size = pil_img .size
610
641
dt = tensor .dtype
611
- for r in [0 , ]:
642
+ for r in [NEAREST , ]:
612
643
for a in range (- 180 , 180 , 17 ):
613
644
for e in [True , False ]:
614
645
for c in centers :
615
646
616
- out_pil_img = F .rotate (pil_img , angle = a , resample = r , expand = e , center = c )
647
+ out_pil_img = F .rotate (pil_img , angle = a , interpolation = r , expand = e , center = c )
617
648
out_pil_tensor = torch .from_numpy (np .array (out_pil_img ).transpose ((2 , 0 , 1 )))
618
649
for fn in [F .rotate , scripted_rotate ]:
619
- out_tensor = fn (tensor , angle = a , resample = r , expand = e , center = c ).cpu ()
650
+ out_tensor = fn (tensor , angle = a , interpolation = r , expand = e , center = c ).cpu ()
620
651
621
652
if out_tensor .dtype != torch .uint8 :
622
653
out_tensor = out_tensor .to (torch .uint8 )
@@ -673,12 +704,24 @@ def test_rotate(self):
673
704
674
705
center = (20 , 22 )
675
706
self ._test_fn_on_batch (
676
- batch_tensors , F .rotate , angle = 32 , resample = 0 , expand = True , center = center
707
+ batch_tensors , F .rotate , angle = 32 , interpolation = NEAREST , expand = True , center = center
677
708
)
709
+ tensor , pil_img = data [0 ]
710
+ # assert deprecation warning and non-BC
711
+ with self .assertWarnsRegex (UserWarning , r"Argument resample is deprecated and will be removed" ):
712
+ res1 = F .rotate (tensor , 45 , resample = 2 )
713
+ res2 = F .rotate (tensor , 45 , interpolation = BILINEAR )
714
+ self .assertTrue (res1 .equal (res2 ))
715
+
716
+ # assert changed type warning
717
+ with self .assertWarnsRegex (UserWarning , r"Argument interpolation should be of type InterpolationModes" ):
718
+ res1 = F .rotate (tensor , 45 , interpolation = 2 )
719
+ res2 = F .rotate (tensor , 45 , interpolation = BILINEAR )
720
+ self .assertTrue (res1 .equal (res2 ))
678
721
679
722
def _test_perspective (self , tensor , pil_img , scripted_transform , test_configs ):
680
723
dt = tensor .dtype
681
- for r in [0 , ]:
724
+ for r in [NEAREST , ]:
682
725
for spoints , epoints in test_configs :
683
726
out_pil_img = F .perspective (pil_img , startpoints = spoints , endpoints = epoints , interpolation = r )
684
727
out_pil_tensor = torch .from_numpy (np .array (out_pil_img ).transpose ((2 , 0 , 1 )))
@@ -739,9 +782,17 @@ def test_perspective(self):
739
782
740
783
for spoints , epoints in test_configs :
741
784
self ._test_fn_on_batch (
742
- batch_tensors , F .perspective , startpoints = spoints , endpoints = epoints , interpolation = 0
785
+ batch_tensors , F .perspective , startpoints = spoints , endpoints = epoints , interpolation = NEAREST
743
786
)
744
787
788
+ # assert changed type warning
789
+ spoints = [[0 , 0 ], [33 , 0 ], [33 , 25 ], [0 , 25 ]]
790
+ epoints = [[3 , 2 ], [32 , 3 ], [30 , 24 ], [2 , 25 ]]
791
+ with self .assertWarnsRegex (UserWarning , r"Argument interpolation should be of type InterpolationModes" ):
792
+ res1 = F .perspective (tensor , startpoints = spoints , endpoints = epoints , interpolation = 2 )
793
+ res2 = F .perspective (tensor , startpoints = spoints , endpoints = epoints , interpolation = BILINEAR )
794
+ self .assertTrue (res1 .equal (res2 ))
795
+
745
796
def test_gaussian_blur (self ):
746
797
small_image_tensor = torch .from_numpy (
747
798
np .arange (3 * 10 * 12 , dtype = "uint8" ).reshape ((10 , 12 , 3 ))
0 commit comments