From 1905743886494e3e271bade0b91e45239e613fa2 Mon Sep 17 00:00:00 2001 From: Qing Date: Sun, 21 Jan 2024 23:25:50 +0800 Subject: [PATCH] add AnyText --- README.md | 72 ++++- iopaint/const.py | 1 + iopaint/download.py | 6 + iopaint/model/__init__.py | 2 + iopaint/model/anytext/anytext_model.py | 73 +++++ iopaint/model/anytext/anytext_pipeline.py | 248 ++++++++--------- iopaint/model/anytext/anytext_sd15.yaml | 2 +- iopaint/model/anytext/cldm/ddim_hacked.py | 2 +- iopaint/model/anytext/cldm/model.py | 10 +- .../anytext/ldm/modules/encoders/modules.py | 249 ++++++++++-------- iopaint/model/anytext/main.py | 63 ++--- iopaint/model_info.py | 4 +- iopaint/tests/anytext_mask.jpg | Bin 0 -> 6860 bytes iopaint/tests/anytext_ref.jpg | Bin 0 -> 105967 bytes iopaint/tests/test_anytext.py | 45 ++++ .../components/SidePanel/DiffusionOptions.tsx | 11 +- web_app/src/lib/const.ts | 1 + 17 files changed, 513 insertions(+), 276 deletions(-) create mode 100644 iopaint/tests/anytext_mask.jpg create mode 100644 iopaint/tests/anytext_ref.jpg create mode 100644 iopaint/tests/test_anytext.py diff --git a/README.md b/README.md index b4f7833..2aae936 100644 --- a/README.md +++ b/README.md @@ -1 +1,71 @@ -# IOPaint \ No newline at end of file +

IOPaint

+

A free and open-source inpainting & outpainting tool powered by SOTA AI model.

+ +

+ + total download + + + version + + + python version + +

