forked from 0xTechSavvy/autoaugment
-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathtransformations.py
105 lines (86 loc) · 2.97 KB
/
transformations.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
import PIL, PIL.ImageOps, PIL.ImageEnhance, PIL.ImageDraw
import matplotlib.pyplot as plt
import numpy as np
from scipy.io import loadmat
def ShearX(img, v): # [-0.3, 0.3]
return img.transform(img.size, PIL.Image.AFFINE, (1, v, 0, 0, 1, 0))
def ShearY(img, v): # [-0.3, 0.3]
return img.transform(img.size, PIL.Image.AFFINE, (1, 0, 0, v, 1, 0))
def TranslateX(img, v): # [-150, 150] => percentage: [-0.45, 0.45]
v = v*img.size[0]
return img.transform(img.size, PIL.Image.AFFINE, (1, 0, v, 0, 1, 0))
def TranslateY(img, v): # [-150, 150] => percentage: [-0.45, 0.45]
v = v*img.size[1]
return img.transform(img.size, PIL.Image.AFFINE, (1, 0, 0, 0, 1, v))
def Rotate(img, v): # [-30, 30]
return img.rotate(v)
def AutoContrast(img, _):
return PIL.ImageOps.autocontrast(img)
def Invert(img, _):
return PIL.ImageOps.invert(img)
def Equalize(img, _):
return PIL.ImageOps.equalize(img)
def Flip(img, _): # not from the paper
return PIL.ImageOps.mirror(img)
def Solarize(img, v): # [0, 256]
return PIL.ImageOps.solarize(img, v)
def Posterize(img, v): # [4, 8]
v = int(v)
return PIL.ImageOps.posterize(img, v)
def Contrast(img, v): # [0.1,1.9]
return PIL.ImageEnhance.Contrast(img).enhance(v)
def Color(img, v): # [0.1,1.9]
return PIL.ImageEnhance.Color(img).enhance(v)
def Brightness(img, v): # [0.1,1.9]
return PIL.ImageEnhance.Brightness(img).enhance(v)
def Sharpness(img, v): # [0.1,1.9]
return PIL.ImageEnhance.Sharpness(img).enhance(v)
def Cutout(img, v): # [0, 60] => percentage: [0, 0.2]
w, h = img.size
v = v*img.size[0]
x0 = np.random.uniform(w-v)
y0 = np.random.uniform(h-v)
xy = (x0, y0, x0+v, y0+v)
color = (127, 127, 127)
img = img.copy()
PIL.ImageDraw.Draw(img).rectangle(xy, color)
return img
def SamplePairing(imgs): # [0, 0.4]
def f(img1, v):
i = np.random.choice(len(imgs))
img2 = PIL.Image.fromarray(imgs[i])
return PIL.Image.blend(img1, img2, v)
return f
def get_transformations(imgs):
return [
(ShearX, -0.3, 0.3),
(ShearY, -0.3, 0.3),
(TranslateX, -0.45, 0.45),
(TranslateY, -0.45, 0.45),
(Rotate, -30, 30),
(AutoContrast, 0, 1),
(Invert, 0, 1),
(Equalize, 0, 1),
(Solarize, 0, 256),
(Posterize, 4, 8),
(Contrast, 0.1, 1.9),
(Color, 0.1, 1.9),
(Brightness, 0.1, 1.9),
(Sharpness, 0.1, 1.9),
(Cutout, 0, 0.2),
(SamplePairing(imgs), 0, 0.4),
]
if __name__ == '__main__':
tr = loadmat('../data/streetview/train_32x32.mat')
imgs = np.moveaxis(tr['X'], -1, 0)
transfs = get_transformations(imgs)
for i in range(10):
img2 = img = PIL.Image.fromarray(imgs[i])
for t, min, max in transfs:
v = np.random.rand()*(max-min) + min
img2 = t(img2, v)
plt.subplot(1, 2, 1)
plt.imshow(img)
plt.subplot(1, 2, 2)
plt.imshow(img2)
plt.show()