real / app.py
profaker's picture
Update app.py
856cda8 verified
import gradio as gr
import torch
import numpy as np
from PIL import Image,ImageFilter
from diffusers.models import AutoencoderKL
from diffusers import AutoPipelineForInpainting, UNet2DConditionModel, DiffusionPipeline, StableDiffusionInpaintPipeline
import diffusers
from share_btn import community_icon_html, loading_icon_html, share_js
vae = AutoencoderKL.from_pretrained("stabilityai/sd-vae-ft-mse")
def read_content(file_path: str) -> str:
"""read the content of target file
"""
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()
return content
def predict(dict, prompt="", negative_prompt="", guidance_scale=7.5, steps=30, strength=0.8,model="Realistic_V5.0", scheduler="DPMSolverMultistepScheduler-Karras"):
pipe = AutoPipelineForInpainting.from_pretrained("SG161222/Realistic_Vision_V5.0_noVAE",vae=vae).to("cuda")
if model == "Realistic_V5.1":
pipe = AutoPipelineForInpainting.from_pretrained("SG161222/Realistic_Vision_V5.1_noVAE", vae=vae).to("cuda")
if model == "EpicRealism":
pipe = AutoPipelineForInpainting.from_pretrained("emilianJR/epiCRealism", vae=vae).to("cuda")
if model == "Realistic_V6.0":
pipe = AutoPipelineForInpainting.from_pretrained("SG161222/Realistic_Vision_V6.0_B1_noVAE", vae=vae).to("cuda")
pipe.safety_checker = lambda images, **kwargs: (images, [False] * len(images))
if negative_prompt == "":
negative_prompt = None
scheduler_class_name = scheduler.split("-")[0]
add_kwargs = {}
if len(scheduler.split("-")) > 1:
add_kwargs["use_karras_sigmas"] = True
if len(scheduler.split("-")) > 2:
add_kwargs["algorithm_type"] = "sde-dpmsolver++"
scheduler = getattr(diffusers, scheduler_class_name)
pipe.scheduler = scheduler.from_pretrained("emilianJR/epiCRealism", subfolder="scheduler", **add_kwargs)
init_image = dict["image"]
mask_image = dict["mask"]
width, height = init_image.size
mask_image = mask_image.convert("RGBA")
data = mask_image.getdata()
new_data = []
for item in data:
if item[:3] == (0, 0, 0): # Check if the pixel is black
new_data.append((0, 0, 0, 0)) # Add transparent pixel
else:
new_data.append(item)
mask_image.putdata(new_data)
mask_image = mask_image.resize(init_image.size, resample=Image.LANCZOS)
mask_image = mask_image.filter(ImageFilter.GaussianBlur(5))
#mask_image = pipe.mask_processor.blur(mask_image, blur_factor=15)
with torch.cuda.amp.autocast():
output = pipe(
prompt=prompt,
negative_prompt=negative_prompt,
image=init_image,
mask_image=mask_image,
guidance_scale=guidance_scale,
num_inference_steps=int(steps),
strength=strength,
clip_skip=1
)
inpainted_image = output.images[0]
inpainted_image = inpainted_image.resize(init_image.size, resample=Image.LANCZOS)
# Combine the original and inpainted images using the mask
combined_image = Image.composite(inpainted_image, init_image, mask_image.split()[3])
print("Positive:", prompt)
print("Negative:", negative_prompt)
print("Guidance_scale:", guidance_scale)
print("Steps:", steps)
print("Strength:", strength)
print("Scheduler:", scheduler)
return inpainted_image, combined_image, gr.update(visible=True)
css = '''
.gradio-container{max-width: 1100px !important}
#image_upload{min-height:400px}
#image_upload [data-testid="image"], #image_upload [data-testid="image"] > div{min-height: 400px}
#mask_radio .gr-form{background:transparent; border: none}
#word_mask{margin-top: .75em !important}
#word_mask textarea:disabled{opacity: 0.3}
.footer {margin-bottom: 45px;margin-top: 35px;text-align: center;border-bottom: 1px solid #e5e5e5}
.footer>p {font-size: .8rem; display: inline-block; padding: 0 10px;transform: translateY(10px);background: white}
.dark .footer {border-color: #303030}
.dark .footer>p {background: #0b0f19}
.acknowledgments h4{margin: 1.25em 0 .25em 0;font-weight: bold;font-size: 115%}
#image_upload .touch-none{display: flex}
@keyframes spin {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
#share-btn-container {padding-left: 0.5rem !important; padding-right: 0.5rem !important; background-color: #000000; justify-content: center; align-items: center; border-radius: 9999px !important; max-width: 13rem; margin-left: auto;}
div#share-btn-container > div {flex-direction: row;background: black;align-items: center}
#share-btn-container:hover {background-color: #060606}
#share-btn {all: initial; color: #ffffff;font-weight: 600; cursor:pointer; font-family: 'IBM Plex Sans', sans-serif; margin-left: 0.5rem !important; padding-top: 0.5rem !important; padding-bottom: 0.5rem !important;right:0;}
#share-btn * {all: unset}
#share-btn-container div:nth-child(-n+2){width: auto !important;min-height: 0px !important;}
#share-btn-container .wrap {display: none !important}
#share-btn-container.hidden {display: none!important}
#prompt input{width: calc(100% - 160px);border-top-right-radius: 0px;border-bottom-right-radius: 0px;}
#prompt-container{margin-top:-18px;}
#prompt-container .form{border-top-left-radius: 0;border-top-right-radius: 0}
#image_upload{border-bottom-left-radius: 0px;border-bottom-right-radius: 0px}
'''
image_blocks = gr.Blocks(css=css, elem_id="total-container")
with image_blocks as demo:
gr.HTML(read_content("header.html"))
with gr.Row():
with gr.Column():
image = gr.Image(source='upload', tool='sketch', elem_id="image_upload", type="pil", label="Upload",height=512)
with gr.Row(elem_id="prompt-container",equal_height=True):
with gr.Row():
prompt = gr.Textbox(placeholder="Your prompt", show_label=False, elem_id="prompt", lines=5)
with gr.Row(equal_height=True):
btn = gr.Button("Inpaint!", elem_id="run_button")
with gr.Accordion(label="Advanced Settings", open=False):
with gr.Row(equal_height=True):
guidance_scale = gr.Number(value=7.5, minimum=1.0, maximum=20.0, step=0.1, label="guidance_scale")
steps = gr.Number(value=40, minimum=10, maximum=100, step=1, label="steps")
strength = gr.Number(value=0.8, minimum=0.01, maximum=1.0, step=0.01, label="strength")
negative_prompt = gr.Textbox(label="negative_prompt", placeholder="Your negative prompt", info="what you don't want to see in the image")
with gr.Row(equal_height=True):
models = ["Realistic_V5.0","Realistic_V5.1","Realistic_V6.0","Epic_Realism"]
model = gr.Dropdown(label="Models",choices=models,value="Realistic_V5.0")
with gr.Row(equal_height=True):
schedulers = ["DEISMultistepScheduler", "HeunDiscreteScheduler", "EulerDiscreteScheduler", "DPMSolverMultistepScheduler", "DPMSolverMultistepScheduler-Karras", "DPMSolverMultistepScheduler-Karras-SDE"]
scheduler = gr.Dropdown(label="Schedulers", choices=schedulers, value="DPMSolverMultistepScheduler-Karras")
with gr.Column():
image_out = gr.Image(label="Output", elem_id="output-img", height=512, width=512)
image_out1 = gr.Image(label="Output", elem_id="output-img", height=512, width=512)
with gr.Group(elem_id="share-btn-container", visible=False) as share_btn_container:
community_icon = gr.HTML(community_icon_html)
loading_icon = gr.HTML(loading_icon_html)
share_button = gr.Button("Share to community", elem_id="share-btn",visible=True)
btn.click(fn=predict, inputs=[image, prompt, negative_prompt, guidance_scale, steps, strength, model, scheduler], outputs=[image_out,image_out1,share_btn_container], api_name='run')
prompt.submit(fn=predict, inputs=[image, prompt, negative_prompt, guidance_scale, steps, strength, model, scheduler], outputs=[image_out,image_out1,share_btn_container])
share_button.click(None, [], [], _js=share_js)
image_blocks.queue(max_size=25,api_open=True).launch(show_api=True)