## 主要更新 - ✨ 更新所有依赖到最新稳定版本 - 📝 添加详细的项目文档和模型推荐 - 🔧 配置 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
138 lines
4.2 KiB
Python
138 lines
4.2 KiB
Python
import os
|
|
|
|
from iopaint.tests.utils import current_dir, check_device
|
|
|
|
os.environ["PYTORCH_ENABLE_MPS_FALLBACK"] = "1"
|
|
|
|
import pytest
|
|
import torch
|
|
|
|
from iopaint.model_manager import ModelManager
|
|
from iopaint.schema import SDSampler
|
|
from iopaint.tests.test_model import get_config, assert_equal
|
|
|
|
|
|
@pytest.mark.parametrize("name", ["runwayml/stable-diffusion-inpainting"])
|
|
@pytest.mark.parametrize("device", ["cuda", "mps"])
|
|
@pytest.mark.parametrize(
|
|
"rect",
|
|
[
|
|
[0, -100, 512, 512 - 128 + 100],
|
|
[0, 128, 512, 512 - 128 + 100],
|
|
[128, 0, 512 - 128 + 100, 512],
|
|
[-100, 0, 512 - 128 + 100, 512],
|
|
[0, 0, 512, 512 + 200],
|
|
[256, 0, 512 + 200, 512],
|
|
[-100, -100, 512 + 200, 512 + 200],
|
|
],
|
|
)
|
|
def test_outpainting(name, device, rect):
|
|
sd_steps = check_device(device)
|
|
|
|
model = ModelManager(
|
|
name=name,
|
|
device=torch.device(device),
|
|
disable_nsfw=True,
|
|
sd_cpu_textencoder=False,
|
|
)
|
|
cfg = get_config(
|
|
prompt="a dog sitting on a bench in the park",
|
|
sd_steps=sd_steps,
|
|
use_extender=True,
|
|
extender_x=rect[0],
|
|
extender_y=rect[1],
|
|
extender_width=rect[2],
|
|
extender_height=rect[3],
|
|
sd_guidance_scale=8.0,
|
|
sd_sampler=SDSampler.dpm_plus_plus_2m,
|
|
)
|
|
|
|
assert_equal(
|
|
model,
|
|
cfg,
|
|
f"{name.replace('/', '--')}_outpainting_{'_'.join(map(str, rect))}_device_{device}.png",
|
|
img_p=current_dir / "overture-creations-5sI6fQgYIuo.png",
|
|
mask_p=current_dir / "overture-creations-5sI6fQgYIuo_mask.png",
|
|
)
|
|
|
|
|
|
@pytest.mark.parametrize("name", ["kandinsky-community/kandinsky-2-2-decoder-inpaint"])
|
|
@pytest.mark.parametrize("device", ["cuda", "mps"])
|
|
@pytest.mark.parametrize(
|
|
"rect",
|
|
[
|
|
[-128, -128, 768, 768],
|
|
],
|
|
)
|
|
def test_kandinsky_outpainting(name, device, rect):
|
|
sd_steps = check_device(device)
|
|
|
|
model = ModelManager(
|
|
name=name,
|
|
device=torch.device(device),
|
|
disable_nsfw=True,
|
|
sd_cpu_textencoder=False,
|
|
)
|
|
cfg = get_config(
|
|
prompt="a cat",
|
|
negative_prompt="lowres, text, error, cropped, worst quality, low quality, jpeg artifacts, ugly, duplicate, morbid, mutilated, out of frame, extra fingers, mutated hands, poorly drawn hands, poorly drawn face, mutation, deformed, blurry, dehydrated, bad anatomy, bad proportions, extra limbs, cloned face, disfigured, gross proportions, malformed limbs, missing arms, missing legs, extra arms, extra legs, fused fingers, too many fingers, long neck, username, watermark, signature",
|
|
sd_steps=sd_steps,
|
|
use_extender=True,
|
|
extender_x=rect[0],
|
|
extender_y=rect[1],
|
|
extender_width=rect[2],
|
|
extender_height=rect[3],
|
|
sd_guidance_scale=7,
|
|
sd_sampler=SDSampler.dpm_plus_plus_2m,
|
|
)
|
|
|
|
assert_equal(
|
|
model,
|
|
cfg,
|
|
f"{name.replace('/', '--')}_outpainting_{'_'.join(map(str, rect))}_device_{device}.png",
|
|
img_p=current_dir / "cat.png",
|
|
mask_p=current_dir / "overture-creations-5sI6fQgYIuo_mask.png",
|
|
fx=1,
|
|
fy=1,
|
|
)
|
|
|
|
|
|
@pytest.mark.parametrize("name", ["Sanster/PowerPaint-V1-stable-diffusion-inpainting"])
|
|
@pytest.mark.parametrize("device", ["cuda", "mps"])
|
|
@pytest.mark.parametrize(
|
|
"rect",
|
|
[
|
|
[-100, -100, 512 + 200, 512 + 200],
|
|
],
|
|
)
|
|
def test_powerpaint_outpainting(name, device, rect):
|
|
sd_steps = check_device(device)
|
|
|
|
model = ModelManager(
|
|
name=name,
|
|
device=torch.device(device),
|
|
disable_nsfw=True,
|
|
sd_cpu_textencoder=False,
|
|
low_mem=True,
|
|
)
|
|
cfg = get_config(
|
|
prompt="a dog sitting on a bench in the park",
|
|
sd_steps=sd_steps,
|
|
use_extender=True,
|
|
extender_x=rect[0],
|
|
extender_y=rect[1],
|
|
extender_width=rect[2],
|
|
extender_height=rect[3],
|
|
sd_guidance_scale=8.0,
|
|
sd_sampler=SDSampler.dpm_plus_plus_2m,
|
|
powerpaint_task="outpainting",
|
|
)
|
|
|
|
assert_equal(
|
|
model,
|
|
cfg,
|
|
f"{name.replace('/', '--')}_outpainting_{'_'.join(map(str, rect))}_device_{device}.png",
|
|
img_p=current_dir / "overture-creations-5sI6fQgYIuo.png",
|
|
mask_p=current_dir / "overture-creations-5sI6fQgYIuo_mask.png",
|
|
)
|