wizzseen's picture
Upload 948 files
8a6df40 verified
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}