File size: 7,331 Bytes
3210048
5193654
50d6b20
 
f9694e5
c1581f5
8b821ae
 
 
50d6b20
8b821ae
5193654
3210048
50d6b20
5193654
 
 
9335613
c6696f9
 
6f47450
c1581f5
 
5193654
ed7e1f3
 
 
 
 
 
 
 
 
 
8b821ae
 
 
 
 
 
 
 
a9d7fe1
8b821ae
ed7e1f3
 
 
50d6b20
ed7e1f3
 
 
 
5193654
ed7e1f3
 
5193654
ed7e1f3
 
 
 
 
 
 
5193654
ed7e1f3
 
 
5193654
ed7e1f3
 
 
 
 
 
5193654
ed7e1f3
 
 
5193654
ed7e1f3
5193654
50d6b20
ed7e1f3
50d6b20
 
5193654
ed7e1f3
5193654
 
 
6f47450
c1581f5
50d6b20
c1581f5
5193654
ed7e1f3
5193654
 
 
 
 
 
b0b7bea
50d6b20
 
e0123d5
50d6b20
e0123d5
f9694e5
e0123d5
50d6b20
f9694e5
50d6b20
 
 
 
 
 
 
 
5193654
 
 
 
 
3210048
5193654
50d6b20
5193654
50d6b20
 
5193654
 
 
50d6b20
 
5193654
50d6b20
 
c3e1273
50d6b20
5193654
50d6b20
5193654
 
c3e1273
5193654
50d6b20
5193654
ed7e1f3
c1581f5
 
 
 
 
 
5193654
f9694e5
5193654
f9694e5
5193654
50d6b20
5193654
50d6b20
 
 
 
 
5193654
50d6b20
5193654
f9694e5
50d6b20
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ed7e1f3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
50d6b20
 
 
ed7e1f3
50d6b20
3210048
 
6f47450
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
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
import gradio as gr
import numpy as np

import spaces
import random
# from image_gen_aux import DepthPreprocessor
from PIL import Image
import torch
from torchvision import transforms

from diffusers import FluxFillPipeline, AutoencoderKL
from PIL import Image


MAX_SEED = np.iinfo(np.int32).max
MAX_IMAGE_SIZE = 2048

pipe = FluxFillPipeline.from_pretrained("black-forest-labs/FLUX.1-Fill-dev", torch_dtype=torch.bfloat16).to("cuda")
pipe.load_lora_weights("alvdansen/flux-koda")
pipe.enable_lora()

# vae = AutoencoderKL.from_pretrained("black-forest-labs/FLUX.1-dev", subfolder="vae")
# processor = DepthPreprocessor.from_pretrained("LiheYoung/depth-anything-large-hf")

# preprocess = transforms.Compose(
#     [
#         transforms.Resize(
#             (vae.config.sample_size, vae.config.sample_size),
#             interpolation=transforms.InterpolationMode.BILINEAR,
#         ),
#         transforms.ToTensor(),
#         transforms.Normalize([0.5], [0.5]),
#     ]
# )
#
# image_np = image[0].cpu().numpy()  # Move to CPU and convert to NumPy

# if image_np.shape[0] == 3:  # Check if channels are first
#     image_np = image_np.transpose(1, 2, 0)

# image_np = (image_np * 255).astype(np.uint8)

# image = Image.fromarray(image_np)

# def calculate_optimal_dimensions(image: Image.Image):
#     # Extract the original dimensions
#     original_width, original_height = image.size

#     # Set constants
#     MIN_ASPECT_RATIO = 9 / 16
#     MAX_ASPECT_RATIO = 16 / 9
#     FIXED_DIMENSION = 1024

#     # Calculate the aspect ratio of the original image
#     original_aspect_ratio = original_width / original_height

#     # Determine which dimension to fix
#     if original_aspect_ratio > 1:  # Wider than tall
#         width = FIXED_DIMENSION
#         height = round(FIXED_DIMENSION / original_aspect_ratio)
#     else:  # Taller than wide
#         height = FIXED_DIMENSION
#         width = round(FIXED_DIMENSION * original_aspect_ratio)

#     # Ensure dimensions are multiples of 8
#     width = (width // 8) * 8
#     height = (height // 8) * 8

