| | from typing import List, Dict |
| | import random |
| | import math |
| |
|
| | import numpy as np |
| | from PIL import Image |
| | import cv2 |
| |
|
| |
|
| | def load_file_list(file_list_path: str) -> List[Dict[str, str]]: |
| | files = [] |
| | with open(file_list_path, "r") as fin: |
| | for line in fin: |
| | path = line.strip() |
| | if path: |
| | files.append({"image_path": path, "prompt": ""}) |
| | return files |
| |
|
| |
|
| | |
| | def center_crop_arr(pil_image, image_size): |
| | |
| | |
| | |
| | while min(*pil_image.size) >= 2 * image_size: |
| | pil_image = pil_image.resize( |
| | tuple(x // 2 for x in pil_image.size), resample=Image.BOX |
| | ) |
| |
|
| | scale = image_size / min(*pil_image.size) |
| | pil_image = pil_image.resize( |
| | tuple(round(x * scale) for x in pil_image.size), resample=Image.BICUBIC |
| | ) |
| |
|
| | arr = np.array(pil_image) |
| | crop_y = (arr.shape[0] - image_size) // 2 |
| | crop_x = (arr.shape[1] - image_size) // 2 |
| | return arr[crop_y : crop_y + image_size, crop_x : crop_x + image_size] |
| |
|
| |
|
| | |
| | def random_crop_arr(pil_image, image_size, min_crop_frac=0.8, max_crop_frac=1.0): |
| | min_smaller_dim_size = math.ceil(image_size / max_crop_frac) |
| | max_smaller_dim_size = math.ceil(image_size / min_crop_frac) |
| | smaller_dim_size = random.randrange(min_smaller_dim_size, max_smaller_dim_size + 1) |
| |
|
| | |
| | |
| | |
| | while min(*pil_image.size) >= 2 * smaller_dim_size: |
| | pil_image = pil_image.resize( |
| | tuple(x // 2 for x in pil_image.size), resample=Image.BOX |
| | ) |
| |
|
| | scale = smaller_dim_size / min(*pil_image.size) |
| | pil_image = pil_image.resize( |
| | tuple(round(x * scale) for x in pil_image.size), resample=Image.BICUBIC |
| | ) |
| |
|
| | arr = np.array(pil_image) |
| | crop_y = random.randrange(arr.shape[0] - image_size + 1) |
| | crop_x = random.randrange(arr.shape[1] - image_size + 1) |
| | return arr[crop_y : crop_y + image_size, crop_x : crop_x + image_size] |
| |
|