Spaces:
Running
on
Zero
Running
on
Zero
File size: 7,527 Bytes
5d2e1c0 d4ba349 5d2e1c0 d4ba349 96ccc11 d4ba349 79f7c2a 43ed6ba 5d2e1c0 d4ba349 329ffa9 d4ba349 5d2e1c0 d4ba349 08e58ba c0f9599 d4ba349 08e58ba e507485 d4ba349 08e58ba d4ba349 9056b59 77b110d d4ba349 5d2e1c0 d4ba349 5d2e1c0 d4ba349 5d2e1c0 061f1a0 d4ba349 5d2e1c0 d4ba349 3d42234 d4ba349 9056b59 3d42234 9056b59 3d42234 9056b59 3d42234 9056b59 3d42234 9056b59 d4ba349 5d2e1c0 d4ba349 9056b59 d4ba349 5d2e1c0 3d42234 |
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 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 |
import gradio as gr
import numpy as np
import spaces
import torch
import random
from PIL import Image
import os
from diffusers import FluxKontextPipeline
from diffusers.utils import load_image
from huggingface_hub import login, hf_hub_download
login(token=os.environ.get("HF_token"))
MAX_SEED = np.iinfo(np.int32).max
pipe = FluxKontextPipeline.from_pretrained("black-forest-labs/FLUX.1-Kontext-dev", torch_dtype=torch.bfloat16).to("cuda")
@spaces.GPU
def infer(input_image, prompt, seed=42, randomize_seed=False, guidance_scale=2.5, steps=28, width=2048, height=256, progress=gr.Progress(track_tqdm=True)):
"""
Perform image editing using the FLUX.1 Kontext pipeline.
This function takes an input image and a text prompt to generate a modified version
of the image based on the provided instructions. It uses the FLUX.1 Kontext model
for contextual image editing tasks.
Args:
input_image (PIL.Image.Image): The input image to be edited. Will be converted
to RGB format if not already in that format.
prompt (str): Text description of the desired edit to apply to the image.
Examples: "Remove glasses", "Add a hat", "Change background to beach".
seed (int, optional): Random seed for reproducible generation. Defaults to 42.
Must be between 0 and MAX_SEED (2^31 - 1).
randomize_seed (bool, optional): If True, generates a random seed instead of
using the provided seed value. Defaults to False.
guidance_scale (float, optional): Controls how closely the model follows the
prompt. Higher values mean stronger adherence to the prompt but may reduce
image quality. Range: 1.0-10.0. Defaults to 2.5.
steps (int, optional): Controls how many steps to run the diffusion model for.
Range: 1-30. Defaults to 28.
progress (gr.Progress, optional): Gradio progress tracker for monitoring
generation progress. Defaults to gr.Progress(track_tqdm=True).
Returns:
tuple: A 3-tuple containing:
- PIL.Image.Image: The generated/edited image
- int: The seed value used for generation (useful when randomize_seed=True)
- gr.update: Gradio update object to make the reuse button visible
Example:
>>> edited_image, used_seed, button_update = infer(
... input_image=my_image,
... prompt="Add sunglasses",
... seed=123,
... randomize_seed=False,
... guidance_scale=2.5
... )
"""
if randomize_seed:
seed = random.randint(0, MAX_SEED)
if input_image:
input_image = input_image.convert("RGB")
original_width, original_height = input_image.width, input_image.height
now_width, now_height = input_image.width, input_image.height
scale = 2
if (input_image.height // input_image.width >= 5 or input_image.width // input_image.height >= 5) and (input_image.width < 2560 and input_image.height < 2560):
# if input_image.height < input_image.width:
# input_image.resize((original_width, original_height * scale ))
# now_width, now_height = input_image.width, input_image.height * scale
# else:
# input_image.resize((original_width * scale, original_height))
# now_width, now_height = input_image.width * scale, input_image.height
input_image.resize((original_width, original_height * scale ))
now_width, now_height = input_image.width, input_image.height * scale
image = pipe(
image=input_image,
prompt=prompt,
guidance_scale=guidance_scale,
num_inference_steps=steps,
generator=torch.Generator().manual_seed(seed),
width=now_width,
height=now_height,
_auto_resize=False,
).images[0]
image = image.resize((original_width, original_height))
else:
image = pipe(
prompt=prompt,
guidance_scale=guidance_scale,
num_inference_steps=steps,
generator=torch.Generator().manual_seed(seed),
width=width,
height=height,
).images[0]
return image, seed, gr.update(visible=True)
css="""
#col-container {
margin: 0 auto;
max-width: 960px;
}
"""
with gr.Blocks(css=css) as demo:
with gr.Column(elem_id="col-container"):
gr.Markdown(f"""# FLUX.1 Kontext [dev]
当上传参考图后,不能自定义输出尺寸,输出尺寸默认和输入图像的尺寸相同。
Image editing and manipulation model guidance-distilled from FLUX.1 Kontext [pro], [[blog]](https://bfl.ai/announcements/flux-1-kontext-dev) [[model]](https://huggingface.co/black-forest-labs/FLUX.1-Kontext-dev)
""")
with gr.Row():
with gr.Column():
input_image = gr.Image(label="Upload the image for editing", type="pil")
with gr.Row():
prompt = gr.Text(
label="Prompt",
show_label=False,
max_lines=1,
placeholder="Enter your prompt for editing (e.g., 'Remove glasses', 'Add a hat')",
container=False,
)
run_button = gr.Button("Run", scale=0)
with gr.Accordion("Advanced Settings", open=False):
seed = gr.Slider(
label="Seed",
minimum=0,
maximum=MAX_SEED,
step=1,
value=0,
)
randomize_seed = gr.Checkbox(label="Randomize seed", value=True)
guidance_scale = gr.Slider(
label="Guidance Scale",
minimum=1,
maximum=10,
step=0.1,
value=2.5,
)
steps = gr.Slider(
label="Steps",
minimum=1,
maximum=30,
value=20,
step=1
)
width = gr.Slider(
label="Width",
minimum=0,
maximum=10000,
step=1,
value=2048,
)
height = gr.Slider(
label="Height",
minimum=0,
maximum=10000,
step=1,
value=256,
)
with gr.Column():
result = gr.Image(label="Result", show_label=False, interactive=False)
reuse_button = gr.Button("Reuse this image", visible=False)
gr.on(
triggers=[run_button.click, prompt.submit],
fn = infer,
inputs = [input_image, prompt, seed, randomize_seed, guidance_scale, steps, width, height],
outputs = [result, seed, reuse_button]
)
reuse_button.click(
fn = lambda image: image,
inputs = [result],
outputs = [input_image]
)
demo.launch() |