import gradio as gr import spaces from RealESRGAN import RealESRGAN 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,algorithm_type="dpmsolver++",use_karras_sigmas=True) device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') model2 = RealESRGAN(device, scale=2) model2.load_weights('weights/RealESRGAN_x2.pth', download=True) model4 = RealESRGAN(device, scale=4) model4.load_weights('weights/RealESRGAN_x4.pth', download=True) @spaces.GPU def inference(image, size): global model2 global model4 global model8 if image is None: raise gr.Error("Image not uploaded") if torch.cuda.is_available(): torch.cuda.empty_cache() if size == '2x': try: result = model2.predict(image.convert('RGB')) except torch.cuda.OutOfMemoryError as e: print(e) model2 = RealESRGAN(device, scale=2) model2.load_weights('weights/RealESRGAN_x2.pth', download=False) result = model2.predict(image.convert('RGB')) elif size == '4x': try: result = model4.predict(image.convert('RGB')) except torch.cuda.OutOfMemoryError as e: print(e) model4 = RealESRGAN(device, scale=4) model4.load_weights('weights/RealESRGAN_x4.pth', download=False) result = model2.predict(image.convert('RGB')) print(f"Image size ({device}): {size} ... OK") return result 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, size): ( 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) if size !="0": cnet_image = inference(cnet_image,size) yield source, cnet_image def clear_result(): return gr.update(value=None) title = """