Buckets:

Pranav2748's picture
download
raw
3.77 kB
import os
from os import PathLike
from pathlib import Path
import datasets
import torch
import torchvision
from PIL import Image
from torch.utils import data
from torchmetrics.image import LearnedPerceptualImagePatchSimilarity
from tqdm import tqdm
def hash_str_to_int(s: str) -> int:
"""Hash a string to an integer."""
modulus = 10**9 + 7 # Large prime modulus
hash_int = 0
for char in s:
hash_int = (hash_int * 31 + ord(char)) % modulus
return hash_int
def already_generate(save_dir: str | PathLike[str], num_images: int | None = None) -> bool:
if isinstance(save_dir, str):
save_dir = Path(save_dir)
assert isinstance(save_dir, Path)
if save_dir.exists():
if num_images is None:
return True
images = list(save_dir.iterdir())
images = [_ for _ in images if _.name.endswith(".png")]
if len(images) >= num_images:
return True
return False
class MultiImageDataset(data.Dataset):
def __init__(self, gen_dirpath_or_image_path: str, ref_dirpath_or_image_path: str | datasets.Dataset):
super(data.Dataset, self).__init__()
if os.path.isdir(gen_dirpath_or_image_path):
self.gen_names = sorted(
[
name
for name in os.listdir(gen_dirpath_or_image_path)
if name.endswith(".png") or name.endswith(".jpg")
]
)
self.gen_dirpath = gen_dirpath_or_image_path
else:
self.gen_names = [os.path.basename(gen_dirpath_or_image_path)]
self.gen_dirpath = os.path.dirname(gen_dirpath_or_image_path)
if os.path.isdir(ref_dirpath_or_image_path):
self.ref_names = sorted(
[
name
for name in os.listdir(ref_dirpath_or_image_path)
if name.endswith(".png") or name.endswith(".jpg")
]
)
self.ref_dirpath = ref_dirpath_or_image_path
else:
self.ref_names = [os.path.basename(ref_dirpath_or_image_path)]
self.ref_dirpath = os.path.dirname(ref_dirpath_or_image_path)
assert len(self.ref_names) == len(self.gen_names)
self.transform = torchvision.transforms.ToTensor()
def __len__(self):
return len(self.ref_names)
def __getitem__(self, idx: int):
ref_image = Image.open(os.path.join(self.ref_dirpath, self.ref_names[idx])).convert("RGB")
gen_image = Image.open(os.path.join(self.gen_dirpath, self.gen_names[idx])).convert("RGB")
gen_size = gen_image.size
ref_size = ref_image.size
if ref_size != gen_size:
ref_image = ref_image.resize(gen_size, Image.Resampling.BICUBIC)
gen_tensor = self.transform(gen_image)
ref_tensor = self.transform(ref_image)
return [gen_tensor, ref_tensor]
def compute_lpips(
ref_dirpath_or_image_path: str,
gen_dirpath_or_image_path: str,
batch_size: int = 4,
num_workers: int = 0,
device: str | torch.device = "cuda",
) -> float:
os.environ["TOKENIZERS_PARALLELISM"] = "false"
metric = LearnedPerceptualImagePatchSimilarity(normalize=True).to(device)
dataset = MultiImageDataset(gen_dirpath_or_image_path, ref_dirpath_or_image_path)
dataloader = data.DataLoader(
dataset, batch_size=batch_size, num_workers=num_workers, shuffle=False, drop_last=False
)
with torch.no_grad():
desc = (os.path.basename(gen_dirpath_or_image_path)) + " LPIPS"
for i, batch in enumerate(tqdm(dataloader, desc=desc)):
batch = [tensor.to(device) for tensor in batch]
metric.update(batch[0], batch[1])
return metric.compute().item()

Xet Storage Details

Size:
3.77 kB
·
Xet hash:
c0262922475e21330e1f4da62c764852de58001211a641bd4656e07cd6f9c69f

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.