Spaces:
Running
on
Zero
Running
on
Zero
| import uuid | |
| import os | |
| import PIL.Image as Image | |
| import torch | |
| import numpy as np | |
| from torchvision import transforms | |
| import torch.nn.functional as F | |
| import torchvision | |
| def make_unique_experiment_path(base_dir: str) -> str: | |
| """ | |
| Create a unique directory in the base directory, named as the least unused number. | |
| return: path to the unique directory | |
| """ | |
| if not os.path.exists(base_dir): | |
| os.makedirs(base_dir) | |
| # List all existing directories | |
| existing_dirs = [ | |
| d for d in os.listdir(base_dir) if os.path.isdir(os.path.join(base_dir, d)) | |
| ] | |
| # Convert directory names to integers, filter out non-numeric names | |
| existing_numbers = sorted([int(d) for d in existing_dirs if d.isdigit()]) | |
| # Find the least unused number | |
| experiment_id = 1 | |
| for number in existing_numbers: | |
| if number != experiment_id: | |
| break | |
| experiment_id += 1 | |
| # Create the new directory | |
| experiment_output_path = os.path.join(base_dir, str(experiment_id)) | |
| os.makedirs(experiment_output_path) | |
| return experiment_output_path | |
| def get_processed_image(image_dir: str, device, resolution) -> torch.Tensor: | |
| src_img = Image.open(image_dir) | |
| src_img = transforms.ToTensor()(src_img).unsqueeze(0).to(device) | |
| h, w = src_img.shape[-2:] | |
| src_img_512 = torchvision.transforms.functional.pad( | |
| src_img, ((resolution - w) // 2,), fill=0, padding_mode="constant" | |
| ) | |
| input_image = F.interpolate( | |
| src_img, (resolution, resolution), mode="bilinear", align_corners=False | |
| ) | |
| # drop alpha channel if it exists | |
| if input_image.shape[1] == 4: | |
| input_image = input_image[:, :3] | |
| return input_image | |
| def process_image(image, device, resolution) -> torch.Tensor: | |
| if isinstance(image, np.ndarray): | |
| image = Image.fromarray(image) | |
| src_img = image | |
| src_img = transforms.ToTensor()(src_img).unsqueeze(0).to(device) | |
| h, w = src_img.shape[-2:] | |
| src_img_512 = torchvision.transforms.functional.pad( | |
| src_img, ((resolution - w) // 2,), fill=0, padding_mode="constant" | |
| ) | |
| input_image = F.interpolate( | |
| src_img, (resolution, resolution), mode="bilinear", align_corners=False | |
| ) | |
| # drop alpha channel if it exists | |
| if input_image.shape[1] == 4: | |
| input_image = input_image[:, :3] | |
| return input_image | |
| def seed_all(seed: int): | |
| torch.manual_seed(seed) | |
| np.random.seed(seed) | |
| torch.cuda.manual_seed(seed) | |
| torch.cuda.manual_seed_all(seed) | |
| torch.backends.cudnn.deterministic = True | |
| torch.backends.cudnn.benchmark = False | |
| g_cpu = torch.Generator(device="cpu") | |
| g_cpu.manual_seed(42) | |
| def dump_tensor(tensor, filename): | |
| with open(filename) as f: | |
| torch.save(tensor, f) | |