Spaces:
Running
Running
import torch | |
from diffusers import ( | |
StableDiffusionControlNetImg2ImgPipeline, | |
ControlNetModel, | |
DDIMScheduler, | |
) | |
from PIL import Image | |
class QRControlNet: | |
def __init__(self, device: str = "cuda"): | |
torch_dtype = torch.float16 if device == "cuda" else torch.float32 | |
controlnet = ControlNetModel.from_pretrained( | |
"DionTimmer/controlnet_qrcode-control_v1p_sd15", torch_dtype=torch_dtype | |
) | |
pipe = StableDiffusionControlNetImg2ImgPipeline.from_pretrained( | |
"runwayml/stable-diffusion-v1-5", | |
controlnet=controlnet, | |
# safety_checker=None, | |
torch_dtype=torch_dtype, | |
).to(device) | |
if device == "cuda": | |
pipe.enable_xformers_memory_efficient_attention() | |
pipe.enable_model_cpu_offload() | |
pipe.scheduler = DDIMScheduler.from_config(pipe.scheduler.config) | |
self.pipe = pipe | |
def generate_image( | |
self, | |
source_image: Image, | |
control_image: Image, | |
prompt: str, | |
negative_prompt: str, | |
img_size=512, | |
num_inference_steps: int = 50, | |
guidance_scale: int = 20, | |
controlnet_conditioning_scale: float = 3.0, | |
strength=0.9, | |
seed=42, | |
**kwargs | |
): | |
width = height = img_size | |
generator = torch.manual_seed(seed) | |
image = self.pipe( | |
prompt=prompt, | |
negative_prompt=negative_prompt, | |
image=source_image, | |
control_image=control_image, | |
width=width, | |
height=height, | |
guidance_scale=guidance_scale, | |
controlnet_conditioning_scale=controlnet_conditioning_scale, # 3.0, | |
generator=generator, | |
strength=strength, | |
num_inference_steps=num_inference_steps, | |
**kwargs | |
) | |
return image.images[0] | |