import spaces import gradio as gr import subprocess import re from PIL import Image import opencvinpaint def sanitize_prompt(prompt): # Allow only alphanumeric characters, spaces, and basic punctuation allowed_chars = re.compile(r"[^a-zA-Z0-9\s.,!?-]") sanitized_prompt = allowed_chars.sub("", prompt) return sanitized_prompt #@spaces.GPU(duration=120) def process_images(image, image2=None,inpaint_radius=3,blur_radius=25,edge_expand=8,inpaint_mode="Telea",progress=gr.Progress(track_tqdm=True)): progress(0, desc="Start Inpainting") print("process_images") # I'm not sure when this happen if not isinstance(image, dict): if image2 == None: print("empty mask") return image else: image = dict({'background': image, 'layers': [image2]}) if image2!=None: mask = image2 else: if len(image['layers']) == 0: print("empty mask") return image mask = image['layers'][0] img_width,img_height = image["background"].size mask_width, mask_height = mask.size if img_width!=mask_width or img_height!=mask_height: gr.Error(f"image size({img_width},{img_height}) must be same as mask size({mask_width},{mask_height})") output = opencvinpaint.process_cvinpaint(image["background"],mask,inpaint_radius,blur_radius,edge_expand,inpaint_mode) return output,mask # code from https://huggingface.co/spaces/diffusers/stable-diffusion-xl-inpainting/blob/main/app.py def read_file(file_path: str) -> str: """read the text of target file """ with open(file_path, 'r', encoding='utf-8') as f: content = f.read() return content css=""" #col-left { margin: 0 auto; max-width: 640px; } #col-right { margin: 0 auto; max-width: 640px; } """ #css=css, with gr.Blocks(css=css, elem_id="demo-container") as demo: with gr.Column(): gr.HTML(read_file("demo_header.html")) with gr.Row(): with gr.Column(): image = gr.ImageEditor(height=800,sources=['upload','clipboard'],transforms=[],image_mode='RGB', layers=False, elem_id="image_upload", type="pil", label="Upload",brush=gr.Brush(colors=["#fff"], color_mode="fixed")) with gr.Row(elem_id="prompt-container", equal_height=False): with gr.Row(): btn = gr.Button("Inpaint!", elem_id="run_button") image_mask = gr.Image(sources=['upload','clipboard'], elem_id="mask_upload", type="pil", label="Mask_Upload",height=400, value=None) with gr.Accordion(label="Advanced Settings", open=False): with gr.Row( equal_height=True): inpaint_radius = gr.Number(value=3, minimum=1.0, maximum=20.0, step=1, label="Inpaint Radius") blur_radius = gr.Number(value=25, minimum=0.0, maximum=50.0, step=1, label="Blur Radius") edge_expand = gr.Number(value=8, minimum=0.0, maximum=20.0, step=1, label="Edge Expand") with gr.Row(equal_height=True): modes = ["Telea", "Navier-Stokes"] inpaint_mode = gr.Dropdown(label="modes", choices=modes, value="Telea") with gr.Column(): image_out = gr.Image(height=800,sources=[],label="Output", elem_id="output-img") mask_out = gr.Image(height=800,sources=[],label="Mask", elem_id="mask-img",format="jpeg") btn.click(fn=process_images, inputs=[image, image_mask,inpaint_radius,blur_radius,edge_expand,inpaint_mode], outputs =[image_out,mask_out], api_name='infer') gr.Examples( examples=[["examples/street.jpg", "examples/street_mask.jpg"]] , #fn=predict, inputs=[image,image_mask], cache_examples=False, ) gr.HTML( """
Inpaint Code OpenCV inpaint example - Gradio Demo by 🤗 Hugging Face