init
This commit is contained in:
@@ -0,0 +1,2 @@
|
||||
from datasets.datasets import get_dataset, get_superclass_list, get_subclass_dataset
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,361 @@
|
||||
import os
|
||||
|
||||
import numpy as np
|
||||
import torch
|
||||
from torch.utils.data.dataset import Subset
|
||||
from torchvision import datasets, transforms
|
||||
|
||||
from utils.utils import set_random_seed
|
||||
|
||||
DATA_PATH = '~/data/'
|
||||
IMAGENET_PATH = '~/data/ImageNet'
|
||||
CNMC_PATH = r'~/data/CSI/CNMC_orig'
|
||||
CNMC_GRAY_PATH = r'~/data/CSI/CNMC_orig_gray'
|
||||
CNMC_ROT4_PATH = r'~/data/CSI/CNMC_rotated_4'
|
||||
|
||||
CIFAR10_SUPERCLASS = list(range(10)) # one class
|
||||
IMAGENET_SUPERCLASS = list(range(30)) # one class
|
||||
CNMC_SUPERCLASS = list(range(2)) # one class
|
||||
|
||||
STD_RES = 450
|
||||
STD_CENTER_CROP = 300
|
||||
|
||||
CIFAR100_SUPERCLASS = [
|
||||
[4, 31, 55, 72, 95],
|
||||
[1, 33, 67, 73, 91],
|
||||
[54, 62, 70, 82, 92],
|
||||
[9, 10, 16, 29, 61],
|
||||
[0, 51, 53, 57, 83],
|
||||
[22, 25, 40, 86, 87],
|
||||
[5, 20, 26, 84, 94],
|
||||
[6, 7, 14, 18, 24],
|
||||
[3, 42, 43, 88, 97],
|
||||
[12, 17, 38, 68, 76],
|
||||
[23, 34, 49, 60, 71],
|
||||
[15, 19, 21, 32, 39],
|
||||
[35, 63, 64, 66, 75],
|
||||
[27, 45, 77, 79, 99],
|
||||
[2, 11, 36, 46, 98],
|
||||
[28, 30, 44, 78, 93],
|
||||
[37, 50, 65, 74, 80],
|
||||
[47, 52, 56, 59, 96],
|
||||
[8, 13, 48, 58, 90],
|
||||
[41, 69, 81, 85, 89],
|
||||
]
|
||||
|
||||
|
||||
class MultiDataTransform(object):
|
||||
def __init__(self, transform):
|
||||
self.transform1 = transform
|
||||
self.transform2 = transform
|
||||
|
||||
def __call__(self, sample):
|
||||
x1 = self.transform1(sample)
|
||||
x2 = self.transform2(sample)
|
||||
return x1, x2
|
||||
|
||||
|
||||
class MultiDataTransformList(object):
|
||||
def __init__(self, transform, clean_trasform, sample_num):
|
||||
self.transform = transform
|
||||
self.clean_transform = clean_trasform
|
||||
self.sample_num = sample_num
|
||||
|
||||
def __call__(self, sample):
|
||||
set_random_seed(0)
|
||||
|
||||
sample_list = []
|
||||
for i in range(self.sample_num):
|
||||
sample_list.append(self.transform(sample))
|
||||
|
||||
return sample_list, self.clean_transform(sample)
|
||||
|
||||
|
||||
def get_transform(image_size=None):
|
||||
# Note: data augmentation is implemented in the layers
|
||||
# Hence, we only define the identity transformation here
|
||||
if image_size: # use pre-specified image size
|
||||
train_transform = transforms.Compose([
|
||||
transforms.Resize((image_size[0], image_size[1])),
|
||||
transforms.RandomHorizontalFlip(),
|
||||
transforms.ToTensor(),
|
||||
])
|
||||
test_transform = transforms.Compose([
|
||||
transforms.Resize((image_size[0], image_size[1])),
|
||||
transforms.ToTensor(),
|
||||
])
|
||||
else: # use default image size
|
||||
train_transform = transforms.Compose([
|
||||
transforms.ToTensor(),
|
||||
])
|
||||
test_transform = transforms.ToTensor()
|
||||
|
||||
return train_transform, test_transform
|
||||
|
||||
|
||||
def get_subset_with_len(dataset, length, shuffle=False):
|
||||
set_random_seed(0)
|
||||
dataset_size = len(dataset)
|
||||
|
||||
index = np.arange(dataset_size)
|
||||
if shuffle:
|
||||
np.random.shuffle(index)
|
||||
|
||||
index = torch.from_numpy(index[0:length])
|
||||
subset = Subset(dataset, index)
|
||||
|
||||
assert len(subset) == length
|
||||
|
||||
return subset
|
||||
|
||||
|
||||
def get_transform_imagenet():
|
||||
|
||||
train_transform = transforms.Compose([
|
||||
transforms.Resize(256),
|
||||
transforms.RandomResizedCrop(224),
|
||||
transforms.RandomHorizontalFlip(),
|
||||
transforms.ToTensor(),
|
||||
])
|
||||
test_transform = transforms.Compose([
|
||||
transforms.Resize(256),
|
||||
transforms.CenterCrop(224),
|
||||
transforms.ToTensor(),
|
||||
])
|
||||
|
||||
train_transform = MultiDataTransform(train_transform)
|
||||
|
||||
return train_transform, test_transform
|
||||
|
||||
def get_transform_cnmc(res, center_crop_size):
|
||||
train_transform = transforms.Compose([
|
||||
transforms.Resize(res),
|
||||
transforms.CenterCrop(center_crop_size),
|
||||
transforms.RandomVerticalFlip(),
|
||||
transforms.RandomHorizontalFlip(),
|
||||
transforms.ToTensor(),
|
||||
])
|
||||
test_transform = transforms.Compose([
|
||||
transforms.Resize(res),
|
||||
transforms.CenterCrop(center_crop_size),
|
||||
transforms.ToTensor(),
|
||||
])
|
||||
train_transform = MultiDataTransform(train_transform)
|
||||
|
||||
return train_transform, test_transform
|
||||
|
||||
|
||||
def get_dataset(P, dataset, test_only=False, image_size=None, download=False, eval=False):
|
||||
if P.res != '':
|
||||
res = int(P.res.replace('px', ''))
|
||||
size_factor = int(STD_RES/res) # always remove same portion
|
||||
center_crop_size = int(STD_CENTER_CROP/size_factor) # remove black border
|
||||
if dataset in ['CNMC', 'CNMC_grayscale', 'CNMC_ROT4_PATH']:
|
||||
if eval:
|
||||
train_transform, test_transform = get_simclr_eval_transform_cnmc(P.ood_samples,
|
||||
P.resize_factor, P.resize_fix, res, center_crop_size)
|
||||
else:
|
||||
train_transform, test_transform = get_transform_cnmc(res, center_crop_size)
|
||||
elif dataset in ['imagenet', 'cub', 'stanford_dogs', 'flowers102',
|
||||
'places365', 'food_101', 'caltech_256', 'dtd', 'pets']:
|
||||
if eval:
|
||||
train_transform, test_transform = get_simclr_eval_transform_imagenet(P.ood_samples,
|
||||
P.resize_factor, P.resize_fix)
|
||||
else:
|
||||
train_transform, test_transform = get_transform_imagenet()
|
||||
else:
|
||||
train_transform, test_transform = get_transform(image_size=image_size)
|
||||
|
||||
if dataset == 'CNMC':
|
||||
image_size = (center_crop_size, center_crop_size, 3) #original 450,450,3
|
||||
n_classes = 2
|
||||
train_dir = os.path.join(CNMC_PATH, '0_training')
|
||||
test_dir = os.path.join(CNMC_PATH, '1_validation')
|
||||
train_set = datasets.ImageFolder(train_dir, transform=train_transform)
|
||||
test_set = datasets.ImageFolder(test_dir, transform=test_transform)
|
||||
|
||||
elif dataset == 'CNMC_grayscale':
|
||||
image_size = (center_crop_size, center_crop_size, 3) #original 450,450,3
|
||||
n_classes = 2
|
||||
train_dir = os.path.join(CNMC_GRAY_PATH, '0_training')
|
||||
test_dir = os.path.join(CNMC_GRAY_PATH, '1_validation')
|
||||
train_set = datasets.ImageFolder(train_dir, transform=train_transform)
|
||||
test_set = datasets.ImageFolder(test_dir, transform=test_transform)
|
||||
|
||||
elif dataset == 'cifar10':
|
||||
image_size = (32, 32, 3)
|
||||
n_classes = 10
|
||||
train_set = datasets.CIFAR10(DATA_PATH, train=True, download=download, transform=train_transform)
|
||||
test_set = datasets.CIFAR10(DATA_PATH, train=False, download=download, transform=test_transform)
|
||||
|
||||
elif dataset == 'cifar100':
|
||||
image_size = (32, 32, 3)
|
||||
n_classes = 100
|
||||
train_set = datasets.CIFAR100(DATA_PATH, train=True, download=download, transform=train_transform)
|
||||
test_set = datasets.CIFAR100(DATA_PATH, train=False, download=download, transform=test_transform)
|
||||
|
||||
elif dataset == 'svhn':
|
||||
assert test_only and image_size is not None
|
||||
test_set = datasets.SVHN(DATA_PATH, split='test', download=download, transform=test_transform)
|
||||
|
||||
elif dataset == 'lsun_resize':
|
||||
assert test_only and image_size is not None
|
||||
test_dir = os.path.join(DATA_PATH, 'LSUN_resize')
|
||||
test_set = datasets.ImageFolder(test_dir, transform=test_transform)
|
||||
|
||||
elif dataset == 'lsun_fix':
|
||||
assert test_only and image_size is not None
|
||||
test_dir = os.path.join(DATA_PATH, 'LSUN_fix')
|
||||
test_set = datasets.ImageFolder(test_dir, transform=test_transform)
|
||||
|
||||
elif dataset == 'imagenet_resize':
|
||||
assert test_only and image_size is not None
|
||||
test_dir = os.path.join(DATA_PATH, 'Imagenet_resize')
|
||||
test_set = datasets.ImageFolder(test_dir, transform=test_transform)
|
||||
|
||||
elif dataset == 'imagenet_fix':
|
||||
assert test_only and image_size is not None
|
||||
test_dir = os.path.join(DATA_PATH, 'Imagenet_fix')
|
||||
test_set = datasets.ImageFolder(test_dir, transform=test_transform)
|
||||
|
||||
elif dataset == 'imagenet':
|
||||
image_size = (224, 224, 3)
|
||||
n_classes = 30
|
||||
train_dir = os.path.join(IMAGENET_PATH, 'one_class_train')
|
||||
test_dir = os.path.join(IMAGENET_PATH, 'one_class_test')
|
||||
train_set = datasets.ImageFolder(train_dir, transform=train_transform)
|
||||
test_set = datasets.ImageFolder(test_dir, transform=test_transform)
|
||||
|
||||
elif dataset == 'stanford_dogs':
|
||||
assert test_only and image_size is not None
|
||||
test_dir = os.path.join(DATA_PATH, 'stanford_dogs')
|
||||
test_set = datasets.ImageFolder(test_dir, transform=test_transform)
|
||||
test_set = get_subset_with_len(test_set, length=3000, shuffle=True)
|
||||
|
||||
elif dataset == 'cub':
|
||||
assert test_only and image_size is not None
|
||||
test_dir = os.path.join(DATA_PATH, 'cub200')
|
||||
test_set = datasets.ImageFolder(test_dir, transform=test_transform)
|
||||
test_set = get_subset_with_len(test_set, length=3000, shuffle=True)
|
||||
|
||||
elif dataset == 'flowers102':
|
||||
assert test_only and image_size is not None
|
||||
test_dir = os.path.join(DATA_PATH, 'flowers102')
|
||||
test_set = datasets.ImageFolder(test_dir, transform=test_transform)
|
||||
test_set = get_subset_with_len(test_set, length=3000, shuffle=True)
|
||||
|
||||
elif dataset == 'places365':
|
||||
assert test_only and image_size is not None
|
||||
test_dir = os.path.join(DATA_PATH, 'places365')
|
||||
test_set = datasets.ImageFolder(test_dir, transform=test_transform)
|
||||
test_set = get_subset_with_len(test_set, length=3000, shuffle=True)
|
||||
|
||||
elif dataset == 'food_101':
|
||||
assert test_only and image_size is not None
|
||||
test_dir = os.path.join(DATA_PATH, 'food-101', 'images')
|
||||
test_set = datasets.ImageFolder(test_dir, transform=test_transform)
|
||||
test_set = get_subset_with_len(test_set, length=3000, shuffle=True)
|
||||
|
||||
elif dataset == 'caltech_256':
|
||||
assert test_only and image_size is not None
|
||||
test_dir = os.path.join(DATA_PATH, 'caltech-256')
|
||||
test_set = datasets.ImageFolder(test_dir, transform=test_transform)
|
||||
test_set = get_subset_with_len(test_set, length=3000, shuffle=True)
|
||||
|
||||
elif dataset == 'dtd':
|
||||
assert test_only and image_size is not None
|
||||
test_dir = os.path.join(DATA_PATH, 'dtd', 'images')
|
||||
test_set = datasets.ImageFolder(test_dir, transform=test_transform)
|
||||
test_set = get_subset_with_len(test_set, length=3000, shuffle=True)
|
||||
|
||||
elif dataset == 'pets':
|
||||
assert test_only and image_size is not None
|
||||
test_dir = os.path.join(DATA_PATH, 'pets')
|
||||
test_set = datasets.ImageFolder(test_dir, transform=test_transform)
|
||||
test_set = get_subset_with_len(test_set, length=3000, shuffle=True)
|
||||
|
||||
else:
|
||||
raise NotImplementedError()
|
||||
|
||||
if test_only:
|
||||
return test_set
|
||||
else:
|
||||
return train_set, test_set, image_size, n_classes
|
||||
|
||||
|
||||
def get_superclass_list(dataset):
|
||||
if dataset == 'CNMC':
|
||||
return CNMC_SUPERCLASS
|
||||
if dataset == 'CNMC_grayscale':
|
||||
return CNMC_SUPERCLASS
|
||||
elif dataset == 'cifar10':
|
||||
return CIFAR10_SUPERCLASS
|
||||
elif dataset == 'cifar100':
|
||||
return CIFAR100_SUPERCLASS
|
||||
elif dataset == 'imagenet':
|
||||
return IMAGENET_SUPERCLASS
|
||||
else:
|
||||
raise NotImplementedError()
|
||||
|
||||
|
||||
def get_subclass_dataset(dataset, classes):
|
||||
if not isinstance(classes, list):
|
||||
classes = [classes]
|
||||
|
||||
indices = []
|
||||
for idx, tgt in enumerate(dataset.targets):
|
||||
if tgt in classes:
|
||||
indices.append(idx)
|
||||
|
||||
dataset = Subset(dataset, indices)
|
||||
return dataset
|
||||
|
||||
|
||||
def get_simclr_eval_transform_imagenet(sample_num, resize_factor, resize_fix):
|
||||
|
||||
resize_scale = (resize_factor, 1.0) # resize scaling factor
|
||||
if resize_fix: # if resize_fix is True, use same scale
|
||||
resize_scale = (resize_factor, resize_factor)
|
||||
|
||||
transform = transforms.Compose([
|
||||
transforms.Resize(256),
|
||||
transforms.RandomResizedCrop(224, scale=resize_scale),
|
||||
transforms.RandomHorizontalFlip(),
|
||||
transforms.ToTensor(),
|
||||
])
|
||||
|
||||
clean_trasform = transforms.Compose([
|
||||
transforms.Resize(256),
|
||||
transforms.CenterCrop(224),
|
||||
transforms.ToTensor(),
|
||||
])
|
||||
|
||||
transform = MultiDataTransformList(transform, clean_trasform, sample_num)
|
||||
|
||||
return transform, transform
|
||||
|
||||
def get_simclr_eval_transform_cnmc(sample_num, resize_factor, resize_fix, res, center_crop_size):
|
||||
|
||||
resize_scale = (resize_factor, 1.0) # resize scaling factor
|
||||
if resize_fix: # if resize_fix is True, use same scale
|
||||
resize_scale = (resize_factor, resize_factor)
|
||||
|
||||
transform = transforms.Compose([
|
||||
transforms.Resize(res),
|
||||
transforms.CenterCrop(center_crop_size),
|
||||
transforms.RandomVerticalFlip(),
|
||||
transforms.RandomHorizontalFlip(),
|
||||
transforms.ToTensor(),
|
||||
])
|
||||
|
||||
clean_trasform = transforms.Compose([
|
||||
transforms.Resize(res),
|
||||
transforms.CenterCrop(center_crop_size),
|
||||
transforms.ToTensor(),
|
||||
])
|
||||
|
||||
transform = MultiDataTransformList(transform, clean_trasform, sample_num)
|
||||
|
||||
return transform, transform
|
||||
|
||||
|
||||
@@ -0,0 +1,66 @@
|
||||
import os
|
||||
import time
|
||||
import random
|
||||
|
||||
import cv2
|
||||
import numpy as np
|
||||
import torch
|
||||
|
||||
import torch.nn.functional as F
|
||||
from torchvision import datasets, transforms
|
||||
from torch.utils.data import DataLoader
|
||||
from torchvision.utils import save_image
|
||||
|
||||
from datasets import get_subclass_dataset
|
||||
|
||||
def set_random_seed(seed):
|
||||
random.seed(seed)
|
||||
np.random.seed(seed)
|
||||
torch.manual_seed(seed)
|
||||
torch.cuda.manual_seed(seed)
|
||||
|
||||
IMAGENET_PATH = '~/data/ImageNet'
|
||||
|
||||
|
||||
check = time.time()
|
||||
|
||||
transform = transforms.Compose([
|
||||
transforms.Resize(256),
|
||||
transforms.CenterCrop(256),
|
||||
transforms.Resize(32),
|
||||
transforms.ToTensor(),
|
||||
])
|
||||
|
||||
# remove airliner(1), ambulance(2), parking_meter(18), schooner(22) since similar class exist in CIFAR-10
|
||||
class_idx_list = list(range(30))
|
||||
remove_idx_list = [1, 2, 18, 22]
|
||||
for remove_idx in remove_idx_list:
|
||||
class_idx_list.remove(remove_idx)
|
||||
|
||||
set_random_seed(0)
|
||||
train_dir = os.path.join(IMAGENET_PATH, 'one_class_train')
|
||||
Imagenet_set = datasets.ImageFolder(train_dir, transform=transform)
|
||||
Imagenet_set = get_subclass_dataset(Imagenet_set, class_idx_list)
|
||||
Imagenet_dataloader = DataLoader(Imagenet_set, batch_size=100, shuffle=True, pin_memory=False)
|
||||
|
||||
total_test_image = None
|
||||
for n, (test_image, target) in enumerate(Imagenet_dataloader):
|
||||
|
||||
if n == 0:
|
||||
total_test_image = test_image
|
||||
else:
|
||||
total_test_image = torch.cat((total_test_image, test_image), dim=0).cpu()
|
||||
|
||||
if total_test_image.size(0) >= 10000:
|
||||
break
|
||||
|
||||
print (f'Preprocessing time {time.time()-check}')
|
||||
|
||||
if not os.path.exists('./Imagenet_fix'):
|
||||
os.mkdir('./Imagenet_fix')
|
||||
|
||||
check = time.time()
|
||||
for i in range(10000):
|
||||
save_image(total_test_image[i], f'Imagenet_fix/correct_resize_{i}.png')
|
||||
print (f'Saving time {time.time()-check}')
|
||||
|
||||
@@ -0,0 +1,61 @@
|
||||
import os
|
||||
import time
|
||||
import random
|
||||
|
||||
import numpy as np
|
||||
import torch
|
||||
|
||||
from torchvision import datasets, transforms
|
||||
from torch.utils.data import DataLoader
|
||||
from torchvision.utils import save_image
|
||||
|
||||
def set_random_seed(seed):
|
||||
random.seed(seed)
|
||||
np.random.seed(seed)
|
||||
torch.manual_seed(seed)
|
||||
torch.cuda.manual_seed(seed)
|
||||
|
||||
check = time.time()
|
||||
|
||||
transform = transforms.Compose([
|
||||
transforms.Resize(256),
|
||||
transforms.CenterCrop(256),
|
||||
transforms.Resize(32),
|
||||
transforms.ToTensor(),
|
||||
])
|
||||
|
||||
set_random_seed(0)
|
||||
|
||||
LSUN_class_list = ['bedroom', 'bridge', 'church_outdoor', 'classroom',
|
||||
'conference_room', 'dining_room', 'kitchen', 'living_room', 'restaurant', 'tower']
|
||||
|
||||
total_test_image_all_class = []
|
||||
for LSUN_class in LSUN_class_list:
|
||||
LSUN_set = datasets.LSUN('~/data/lsun/', classes=LSUN_class + '_train', transform=transform)
|
||||
LSUN_loader = DataLoader(LSUN_set, batch_size=100, shuffle=True, pin_memory=False)
|
||||
|
||||
total_test_image = None
|
||||
for n, (test_image, _) in enumerate(LSUN_loader):
|
||||
|
||||
if n == 0:
|
||||
total_test_image = test_image
|
||||
else:
|
||||
total_test_image = torch.cat((total_test_image, test_image), dim=0).cpu()
|
||||
|
||||
if total_test_image.size(0) >= 1000:
|
||||
break
|
||||
|
||||
total_test_image_all_class.append(total_test_image)
|
||||
|
||||
total_test_image_all_class = torch.cat(total_test_image_all_class, dim=0)
|
||||
|
||||
print (f'Preprocessing time {time.time()-check}')
|
||||
|
||||
if not os.path.exists('./LSUN_fix'):
|
||||
os.mkdir('./LSUN_fix')
|
||||
|
||||
check = time.time()
|
||||
for i in range(10000):
|
||||
save_image(total_test_image_all_class[i], f'LSUN_fix/correct_resize_{i}.png')
|
||||
print (f'Saving time {time.time()-check}')
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
import re
|
||||
import matplotlib.pyplot as plt
|
||||
|
||||
PATH = r'C:\Users\feokt\PycharmProjects\CSI\CSI\logs'
|
||||
|
||||
|
||||
def postprocess_data(log: list):
|
||||
for pth in log:
|
||||
loss_sim = []
|
||||
loss_shift = []
|
||||
with open(PATH + pth) as f:
|
||||
lines = f.readlines()
|
||||
for line in lines:
|
||||
# line = '[2022-01-31 20:40:23.947855] [DONE] [Time 0.179] [Data 0.583] [LossC 0.000000] [LossSim 4.024234] [LossShift 0.065126]'
|
||||
part = re.search('\[DONE\]', line)
|
||||
if part is not None:
|
||||
l_sim = re.search('(\[LossSim.[0-9]*.[0-9]*\])', line).group()
|
||||
if l_sim is not None:
|
||||
loss_sim.append(float(re.search('(\s[0-9].*[0-9])', l_sim).group()))
|
||||
l_shift = re.search('(\[LossShift.[0-9]*.[0-9]*\])', line).group()
|
||||
if l_shift is not None:
|
||||
loss_shift.append(float(re.search('(\s[0-9].*[0-9])', l_shift).group()))
|
||||
loss = [loss_sim[i] + loss_shift[i] for i in range(len(loss_sim))]
|
||||
|
||||
plt.ylabel("loss")
|
||||
plt.xlabel("epoch")
|
||||
plt.title("Loss over epochs")
|
||||
plt.plot(list(range(1, 101)), loss)
|
||||
for idx in range(len(log)):
|
||||
log[idx] = log[idx][38:]
|
||||
plt.legend(log)
|
||||
plt.grid()
|
||||
#plt.plot(list(range(1, 101)), loss_sim)
|
||||
#plt.plot(list(range(1, 101)), loss_shift)
|
||||
plt.show()
|
||||
|
||||
|
||||
@@ -0,0 +1,196 @@
|
||||
import csv
|
||||
import os
|
||||
from PIL import Image
|
||||
from torchvision import transforms
|
||||
from torchvision.utils import save_image
|
||||
import torch
|
||||
|
||||
|
||||
def transform_image(img_in, target_dir, transformation, suffix):
|
||||
"""
|
||||
Transforms an image according to provided transformation.
|
||||
|
||||
Parameters:
|
||||
img_in (path): Image to transform
|
||||
target_dir (path): Destination path
|
||||
transformation (callable): Transformation to be applied
|
||||
suffix (str): Suffix of resulting image.
|
||||
|
||||
Returns:
|
||||
binary_sum (str): Binary string of the sum of a and b
|
||||
"""
|
||||
if suffix == 'rot':
|
||||
im = Image.open(img_in)
|
||||
im = im.rotate(270)
|
||||
tensor = transforms.ToTensor()(im)
|
||||
save_image(tensor, target_dir + os.sep + suffix + '.jpg')
|
||||
elif suffix == 'sobel':
|
||||
im = Image.open(img_in)
|
||||
tensor = transforms.ToTensor()(im)
|
||||
sobel_filter = torch.tensor([[1., 2., 1.], [0., 0., 0.], [-1., -2., -1.]])
|
||||
f = sobel_filter.expand(1, 3, 3, 3)
|
||||
tensor = torch.conv2d(tensor, f, stride=1, padding=1 )
|
||||
save_image(tensor, target_dir + os.sep + suffix + '.jpg')
|
||||
elif suffix == 'noise':
|
||||
im = Image.open(img_in)
|
||||
tensor = transforms.ToTensor()(im)
|
||||
tensor = tensor + (torch.randn(tensor.size()) * 0.2 + 0)
|
||||
save_image(tensor, target_dir + os.sep + suffix + '.jpg')
|
||||
elif suffix == 'cutout':
|
||||
print("asd")
|
||||
else:
|
||||
im = Image.open(img_in)
|
||||
im_trans = transformation(im)
|
||||
im_trans.save(target_dir + os.sep + suffix + '.jpg')
|
||||
|
||||
|
||||
def sort_and_rename_images(excel_path: str):
|
||||
"""Renames images and sorts them according to csv."""
|
||||
base_dir = excel_path.rsplit(os.sep, 1)[0]
|
||||
dir_all = base_dir + os.sep + 'all'
|
||||
if not os.path.isdir(dir_all):
|
||||
os.mkdir(dir_all)
|
||||
dir_hem = base_dir + os.sep + 'hem'
|
||||
if not os.path.isdir(dir_hem):
|
||||
os.mkdir(dir_hem)
|
||||
|
||||
with open(excel_path, mode='r') as file:
|
||||
csv_file = csv.reader(file)
|
||||
for lines in csv_file:
|
||||
print(lines)
|
||||
if lines[2] == '1':
|
||||
os.rename(base_dir + os.sep + lines[1], dir_all + os.sep + lines[0])
|
||||
elif lines[2] == '0':
|
||||
os.rename(base_dir + os.sep + lines[1], dir_hem + os.sep + lines[0])
|
||||
|
||||
|
||||
def drop_color_channels(source_dir, target_dir, rgb):
|
||||
"""Rotates all images in in source dir."""
|
||||
if rgb == 0:
|
||||
suffix = "red_only"
|
||||
drop_1 = 1
|
||||
drop_2 = 2
|
||||
elif rgb == 1:
|
||||
suffix = "green_only"
|
||||
drop_1 = 0
|
||||
drop_2 = 2
|
||||
elif rgb == 2:
|
||||
suffix = "blue_only"
|
||||
drop_1 = 0
|
||||
drop_2 = 1
|
||||
elif rgb == 3:
|
||||
suffix = "no_red"
|
||||
drop_1 = 0
|
||||
elif rgb == 4:
|
||||
suffix = "no_green"
|
||||
drop_1 = 1
|
||||
elif rgb == 5:
|
||||
suffix = "no_blue"
|
||||
drop_1 = 2
|
||||
else:
|
||||
suffix = ""
|
||||
print("Invalid RGB-channel")
|
||||
if suffix != "":
|
||||
dirs = os.listdir(source_dir)
|
||||
for item in dirs:
|
||||
if os.path.isfile(source_dir + os.sep + item):
|
||||
im = Image.open(source_dir + os.sep + item)
|
||||
tensor = transforms.ToTensor()(im)
|
||||
tensor[drop_1, :, :] = 0
|
||||
if rgb < 3:
|
||||
tensor[drop_2, :, :] = 0
|
||||
save_image(tensor, target_dir + os.sep + item, 'bmp')
|
||||
|
||||
|
||||
def rotate_images(target_dir, source_dir, rotate, theta):
|
||||
"""Rotates all images in in source dir."""
|
||||
dirs = os.listdir(source_dir)
|
||||
for item in dirs:
|
||||
if os.path.isfile(source_dir + os.sep + item):
|
||||
for i in range(0, rotate):
|
||||
im = Image.open(source_dir + os.sep + item)
|
||||
im = im.rotate(i*theta)
|
||||
tensor = transforms.ToTensor()(im)
|
||||
save_image(tensor, target_dir + os.sep + str(i) + '_' + item, 'bmp')
|
||||
|
||||
|
||||
def grayscale_image(source_dir, target_dir):
|
||||
"""Grayscale transforms all images in path."""
|
||||
t = transforms.Grayscale()
|
||||
dirs = os.listdir(source_dir)
|
||||
if not os.path.isdir(target_dir):
|
||||
os.mkdir(target_dir)
|
||||
for item in dirs:
|
||||
if os.path.isfile(source_dir + os.sep + item):
|
||||
im = Image.open(source_dir + os.sep + item).convert('RGB')
|
||||
im_resize = t(im)
|
||||
tensor = transforms.ToTensor()(im_resize)
|
||||
padding = torch.zeros(1, tensor.shape[1], tensor.shape[2])
|
||||
tensor = torch.cat((tensor, padding), 0)
|
||||
im_resize.save(target_dir + os.sep + item, 'bmp')
|
||||
|
||||
|
||||
def resize(source_dir):
|
||||
"""Rotates all images in in source dir."""
|
||||
t = transforms.Compose([transforms.Resize((128, 128))])
|
||||
dirs = os.listdir(source_dir)
|
||||
target_dir = source_dir + os.sep + 'resized'
|
||||
if not os.path.isdir(target_dir):
|
||||
os.mkdir(target_dir)
|
||||
for item in dirs:
|
||||
if os.path.isfile(source_dir + os.sep + item):
|
||||
im = Image.open(source_dir + os.sep + item)
|
||||
im_resize = t(im)
|
||||
im_resize.save(source_dir + os.sep + 'resized' + os.sep + item, 'bmp')
|
||||
|
||||
|
||||
def crop_image(source_dir):
|
||||
"""Center Crops all images in path."""
|
||||
t = transforms.CenterCrop((224, 224))
|
||||
dirs = os.listdir(source_dir)
|
||||
target_dir = source_dir + os.sep + 'cropped'
|
||||
if not os.path.isdir(target_dir):
|
||||
os.mkdir(target_dir)
|
||||
for item in dirs:
|
||||
if os.path.isfile(source_dir + os.sep + item):
|
||||
im = Image.open(source_dir + os.sep + item)
|
||||
im_resize = t(im, )
|
||||
im_resize.save(source_dir + os.sep + 'cropped' + os.sep + item, 'bmp')
|
||||
|
||||
|
||||
def mk_dirs(target_dir):
|
||||
dir_0 = target_dir + r"\fold_0"
|
||||
dir_1 = target_dir + r"\fold_1"
|
||||
dir_2 = target_dir + r"\fold_2"
|
||||
dir_3 = target_dir + r"\phase2"
|
||||
dir_4 = target_dir + r"\phase3"
|
||||
dir_0_all = dir_0 + r"\all"
|
||||
dir_0_hem = dir_0 + r"\hem"
|
||||
dir_1_all = dir_1 + r"\all"
|
||||
dir_1_hem = dir_1 + r"\hem"
|
||||
dir_2_all = dir_2 + r"\all"
|
||||
dir_2_hem = dir_2 + r"\hem"
|
||||
if not os.path.isdir(dir_0):
|
||||
os.mkdir(dir_0)
|
||||
if not os.path.isdir(dir_1):
|
||||
os.mkdir(dir_1)
|
||||
if not os.path.isdir(dir_2):
|
||||
os.mkdir(dir_2)
|
||||
if not os.path.isdir(dir_3):
|
||||
os.mkdir(dir_3)
|
||||
if not os.path.isdir(dir_4):
|
||||
os.mkdir(dir_4)
|
||||
|
||||
if not os.path.isdir(dir_0_all):
|
||||
os.mkdir(dir_0_all)
|
||||
if not os.path.isdir(dir_0_hem):
|
||||
os.mkdir(dir_0_hem)
|
||||
if not os.path.isdir(dir_1_all):
|
||||
os.mkdir(dir_1_all)
|
||||
if not os.path.isdir(dir_1_hem):
|
||||
os.mkdir(dir_1_hem)
|
||||
if not os.path.isdir(dir_2_all):
|
||||
os.mkdir(dir_2_all)
|
||||
if not os.path.isdir(dir_2_hem):
|
||||
os.mkdir(dir_2_hem)
|
||||
return dir_0_all, dir_0_hem, dir_1_all, dir_1_hem, dir_2_all, dir_2_hem, dir_3, dir_4
|
||||
Reference in New Issue
Block a user