@@ -349,13 +349,20 @@ def test_resized_crop(self):
349
349
)
350
350
351
351
def test_affine (self ):
352
- # Let's do some tests on square image at first
352
+ # Tests on square image
353
353
tensor , pil_img = self ._create_data (26 , 26 )
354
+
355
+ scripted_affine = torch .jit .script (F .affine )
354
356
# 1) identity map
355
357
out_tensor = F .affine (tensor , angle = 0 , translate = [0 , 0 ], scale = 1.0 , shear = [0.0 , 0.0 ], resample = 0 )
356
358
self .assertTrue (
357
359
tensor .equal (out_tensor ), msg = "{} vs {}" .format (out_tensor [0 , :5 , :5 ], tensor [0 , :5 , :5 ])
358
360
)
361
+ out_tensor = scripted_affine (tensor , angle = 0 , translate = [0 , 0 ], scale = 1.0 , shear = [0.0 , 0.0 ], resample = 0 )
362
+ self .assertTrue (
363
+ tensor .equal (out_tensor ), msg = "{} vs {}" .format (out_tensor [0 , :5 , :5 ], tensor [0 , :5 , :5 ])
364
+ )
365
+
359
366
# 2) Test rotation
360
367
test_configs = [
361
368
(90 , torch .rot90 (tensor , k = 1 , dims = (- 1 , - 2 ))),
@@ -367,29 +374,68 @@ def test_affine(self):
367
374
(180 , torch .rot90 (tensor , k = 2 , dims = (- 1 , - 2 ))),
368
375
]
369
376
for a , true_tensor in test_configs :
370
-
371
- out_tensor = F .affine (tensor , angle = a , translate = [0 , 0 ], scale = 1.0 , shear = [0.0 , 0.0 ], resample = 0 )
372
- if true_tensor is not None :
373
- self .assertTrue (
374
- true_tensor .equal (out_tensor ),
375
- msg = "{}\n {} vs \n {}" .format (a , out_tensor [0 , :5 , :5 ], true_tensor [0 , :5 , :5 ])
376
- )
377
- else :
378
- true_tensor = out_tensor
379
-
380
- out_pil_img = F .affine (pil_img , angle = a , translate = [0 , 0 ], scale = 1.0 , shear = [0.0 , 0.0 ], resample = 0 )
381
- out_pil_tensor = torch .from_numpy (np .array (out_pil_img ).transpose ((2 , 0 , 1 )))
382
-
383
- num_diff_pixels = (true_tensor != out_pil_tensor ).sum ().item () / 3.0
384
- ratio_diff_pixels = num_diff_pixels / true_tensor .shape [- 1 ] / true_tensor .shape [- 2 ]
385
- # Tolerence : 6% of different pixels
386
- self .assertLess (
387
- ratio_diff_pixels ,
388
- 0.06 ,
389
- msg = "{}\n {} vs \n {}" .format (
390
- ratio_diff_pixels , true_tensor [0 , :7 , :7 ], out_pil_tensor [0 , :7 , :7 ]
377
+ for fn in [F .affine , scripted_affine ]:
378
+ out_tensor = fn (tensor , angle = a , translate = [0 , 0 ], scale = 1.0 , shear = [0.0 , 0.0 ], resample = 0 )
379
+ if true_tensor is not None :
380
+ self .assertTrue (
381
+ true_tensor .equal (out_tensor ),
382
+ msg = "{}\n {} vs \n {}" .format (a , out_tensor [0 , :5 , :5 ], true_tensor [0 , :5 , :5 ])
383
+ )
384
+ else :
385
+ true_tensor = out_tensor
386
+
387
+ out_pil_img = F .affine (pil_img , angle = a , translate = [0 , 0 ], scale = 1.0 , shear = [0.0 , 0.0 ], resample = 0 )
388
+ out_pil_tensor = torch .from_numpy (np .array (out_pil_img ).transpose ((2 , 0 , 1 )))
389
+
390
+ num_diff_pixels = (true_tensor != out_pil_tensor ).sum ().item () / 3.0
391
+ ratio_diff_pixels = num_diff_pixels / true_tensor .shape [- 1 ] / true_tensor .shape [- 2 ]
392
+ # Tolerance : less than 6% of different pixels
393
+ self .assertLess (
394
+ ratio_diff_pixels ,
395
+ 0.06 ,
396
+ msg = "{}\n {} vs \n {}" .format (
397
+ ratio_diff_pixels , true_tensor [0 , :7 , :7 ], out_pil_tensor [0 , :7 , :7 ]
398
+ )
391
399
)
392
- )
400
+ # 3) Test translation
401
+ test_configs = [
402
+ [10 , 12 ], (12 , 13 )
403
+ ]
404
+ for t in test_configs :
405
+ for fn in [F .affine , scripted_affine ]:
406
+ out_tensor = fn (tensor , angle = 0 , translate = t , scale = 1.0 , shear = [0.0 , 0.0 ], resample = 0 )
407
+ out_pil_img = F .affine (pil_img , angle = 0 , translate = t , scale = 1.0 , shear = [0.0 , 0.0 ], resample = 0 )
408
+ self .compareTensorToPIL (out_tensor , out_pil_img )
409
+
410
+ # 3) Test rotation + translation + scale + share
411
+ test_configs = [
412
+ (45 , [5 , 6 ], 1.0 , [0.0 , 0.0 ]),
413
+ (33 , (5 , - 4 ), 1.0 , [0.0 , 0.0 ]),
414
+ (45 , [5 , 4 ], 1.2 , [0.0 , 0.0 ]),
415
+ (33 , (4 , 8 ), 2.0 , [0.0 , 0.0 ]),
416
+ (85 , (10 , - 10 ), 0.7 , [0.0 , 0.0 ]),
417
+ (0 , [0 , 0 ], 1.0 , [35.0 , ]),
418
+ (25 , [0 , 0 ], 1.2 , [0.0 , 15.0 ]),
419
+ (45 , [10 , 0 ], 0.7 , [2.0 , 5.0 ]),
420
+ (45 , [10 , - 10 ], 1.2 , [4.0 , 5.0 ]),
421
+ ]
422
+ for r in [0 , ]:
423
+ for a , t , s , sh in test_configs :
424
+ for fn in [F .affine , scripted_affine ]:
425
+ out_tensor = fn (tensor , angle = a , translate = t , scale = s , shear = sh , resample = r )
426
+ out_pil_img = F .affine (pil_img , angle = a , translate = t , scale = s , shear = sh , resample = r )
427
+ out_pil_tensor = torch .from_numpy (np .array (out_pil_img ).transpose ((2 , 0 , 1 )))
428
+
429
+ num_diff_pixels = (out_tensor != out_pil_tensor ).sum ().item () / 3.0
430
+ ratio_diff_pixels = num_diff_pixels / out_tensor .shape [- 1 ] / out_tensor .shape [- 2 ]
431
+ # Tolerance : less than 5% of different pixels
432
+ self .assertLess (
433
+ ratio_diff_pixels ,
434
+ 0.05 ,
435
+ msg = "{}: {}\n {} vs \n {}" .format (
436
+ (r , a , t , s , sh ), ratio_diff_pixels , out_tensor [0 , :7 , :7 ], out_pil_tensor [0 , :7 , :7 ]
437
+ )
438
+ )
393
439
394
440
395
441
if __name__ == '__main__' :
0 commit comments