| import torch |
| import numpy as np |
| from PIL import Image |
| from typing import Union, List |
|
|
| |
| 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: |
| return np.clip(255.0 * tensor.cpu().numpy(), 0, 255).astype(np.uint8) |
| else: |
| 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) |
| ) |
| ] |