-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathtransforms.py
More file actions
116 lines (81 loc) · 2.94 KB
/
Copy pathtransforms.py
File metadata and controls
116 lines (81 loc) · 2.94 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
import random
import numbers
import numpy as np
import torch
from PIL import Image
try:
import accimage
except ImportError:
accimage = None
class Compose(object):
def __init__(self, transforms):
self.transforms = transforms
def __call__(self, img):
for t in self.transforms:
img = t(img)
return img
def randomize_parameters(self):
for t in self.transforms:
t.randomize_parameters()
class ToTensor(object):
def __init__(self, norm_value=255):
self.norm_value = norm_value
def __call__(self, pic):
if isinstance(pic, np.ndarray):
img = torch.from_numpy(pic.transpose((2, 0, 1)))
return img.float().div(self.norm_value)
if accimage is not None and isinstance(pic, accimage.Image):
nppic = np.zeros(
[pic.channels, pic.height, pic.width], dtype=np.float32)
pic.copyto(nppic)
return torch.from_numpy(nppic)
if pic.mode == 'I':
img = torch.from_numpy(np.array(pic, np.int32, copy=False))
elif pic.mode == 'I;16':
img = torch.from_numpy(np.array(pic, np.int16, copy=False))
else:
img = torch.ByteTensor(torch.ByteStorage.from_buffer(pic.tobytes()))
if pic.mode == 'YCbCr':
nchannel = 3
elif pic.mode == 'I;16':
nchannel = 1
else:
nchannel = len(pic.mode)
img = img.view(pic.size[1], pic.size[0], nchannel)
img = img.transpose(0, 1).transpose(0, 2).contiguous()
if isinstance(img, torch.ByteTensor):
return img.float().div(self.norm_value)
else:
return img
def randomize_parameters(self):
pass
class CenterCrop(object):
def __init__(self, size):
if isinstance(size, numbers.Number):
self.size = (int(size), int(size))
else:
self.size = size
def __call__(self, img):
w, h = img.size
th, tw = self.size
x1 = int(round((w - tw) / 2.))
y1 = int(round((h - th) / 2.))
return img.crop((x1, y1, x1 + tw, y1 + th))
def randomize_parameters(self):
pass
class RandomHorizontalFlip(object):
def __call__(self, img):
if self.p < 0.5:
return img.transpose(Image.FLIP_LEFT_RIGHT)
return img
def randomize_parameters(self):
self.p = random.random()
class RandomRotate(object):
def __init__(self):
self.interpolation = Image.BILINEAR
def __call__(self, img):
im_size = img.size
ret_img = img.rotate(self.rotate_angle, resample=self.interpolation)
return ret_img
def randomize_parameters(self):
self.rotate_angle = random.randint(-10, 10)