+ +## Quick Start + +IOPaint provides an easy-to-use webui for utilizing the latest AI models. The installation process for IOPaint is also simple, requiring just two commands: + +```bash +# In order to use GPU, install cuda version of pytorch first. +# pip3 install torch==2.1.2 torchvision==0.16.2 --index-url https://download.pytorch.org/whl/cu118 +pip3 install iopaint +iopaint start --model=lama --device=cpu --port=8080 +``` + +That's it, you can start using IOPaint by visiting http://localhost:8080 in your web browser. + +You can also use IOPaint in the command line to batch process images: + +```bash +iopaint run --model=lama --device=cpu \ +--input=/path/to/image_folder \ +--mask=/path/to/mask_folder \ +--output=output_dir +``` + +`--input` is the folder containing input images, `--mask` is the folder containing corresponding mask images. +When `--mask` is a path to a mask file, all images will be processed using this mask. + +You can see more information about the models and plugins supported by IOPaint below. + +## Features + +- Completely free and open-source, fully self-hosted, support CPU & GPU & M1/2 +- Supports various AI models: + - Inpainting models: These models are usually used to remove people or objects from images. + - Stable Diffusion models: These models have stronger generation abilities, allowing them to generate new objects on images, or to expand existing images. +You can use any Stable Diffusion Inpainting(or normal) models from [Huggingface](https://huggingface.co/models?other=stable-diffusion) in IOPaint. +Some commonly used models are listed below: + - [runwayml/stable-diffusion-inpainting](https://huggingface.co/runwayml/stable-diffusion-inpainting) + - [diffusers/stable-diffusion-xl-1.0-inpainting-0.1](https://huggingface.co/diffusers/stable-diffusion-xl-1.0-inpainting-0.1) + - [andregn/Realistic_Vision_V3.0-inpainting](https://huggingface.co/andregn/Realistic_Vision_V3.0-inpainting) + - [Lykon/dreamshaper-8-inpainting](https://huggingface.co/Lykon/dreamshaper-8-inpainting) + - [Sanster/anything-4.0-inpainting](https://huggingface.co/Sanster/anything-4.0-inpainting) + - [Sanster/PowerPaint-V1-stable-diffusion-inpainting](https://huggingface.co/Sanster/PowerPaint-V1-stable-diffusion-inpainting) + - Other Diffusion models: + - [Sanster/AnyText](https://huggingface.co/Sanster/AnyText): Generate text on images + - [timbrooks/instruct-pix2pix](https://huggingface.co/timbrooks/instruct-pix2pix) + - [Fantasy-Studio/Paint-by-Example](https://huggingface.co/Fantasy-Studio/Paint-by-Example): Generate images from text + - [kandinsky-community/kandinsky-2-2-decoder-inpaint](https://huggingface.co/kandinsky-community/kandinsky-2-2-decoder-inpaint) +- [Plugins](https://iopaint.com/plugins) for post-processing: + - [Segment Anything](https://iopaint.com/plugins/interactive_seg): Accurate and fast interactive object segmentation + - [RemoveBG](https://iopaint.com/plugins/rembg): Remove image background or generate masks for foreground objects + - [Anime Segmentation](https://iopaint.com/plugins/anime_seg): Similar to RemoveBG, the model is specifically trained for anime images. + - [RealESRGAN](https://iopaint.com/plugins/RealESRGAN): Super Resolution + - [GFPGAN](https://iopaint.com/plugins/GFPGAN): Face Restoration + - [RestoreFormer](https://iopaint.com/plugins/RestoreFormer): Face Restoration +- [FileManager](https://iopaint.com/features/file_manager): Browse your pictures conveniently and save them directly to the output directory. +- [Native macOS app](https://opticlean.io/) for erase task +- More features at [IOPaint Docs](https://iopaint.com/) diff --git a/iopaint/const.py b/iopaint/const.py index 11b1241..f2e04fe 100644 --- a/iopaint/const.py +++ b/iopaint/const.py @@ -6,6 +6,7 @@ from pydantic import BaseModel INSTRUCT_PIX2PIX_NAME = "timbrooks/instruct-pix2pix" KANDINSKY22_NAME = "kandinsky-community/kandinsky-2-2-decoder-inpaint" POWERPAINT_NAME = "Sanster/PowerPaint-V1-stable-diffusion-inpainting" +ANYTEXT_NAME = "Sanster/AnyText" DIFFUSERS_SD_CLASS_NAME = "StableDiffusionPipeline" diff --git a/iopaint/download.py b/iopaint/download.py index 2f7ceef..5253206 100644 --- a/iopaint/download.py +++ b/iopaint/download.py @@ -12,6 +12,7 @@ from iopaint.const import ( DIFFUSERS_SD_INPAINT_CLASS_NAME, DIFFUSERS_SDXL_CLASS_NAME, DIFFUSERS_SDXL_INPAINT_CLASS_NAME, + ANYTEXT_NAME, ) from iopaint.model_info import ModelInfo, ModelType @@ -24,6 +25,10 @@ def cli_download_model(model: str): logger.info(f"Downloading {model}...") models[model].download() logger.info(f"Done.") + elif model == ANYTEXT_NAME: + logger.info(f"Downloading {model}...") + models[model].download() + logger.info(f"Done.") else: logger.info(f"Downloading model from Huggingface: {model}") from diffusers import DiffusionPipeline @@ -210,6 +215,7 @@ def scan_models() -> List[ModelInfo]: "StableDiffusionInstructPix2PixPipeline", "PaintByExamplePipeline", "KandinskyV22InpaintPipeline", + "AnyText", ]: model_type = ModelType.DIFFUSERS_OTHER else: diff --git a/iopaint/model/__init__.py b/iopaint/model/__init__.py index 473cb99..799e2ec 100644 --- a/iopaint/model/__init__.py +++ b/iopaint/model/__init__.py @@ -1,3 +1,4 @@ +from .anytext.anytext_model import AnyText from .controlnet import ControlNet from .fcf import FcF from .instruct_pix2pix import InstructPix2Pix @@ -32,4 +33,5 @@ models = { Kandinsky22.name: Kandinsky22, SDXL.name: SDXL, PowerPaint.name: PowerPaint, + AnyText.name: AnyText, } diff --git a/iopaint/model/anytext/anytext_model.py b/iopaint/model/anytext/anytext_model.py index e69de29..374669e 100644 --- a/iopaint/model/anytext/anytext_model.py +++ b/iopaint/model/anytext/anytext_model.py @@ -0,0 +1,73 @@ +import torch +from huggingface_hub import hf_hub_download + +from iopaint.const import ANYTEXT_NAME +from iopaint.model.anytext.anytext_pipeline import AnyTextPipeline +from iopaint.model.base import DiffusionInpaintModel +from iopaint.model.utils import get_torch_dtype, is_local_files_only +from iopaint.schema import InpaintRequest + + +class AnyText(DiffusionInpaintModel): + name = ANYTEXT_NAME + pad_mod = 64 + is_erase_model = False + + @staticmethod + def download(local_files_only=False): + hf_hub_download( + repo_id=ANYTEXT_NAME, + filename="model_index.json", + local_files_only=local_files_only, + ) + ckpt_path = hf_hub_download( + repo_id=ANYTEXT_NAME, + filename="pytorch_model.fp16.safetensors", + local_files_only=local_files_only, + ) + font_path = hf_hub_download( + repo_id=ANYTEXT_NAME, + filename="SourceHanSansSC-Medium.otf", + local_files_only=local_files_only, + ) + return ckpt_path, font_path + + def init_model(self, device, **kwargs): + local_files_only = is_local_files_only(**kwargs) + ckpt_path, font_path = self.download(local_files_only) + use_gpu, torch_dtype = get_torch_dtype(device, kwargs.get("no_half", False)) + self.model = AnyTextPipeline( + ckpt_path=ckpt_path, + font_path=font_path, + device=device, + use_fp16=torch_dtype == torch.float16, + ) + self.callback = kwargs.pop("callback", None) + + def forward(self, image, mask, config: InpaintRequest): + """Input image and output image have same size + image: [H, W, C] RGB + mask: [H, W, 1] 255 means area to inpainting + return: BGR IMAGE + """ + height, width = image.shape[:2] + mask = mask.astype("float32") / 255.0 + masked_image = image * (1 - mask) + + # list of rgb ndarray + results, rtn_code, rtn_warning = self.model( + image=image, + masked_image=masked_image, + prompt=config.prompt, + negative_prompt=config.negative_prompt, + num_inference_steps=config.sd_steps, + strength=config.sd_strength, + guidance_scale=config.sd_guidance_scale, + height=height, + width=width, + seed=config.sd_seed, + sort_priority="y", + callback=self.callback + ) + inpainted_rgb_image = results[0][..., ::-1] + return inpainted_rgb_image diff --git a/iopaint/model/anytext/anytext_pipeline.py b/iopaint/model/anytext/anytext_pipeline.py index 9e82fe0..5051272 100644 --- a/iopaint/model/anytext/anytext_pipeline.py +++ b/iopaint/model/anytext/anytext_pipeline.py @@ -5,20 +5,21 @@ Code: https://github.com/tyxsspa/AnyText Copyright (c) Alibaba, Inc. and its affiliates. """ import os +from pathlib import Path + +from iopaint.model.utils import set_seed +from safetensors.torch import load_file os.environ["TF_CPP_MIN_LOG_LEVEL"] = "3" import torch -import random import re import numpy as np import cv2 import einops -import time from PIL import ImageFont from iopaint.model.anytext.cldm.model import create_model, load_state_dict from iopaint.model.anytext.cldm.ddim_hacked import DDIMSampler from iopaint.model.anytext.utils import ( - resize_image, check_channels, draw_glyph, draw_glyph2, @@ -29,55 +30,93 @@ BBOX_MAX_NUM = 8 PLACE_HOLDER = "*" max_chars = 20 +ANYTEXT_CFG = os.path.join( + os.path.dirname(os.path.abspath(__file__)), "anytext_sd15.yaml" +) + + +def check_limits(tensor): + float16_min = torch.finfo(torch.float16).min + float16_max = torch.finfo(torch.float16).max + + # 检查张量中是否有值小于float16的最小值或大于float16的最大值 + is_below_min = (tensor < float16_min).any() + is_above_max = (tensor > float16_max).any() + + return is_below_min or is_above_max + class AnyTextPipeline: - def __init__(self, cfg_path, model_dir, font_path, device, use_fp16=True): - self.cfg_path = cfg_path - self.model_dir = model_dir + def __init__(self, ckpt_path, font_path, device, use_fp16=True): + self.cfg_path = ANYTEXT_CFG self.font_path = font_path self.use_fp16 = use_fp16 self.device = device - self.init_model() - """ - return: - result: list of images in numpy.ndarray format - rst_code: 0: normal -1: error 1:warning - rst_info: string of error or warning - debug_info: string for debug, only valid if show_debug=True - """ + self.font = ImageFont.truetype(font_path, size=60) + self.model = create_model( + self.cfg_path, + device=self.device, + use_fp16=self.use_fp16, + ) + if self.use_fp16: + self.model = self.model.half() + if Path(ckpt_path).suffix == ".safetensors": + state_dict = load_file(ckpt_path, device="cpu") + else: + state_dict = load_state_dict(ckpt_path, location="cpu") + self.model.load_state_dict(state_dict, strict=False) + self.model = self.model.eval().to(self.device) + self.ddim_sampler = DDIMSampler(self.model, device=self.device) - def __call__(self, input_tensor, **forward_params): - tic = time.time() + def __call__( + self, + prompt: str, + negative_prompt: str, + image: np.ndarray, + masked_image: np.ndarray, + num_inference_steps: int, + strength: float, + guidance_scale: float, + height: int, + width: int, + seed: int, + sort_priority: str = "y", + callback=None, + ): + """ + + Args: + prompt: + negative_prompt: + image: + masked_image: + num_inference_steps: + strength: + guidance_scale: + height: + width: + seed: + sort_priority: x: left-right, y: top-down + + Returns: + result: list of images in numpy.ndarray format + rst_code: 0: normal -1: error 1:warning + rst_info: string of error or warning + + """ + set_seed(seed) str_warning = "" - # get inputs - seed = input_tensor.get("seed", -1) - if seed == -1: - seed = random.randint(0, 99999999) - # seed_everything(seed) - prompt = input_tensor.get("prompt") - draw_pos = input_tensor.get("draw_pos") - ori_image = input_tensor.get("ori_image") - mode = forward_params.get("mode") - sort_priority = forward_params.get("sort_priority", "↕") - show_debug = forward_params.get("show_debug", False) - revise_pos = forward_params.get("revise_pos", False) - img_count = forward_params.get("image_count", 4) - ddim_steps = forward_params.get("ddim_steps", 20) - w = forward_params.get("image_width", 512) - h = forward_params.get("image_height", 512) - strength = forward_params.get("strength", 1.0) - cfg_scale = forward_params.get("cfg_scale", 9.0) - eta = forward_params.get("eta", 0.0) - a_prompt = forward_params.get( - "a_prompt", - "best quality, extremely detailed,4k, HD, supper legible text, clear text edges, clear strokes, neat writing, no watermarks", - ) - n_prompt = forward_params.get( - "n_prompt", - "low-res, bad anatomy, extra digit, fewer digits, cropped, worst quality, low quality, watermark, unreadable text, messy words, distorted text, disorganized writing, advertising picture", - ) + mode = "text-editing" + revise_pos = False + img_count = 1 + ddim_steps = num_inference_steps + w = width + h = height + strength = strength + cfg_scale = guidance_scale + eta = 0.0 prompt, texts = self.modify_prompt(prompt) if prompt is None and texts is None: @@ -91,43 +130,44 @@ class AnyTextPipeline: if mode in ["text-generation", "gen"]: edit_image = np.ones((h, w, 3)) * 127.5 # empty mask image elif mode in ["text-editing", "edit"]: - if draw_pos is None or ori_image is None: + if masked_image is None or image is None: return ( None, -1, "Reference image and position image are needed for text editing!", "", ) - if isinstance(ori_image, str): - ori_image = cv2.imread(ori_image)[..., ::-1] - assert ( - ori_image is not None - ), f"Can't read ori_image image from{ori_image}!" - elif isinstance(ori_image, torch.Tensor): - ori_image = ori_image.cpu().numpy() + if isinstance(image, str): + image = cv2.imread(image)[..., ::-1] + assert image is not None, f"Can't read ori_image image from{image}!" + elif isinstance(image, torch.Tensor): + image = image.cpu().numpy() else: assert isinstance( - ori_image, np.ndarray - ), f"Unknown format of ori_image: {type(ori_image)}" - edit_image = ori_image.clip(1, 255) # for mask reason + image, np.ndarray + ), f"Unknown format of ori_image: {type(image)}" + edit_image = image.clip(1, 255) # for mask reason edit_image = check_channels(edit_image) - edit_image = resize_image( - edit_image, max_length=768 - ) # make w h multiple of 64, resize if w or h > max_length + # edit_image = resize_image( + # edit_image, max_length=768 + # ) # make w h multiple of 64, resize if w or h > max_length h, w = edit_image.shape[:2] # change h, w by input ref_img # preprocess pos_imgs(if numpy, make sure it's white pos in black bg) - if draw_pos is None: + if masked_image is None: pos_imgs = np.zeros((w, h, 1)) - if isinstance(draw_pos, str): - draw_pos = cv2.imread(draw_pos)[..., ::-1] - assert draw_pos is not None, f"Can't read draw_pos image from{draw_pos}!" - pos_imgs = 255 - draw_pos - elif isinstance(draw_pos, torch.Tensor): - pos_imgs = draw_pos.cpu().numpy() + if isinstance(masked_image, str): + masked_image = cv2.imread(masked_image)[..., ::-1] + assert ( + masked_image is not None + ), f"Can't read draw_pos image from{masked_image}!" + pos_imgs = 255 - masked_image + elif isinstance(masked_image, torch.Tensor): + pos_imgs = masked_image.cpu().numpy() else: assert isinstance( - draw_pos, np.ndarray - ), f"Unknown format of draw_pos: {type(draw_pos)}" + masked_image, np.ndarray + ), f"Unknown format of draw_pos: {type(masked_image)}" + pos_imgs = 255 - masked_image pos_imgs = pos_imgs[..., 0:1] pos_imgs = cv2.convertScaleAbs(pos_imgs) _, pos_imgs = cv2.threshold(pos_imgs, 254, 255, cv2.THRESH_BINARY) @@ -139,11 +179,8 @@ class AnyTextPipeline: if n_lines == 1 and texts[0] == " ": pass # text-to-image without text else: - return ( - None, - -1, - f"Found {len(pos_imgs)} positions that < needed {n_lines} from prompt, check and try again!", - "", + raise RuntimeError( + f"{n_lines} text line to draw from prompt, not enough mask area({len(pos_imgs)}) on images" ) elif len(pos_imgs) > n_lines: str_warning = f"Warning: found {len(pos_imgs)} positions that > needed {n_lines} from prompt." @@ -250,12 +287,16 @@ class AnyTextPipeline: cond = self.model.get_learned_conditioning( dict( c_concat=[hint], - c_crossattn=[[prompt + " , " + a_prompt] * img_count], + c_crossattn=[[prompt] * img_count], text_info=info, ) ) un_cond = self.model.get_learned_conditioning( - dict(c_concat=[hint], c_crossattn=[[n_prompt] * img_count], text_info=info) + dict( + c_concat=[hint], + c_crossattn=[[negative_prompt] * img_count], + text_info=info, + ) ) shape = (4, h // 8, w // 8) self.model.control_scales = [strength] * 13 @@ -268,6 +309,7 @@ class AnyTextPipeline: eta=eta, unconditional_guidance_scale=cfg_scale, unconditional_conditioning=un_cond, + callback=callback ) if self.use_fp16: samples = samples.half() @@ -280,52 +322,18 @@ class AnyTextPipeline: .astype(np.uint8) ) results = [x_samples[i] for i in range(img_count)] - if ( - mode == "edit" and False - ): # replace backgound in text editing but not ideal yet - results = [r * np_hint + edit_image * (1 - np_hint) for r in results] - results = [r.clip(0, 255).astype(np.uint8) for r in results] - if len(gly_pos_imgs) > 0 and show_debug: - glyph_bs = np.stack(gly_pos_imgs, axis=2) - glyph_img = np.sum(glyph_bs, axis=2) * 255 - glyph_img = glyph_img.clip(0, 255).astype(np.uint8) - results += [np.repeat(glyph_img, 3, axis=2)] - # debug_info - if not show_debug: - debug_info = "" - else: - input_prompt = prompt - for t in texts: - input_prompt = input_prompt.replace("*", f'"{t}"', 1) - debug_info = f'Prompt: {input_prompt}
\ - Size: {w}x{h}
\ - Image Count: {img_count}
\ - Seed: {seed}
\ - Use FP16: {self.use_fp16}
\ - Cost Time: {(time.time()-tic):.2f}s' + # if ( + # mode == "edit" and False + # ): # replace backgound in text editing but not ideal yet + # results = [r * np_hint + edit_image * (1 - np_hint) for r in results] + # results = [r.clip(0, 255).astype(np.uint8) for r in results] + # if len(gly_pos_imgs) > 0 and show_debug: + # glyph_bs = np.stack(gly_pos_imgs, axis=2) + # glyph_img = np.sum(glyph_bs, axis=2) * 255 + # glyph_img = glyph_img.clip(0, 255).astype(np.uint8) + # results += [np.repeat(glyph_img, 3, axis=2)] rst_code = 1 if str_warning else 0 - return results, rst_code, str_warning, debug_info - - def init_model(self): - font_path = self.font_path - self.font = ImageFont.truetype(font_path, size=60) - cfg_path = self.cfg_path - ckpt_path = os.path.join(self.model_dir, "anytext_v1.1.ckpt") - clip_path = os.path.join(self.model_dir, "clip-vit-large-patch14") - self.model = create_model( - cfg_path, - device=self.device, - cond_stage_path=clip_path, - use_fp16=self.use_fp16, - ) - if self.use_fp16: - self.model = self.model.half() - self.model.load_state_dict( - load_state_dict(ckpt_path, location=self.device), strict=False - ) - self.model.eval() - self.model = self.model.to(self.device) - self.ddim_sampler = DDIMSampler(self.model, device=self.device) + return results, rst_code, str_warning def modify_prompt(self, prompt): prompt = prompt.replace("“", '"') @@ -360,9 +368,9 @@ class AnyTextPipeline: component = np.zeros_like(img) component[labels == label] = 255 components.append((component, centroids[label])) - if sort_priority == "↕": + if sort_priority == "y": fir, sec = 1, 0 # top-down first - elif sort_priority == "↔": + elif sort_priority == "x": fir, sec = 0, 1 # left-right first components.sort(key=lambda c: (c[1][fir] // gap, c[1][sec] // gap)) sorted_components = [c[0] for c in components] diff --git a/iopaint/model/anytext/anytext_sd15.yaml b/iopaint/model/anytext/anytext_sd15.yaml index a017d90..d727594 100644 --- a/iopaint/model/anytext/anytext_sd15.yaml +++ b/iopaint/model/anytext/anytext_sd15.yaml @@ -95,5 +95,5 @@ model: cond_stage_config: target: iopaint.model.anytext.ldm.modules.encoders.modules.FrozenCLIPEmbedderT3 params: - version: ./models/clip-vit-large-patch14 + version: openai/clip-vit-large-patch14 use_vision: false # v6 diff --git a/iopaint/model/anytext/cldm/ddim_hacked.py b/iopaint/model/anytext/cldm/ddim_hacked.py index 87ea63b..b23a883 100644 --- a/iopaint/model/anytext/cldm/ddim_hacked.py +++ b/iopaint/model/anytext/cldm/ddim_hacked.py @@ -254,7 +254,7 @@ class DDIMSampler(object): ) img, pred_x0 = outs if callback: - callback(i) + callback(None, i, None, None) if img_callback: img_callback(pred_x0, i) diff --git a/iopaint/model/anytext/cldm/model.py b/iopaint/model/anytext/cldm/model.py index 6d2d2c3..688f2ed 100644 --- a/iopaint/model/anytext/cldm/model.py +++ b/iopaint/model/anytext/cldm/model.py @@ -26,11 +26,11 @@ def load_state_dict(ckpt_path, location="cpu"): def create_model(config_path, device, cond_stage_path=None, use_fp16=False): config = OmegaConf.load(config_path) - if cond_stage_path: - config.model.params.cond_stage_config.params.version = ( - cond_stage_path # use pre-downloaded ckpts, in case blocked - ) - config.model.params.cond_stage_config.params.device = device + # if cond_stage_path: + # config.model.params.cond_stage_config.params.version = ( + # cond_stage_path # use pre-downloaded ckpts, in case blocked + # ) + config.model.params.cond_stage_config.params.device = str(device) if use_fp16: config.model.params.use_fp16 = True config.model.params.control_stage_config.params.use_fp16 = True diff --git a/iopaint/model/anytext/ldm/modules/encoders/modules.py b/iopaint/model/anytext/ldm/modules/encoders/modules.py index e7e2d0a..ceac395 100644 --- a/iopaint/model/anytext/ldm/modules/encoders/modules.py +++ b/iopaint/model/anytext/ldm/modules/encoders/modules.py @@ -2,7 +2,14 @@ import torch import torch.nn as nn from torch.utils.checkpoint import checkpoint -from transformers import T5Tokenizer, T5EncoderModel, CLIPTokenizer, CLIPTextModel, AutoProcessor, CLIPVisionModelWithProjection +from transformers import ( + T5Tokenizer, + T5EncoderModel, + CLIPTokenizer, + CLIPTextModel, + AutoProcessor, + CLIPVisionModelWithProjection, +) from iopaint.model.anytext.ldm.util import count_params @@ -18,7 +25,9 @@ def _expand_mask(mask, dtype, tgt_len=None): inverted_mask = 1.0 - expanded_mask - return inverted_mask.masked_fill(inverted_mask.to(torch.bool), torch.finfo(dtype).min) + return inverted_mask.masked_fill( + inverted_mask.to(torch.bool), torch.finfo(dtype).min + ) def _build_causal_attention_mask(bsz, seq_len, dtype): @@ -30,6 +39,7 @@ def _build_causal_attention_mask(bsz, seq_len, dtype): mask = mask.unsqueeze(1) # expand mask return mask + class AbstractEncoder(nn.Module): def __init__(self): super().__init__() @@ -39,13 +49,12 @@ class AbstractEncoder(nn.Module): class IdentityEncoder(AbstractEncoder): - def encode(self, x): return x class ClassEmbedder(nn.Module): - def __init__(self, embed_dim, n_classes=1000, key='class', ucg_rate=0.1): + def __init__(self, embed_dim, n_classes=1000, key="class", ucg_rate=0.1): super().__init__() self.key = key self.embedding = nn.Embedding(n_classes, embed_dim) @@ -57,15 +66,17 @@ class ClassEmbedder(nn.Module): key = self.key # this is for use in crossattn c = batch[key][:, None] - if self.ucg_rate > 0. and not disable_dropout: - mask = 1. - torch.bernoulli(torch.ones_like(c) * self.ucg_rate) - c = mask * c + (1-mask) * torch.ones_like(c)*(self.n_classes-1) + if self.ucg_rate > 0.0 and not disable_dropout: + mask = 1.0 - torch.bernoulli(torch.ones_like(c) * self.ucg_rate) + c = mask * c + (1 - mask) * torch.ones_like(c) * (self.n_classes - 1) c = c.long() c = self.embedding(c) return c def get_unconditional_conditioning(self, bs, device="cuda"): - uc_class = self.n_classes - 1 # 1000 classes --> 0 ... 999, one extra class for ucg (class 1000) + uc_class = ( + self.n_classes - 1 + ) # 1000 classes --> 0 ... 999, one extra class for ucg (class 1000) uc = torch.ones((bs,), device=device) * uc_class uc = {self.key: uc} return uc @@ -79,24 +90,34 @@ def disabled_train(self, mode=True): class FrozenT5Embedder(AbstractEncoder): """Uses the T5 transformer encoder for text""" - def __init__(self, version="google/t5-v1_1-large", device="cuda", max_length=77, freeze=True): # others are google/t5-v1_1-xl and google/t5-v1_1-xxl + + def __init__( + self, version="google/t5-v1_1-large", device="cuda", max_length=77, freeze=True + ): # others are google/t5-v1_1-xl and google/t5-v1_1-xxl super().__init__() self.tokenizer = T5Tokenizer.from_pretrained(version) self.transformer = T5EncoderModel.from_pretrained(version) self.device = device - self.max_length = max_length # TODO: typical value? + self.max_length = max_length # TODO: typical value? if freeze: self.freeze() def freeze(self): self.transformer = self.transformer.eval() - #self.train = disabled_train + # self.train = disabled_train for param in self.parameters(): param.requires_grad = False def forward(self, text): - batch_encoding = self.tokenizer(text, truncation=True, max_length=self.max_length, return_length=True, - return_overflowing_tokens=False, padding="max_length", return_tensors="pt") + batch_encoding = self.tokenizer( + text, + truncation=True, + max_length=self.max_length, + return_length=True, + return_overflowing_tokens=False, + padding="max_length", + return_tensors="pt", + ) tokens = batch_encoding["input_ids"].to(self.device) outputs = self.transformer(input_ids=tokens) @@ -109,13 +130,18 @@ class FrozenT5Embedder(AbstractEncoder): class FrozenCLIPEmbedder(AbstractEncoder): """Uses the CLIP transformer encoder for text (from huggingface)""" - LAYERS = [ - "last", - "pooled", - "hidden" - ] - def __init__(self, version="openai/clip-vit-large-patch14", device="cuda", max_length=77, - freeze=True, layer="last", layer_idx=None): # clip-vit-base-patch32 + + LAYERS = ["last", "pooled", "hidden"] + + def __init__( + self, + version="openai/clip-vit-large-patch14", + device="cuda", + max_length=77, + freeze=True, + layer="last", + layer_idx=None, + ): # clip-vit-base-patch32 super().__init__() assert layer in self.LAYERS self.tokenizer = CLIPTokenizer.from_pretrained(version) @@ -137,10 +163,19 @@ class FrozenCLIPEmbedder(AbstractEncoder): param.requires_grad = False def forward(self, text): - batch_encoding = self.tokenizer(text, truncation=True, max_length=self.max_length, return_length=True, - return_overflowing_tokens=False, padding="max_length", return_tensors="pt") + batch_encoding = self.tokenizer( + text, + truncation=True, + max_length=self.max_length, + return_length=True, + return_overflowing_tokens=False, + padding="max_length", + return_tensors="pt", + ) tokens = batch_encoding["input_ids"].to(self.device) - outputs = self.transformer(input_ids=tokens, output_hidden_states=self.layer=="hidden") + outputs = self.transformer( + input_ids=tokens, output_hidden_states=self.layer == "hidden" + ) if self.layer == "last": z = outputs.last_hidden_state elif self.layer == "pooled": @@ -153,77 +188,24 @@ class FrozenCLIPEmbedder(AbstractEncoder): return self(text) -class FrozenOpenCLIPEmbedder(AbstractEncoder): - """ - Uses the OpenCLIP transformer encoder for text - """ - LAYERS = [ - # "pooled", - "last", - "penultimate" - ] - - def __init__(self, arch="ViT-H-14", version="laion2b_s32b_b79k", device="cuda", max_length=77, - freeze=True, layer="last"): - super().__init__() - assert layer in self.LAYERS - model, _, _ = open_clip.create_model_and_transforms(arch, device=torch.device('cpu'), pretrained=version) - del model.visual - self.model = model - - self.device = device - self.max_length = max_length - if freeze: - self.freeze() - self.layer = layer - if self.layer == "last": - self.layer_idx = 0 - elif self.layer == "penultimate": - self.layer_idx = 1 - else: - raise NotImplementedError() - - def freeze(self): - self.model = self.model.eval() - for param in self.parameters(): - param.requires_grad = False - - def forward(self, text): - tokens = open_clip.tokenize(text) - z = self.encode_with_transformer(tokens.to(self.device)) - return z - - def encode_with_transformer(self, text): - x = self.model.token_embedding(text) # [batch_size, n_ctx, d_model] - x = x + self.model.positional_embedding - x = x.permute(1, 0, 2) # NLD -> LND - x = self.text_transformer_forward(x, attn_mask=self.model.attn_mask) - x = x.permute(1, 0, 2) # LND -> NLD - x = self.model.ln_final(x) - return x - - def text_transformer_forward(self, x: torch.Tensor, attn_mask=None): - for i, r in enumerate(self.model.transformer.resblocks): - if i == len(self.model.transformer.resblocks) - self.layer_idx: - break - if self.model.transformer.grad_checkpointing and not torch.jit.is_scripting(): - x = checkpoint(r, x, attn_mask) - else: - x = r(x, attn_mask=attn_mask) - return x - - def encode(self, text): - return self(text) - - class FrozenCLIPT5Encoder(AbstractEncoder): - def __init__(self, clip_version="openai/clip-vit-large-patch14", t5_version="google/t5-v1_1-xl", device="cuda", - clip_max_length=77, t5_max_length=77): + def __init__( + self, + clip_version="openai/clip-vit-large-patch14", + t5_version="google/t5-v1_1-xl", + device="cuda", + clip_max_length=77, + t5_max_length=77, + ): super().__init__() - self.clip_encoder = FrozenCLIPEmbedder(clip_version, device, max_length=clip_max_length) + self.clip_encoder = FrozenCLIPEmbedder( + clip_version, device, max_length=clip_max_length + ) self.t5_encoder = FrozenT5Embedder(t5_version, device, max_length=t5_max_length) - print(f"{self.clip_encoder.__class__.__name__} has {count_params(self.clip_encoder)*1.e-6:.2f} M parameters, " - f"{self.t5_encoder.__class__.__name__} comes with {count_params(self.t5_encoder)*1.e-6:.2f} M params.") + print( + f"{self.clip_encoder.__class__.__name__} has {count_params(self.clip_encoder)*1.e-6:.2f} M parameters, " + f"{self.t5_encoder.__class__.__name__} comes with {count_params(self.t5_encoder)*1.e-6:.2f} M params." + ) def encode(self, text): return self(text) @@ -236,7 +218,15 @@ class FrozenCLIPT5Encoder(AbstractEncoder): class FrozenCLIPEmbedderT3(AbstractEncoder): """Uses the CLIP transformer encoder for text (from Hugging Face)""" - def __init__(self, version="openai/clip-vit-large-patch14", device="cuda", max_length=77, freeze=True, use_vision=False): + + def __init__( + self, + version="openai/clip-vit-large-patch14", + device="cuda", + max_length=77, + freeze=True, + use_vision=False, + ): super().__init__() self.tokenizer = CLIPTokenizer.from_pretrained(version) self.transformer = CLIPTextModel.from_pretrained(version) @@ -255,7 +245,11 @@ class FrozenCLIPEmbedderT3(AbstractEncoder): inputs_embeds=None, embedding_manager=None, ): - seq_length = input_ids.shape[-1] if input_ids is not None else inputs_embeds.shape[-2] + seq_length = ( + input_ids.shape[-1] + if input_ids is not None + else inputs_embeds.shape[-2] + ) if position_ids is None: position_ids = self.position_ids[:, :seq_length] if inputs_embeds is None: @@ -266,7 +260,9 @@ class FrozenCLIPEmbedderT3(AbstractEncoder): embeddings = inputs_embeds + position_embeddings return embeddings - self.transformer.text_model.embeddings.forward = embedding_forward.__get__(self.transformer.text_model.embeddings) + self.transformer.text_model.embeddings.forward = embedding_forward.__get__( + self.transformer.text_model.embeddings + ) def encoder_forward( self, @@ -277,11 +273,19 @@ class FrozenCLIPEmbedderT3(AbstractEncoder): output_hidden_states=None, return_dict=None, ): - output_attentions = output_attentions if output_attentions is not None else self.config.output_attentions - output_hidden_states = ( - output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states + output_attentions = ( + output_attentions + if output_attentions is not None + else self.config.output_attentions + ) + output_hidden_states = ( + output_hidden_states + if output_hidden_states is not None + else self.config.output_hidden_states + ) + return_dict = ( + return_dict if return_dict is not None else self.config.use_return_dict ) - return_dict = return_dict if return_dict is not None else self.config.use_return_dict encoder_states = () if output_hidden_states else None all_attentions = () if output_attentions else None hidden_states = inputs_embeds @@ -301,7 +305,9 @@ class FrozenCLIPEmbedderT3(AbstractEncoder): encoder_states = encoder_states + (hidden_states,) return hidden_states - self.transformer.text_model.encoder.forward = encoder_forward.__get__(self.transformer.text_model.encoder) + self.transformer.text_model.encoder.forward = encoder_forward.__get__( + self.transformer.text_model.encoder + ) def text_encoder_forward( self, @@ -313,22 +319,34 @@ class FrozenCLIPEmbedderT3(AbstractEncoder): return_dict=None, embedding_manager=None, ): - output_attentions = output_attentions if output_attentions is not None else self.config.output_attentions - output_hidden_states = ( - output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states + output_attentions = ( + output_attentions + if output_attentions is not None + else self.config.output_attentions + ) + output_hidden_states = ( + output_hidden_states + if output_hidden_states is not None + else self.config.output_hidden_states + ) + return_dict = ( + return_dict if return_dict is not None else self.config.use_return_dict ) - return_dict = return_dict if return_dict is not None else self.config.use_return_dict if input_ids is None: raise ValueError("You have to specify either input_ids") input_shape = input_ids.size() input_ids = input_ids.view(-1, input_shape[-1]) - hidden_states = self.embeddings(input_ids=input_ids, position_ids=position_ids, embedding_manager=embedding_manager) + hidden_states = self.embeddings( + input_ids=input_ids, + position_ids=position_ids, + embedding_manager=embedding_manager, + ) bsz, seq_len = input_shape # CLIP's text model uses causal mask, prepare it here. # https://github.com/openai/CLIP/blob/cfcffb90e69f37bf2ff1e988237a0fbe41f33c04/clip/model.py#L324 - causal_attention_mask = _build_causal_attention_mask(bsz, seq_len, hidden_states.dtype).to( - hidden_states.device - ) + causal_attention_mask = _build_causal_attention_mask( + bsz, seq_len, hidden_states.dtype + ).to(hidden_states.device) # expand attention_mask if attention_mask is not None: # [bsz, seq_len] -> [bsz, 1, tgt_seq_len, src_seq_len] @@ -344,7 +362,9 @@ class FrozenCLIPEmbedderT3(AbstractEncoder): last_hidden_state = self.final_layer_norm(last_hidden_state) return last_hidden_state - self.transformer.text_model.forward = text_encoder_forward.__get__(self.transformer.text_model) + self.transformer.text_model.forward = text_encoder_forward.__get__( + self.transformer.text_model + ) def transformer_forward( self, @@ -363,7 +383,7 @@ class FrozenCLIPEmbedderT3(AbstractEncoder): output_attentions=output_attentions, output_hidden_states=output_hidden_states, return_dict=return_dict, - embedding_manager=embedding_manager + embedding_manager=embedding_manager, ) self.transformer.forward = transformer_forward.__get__(self.transformer) @@ -374,8 +394,15 @@ class FrozenCLIPEmbedderT3(AbstractEncoder): param.requires_grad = False def forward(self, text, **kwargs): - batch_encoding = self.tokenizer(text, truncation=True, max_length=self.max_length, return_length=True, - return_overflowing_tokens=False, padding="max_length", return_tensors="pt") + batch_encoding = self.tokenizer( + text, + truncation=True, + max_length=self.max_length, + return_length=True, + return_overflowing_tokens=False, + padding="max_length", + return_tensors="pt", + ) tokens = batch_encoding["input_ids"].to(self.device) z = self.transformer(input_ids=tokens, **kwargs) return z diff --git a/iopaint/model/anytext/main.py b/iopaint/model/anytext/main.py index dbafe50..f7b2d2e 100644 --- a/iopaint/model/anytext/main.py +++ b/iopaint/model/anytext/main.py @@ -1,3 +1,6 @@ +import cv2 +import os + from anytext_pipeline import AnyTextPipeline from utils import save_images @@ -5,48 +8,38 @@ seed = 66273235 # seed_everything(seed) pipe = AnyTextPipeline( - cfg_path="/Users/cwq/code/github/AnyText/anytext/models_yaMl/anytext_sd15.yaml", - model_dir="/Users/cwq/.cache/modelscope/hub/damo/cv_anytext_text_generation_editing", - # font_path="/Users/cwq/code/github/AnyText/anytext/font/Arial_Unicode.ttf", - # font_path="/Users/cwq/code/github/AnyText/anytext/font/SourceHanSansSC-VF.ttf", + ckpt_path="/Users/cwq/code/github/IOPaint/iopaint/model/anytext/anytext_v1.1_fp16.ckpt", font_path="/Users/cwq/code/github/AnyText/anytext/font/SourceHanSansSC-Medium.otf", use_fp16=False, device="mps", ) img_save_folder = "SaveImages" -params = { - "show_debug": True, - "image_count": 2, - "ddim_steps": 20, -} +rgb_image = cv2.imread( + "/Users/cwq/code/github/AnyText/anytext/example_images/ref7.jpg" +)[..., ::-1] -# # 1. text generation -# mode = "text-generation" -# input_data = { -# "prompt": 'photo of caramel macchiato coffee on the table, top-down perspective, with "Any" "Text" written on it using cream', -# "seed": seed, -# "draw_pos": "/Users/cwq/code/github/AnyText/anytext/example_images/gen9.png", -# } -# results, rtn_code, rtn_warning, debug_info = pipe(input_data, mode=mode, **params) -# if rtn_code >= 0: -# save_images(results, img_save_folder) -# print(f"Done, result images are saved in: {img_save_folder}") -# if rtn_warning: -# print(rtn_warning) -# -# exit() -# 2. text editing -mode = "text-editing" -input_data = { - "prompt": 'A cake with colorful characters that reads "EVERYDAY"', - "seed": seed, - "draw_pos": "/Users/cwq/code/github/AnyText/anytext/example_images/edit7.png", - "ori_image": "/Users/cwq/code/github/AnyText/anytext/example_images/ref7.jpg", -} -results, rtn_code, rtn_warning, debug_info = pipe(input_data, mode=mode, **params) +masked_image = cv2.imread( + "/Users/cwq/code/github/AnyText/anytext/example_images/edit7.png" +)[..., ::-1] + +rgb_image = cv2.resize(rgb_image, (512, 512)) +masked_image = cv2.resize(masked_image, (512, 512)) + +# results: list of rgb ndarray +results, rtn_code, rtn_warning = pipe( + prompt='A cake with colorful characters that reads "EVERYDAY", best quality, extremely detailed,4k, HD, supper legible text, clear text edges, clear strokes, neat writing, no watermarks', + negative_prompt="low-res, bad anatomy, extra digit, fewer digits, cropped, worst quality, low quality, watermark, unreadable text, messy words, distorted text, disorganized writing, advertising picture", + image=rgb_image, + masked_image=masked_image, + num_inference_steps=20, + strength=1.0, + guidance_scale=9.0, + height=rgb_image.shape[0], + width=rgb_image.shape[1], + seed=seed, + sort_priority="y", +) if rtn_code >= 0: save_images(results, img_save_folder) print(f"Done, result images are saved in: {img_save_folder}") -if rtn_warning: - print(rtn_warning) diff --git a/iopaint/model_info.py b/iopaint/model_info.py index a053534..8021fa3 100644 --- a/iopaint/model_info.py +++ b/iopaint/model_info.py @@ -9,6 +9,7 @@ from iopaint.const import ( INSTRUCT_PIX2PIX_NAME, KANDINSKY22_NAME, POWERPAINT_NAME, + ANYTEXT_NAME, ) from iopaint.schema import ModelType @@ -31,6 +32,7 @@ class ModelInfo(BaseModel): INSTRUCT_PIX2PIX_NAME, KANDINSKY22_NAME, POWERPAINT_NAME, + ANYTEXT_NAME, ] @computed_field @@ -58,7 +60,7 @@ class ModelInfo(BaseModel): ModelType.DIFFUSERS_SDXL, ModelType.DIFFUSERS_SD_INPAINT, ModelType.DIFFUSERS_SDXL_INPAINT, - ] or self.name in [POWERPAINT_NAME] + ] or self.name in [POWERPAINT_NAME, ANYTEXT_NAME] @computed_field @property diff --git a/iopaint/tests/anytext_mask.jpg b/iopaint/tests/anytext_mask.jpg new file mode 100644 index 0000000000000000000000000000000000000000..43d8b120399b985ec8bb95aa12647dda45f555e4 GIT binary patch literal 6860 zcmeHKc~n!^*1rf&s6Yh4%4BH^DgrWz%G8#rDv%-sWY$oD1PJpywY63Tfyc8z0s-72mmWs0669e0E({xK-T;3I!W^{VmmESsY&7r zms~+WC~yZj4O|5fKmedGVMf3Oz!117W&$>V^u9gpwbByE9FW<=p#ul@A2@tSR`&3r z!-r*$${&?IB6sBQ;bWj`6htFZoX?12`%PW* zt+A1rmSy)R;bLI_k~)u=t~L@1fs8X##lT9Oxzpk@Xa}19vm0*K z!P|-u5G5BorG7fZ)!f$Bp}PMm<&$mw*6JC}miZ*Ctk;B-v_88L>%uY55Bxw|%8ES8 z{v?rSID^g#G~X&ZMl1j7QQqABFY2&SQ$H-vc&r-aw6~(s{wFMt4=}lAaII(;W-*I2}*`;LdRt)atP;3gp)YcKg&>QoOgPIZ2mo|hZ zy`nfIw_jdH|3n9LZP7it3)0o0q7@bpd7w00ySR#_1;ejpk_-(sU@X0Ua4^Ffe|~%a z$@xwNb?DsKN+{=6L>kU6XQy=BDe5d{cW4(JW_QAVxBS}KU6EC^+4Bmb+I5#G%DD^m z=Zf3w5tQSwIyZY7d#h+Jhdh?Ho4qVmR_foCU6Uh+t1$bESI^5VboqwGhx5&>fOKy& zJdZ>f)@j)Iu$e;4Pa<@Y-AxyZx1K;^!rB>==S2-0IUbx|^r?-Jk)3xWV(Zk6973Bat)oe{3y+wYoqJnJJxE`HUn>ZP|;O(NyciXCQ zK+xE;ExYLdh!1t zY`e!RY~&*d#3X_u6{%4NiRp>yJy4Xc6^P12B3E3^ySp950OPZ&TOYN*ZZ)2#WS$|# zU!NO8Y7A^_#=f8RJUK$w@V~eWnTO?IbQ*-<%J>*P%`R!8I<#tK+ z&mwcg04B;ppvW-G3N#Y~4ZOz+O1CQ#K99}Dy(xLytfpD%p}ACV`T~#RTMJEmu#<`l z%Xxg#n_CHIVn2%>+yQ>@6Vo8z0ZKhi7|ELI~Z9?$`z23&7}NK`pH_FcsCm2qCY{A7Pm-Q)j_azTvl8z)A=*s4R)s( znBCDd!d}-5Zy{_FOGQdz$tlI^j&q?EJKAH}*L+>4A2&>4F2Z+pv1vWlzkDu_a($Xd z8mDi2IPYW%&c)QNi;BrvbL=|sl7jTK+gt!|!!-Q_jSNkBReCixMK`1)ML|sMk7n7$SX^8rD9+Vv75QLPjz

YNIYq=<;2E7;WloZ6d$!iBW%V=amufhil|fe; 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≫cz!`({?d{EA3B>U$M52;ZF-{elPG<-NohAp%PC7g+TiGqdW+ZC2sEg(>)OHrS_ z#^Sv|1myI|rsl+;kIk#g`66E|+DjA2xluD1@<0TS;lbw>QVnidS);bFm75`glFA!^ z4-4pVft+`*)R;at{?Gn2l-lanR>vC^1>LYO*ML4#j30b+^{&fV{hYoWYw$1F;QJM< zlYOM5Ayr#&9CSDs>FJsj*trq;4x03nM8&ky!y_XscM;Apo`bRHK9wb%%$IW@ywld- zc{^C6F;&6FdGEj{{0)6k@w?##?}EHh99|mI?qssmV)+)_JD_k6?*9OZi2(~7lafgQ z4lCBa7yioHU4^_}A^4VXVF0a?$lFy;NixU?B>O4jx$GNZ%6@o5r}&EI-tO|-Mr(*8 zA~s};bB;IW!`Pl4a5n(WUU}yYk9Qe*TbFv8c9iM1e)<*LncE;_h{FOY6WRdM(pE}l+KZb9vG_7w=HW$|H z!Q+x9`3fF!k(1j5aDS1b30)k1?-oTf$vxB(NI_hdRwo0TkiC9hmC|Y2UaSm~-D)uH z5VWWf2;C_Qg&WtX$r#2@UW6LTj^e^;l_gMBOCDk@19Cb6-`6!~?RIMd2t3)QT$fgW zuHC$GmBVCo$4#T_M=BZH*!(p3v3CWu_PR{d$8@Up?yz7?AA~A#fEW>j#~jxcsA*m| z&~*tc^^le~871Pl#7=|^?QO^i!2I)Hvp)&pvrmV96_-k77SY&4Jjn5W^@Bz>U?|TF z4mi(VwdH@bkHQ%KA^2|Z#5VSE!L4b4&XVl?t}*_3t3*k&A)wdr(pu_c%E=f3 zI{rB7aBUWv@;j2Jou@UD zmtISsD%{4-xCKLu5O^iH-|2yhZ31k!r|4cZ)ZE(X(!qNF05JkJ4BHTAeiwojMsZbc zVDWOyvHhmqql5(@q+v%SjIlnw&*z%`IsJ>gE2LcbD^~G#p#*a3cazI%WZK}Q0T(I@ zXNDw_K{?~nzd!tKqebCA7V6#^y9mG8*HbE%-lt%Hl$G4vkTc(|YG7O1=NovM&)K1a z%e4y>WpW}$JF;7$ewaAv$8Pzh_CFFevD}tLKqn6x0;J%PjoHq7=e{d>wR?$f9`EF6 zr&dBn;>@S+-4aNW52P(EgJuW_iXQY@MzO&}vUFN^{691=!&{IlM# z>5{#{Hq&W&U8RO4W4Nd#LELeUo%(bJw=Pv=mu-@VcKM3OD=@&w!1;L?=a2~Wq>SDH z6|q?nHs^Pk4oEpU7zZ4T&{;s-EU+W4hj69A$Vr)a2N@&|M;!$$FQzQP?riQ*c0n$3 z0)vuIr%Zp2Yi`c^@*9%@Nm@Q*BrI&8jOVBDj-Z-RBSHy=;p7X)?%`d>CkN*Pryisn z^v^&K|I*@PiZoP6?U~^8+!ugzo}>ojt_@b2&dnq&BJ#t4c#*l|k$^zsuk@(mz7c@Y z?^jZ;*%%o)Jd7_Lc&WU{ZSpK`-eK%fim5yUjDehR4RjfzM6`w%Z9>clyp{!ibGzj~ zEstIK8_S5KQV#`{9HO!G+y-hYY*bIoKia!Z z@_sXG^P`DGuM3URa-rfve(yj#0&C_-H0P2gl*Yx?ce)Zl1pK3`WSkI2IIp7r0Ba&` zJ~e9atVJV*ZORzi%3Z!%uF?t15y&T@=DuwcJgP+2(n`4s3&<4hInMy+uczZwwiJsW zU{57tw?n;|L$rjPoN{rK(~dHG`tfcJ9^H|xZi2>0;oK6q0kEJhPESFQGma{my|{cu zZ2>IGrNEbijxuxiN%qA<71hH;V>YOcHuCSBZ3OdzdY^1(tuYp0(#+E|Qpz1(J)jZg zmggXI+rLwal<0CPj&Ta@Bn&XzeR6O|2RP}TIjSJs%6G+S5ZVld40#@(QhENhJ)_?! zOJk?QEyBOd!^|Tj4XS&9I&}X4>i|!6qudzPO9-PQff)mN-GWN@#xaiF`c)tJM(&|S zm1b6!R18l40GDqavyG#tBezMEF!jEa?Hb?26}a`jpFP}jX2Zqsr%P~ zSx2jXZmJwB z0fY4JYFnQW+LQn|EO0V^!oJ#4grlMO0;O3=^CDzOuod&T*EixF3fAcY`C}umy-WSC z5()C-na3RsdDEvCqdRHFq$H&iiqpI)Y>&LA;=aFH^i4lair50dRY3Y? zxvQTR*jkOzjOUE;Tt2Vk_GDyNz~=yQS$j%!)`zCB*qlSu_MJn-HX3wzjg+@RT%G5{ zhPRPQ^il{X)K|`0kBcrOa>a=r{f%;$UM7{%mDmtJO5m%RHL>ns_%%O`T=$<5{79cr zh@Uj7f^*65+P+`$hPEa$5ZklZbAi`6{3}0G@e36yk~TlQdRLlicm8W*JB~T$*1UXX zImv2%mBU;s3NGhvkfP z{{R~EaMHZbzQ?5s5>K(^+PjN=N_CQEZ#Bsz0tO$FynQ=;D>7jmD3cKA>OtceBPXaV zFmcimYdkQrjNU7+ewn+)nIqoO6t0n#8uXf;EwEE!?iJ=m(fY=~{tW+`2Bx3^uJ+ogz{?B5^Ncf-O9a>wRl0Ksd*pUFs5OSM@ zjmIYnK<5PW$1E;>;_3~y-s(F)EZt87G?6eY36K$%0A+{Ef!_kYDzwl(8Gg!od|oZ_ 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 Ku{#jb)c*k@(K*ck literal 0 HcmV?d00001 diff --git a/iopaint/tests/test_anytext.py b/iopaint/tests/test_anytext.py new file mode 100644 index 0000000..996176f --- /dev/null +++ b/iopaint/tests/test_anytext.py @@ -0,0 +1,45 @@ +import os + +from iopaint.tests.utils import check_device, get_config, assert_equal + +os.environ["PYTORCH_ENABLE_MPS_FALLBACK"] = "1" +from pathlib import Path + +import pytest +import torch + +from iopaint.model_manager import ModelManager +from iopaint.schema import HDStrategy + +current_dir = Path(__file__).parent.absolute().resolve() +save_dir = current_dir / "result" +save_dir.mkdir(exist_ok=True, parents=True) + + +@pytest.mark.parametrize("device", ["cuda", "mps"]) +def test_anytext(device): + sd_steps = check_device(device) + model = ModelManager( + name="Sanster/AnyText", + device=torch.device(device), + disable_nsfw=True, + sd_cpu_textencoder=False, + ) + + cfg = get_config( + strategy=HDStrategy.ORIGINAL, + prompt='Characters written in chalk on the blackboard that says "DADDY", best quality, extremely detailed,4k, HD, supper legible text, clear text edges, clear strokes, neat writing, no watermarks', + negative_prompt="low-res, bad anatomy, extra digit, fewer digits, cropped, worst quality, low quality, watermark, unreadable text, messy words, distorted text, disorganized writing, advertising picture", + sd_steps=sd_steps, + sd_guidance_scale=9.0, + sd_seed=66273235, + sd_match_histograms=True + ) + + assert_equal( + model, + cfg, + f"anytext.png", + img_p=current_dir / "anytext_ref.jpg", + mask_p=current_dir / "anytext_mask.jpg", + ) diff --git a/web_app/src/components/SidePanel/DiffusionOptions.tsx b/web_app/src/components/SidePanel/DiffusionOptions.tsx index 40c22b5..265e1c7 100644 --- a/web_app/src/components/SidePanel/DiffusionOptions.tsx +++ b/web_app/src/components/SidePanel/DiffusionOptions.tsx @@ -16,7 +16,12 @@ import { Separator } from "../ui/separator" import { Button, ImageUploadButton } from "../ui/button" import { Slider } from "../ui/slider" import { useImage } from "@/hooks/useImage" -import { INSTRUCT_PIX2PIX, PAINT_BY_EXAMPLE, POWERPAINT } from "@/lib/const" +import { + ANYTEXT, + INSTRUCT_PIX2PIX, + PAINT_BY_EXAMPLE, + POWERPAINT, +} from "@/lib/const" import { RowContainer, LabelTitle } from "./LabelTitle" import { Minus, Plus, Upload } from "lucide-react" import { useClickAway } from "react-use" @@ -661,6 +666,10 @@ const DiffusionOptions = () => { } const renderSampler = () => { + if (settings.model.name === ANYTEXT) { + return null + } + return ( diff --git a/web_app/src/lib/const.ts b/web_app/src/lib/const.ts index bd094f2..11a5a0e 100644 --- a/web_app/src/lib/const.ts +++ b/web_app/src/lib/const.ts @@ -15,6 +15,7 @@ export const PAINT_BY_EXAMPLE = "Fantasy-Studio/Paint-by-Example" export const INSTRUCT_PIX2PIX = "timbrooks/instruct-pix2pix" export const KANDINSKY_2_2 = "kandinsky-community/kandinsky-2-2-decoder-inpaint" export const POWERPAINT = "Sanster/PowerPaint-V1-stable-diffusion-inpainting" +export const ANYTEXT = "Sanster/AnyText" export const DEFAULT_NEGATIVE_PROMPT = "out of frame, lowres, error, cropped, worst quality, low quality, jpeg artifacts, ugly, duplicate, morbid, mutilated, out of frame, mutation, deformed, blurry, dehydrated, bad anatomy, bad proportions, extra limbs, disfigured, gross proportions, malformed limbs, watermark, signature"