| from torch.utils.data import Dataset |
| import os |
| from PIL import Image |
| from torchvision import transforms |
|
|
|
|
| class ImageFolderDataset(Dataset): |
| def __init__(self, root, transform = None): |
| super(ImageFolderDataset, self).__init__() |
| self.root = root |
| self.transform = transform |
| self.files = list(os.listdir(root)) |
| self.files = [p for p in self.files if p.endswith(('.jpg', '.png', '.jpeg'))] |
|
|
| def __len__(self): |
| return len(self.files) |
|
|
| def __getitem__(self, idx): |
| image_path = os.path.join(self.root, self.files[idx]) |
| image = Image.open(image_path).convert('RGB') |
|
|
| if self.transform: |
| image = self.transform(image) |
|
|
| return image |
|
|
|
|
| def get_transform(size, crop, final_size): |
| transform_list = [] |
| if size > 0: |
| transform_list.append(transforms.Resize(size)) |
| if crop: |
| transform_list.append(transforms.RandomCrop(final_size)) |
| else: |
| transform_list.append(transforms.Resize(final_size)) |
|
|
| transform_list.append(transforms.ToTensor()) |
| return transforms.Compose(transform_list) |
| |
|
|
| def adaptive_instance_normalization(content_feat, style_feat): |
| |
| size = content_feat.size() |
| style_mean, style_std = calc_mean_std(style_feat) |
| content_mean, content_std = calc_mean_std(content_feat) |
| normalized_content_feat = (content_feat - content_mean.expand(size)) / content_std.expand(size) |
| return normalized_content_feat * style_std.expand(size) + style_mean.expand(size) |
|
|
| def calc_mean_std(feat, eps=1e-5): |
| |
| size = feat.size() |
| assert (len(size) == 4) |
| batch_size, channels = size[:2] |
| feat_mean = feat.view(batch_size, channels, -1).mean(dim=2).view(batch_size, channels, 1, 1) |
| feat_var = feat.view(batch_size, channels, -1).var(dim=2, unbiased=False) + eps |
| feat_std = feat_var.sqrt().view(batch_size, channels, 1, 1) |
| return feat_mean, feat_std |