NST / utils /utils.py
Ayush5605's picture
Upload 6 files
c4c27d1 verified
Raw History Blame Contribute Delete
2.25 kB
from torch.utils.data import Dataset
import os
from PIL import Image, ImageFile
from torchvision import transforms
ImageFile.LOAD_TRUNCATED_IMAGES=False
class ImageFolderDataset(Dataset):
def __init__(self, root: str, transform=None):
super().__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 = []
transform_list.append(
transforms.Resize((final_size, final_size))
)
transform_list.append(
transforms.ToTensor()
)
return transforms.Compose(transform_list)
def adaptive_instance_normalization(content_feat, style_feat):
# content_feat: (batch_size, channels, height, width)
# style_feat: (batch_size, channels, height, width)
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):
# feat: (batch_size, channels, height, width)
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