Spaces:
Running
on
Zero
Running
on
Zero
import torch | |
import spaces | |
import gradio as gr | |
from diffusers import FluxInpaintPipeline | |
import random | |
import numpy as np | |
MARKDOWN = """ | |
# FLUX.1 Inpainting 🎨 | |
Shoutout to [Black Forest Labs](https://huggingface.co./black-forest-labs) team for | |
creating this amazing model, and a big thanks to [Gothos](https://github.com/Gothos) | |
for taking it to the next level by enabling inpainting with the FLUX. | |
""" | |
MAX_SEED = np.iinfo(np.int32).max | |
DEVICE = "cuda" if torch.cuda.is_available() else "cpu" | |
pipe = FluxInpaintPipeline.from_pretrained( | |
"black-forest-labs/FLUX.1-schnell", torch_dtype=torch.bfloat16).to(DEVICE) | |
def process(input_image_editor, uploaded_mask, input_text, strength, seed, randomize_seed, num_inference_steps, guidance_scale=3.5, progress=gr.Progress(track_tqdm=True)): | |
if not input_text: | |
raise gr.Error("Please enter a text prompt.") | |
image = input_image_editor['background'] | |
if uploaded_mask is None: | |
mask_image = input_image_editor['layers'][0] | |
else: | |
mask_image = uploaded_mask | |
if not image: | |
raise gr.Error("Please upload an image.") | |
if not mask_image: | |
raise gr.Error("Please draw or upload a mask on the image.") | |
width, height = image.size | |
if randomize_seed: | |
seed = random.randint(0, MAX_SEED) | |
generator = torch.Generator(device=DEVICE).manual_seed(seed) | |
result = pipe( | |
prompt=input_text, | |
image=image, | |
mask_image=mask_image, | |
width=width, | |
height=height, | |
strength=strength, | |
num_inference_steps=num_inference_steps, | |
generator=generator, | |
guidance_scale=guidance_scale | |
).images[0] | |
return result, mask_image, seed | |
with gr.Blocks(theme=gr.themes.Soft()) as demo: | |
gr.Markdown(MARKDOWN) | |
with gr.Row(): | |
with gr.Column(scale=1): | |
input_image_editor_component = gr.ImageEditor( | |
label='Image', | |
type='pil', | |
sources=["upload", "webcam"], | |
image_mode='RGB', | |
layers=False, | |
brush=gr.Brush(colors=["#FFFFFF"], color_mode="fixed")) | |
input_text_component = gr.Text( | |
label="Prompt", | |
show_label=False, | |
max_lines=1, | |
placeholder="Enter your prompt", | |
container=False, | |
) | |
with gr.Accordion("Advanced Settings", open=False): | |
strength_slider = gr.Slider( | |
minimum=0.0, | |
maximum=1.0, | |
value=0.7, | |
step=0.01, | |
label="Strength" | |
) | |
num_inference_steps = gr.Slider( | |
minimum=1, | |
maximum=100, | |
value=30, | |
step=1, | |
label="Number of inference steps" | |
) | |
guidance_scale = gr.Slider( | |
label="Guidance Scale", | |
minimum=1, | |
maximum=15, | |
step=0.1, | |
value=3.5, | |
) | |
seed_number = gr.Number( | |
label="Seed", | |
value=42, | |
precision=0 | |
) | |
randomize_seed = gr.Checkbox(label="Randomize seed", value=True) | |
with gr.Accordion("Upload a mask", open=False): | |
uploaded_mask_component = gr.Image(label="Already made mask (black pixels will be preserved, white pixels will be redrawn)", sources=["upload"], type="pil") | |
submit_button_component = gr.Button( | |
value='Inpaint', variant='primary') | |
with gr.Column(scale=1): | |
output_image_component = gr.Image( | |
type='pil', image_mode='RGB', label='Generated image') | |
with gr.Accordion("Debug Info", open=False): | |
output_mask_component = gr.Image( | |
type='pil', image_mode='RGB', label='Input mask') | |
output_seed = gr.Number(label="Used Seed") | |
submit_button_component.click( | |
fn=process, | |
inputs=[ | |
input_image_editor_component, | |
uploaded_mask_component, | |
input_text_component, | |
strength_slider, | |
seed_number, | |
randomize_seed, | |
num_inference_steps, | |
guidance_scale | |
], | |
outputs=[ | |
output_image_component, | |
output_mask_component, | |
output_seed | |
] | |
) | |
demo.launch(debug=False, show_error=True) |