File size: 8,506 Bytes
8fd0cd1
 
965fecf
e57b7d5
51270f5
 
5d9aa34
8fd0cd1
 
51270f5
8fd0cd1
 
 
 
 
4928b51
 
5d9aa34
 
 
 
4928b51
 
 
 
 
 
8fd0cd1
 
 
ad57993
 
e57b7d5
8fd0cd1
e6c2d69
9635ab5
e6c2d69
 
9bf6989
 
e6c2d69
0825aa9
 
 
 
e6c2d69
0825aa9
 
790c473
 
 
 
 
 
 
 
 
 
 
 
8fd0cd1
 
00d56f0
 
8fd0cd1
 
790c473
8fd0cd1
 
9bf6989
 
8fd0cd1
 
 
0c6ce0e
8fd0cd1
 
 
 
 
 
d442146
 
4f9a30e
 
 
 
 
d442146
8fd0cd1
 
0c6ce0e
 
 
790c473
 
 
 
 
 
 
 
9635ab5
e6c2d69
 
 
 
 
790c473
0c6ce0e
e6c2d69
 
 
 
 
 
 
 
 
 
0c6ce0e
8fd0cd1
 
 
 
 
 
 
 
 
 
 
 
 
9635ab5
 
 
 
 
f15bd01
9635ab5
 
 
 
 
 
f15bd01
9635ab5
 
 
0825aa9
9635ab5
 
f15bd01
9635ab5
 
 
 
 
 
f15bd01
9635ab5
 
eb34868
8fd0cd1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e57b7d5
8fd0cd1
e57b7d5
8fd0cd1
 
d442146
e57b7d5
ad57993
4f9a30e
d442146
 
 
8fd0cd1
 
 
9635ab5
8fd0cd1
 
 
 
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
import gradio as gr
import numpy as np
import random
from PIL import Image
import spaces
import torch
from huggingface_hub import hf_hub_download
from diffusers import FluxPriorReduxPipeline, FluxPipeline
from diffusers.utils import load_image

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

pipe = FluxPipeline.from_pretrained(
    "black-forest-labs/FLUX.1-dev" , 
    torch_dtype=torch.bfloat16
).to("cuda")
pipe.load_lora_weights(hf_hub_download("ByteDance/Hyper-SD", "Hyper-FLUX.1-dev-8steps-lora.safetensors"), lora_scale=0.125)
pipe.fuse_lora(lora_scale=0.125)
pipe.to(device="cuda", dtype=torch.bfloat16)

pipe_prior_redux = FluxPriorReduxPipeline.from_pretrained(
    "black-forest-labs/FLUX.1-Redux-dev",
    text_encoder=pipe.text_encoder,
    tokenizer=pipe.tokenizer,
    text_encoder_2=pipe.text_encoder_2,
    tokenizer_2=pipe.tokenizer_2,
    torch_dtype=torch.bfloat16
).to("cuda")

examples = [[Image.open("mona_lisa.jpg"), "pink hair, at the beach", None, "", 0.035, 1., 1., 1., 1., 0, False], 
            [Image.open("1665_Girl_with_a_Pearl_Earring.jpg"), "", Image.open("dali_example.jpg"), "", 0.08, .4, .6, .33, 1., 1912857110, False]]

