wizzseen's picture
Upload 948 files
8a6df40 verified
raw
history blame
15.2 kB
import torch
import math
import numbers
import random
import numpy as np
from PIL import Image, ImageOps
from torchvision import transforms
class RandomCrop(object):
def __init__(self, size, padding=0):
if isinstance(size, numbers.Number):
self.size = (int(size), int(size))
else:
self.size = size # h, w
self.padding = padding
def __call__(self, sample):
img, mask = sample['image'], sample['label']
if self.padding > 0:
img = ImageOps.expand(img, border=self.padding, fill=0)
mask = ImageOps.expand(mask, border=self.padding, fill=0)
assert img.size == mask.size
w, h = img.size
th, tw = self.size # target size
if w == tw and h == th:
return {'image': img,
'label': mask}
if w < tw or h < th:
img = img.resize((tw, th), Image.BILINEAR)
mask = mask.resize((tw, th), Image.NEAREST)
return {'image': img,
'label': mask}
x1 = random.randint(0, w - tw)
y1 = random.randint(0, h - th)
img = img.crop((x1, y1, x1 + tw, y1 + th))
mask = mask.crop((x1, y1, x1 + tw, y1 + th))
return {'image': img,
'label': mask}
class RandomCrop_new(object):
def __init__(self, size, padding=0):
if isinstance(size, numbers.Number):
self.size = (int(size), int(size))
else:
self.size = size # h, w
self.padding = padding
def __call__(self, sample):
img, mask = sample['image'], sample['label']
if self.padding > 0:
img = ImageOps.expand(img, border=self.padding, fill=0)
mask = ImageOps.expand(mask, border=self.padding, fill=0)
assert img.size == mask.size
w, h = img.size
th, tw = self.size # target size
if w == tw and h == th:
return {'image': img,
'label': mask}
new_img = Image.new('RGB',(tw,th),'black') # size is w x h; and 'white' is 255
new_mask = Image.new('L',(tw,th),'white') # same above
# if w > tw or h > th
x1 = y1 = 0
if w > tw:
x1 = random.randint(0,w - tw)
if h > th:
y1 = random.randint(0,h - th)
# crop
img = img.crop((x1,y1, x1 + tw, y1 + th))
mask = mask.crop((x1,y1, x1 + tw, y1 + th))
new_img.paste(img,(0,0))
new_mask.paste(mask,(0,0))
# x1 = random.randint(0, w - tw)
# y1 = random.randint(0, h - th)
# img = img.crop((x1, y1, x1 + tw, y1 + th))
# mask = mask.crop((x1, y1, x1 + tw, y1 + th))
return {'image': new_img,
'label': new_mask}
class Paste(object):
def __init__(self, size,):
if isinstance(size, numbers.Number):
self.size = (int(size), int(size))
else:
self.size = size # h, w
def __call__(self, sample):
img, mask = sample['image'], sample['label']
assert img.size == mask.size
w, h = img.size
th, tw = self.size # target size
assert (w <=tw) and (h <= th)
if w == tw and h == th:
return {'image': img,
'label': mask}
new_img = Image.new('RGB',(tw,th),'black') # size is w x h; and 'white' is 255
new_mask = Image.new('L',(tw,th),'white') # same above
new_img.paste(img,(0,0))
new_mask.paste(mask,(0,0))
return {'image': new_img,
'label': new_mask}
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, sample):
img = sample['image']
mask = sample['label']
assert img.size == mask.size
w, h = img.size
th, tw = self.size
x1 = int(round((w - tw) / 2.))
y1 = int(round((h - th) / 2.))
img = img.crop((x1, y1, x1 + tw, y1 + th))
mask = mask.crop((x1, y1, x1 + tw, y1 + th))
return {'image': img,
'label': mask}
class RandomHorizontalFlip(object):
def __call__(self, sample):
img = sample['image']
mask = sample['label']
if random.random() < 0.5:
img = img.transpose(Image.FLIP_LEFT_RIGHT)
mask = mask.transpose(Image.FLIP_LEFT_RIGHT)
return {'image': img,
'label': mask}
class HorizontalFlip(object):
def __call__(self, sample):
img = sample['image']
mask = sample['label']
img = img.transpose(Image.FLIP_LEFT_RIGHT)
mask = mask.transpose(Image.FLIP_LEFT_RIGHT)
return {'image': img,
'label': mask}
class HorizontalFlip_only_img(object):
def __call__(self, sample):
img = sample['image']
mask = sample['label']
img = img.transpose(Image.FLIP_LEFT_RIGHT)
# mask = mask.transpose(Image.FLIP_LEFT_RIGHT)
return {'image': img,
'label': mask}
class RandomHorizontalFlip_cihp(object):
def __call__(self, sample):
img = sample['image']
mask = sample['label']
if random.random() < 0.5:
img = img.transpose(Image.FLIP_LEFT_RIGHT)
# mask = Image.open()
return {'image': img,
'label': mask}
class Normalize(object):
"""Normalize a tensor image with mean and standard deviation.
Args:
mean (tuple): means for each channel.
std (tuple): standard deviations for each channel.
"""
def __init__(self, mean=(0., 0., 0.), std=(1., 1., 1.)):
self.mean = mean
self.std = std
def __call__(self, sample):
img = np.array(sample['image']).astype(np.float32)
mask = np.array(sample['label']).astype(np.float32)
img /= 255.0
img -= self.mean
img /= self.std
return {'image': img,
'label': mask}
class Normalize_255(object):
"""Normalize a tensor image with mean and standard deviation. tf use 255.
Args:
mean (tuple): means for each channel.
std (tuple): standard deviations for each channel.
"""
def __init__(self, mean=(123.15, 115.90, 103.06), std=(1., 1., 1.)):
self.mean = mean
self.std = std
def __call__(self, sample):
img = np.array(sample['image']).astype(np.float32)
mask = np.array(sample['label']).astype(np.float32)
# img = 255.0
img -= self.mean
img /= self.std
img = img
img = img[[0,3,2,1],...]
return {'image': img,
'label': mask}
class Normalize_xception_tf(object):
# def __init__(self):
# self.rgb2bgr =
def __call__(self, sample):
img = np.array(sample['image']).astype(np.float32)
mask = np.array(sample['label']).astype(np.float32)
img = (img*2.0)/255.0 - 1
# print(img.shape)
# img = img[[0,3,2,1],...]
return {'image': img,
'label': mask}
class Normalize_xception_tf_only_img(object):
# def __init__(self):
# self.rgb2bgr =
def __call__(self, sample):
img = np.array(sample['image']).astype(np.float32)
# mask = np.array(sample['label']).astype(np.float32)
img = (img*2.0)/255.0 - 1
# print(img.shape)
# img = img[[0,3,2,1],...]
return {'image': img,
'label': sample['label']}
class Normalize_cityscapes(object):
"""Normalize a tensor image with mean and standard deviation.
Args:
mean (tuple): means for each channel.
std (tuple): standard deviations for each channel.
"""
def __init__(self, mean=(0., 0., 0.)):
self.mean = mean
def __call__(self, sample):
img = np.array(sample['image']).astype(np.float32)
mask = np.array(sample['label']).astype(np.float32)
img -= self.mean
img /= 255.0
return {'image': img,
'label': mask}
class ToTensor_(object):
"""Convert ndarrays in sample to Tensors."""
def __init__(self):
self.rgb2bgr = transforms.Lambda(lambda x:x[[2,1,0],...])
def __call__(self, sample):
# swap color axis because
# numpy image: H x W x C
# torch image: C X H X W
img = np.array(sample['image']).astype(np.float32).transpose((2, 0, 1))
mask = np.expand_dims(np.array(sample['label']).astype(np.float32), -1).transpose((2, 0, 1))
# mask[mask == 255] = 0
img = torch.from_numpy(img).float()
img = self.rgb2bgr(img)
mask = torch.from_numpy(mask).float()
return {'image': img,
'label': mask}
class ToTensor_only_img(object):
"""Convert ndarrays in sample to Tensors."""
def __init__(self):
self.rgb2bgr = transforms.Lambda(lambda x:x[[2,1,0],...])
def __call__(self, sample):
# swap color axis because
# numpy image: H x W x C
# torch image: C X H X W
img = np.array(sample['image']).astype(np.float32).transpose((2, 0, 1))
# mask = np.expand_dims(np.array(sample['label']).astype(np.float32), -1).transpose((2, 0, 1))
# mask[mask == 255] = 0
img = torch.from_numpy(img).float()
img = self.rgb2bgr(img)
# mask = torch.from_numpy(mask).float()
return {'image': img,
'label': sample['label']}
class FixedResize(object):
def __init__(self, size):
self.size = tuple(reversed(size)) # size: (h, w)
def __call__(self, sample):
img = sample['image']
mask = sample['label']
assert img.size == mask.size
img = img.resize(self.size, Image.BILINEAR)
mask = mask.resize(self.size, Image.NEAREST)
return {'image': img,
'label': mask}
class Keep_origin_size_Resize(object):
def __init__(self, max_size, scale=1.0):
self.size = tuple(reversed(max_size)) # size: (h, w)
self.scale = scale
self.paste = Paste(int(max_size[0]*scale))
def __call__(self, sample):
img = sample['image']
mask = sample['label']
assert img.size == mask.size
h, w = self.size
h = int(h*self.scale)
w = int(w*self.scale)
img = img.resize((h, w), Image.BILINEAR)
mask = mask.resize((h, w), Image.NEAREST)
return self.paste({'image': img,
'label': mask})
class Scale(object):
def __init__(self, size):
if isinstance(size, numbers.Number):
self.size = (int(size), int(size))
else:
self.size = size
def __call__(self, sample):
img = sample['image']
mask = sample['label']
assert img.size == mask.size
w, h = img.size
if (w >= h and w == self.size[1]) or (h >= w and h == self.size[0]):
return {'image': img,
'label': mask}
oh, ow = self.size
img = img.resize((ow, oh), Image.BILINEAR)
mask = mask.resize((ow, oh), Image.NEAREST)
return {'image': img,
'label': mask}
class Scale_(object):
def __init__(self, scale):
self.scale = scale
def __call__(self, sample):
img = sample['image']
mask = sample['label']
assert img.size == mask.size
w, h = img.size
ow = int(w*self.scale)
oh = int(h*self.scale)
img = img.resize((ow, oh), Image.BILINEAR)
mask = mask.resize((ow, oh), Image.NEAREST)
return {'image': img,
'label': mask}
class Scale_only_img(object):
def __init__(self, scale):
self.scale = scale
def __call__(self, sample):
img = sample['image']
mask = sample['label']
# assert img.size == mask.size
w, h = img.size
ow = int(w*self.scale)
oh = int(h*self.scale)
img = img.resize((ow, oh), Image.BILINEAR)
# mask = mask.resize((ow, oh), Image.NEAREST)
return {'image': img,
'label': mask}
class RandomSizedCrop(object):
def __init__(self, size):
self.size = size
def __call__(self, sample):
img = sample['image']
mask = sample['label']
assert img.size == mask.size
for attempt in range(10):
area = img.size[0] * img.size[1]
target_area = random.uniform(0.45, 1.0) * area
aspect_ratio = random.uniform(0.5, 2)
w = int(round(math.sqrt(target_area * aspect_ratio)))
h = int(round(math.sqrt(target_area / aspect_ratio)))
if random.random() < 0.5:
w, h = h, w
if w <= img.size[0] and h <= img.size[1]:
x1 = random.randint(0, img.size[0] - w)
y1 = random.randint(0, img.size[1] - h)
img = img.crop((x1, y1, x1 + w, y1 + h))
mask = mask.crop((x1, y1, x1 + w, y1 + h))
assert (img.size == (w, h))
img = img.resize((self.size, self.size), Image.BILINEAR)
mask = mask.resize((self.size, self.size), Image.NEAREST)
return {'image': img,
'label': mask}
# Fallback
scale = Scale(self.size)
crop = CenterCrop(self.size)
sample = crop(scale(sample))
return sample
class RandomRotate(object):
def __init__(self, degree):
self.degree = degree
def __call__(self, sample):
img = sample['image']
mask = sample['label']
rotate_degree = random.random() * 2 * self.degree - self.degree
img = img.rotate(rotate_degree, Image.BILINEAR)
mask = mask.rotate(rotate_degree, Image.NEAREST)
return {'image': img,
'label': mask}
class RandomSized_new(object):
'''what we use is this class to aug'''
def __init__(self, size,scale1=0.5,scale2=2):
self.size = size
# self.scale = Scale(self.size)
self.crop = RandomCrop_new(self.size)
self.small_scale = scale1
self.big_scale = scale2
def __call__(self, sample):
img = sample['image']
mask = sample['label']
assert img.size == mask.size
w = int(random.uniform(self.small_scale, self.big_scale) * img.size[0])
h = int(random.uniform(self.small_scale, self.big_scale) * img.size[1])
img, mask = img.resize((w, h), Image.BILINEAR), mask.resize((w, h), Image.NEAREST)
sample = {'image': img, 'label': mask}
# finish resize
return self.crop(sample)
# class Random
class RandomScale(object):
def __init__(self, limit):
self.limit = limit
def __call__(self, sample):
img = sample['image']
mask = sample['label']
assert img.size == mask.size
scale = random.uniform(self.limit[0], self.limit[1])
w = int(scale * img.size[0])
h = int(scale * img.size[1])
img, mask = img.resize((w, h), Image.BILINEAR), mask.resize((w, h), Image.NEAREST)
return {'image': img, 'label': mask}