markytools's picture
added strexp
d61b9c7
import cv2
import numpy as np
from PIL import Image, ImageOps
'''
PIL resize (W,H)
Torch resize is (H,W)
'''
class Stretch:
def __init__(self):
self.tps = cv2.createThinPlateSplineShapeTransformer()
def __call__(self, img, mag=-1, prob=1.):
if np.random.uniform(0,1) > prob:
return img
W, H = img.size
img = np.array(img)
srcpt = list()
dstpt = list()
W_33 = 0.33 * W
W_50 = 0.50 * W
W_66 = 0.66 * W
H_50 = 0.50 * H
P = 0
#frac = 0.4
b = [.2, .3, .4]
if mag<0 or mag>=len(b):
index = len(b)-1
else:
index = mag
frac = b[index]
# left-most
srcpt.append([P, P])
srcpt.append([P, H-P])
srcpt.append([P, H_50])
x = np.random.uniform(0, frac)*W_33 #if np.random.uniform(0,1) > 0.5 else 0
dstpt.append([P+x, P])
dstpt.append([P+x, H-P])
dstpt.append([P+x, H_50])
# 2nd left-most
srcpt.append([P+W_33, P])
srcpt.append([P+W_33, H-P])
x = np.random.uniform(-frac, frac)*W_33
dstpt.append([P+W_33+x, P])
dstpt.append([P+W_33+x, H-P])
# 3rd left-most
srcpt.append([P+W_66, P])
srcpt.append([P+W_66, H-P])
x = np.random.uniform(-frac, frac)*W_33
dstpt.append([P+W_66+x, P])
dstpt.append([P+W_66+x, H-P])
# right-most
srcpt.append([W-P, P])
srcpt.append([W-P, H-P])
srcpt.append([W-P, H_50])
x = np.random.uniform(-frac, 0)*W_33 #if np.random.uniform(0,1) > 0.5 else 0
dstpt.append([W-P+x, P])
dstpt.append([W-P+x, H-P])
dstpt.append([W-P+x, H_50])
N = len(dstpt)
matches = [cv2.DMatch(i, i, 0) for i in range(N)]
dst_shape = np.array(dstpt).reshape((-1, N, 2))
src_shape = np.array(srcpt).reshape((-1, N, 2))
self.tps.estimateTransformation(dst_shape, src_shape, matches)
img = self.tps.warpImage(img)
img = Image.fromarray(img)
return img
class Distort:
def __init__(self):
self.tps = cv2.createThinPlateSplineShapeTransformer()
def __call__(self, img, mag=-1, prob=1.):
if np.random.uniform(0,1) > prob:
return img
W, H = img.size
img = np.array(img)
srcpt = list()
dstpt = list()
W_33 = 0.33 * W
W_50 = 0.50 * W
W_66 = 0.66 * W
H_50 = 0.50 * H
P = 0
#frac = 0.4
b = [.2, .3, .4]
if mag<0 or mag>=len(b):
index = len(b)-1
else:
index = mag
frac = b[index]
# top pts
srcpt.append([P, P])
x = np.random.uniform(0, frac)*W_33
y = np.random.uniform(0, frac)*H_50
dstpt.append([P+x, P+y])
srcpt.append([P+W_33, P])
x = np.random.uniform(-frac, frac)*W_33
y = np.random.uniform(0, frac)*H_50
dstpt.append([P+W_33+x, P+y])
srcpt.append([P+W_66, P])
x = np.random.uniform(-frac, frac)*W_33
y = np.random.uniform(0, frac)*H_50
dstpt.append([P+W_66+x, P+y])
srcpt.append([W-P, P])
x = np.random.uniform(-frac, 0)*W_33
y = np.random.uniform(0, frac)*H_50
dstpt.append([W-P+x, P+y])
# bottom pts
srcpt.append([P, H-P])
x = np.random.uniform(0, frac)*W_33
y = np.random.uniform(-frac, 0)*H_50
dstpt.append([P+x, H-P+y])
srcpt.append([P+W_33, H-P])
x = np.random.uniform(-frac, frac)*W_33
y = np.random.uniform(-frac, 0)*H_50
dstpt.append([P+W_33+x, H-P+y])
srcpt.append([P+W_66, H-P])
x = np.random.uniform(-frac, frac)*W_33
y = np.random.uniform(-frac, 0)*H_50
dstpt.append([P+W_66+x, H-P+y])
srcpt.append([W-P, H-P])
x = np.random.uniform(-frac, 0)*W_33
y = np.random.uniform(-frac, 0)*H_50
dstpt.append([W-P+x, H-P+y])
N = len(dstpt)
matches = [cv2.DMatch(i, i, 0) for i in range(N)]
dst_shape = np.array(dstpt).reshape((-1, N, 2))
src_shape = np.array(srcpt).reshape((-1, N, 2))
self.tps.estimateTransformation(dst_shape, src_shape, matches)
img = self.tps.warpImage(img)
img = Image.fromarray(img)
return img
class Curve:
def __init__(self, square_side=224):
self.tps = cv2.createThinPlateSplineShapeTransformer()
self.side = square_side
def __call__(self, img, mag=-1, prob=1.):
if np.random.uniform(0,1) > prob:
return img
W, H = img.size
if H!=self.side or W!=self.side:
img = img.resize((self.side, self.side), Image.BICUBIC)
isflip = np.random.uniform(0,1) > 0.5
if isflip:
img = ImageOps.flip(img)
#img = TF.vflip(img)
img = np.array(img)
w = self.side
h = self.side
w_25 = 0.25 * w
w_50 = 0.50 * w
w_75 = 0.75 * w
b = [1.1, .95, .8]
if mag<0 or mag>=len(b):
index = 0
else:
index = mag
rmin = b[index]
r = np.random.uniform(rmin, rmin+.1)*h
x1 = (r**2 - w_50**2)**0.5
h1 = r - x1
t = np.random.uniform(0.4, 0.5)*h
w2 = w_50*t/r
hi = x1*t/r
h2 = h1 + hi
sinb_2 = ((1 - x1/r)/2)**0.5
cosb_2 = ((1 + x1/r)/2)**0.5
w3 = w_50 - r*sinb_2
h3 = r - r*cosb_2
w4 = w_50 - (r-t)*sinb_2
h4 = r - (r-t)*cosb_2
w5 = 0.5*w2
h5 = h1 + 0.5*hi
h_50 = 0.50*h
srcpt = [(0,0 ), (w,0 ), (w_50,0), (0,h ), (w,h ), (w_25,0), (w_75,0 ), (w_50,h), (w_25,h), (w_75,h ), (0,h_50), (w,h_50 )]
dstpt = [(0,h1), (w,h1), (w_50,0), (w2,h2), (w-w2,h2), (w3, h3), (w-w3,h3), (w_50,t), (w4,h4 ), (w-w4,h4), (w5,h5 ), (w-w5,h5)]
N = len(dstpt)
matches = [cv2.DMatch(i, i, 0) for i in range(N)]
dst_shape = np.array(dstpt).reshape((-1, N, 2))
src_shape = np.array(srcpt).reshape((-1, N, 2))
self.tps.estimateTransformation(dst_shape, src_shape, matches)
img = self.tps.warpImage(img)
img = Image.fromarray(img)
if isflip:
#img = TF.vflip(img)
img = ImageOps.flip(img)
rect = (0, self.side//2, self.side, self.side)
else:
rect = (0, 0, self.side, self.side//2)
img = img.crop(rect)
img = img.resize((W, H), Image.BICUBIC)
return img