@spaces.GPU
def infer(control_image, prompt,  image_2, prompt_2, reference_scale= 0.03 , 
          prompt_embeds_scale_1 =1, prompt_embeds_scale_2 =1, pooled_prompt_embeds_scale_1 =1, pooled_prompt_embeds_scale_2 =1,
          seed=42, randomize_seed=False, width=1024, height=1024, 
          guidance_scale=3.5, num_inference_steps=28, progress=gr.Progress(track_tqdm=True)):
    if randomize_seed:
        seed = random.randint(0, MAX_SEED)
    if image_2 is not None:
        pipe_prior_output = pipe_prior_redux([control_image, image_2], 
                                             prompt=[prompt, prompt_2],
                                            prompt_embeds_scale = [prompt_embeds_scale_1, prompt_embeds_scale_2],
                                            pooled_prompt_embeds_scale = [pooled_prompt_embeds_scale_1, pooled_prompt_embeds_scale_2])
    else:
        pipe_prior_output = pipe_prior_redux(control_image, prompt=prompt,  prompt_embeds_scale = [prompt_embeds_scale_1],
                                            pooled_prompt_embeds_scale = [pooled_prompt_embeds_scale_1])
    cond_size = 729
    hidden_size = 4096
    max_sequence_length = 512
    full_attention_size = max_sequence_length + hidden_size + cond_size
    attention_mask = torch.zeros(
        (full_attention_size, full_attention_size), device="cuda", dtype=torch.bfloat16
    )
    bias = torch.log(
        torch.tensor(reference_scale, dtype=torch.bfloat16, device="cuda").clamp(min=1e-5, max=1)
    )
    attention_mask[:, max_sequence_length : max_sequence_length + cond_size] = bias
    joint_attention_kwargs=dict(attention_mask=attention_mask)
    images = pipe(
        guidance_scale=guidance_scale,
        width=width, 
        height=height, 
        num_inference_steps=num_inference_steps,
        generator=torch.Generator("cpu").manual_seed(seed),
        joint_attention_kwargs=joint_attention_kwargs,
        **pipe_prior_output,
    ).images[0]
    return images, seed

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"""# ⚡️ Fast FLUX.1 Redux [dev] ⚡️
An adapter for FLUX [dev] to create image variations combined with ByteDance [
Hyper FLUX 8 Steps LoRA](https://huggingface.co/ByteDance/Hyper-SD) 🏎️
Now with added support: 
- prompt input
- attention masking for improved prompt adherence
- multiple image interpolation

[[non-commercial license](https://huggingface.co/black-forest-labs/FLUX.1-dev/blob/main/LICENSE.md)] [[blog](https://blackforestlabs.ai/announcing-black-forest-labs/)] [[model](https://huggingface.co/black-forest-labs/FLUX.1-dev)]
        """)
        with gr.Row():
            with gr.Column():
                    input_image = gr.Image(label="Image to create variations", type="pil")
                    prompt = gr.Text(
                        label="Prompt",
                        show_label=False,
                        max_lines=1,
                        placeholder="Enter your prompt",
                        container=False,
                    )
                    reference_scale = gr.Slider(
                        info="lower to enhance prompt adherence",
                        label="Masking Scale",
                        minimum=0.01,
                        maximum=0.08,
                        step=0.001,
                        value=0.03,
                    )
                    run_button = gr.Button("Run")
            with gr.Column():
                    image_2 = gr.Image(label="2nd image to create interpolated variations", type="pil")
                    prompt_2 = gr.Text(
                        label="2nd Prompt",
                        show_label=False,
                        max_lines=1,
                        placeholder="Enter your prompt",
                        container=False,
                    )
                    
            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():
                prompt_embeds_scale_1 = gr.Slider(
                        label="prompt embeds scale 1st image",
                        minimum=0,
                        maximum=1.5,
                        step=0.01,
                        value=1,
                    )
                prompt_embeds_scale_2 = gr.Slider(
                        label="prompt embeds scale 2nd image",
                        minimum=0,
                        maximum=1.5,
                        step=0.01,
                        value=1,
                    )
                pooled_prompt_embeds_scale_1 = gr.Slider(
                        label="pooled prompt embeds scale 1nd image",
                        minimum=0,
                        maximum=1.5,
                        step=0.01,
                        value=1,
                    )
                pooled_prompt_embeds_scale_2 = gr.Slider(
                        label="pooled prompt embeds scale 2nd image",
                        minimum=0,
                        maximum=1.5,
                        step=0.01,
                        value=1,
                    )
               
            with gr.Row():
                
                width = gr.Slider(
                    label="Width",
                    minimum=256,
                    maximum=MAX_IMAGE_SIZE,
                    step=32,
                    value=1024,
                )
                
                height = gr.Slider(
                    label="Height",
                    minimum=256,
                    maximum=MAX_IMAGE_SIZE,
                    step=32,
                    value=1024,
                )
            
            with gr.Row():

                guidance_scale = gr.Slider(
                    label="Guidance Scale",
                    minimum=1,
                    maximum=15,
                    step=0.1,
                    value=3.5,
                )
  
                num_inference_steps = gr.Slider(
                    label="Number of inference steps",
                    minimum=1,
                    maximum=30,
                    step=1,
                    value=8,
                )

        gr.Examples(
                examples=examples,
                inputs=[input_image, prompt, image_2, prompt_2, reference_scale, prompt_embeds_scale_1, prompt_embeds_scale_2, pooled_prompt_embeds_scale_1, pooled_prompt_embeds_scale_2, seed, randomize_seed],
                outputs=[result, seed],
                fn=infer,
            )

    gr.on(
        triggers=[run_button.click],
        fn = infer,
        inputs = [input_image, prompt, image_2, prompt_2, reference_scale, prompt_embeds_scale_1, prompt_embeds_scale_2, pooled_prompt_embeds_scale_1, pooled_prompt_embeds_scale_2, seed, randomize_seed, width, height, guidance_scale, num_inference_steps],
        outputs = [result, seed]
    )

demo.launch()