|
import torch |
|
import PIL |
|
import cv2 |
|
from PIL import Image |
|
import numpy as np |
|
|
|
from iopaint.helper import pad_img_to_modulo |
|
|
|
|
|
def make_canny_control_image(image: np.ndarray) -> Image: |
|
canny_image = cv2.Canny(image, 100, 200) |
|
canny_image = canny_image[:, :, None] |
|
canny_image = np.concatenate([canny_image, canny_image, canny_image], axis=2) |
|
canny_image = PIL.Image.fromarray(canny_image) |
|
control_image = canny_image |
|
return control_image |
|
|
|
|
|
def make_openpose_control_image(image: np.ndarray) -> Image: |
|
from controlnet_aux import OpenposeDetector |
|
|
|
processor = OpenposeDetector.from_pretrained("lllyasviel/ControlNet") |
|
control_image = processor(image, hand_and_face=True) |
|
return control_image |
|
|
|
|
|
def resize_image(input_image, resolution): |
|
H, W, C = input_image.shape |
|
H = float(H) |
|
W = float(W) |
|
k = float(resolution) / min(H, W) |
|
H *= k |
|
W *= k |
|
H = int(np.round(H / 64.0)) * 64 |
|
W = int(np.round(W / 64.0)) * 64 |
|
img = cv2.resize( |
|
input_image, |
|
(W, H), |
|
interpolation=cv2.INTER_LANCZOS4 if k > 1 else cv2.INTER_AREA, |
|
) |
|
return img |
|
|
|
|
|
def make_depth_control_image(image: np.ndarray) -> Image: |
|
from controlnet_aux import MidasDetector |
|
|
|
midas = MidasDetector.from_pretrained("lllyasviel/Annotators") |
|
|
|
origin_height, origin_width = image.shape[:2] |
|
pad_image = pad_img_to_modulo(image, mod=64, square=False, min_size=512) |
|
depth_image = midas(pad_image) |
|
depth_image = depth_image[0:origin_height, 0:origin_width] |
|
depth_image = depth_image[:, :, None] |
|
depth_image = np.concatenate([depth_image, depth_image, depth_image], axis=2) |
|
control_image = PIL.Image.fromarray(depth_image) |
|
return control_image |
|
|
|
|
|
def make_inpaint_control_image(image: np.ndarray, mask: np.ndarray) -> torch.Tensor: |
|
""" |
|
image: [H, W, C] RGB |
|
mask: [H, W, 1] 255 means area to repaint |
|
""" |
|
image = image.astype(np.float32) / 255.0 |
|
image[mask[:, :, -1] > 128] = -1.0 |
|
image = np.expand_dims(image, 0).transpose(0, 3, 1, 2) |
|
image = torch.from_numpy(image) |
|
return image |
|
|