-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathtransform_lib.py
118 lines (102 loc) · 4.25 KB
/
transform_lib.py
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
117
118
import numpy as np
import paddle
import paddle.vision.transforms as transforms
import paddle
import paddle.nn as nn
# use from https://github.com/Spijkervet/BYOL/blob/977621ae16de1f969e048a68a3f6e4dd9c3d226d/modules/transformations/simclr.py#L4
class SimCLRTransform:
"""
A stochastic data augmentation module that transforms any given data example randomly
resulting in two correlated views of the same example,
denoted x ̃i and x ̃j, which we consider as a positive pair.
data_format is array or image
"""
def __init__(self, size=32, gaussian=False, data_format="array"):
s = 1
color_jitter = transforms.ColorJitter(
0.8 * s, 0.8 * s, 0.8 * s, 0.2 * s
)
if gaussian:
self.train_transform = transforms.Compose(
[
# transforms.ToPILImage(mode='RGB'),
transforms.Resize(size=size),
transforms.RandomResizedCrop(size=size),
transforms.RandomHorizontalFlip(), # with 0.5 probability
transforms.RandomApply([color_jitter], p=0.8),
transforms.RandomGrayscale(p=0.2),
GaussianBlur(kernel_size=int(0.1 * size)),
# RandomApply( transforms.GaussianBlur((3, 3), (1.0, 2.0)), p=0.2),
transforms.ToTensor(),
]
)
else:
if data_format == "array":
self.train_transform = transforms.Compose(
[
# transforms.ToPILImage(mode='RGB'),
transforms.Resize(size=size),
transforms.RandomResizedCrop(size=size),
transforms.RandomHorizontalFlip(), # with 0.5 probability
transforms.RandomApply([color_jitter], p=0.8),
transforms.RandomGrayscale(p=0.2),
transforms.ToTensor(),
]
)
else:
self.train_transform = transforms.Compose(
[
transforms.RandomResizedCrop(size=size),
transforms.RandomHorizontalFlip(), # with 0.5 probability
transforms.RandomApply([color_jitter], p=0.8),
transforms.RandomGrayscale(p=0.2),
transforms.ToTensor(),
]
)
self.test_transform = transforms.Compose(
[
transforms.Resize(size=size),
transforms.ToTensor(),
]
)
self.fine_tune_transform = transforms.Compose(
[
# transforms.ToPILImage(mode='RGB'),
transforms.Resize(size=size),
transforms.ToTensor(),
]
)
def __call__(self, x):
return self.train_transform(x)
class GaussianBlur(object):
"""blur a single image on CPU"""
def __init__(self, kernel_size):
radias = kernel_size // 2
kernel_size = radias * 2 + 1
self.blur_h = nn.Conv2D(3, 3, kernel_size=(kernel_size, 1),
stride=1, padding=0, bias_attr=False, groups=3)
self.blur_v = nn.Conv2D(3, 3, kernel_size=(1, kernel_size),
stride=1, padding=0, bias_attr=False, groups=3)
self.k = kernel_size
self.r = radias
self.blur = nn.Sequential(
nn.ReflectionPad2d(radias),
self.blur_h,
self.blur_v
)
self.pil_to_tensor =transforms.ToTensor()
# self.tensor_to_pil =transforms.ToPILImage()
def __call__(self, img):
img = self.pil_to_tensor(img).unsqueeze(0)
sigma = np.random.uniform(0.1, 2.0)
x = np.arange(-self.r, self.r + 1)
x = np.exp(-np.power(x, 2) / (2 * sigma * sigma))
x = x / x.sum()
x = paddle.from_numpy(x).view(1, -1).repeat(3, 1)
self.blur_h.weight.data.copy_(x.view(3, 1, self.k, 1))
self.blur_v.weight.data.copy_(x.view(3, 1, 1, self.k))
with paddle.no_grad():
img = self.blur(img)
img = img.squeeze()
# img = self.tensor_to_pil(img)
return img