-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathtransforms.py
126 lines (103 loc) · 4.28 KB
/
transforms.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
119
120
121
122
123
124
125
126
import cv2
import numpy as np
from torchvision import transforms
import albumentations as albu
from albumentations.pytorch import ToTensorV2
def pil2array(image):
image = np.array(image)
if image.ndim != 3:
image = np.expand_dims(image, axis=-1)
return image
def project_transform(image):
size = 28, 28
mean, std = 0.0, 5.0
src = np.array([[0.0, 0.0], [0.0, 28.0],
[28.0, 0.0], [28.0, 28.0]])
dst = src + np.random.randn(4, 2) * std + mean
M = cv2.getPerspectiveTransform(src, dst)
image = cv2.warpPerspective(image, M, size)
return image
def get_transforms(type: str):
assert type in ['R', 'RTS', 'P', 'E', 'T', 'TU']
if type in ['T', 'TU']:
pre_transform = transforms.Lambda(lambd=pil2array)
post_transform = albu.Compose([
albu.PadIfNeeded(min_height=84,
min_width=84,
border_mode=cv2.BORDER_CONSTANT,
value=0,
p=1.0),
albu.ShiftScaleRotate(shift_limit=(84 - 28) / (84 * 2),
scale_limit=0.0,
rotate_limit=0.0,
border_mode=cv2.BORDER_CONSTANT,
value=0,
p=1.0),
],
bbox_params=albu.BboxParams(format='pascal_voc',
label_fields=['category_id'])
)
cluster_transform = None if type != 'TU' else albu.Compose([
albu.RandomCrop(height=6, width=6),
albu.PadIfNeeded(min_height=84,
min_width=84,
border_mode=cv2.BORDER_CONSTANT,
value=0,
p=1.0),
albu.ShiftScaleRotate(shift_limit=(84 - 6) / (84 * 2),
scale_limit=0.0,
rotate_limit=0.0,
border_mode=cv2.BORDER_CONSTANT,
value=0,
p=1.0)
])
return pre_transform, post_transform, cluster_transform
if type == 'R':
pre_transform = transforms.Compose([
transforms.RandomRotation(degrees=90), # if a bug appears at here
# transforms.RandomRotation(degrees=90, fill=(0,)), # use this function instead
transforms.ToTensor()
])
post_transform = None
elif type == 'RTS':
padding = (42 - 28) // 2
shift = (42 - 28) / (42 * 2)
pre_transform = transforms.Compose([
transforms.Pad(padding=padding),
transforms.RandomAffine(degrees=45, # randomly rotate
translate=(shift, shift), # randomly place
scale=(0.7, 1.2), # random scaling
fillcolor=0),
transforms.ToTensor(),
])
post_transform = None
elif type == 'P':
pre_transform = transforms.Compose([
transforms.RandomAffine(degrees=0.0,
translate=None,
scale=(0.75, 1.0),
fillcolor=0),
transforms.Lambda(lambd=pil2array),
transforms.Lambda(lambd=project_transform),
transforms.ToTensor()
])
post_transform = None
elif type == 'E':
pre_transform = transforms.Compose([
transforms.RandomAffine(degrees=0.0,
translate=None,
scale=(0.75, 1.0),
fillcolor=0),
transforms.Lambda(lambd=pil2array)
])
# TODO: need to tune the parameters
post_transform = albu.Compose([
albu.ElasticTransform(alpha=0.0,
sigma=1.5,
alpha_affine=3.0,
border_mode=cv2.BORDER_CONSTANT,
value=0,
p=1.0),
ToTensorV2()
])
return pre_transform, post_transform, None