#     # Enforce aspect ratio limits
#     calculated_aspect_ratio = width / height
#     if calculated_aspect_ratio > MAX_ASPECT_RATIO:
#         width = (height * MAX_ASPECT_RATIO // 8) * 8
#     elif calculated_aspect_ratio < MIN_ASPECT_RATIO:
#         height = (width / MIN_ASPECT_RATIO // 8) * 8

#     # Ensure width and height remain above the minimum dimensions
#     width = max(width, 576) if width == FIXED_DIMENSION else width
#     height = max(height, 576) if height == FIXED_DIMENSION else height

#     return width, height

@spaces.GPU(durations=300)
def infer(edit_images, prompt, prompt2, width, height, seed=42, randomize_seed=False, guidance_scale=3.5, num_inference_steps=28, progress=gr.Progress(track_tqdm=True)):
    # pipe.enable_xformers_memory_efficient_attention()

    image = edit_images["background"]
    # width, height = calculate_optimal_dimensions(image)
    mask = edit_images["layers"][0]
    if randomize_seed:
        seed = random.randint(0, MAX_SEED)

    # controlImage = processor(image)
    image = pipe(
        # mask_image_latent=vae.encode(controlImage),
        prompt=prompt,
        prompt_2=prompt2,
        image=image,
        mask_image=mask,
        height=height,
        width=width,
        guidance_scale=guidance_scale,
        num_inference_steps=num_inference_steps,
        generator=torch.Generator(device='cuda').manual_seed(seed),
        # lora_scale=0.75 // not supported in this version
    ).images[0]

    output_image_jpg = image.convert("RGB")
    output_image_jpg.save("output.jpg", "JPEG")

    return output_image_jpg, seed
    # return image, seed

examples = [
    "photography of a young woman,  accent lighting,  (front view:1.4),  "
    # "a tiny astronaut hatching from an egg on the moon",
    # "a cat holding a sign that says hello world",
    # "an anime illustration of a wiener schnitzel",
]

css="""
#col-container {
    margin: 0 auto;
    max-width: 1000px;
}
"""

with gr.Blocks(css=css) as demo:

    with gr.Column(elem_id="col-container"):
        gr.Markdown(f"""# FLUX.1 [dev]
        """)
        with gr.Row():
            with gr.Column():
                edit_image = gr.ImageEditor(
                    label='Upload and draw mask for inpainting',
                    type='pil',
                    sources=["upload", "webcam"],
                    image_mode='RGB',
                    layers=False,
                    brush=gr.Brush(colors=["#FFFFFF"]),
                    # height=600
                )
                prompt = gr.Text(
                    label="Prompt",
                    show_label=False,
                    max_lines=2,
                    placeholder="Enter your prompt",
                    container=False,
                )
                prompt2 = gr.Text(
                    label="Prompt2",
                    show_label=False,
                    max_lines=2,
                    placeholder="Enter your second prompt",
                    container=False,
                )
                run_button = gr.Button("Run")

            result = gr.Image(label="Result", show_label=False)

        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)

            with gr.Row():

                width = gr.Slider(
                    label="Width",
                    minimum=256,
                    maximum=MAX_IMAGE_SIZE,
                    step=32,
                    value=1024,
                    visible=False
                )

                height = gr.Slider(
                    label="Height",
                    minimum=256,
                    maximum=MAX_IMAGE_SIZE,
                    step=32,
                    value=1024,
                    visible=False
                )

            with gr.Row():

                guidance_scale = gr.Slider(
                    label="Guidance Scale",
                    minimum=1,
                    maximum=30,
                    step=0.5,
                    value=50,
                )

                num_inference_steps = gr.Slider(
                    label="Number of inference steps",
                    minimum=1,
                    maximum=50,
                    step=1,
                    value=28,
                )

            with gr.Row():

                width = gr.Slider(
                    label="width",
                    minimum=512,
                    maximum=3072,
                    step=1,
                    value=1024,
                )

                num_inference_steps = gr.Slider(
                    label="height",
                    minimum=512,
                    maximum=3072,
                    step=1,
                    value=1024,
                )

    gr.on(
        triggers=[run_button.click, prompt.submit],
        fn = infer,
        inputs = [edit_image, prompt, prompt2, width, height, seed, randomize_seed, width, height, guidance_scale, num_inference_steps],
        outputs = [result, seed]
    )

demo.launch()