import gradio as gr import spaces import torch from diffusers import AutoencoderKL, TCDScheduler, DPMSolverMultistepScheduler from diffusers.models.model_loading_utils import load_state_dict from gradio_imageslider import ImageSlider from huggingface_hub import hf_hub_download from PIL import ImageDraw, ImageFont, Image from controlnet_union import ControlNetModel_Union from pipeline_fill_sd_xl import StableDiffusionXLFillPipeline MODELS = { "RealVisXL V5.0 Lightning": "SG161222/RealVisXL_V5.0_Lightning", } config_file = hf_hub_download( "xinsir/controlnet-union-sdxl-1.0", filename="config_promax.json", ) config = ControlNetModel_Union.load_config(config_file) controlnet_model = ControlNetModel_Union.from_config(config) model_file = hf_hub_download( "xinsir/controlnet-union-sdxl-1.0", filename="diffusion_pytorch_model_promax.safetensors", ) state_dict = load_state_dict(model_file) model, _, _, _, _ = ControlNetModel_Union._load_pretrained_model( controlnet_model, state_dict, model_file, "xinsir/controlnet-union-sdxl-1.0" ) model.to(device="cuda", dtype=torch.float16) vae = AutoencoderKL.from_pretrained( "madebyollin/sdxl-vae-fp16-fix", torch_dtype=torch.float16 ).to("cuda") pipe = StableDiffusionXLFillPipeline.from_pretrained( "SG161222/RealVisXL_V5.0_Lightning", torch_dtype=torch.float16, vae=vae, controlnet=model, variant="fp16", ).to("cuda") pipe.scheduler = TCDScheduler.from_config(pipe.scheduler.config) device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') def add_watermark(image, text="ProFaker", font_path="BRLNSDB.TTF", font_size=25): # Load the Berlin Sans Demi font with the specified size font = ImageFont.truetype(font_path, font_size) # Position the watermark in the bottom right corner, adjusting for text size text_bbox = font.getbbox(text) text_width, text_height = text_bbox[2], text_bbox[3] watermark_position = (image.width - text_width - 100, image.height - text_height - 150) # Draw the watermark text with a translucent white color draw = ImageDraw.Draw(image) draw.text(watermark_position, text, font=font, fill=(255, 255, 255, 150)) # RGBA for transparency return image @spaces.GPU def fill_image(prompt, negative_prompt, image, model_selection, paste_back, guidance_scale, num_steps): ( prompt_embeds, negative_prompt_embeds, pooled_prompt_embeds, negative_pooled_prompt_embeds, ) = pipe.encode_prompt(prompt, "cuda", True,negative_prompt=negative_prompt) source = image["background"] mask = image["layers"][0] alpha_channel = mask.split()[3] binary_mask = alpha_channel.point(lambda p: p > 0 and 255) cnet_image = source.copy() cnet_image.paste(0, (0, 0), binary_mask) for image in pipe( prompt_embeds=prompt_embeds, negative_prompt_embeds=negative_prompt_embeds, pooled_prompt_embeds=pooled_prompt_embeds, negative_pooled_prompt_embeds=negative_pooled_prompt_embeds, image=cnet_image, guidance_scale = guidance_scale, num_inference_steps = num_steps, ): yield image, cnet_image print(f"{model_selection=}") print(f"{paste_back=}") if paste_back: image = image.convert("RGBA") cnet_image.paste(image, (0, 0), binary_mask) else: cnet_image = image cnet_image = add_watermark(cnet_image) yield source, cnet_image def clear_result(): return gr.update(value=None) title = """