File size: 4,397 Bytes
f24d19f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7c945b6
 
3272647
7c0ca8f
316424f
7c0ca8f
 
316424f
7c0ca8f
316424f
7c0ca8f
 
 
 
316424f
7c0ca8f
 
316424f
7c0ca8f
8a56dc6
 
 
 
7c0ca8f
3272647
f24d19f
1bb37af
f24d19f
 
 
 
 
 
 
 
 
 
 
7c0ca8f
 
 
 
 
 
 
 
 
 
 
f24d19f
3272647
 
7c0ca8f
 
f24d19f
 
8a56dc6
7c0ca8f
f24d19f
 
7c0ca8f
f24d19f
 
 
 
 
7c0ca8f
 
 
f24d19f
8a56dc6
fbb8f18
7c0ca8f
f24d19f
 
fbb8f18
f24d19f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3272647
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
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(
        """
            <div style="text-align: center;">
                <p>Inpaint Code <a href="https://github.com/opencv/opencv/blob/da3debda6d233af90e421e95700c63fc08b83b75/samples/python/inpaint.py" style="text-decoration: underline;" target="_blank">OpenCV inpaint example</a> - Gradio Demo by 🤗 Hugging Face
                </p>
            </div>
        """
    )

    demo.launch()