FLUX.1-inpaint / app.py
Fabrice-TIERCELIN's picture
This PR adds the "Guidance Scale" parameter
6f60bb9 verified
raw
history blame
4.62 kB
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)
@spaces.GPU()
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)