StreamingSVD / utils /inference_utils.py
lev1's picture
Initial commit
8fd2f2f
raw
history blame
3.71 kB
from math import ceil, floor
from PIL import Image
import torchvision.transforms as transforms
import numpy as np
pil_to_torch = transforms.Compose([
transforms.PILToTensor()
])
from typing import Tuple
def get_padding_for_aspect_ratio(img: Image.Image, target_aspect_ratio: float = 16/9) -> list[int]:
aspect_ratio = img.width / img.height
if aspect_ratio != target_aspect_ratio:
w_target = ceil(target_aspect_ratio*img.height) # r = w /h = w_i / h_i
h_target = floor(img.width * (1/target_aspect_ratio))
if w_target >= img.width:
w_scale = w_target / img.width
else:
w_scale = np.inf
if h_target >= img.height:
h_scale = h_target / img.height
else:
h_scale = np.inf
if min([h_scale, w_scale]) == h_scale:
scale_axis = 1
target_size = h_target
else:
scale_axis = 0
target_size = w_target
pad_size = [0, 0, 0, 0]
img_size = img.size
pad_size[2+scale_axis] = int(target_size - img_size[scale_axis])
return pad_size
else:
return None
def get_padding_for_aspect_ratio(img: Image, target_aspect_ratio: float = 16/9):
aspect_ratio = img.width / img.height
if aspect_ratio != target_aspect_ratio:
w_target = ceil(target_aspect_ratio*img.height) # r = w /h = w_i / h_i
h_target = floor(img.width * (1/target_aspect_ratio))
if w_target >= img.width:
w_scale = w_target / img.width
else:
w_scale = np.inf
if h_target >= img.height:
h_scale = h_target / img.height
else:
h_scale = np.inf
if min([h_scale, w_scale]) == h_scale:
scale_axis = 1
target_size = h_target
else:
scale_axis = 0
target_size = w_target
pad_size = [0, 0, 0, 0]
img_size = img.size
pad_size[2+scale_axis] = int(target_size - img_size[scale_axis])
return pad_size
else:
return None
def add_margin(pil_img, top, right, bottom, left, color):
width, height = pil_img.size
new_width = width + right + left
new_height = height + top + bottom
result = Image.new(pil_img.mode, (new_width, new_height), color)
result.paste(pil_img, (left, top))
return result
def resize_to_fit(image, size):
W, H = size
w, h = image.size
if H / h > W / w:
H_ = int(h * W / w)
W_ = W
else:
W_ = int(w * H / h)
H_ = H
return image.resize((W_, H_))
def pad_to_fit(image, size):
W, H = size
w, h = image.size
pad_h = (H - h) // 2
pad_w = (W - w) // 2
return add_margin(image, pad_h, pad_w, pad_h, pad_w, (0, 0, 0))
def resize_and_keep(pil_img):
expanded_size = [pil_img.width, pil_img.height]
myheight = 576
hpercent = (myheight/float(pil_img.size[1]))
wsize = int((float(pil_img.size[0])*float(hpercent)))
pil_img = pil_img.resize((wsize, myheight))
return pil_img, expanded_size
def resize_and_crop(pil_img: Image.Image) -> Tuple[Image.Image, Tuple[int, int]]:
img, expanded_size = resize_and_keep(pil_img)
assert img.width >= 1024 and img.height >= 576,f"Got {img.width} and {img.height}"
return img.crop((0, 0, 1024, 576)), expanded_size
def center_crop(pil_img):
width, height = pil_img.size
new_width = 576
new_height = 576
left = (width - new_width)/2
top = (height - new_height)/2
right = (width + new_width)/2
bottom = (height + new_height)/2
# Crop the center of the image
pil_img = pil_img.crop((left, top, right, bottom))
return pil_img