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