## 主要更新 - ✨ 更新所有依赖到最新稳定版本 - 📝 添加详细的项目文档和模型推荐 - 🔧 配置 VSCode Cloud Studio 预览功能 - 🐛 修复 PyTorch API 弃用警告 ## 依赖更新 - diffusers: 0.27.2 → 0.35.2 - gradio: 4.21.0 → 5.46.0 - peft: 0.7.1 → 0.18.0 - Pillow: 9.5.0 → 11.3.0 - fastapi: 0.108.0 → 0.116.2 ## 新增文件 - CLAUDE.md - 项目架构和开发指南 - UPGRADE_NOTES.md - 详细的升级说明 - .vscode/preview.yml - 预览配置 - .vscode/LAUNCH_GUIDE.md - 启动指南 - .gitignore - 更新的忽略规则 ## 代码修复 - 修复 iopaint/model/ldm.py 中的 torch.cuda.amp.autocast() 弃用警告 ## 文档更新 - README.md - 添加模型推荐和使用指南 - 完整的项目源码(iopaint/) - Web 前端源码(web_app/) 🤖 Generated with Claude Code
69 lines
2.1 KiB
Python
69 lines
2.1 KiB
Python
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 # set as masked pixel
|
|
image = np.expand_dims(image, 0).transpose(0, 3, 1, 2)
|
|
image = torch.from_numpy(image)
|
|
return image
|