Flux.1-Fill-dev / app.py
vilarin's picture
Update app.py
6ab5cc8 verified
raw
history blame
3.63 kB
import os
import torch
import spaces
import gradio as gr
from diffusers import FluxFillPipeline
import random
import numpy as np
from huggingface_hub import hf_hub_download
from PIL import Image, ImageOps
CSS = """
h1 {
margin-top: 10px
}
"""
os.environ["HF_HUB_ENABLE_HF_TRANSFER"] = "1"
MAX_SEED = np.iinfo(np.int32).max
repo_id = "black-forest-labs/FLUX.1-Fill-dev"
if torch.cuda.is_available():
pipe = FluxFillPipeline.from_pretrained(repo_id, torch_dtype=torch.bfloat16).to("cuda")
@spaces.GPU()
def inpaintGen(
imgMask,
inpaint_prompt: str,
guidance: float,
num_steps: int,
seed: int,
randomize_seed: bool,
progress=gr.Progress(track_tqdm=True)):
source_path = imgMask["background"]
mask_path = imgMask["layers"][0]
if not source_path:
raise gr.Error("Please upload an image.")
if not mask_path:
raise gr.Error("Please draw a mask on the image.")
source_img = Image.open(source_path).convert("RGB")
mask_img = Image.open(mask_path)
alpha_channel=mask_img.split()[3]
binary_mask = alpha_channel.point(lambda p: p > 0 and 255)
width, height = source_img.size
new_width = (width // 16) * 16
new_height = (height // 16) * 16
# If the image size is not already divisible by 16, resize it
if width != new_width or height != new_height:
source_img = source_img.resize((new_width, new_height), Image.LANCZOS)
if randomize_seed:
seed = random.randint(0, MAX_SEED)
generator = torch.Generator("cpu").manual_seed(seed)
result = pipe(
prompt=inpaint_prompt,
image=source_img,
mask_image=binary_mask,
width=new_width,
height=new_height,
num_inference_steps=num_steps,
generator=generator,
guidance_scale=guidance,
max_sequence_length=512,
).images[0]
return result, seed
with gr.Blocks(theme="ocean", title="Flux.1 Fill dev", css=CSS) as demo:
gr.HTML("<h1><center>Flux.1 Fill dev</center></h1>")
gr.HTML("""
<p>
<center>
FLUX.1 Fill [dev] is a 12 billion parameter rectified flow transformer capable of filling areas in existing images based on a text description.
</center>
</p>
""")
with gr.Row():
with gr.Column():
imgMask = gr.ImageMask(type="filepath", label="Image", layers=False, height=800)
inpaint_prompt = gr.Textbox(label='Prompts ✏️', placeholder="A hat...")
with gr.Row():
Inpaint_sendBtn = gr.Button(value="Submit", variant='primary')
Inpaint_clearBtn = gr.ClearButton([imgMask, inpaint_prompt], value="Clear")
image_out = gr.Image(type="pil", label="Output", height=960)
with gr.Accordion("Advanced ⚙️", open=False):
guidance = gr.Slider(label="Guidance scale", minimum=1, maximum=50, value=30.0, step=0.1)
num_steps = gr.Slider(label="Steps", minimum=1, maximum=50, value=20, step=1)
seed = gr.Number(label="Seed", value=42, precision=0)
randomize_seed = gr.Checkbox(label="Randomize seed", value=True)
gr.on(
triggers = [
inpaint_prompt.submit,
Inpaint_sendBtn.click,
],
fn = inpaintGen,
inputs = [
imgMask,
inpaint_prompt,
guidance,
num_steps,
seed,
randomize_seed
],
outputs = [image_out, seed]
)
if __name__ == "__main__":
demo.queue(api_open=False).launch(show_api=False, share=False)