import os from PIL import Image from torch.utils.data import Dataset from torchvision import transforms class ImageDataset(Dataset): def __init__(self, root, transform=None): super(ImageDataset, self).__init__() self.root = root self.transform = transform self.files = list(os.listdir(root)) self.files = [f for f in self.files if f.endswith(('.jpg', '.jpeg', '.png'))] def __len__(self): return len(self.files) def __getitem__(self, idx): img_path = os.path.join(self.root, self.files[idx]) image = Image.open(img_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(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_feat = (content_feat - content_mean) / content_std.expand(size) return normalized_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_var = feat.view(batch_size, channels, -1).var(dim=2) + eps feat_std = feat_var.sqrt().view(batch_size, channels, 1, 1) feat_mean = feat.view(batch_size, channels, -1).mean(dim=2).view(batch_size, channels, 1, 1) return feat_mean, feat_std