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) | |