Spaces:
Running
Running
import torch | |
import numpy as np | |
from PIL import Image | |
from typing import Union, List | |
# Utility functions from mtb nodes: https://github.com/melMass/comfy_mtb | |
def pil2tensor(image: Union[Image.Image, List[Image.Image]]) -> torch.Tensor: | |
if isinstance(image, list): | |
return torch.cat([pil2tensor(img) for img in image], dim=0) | |
return torch.from_numpy(np.array(image).astype(np.float32) / 255.0).unsqueeze(0) | |
def np2tensor(img_np: Union[np.ndarray, List[np.ndarray]]) -> torch.Tensor: | |
if isinstance(img_np, list): | |
return torch.cat([np2tensor(img) for img in img_np], dim=0) | |
return torch.from_numpy(img_np.astype(np.float32) / 255.0).unsqueeze(0) | |
def tensor2np(tensor: torch.Tensor): | |
if len(tensor.shape) == 3: # Single image | |
return np.clip(255.0 * tensor.cpu().numpy(), 0, 255).astype(np.uint8) | |
else: # Batch of images | |
return [np.clip(255.0 * t.cpu().numpy(), 0, 255).astype(np.uint8) for t in tensor] | |
def tensor2pil(image: torch.Tensor) -> List[Image.Image]: | |
batch_count = image.size(0) if len(image.shape) > 3 else 1 | |
if batch_count > 1: | |
out = [] | |
for i in range(batch_count): | |
out.extend(tensor2pil(image[i])) | |
return out | |
return [ | |
Image.fromarray( | |
np.clip(255.0 * image.cpu().numpy().squeeze(), 0, 255).astype(np.uint8) | |
) | |
] |