File size: 4,178 Bytes
a2f8ee0
6453bed
 
 
a2f8ee0
 
ac1b901
 
 
 
 
a2f8ee0
496dbd8
ac1b901
6453bed
75f921d
 
 
6453bed
75f921d
 
ca70941
75f921d
 
a2f8ee0
 
 
ca70941
a2f8ee0
 
 
 
6b2baab
a2f8ee0
75f921d
a2f8ee0
48d37f2
 
 
 
a2f8ee0
6b2baab
a2f8ee0
 
ca70941
a2f8ee0
6b2baab
a2f8ee0
 
 
 
 
 
 
6453bed
75f921d
9adc3f1
a2f8ee0
 
 
 
 
 
 
 
 
 
 
 
 
9adc3f1
a2f8ee0
 
 
 
 
 
e849d5a
a2f8ee0
 
 
 
 
 
 
 
 
 
 
 
 
 
a5afc6b
6453bed
cc4a3ff
 
6453bed
a2f8ee0
 
 
6453bed
75f921d
a2f8ee0
486fdc6
a2f8ee0
75f921d
a2f8ee0
75f921d
a2f8ee0
75f921d
a2f8ee0
 
 
75f921d
a2f8ee0
 
 
 
75f921d
8a3405a
cc4a3ff
a2f8ee0
dced90f
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
import spaces
import gradio as gr
import re
from PIL import Image
import os
import numpy as np
import torch
from diffusers import FluxImg2ImgPipeline

dtype = torch.bfloat16
device = "cuda" if torch.cuda.is_available() else "cpu"

pipe = FluxImg2ImgPipeline.from_pretrained("black-forest-labs/FLUX.1-schnell", torch_dtype=torch.bfloat16).to(device)

def sanitize_prompt(prompt):
    allowed_chars = re.compile(r"[^a-zA-Z0-9\s.,!?-]")
    sanitized_prompt = allowed_chars.sub("", prompt)
    return sanitized_prompt

def convert_to_fit_size(original_width_and_height, maximum_size=2048):
    width, height = original_width_and_height
    if width <= maximum_size and height <= maximum_size:
        return width, height
    scaling_factor = maximum_size / max(width, height)
    new_width = int(width * scaling_factor)
    new_height = int(height * scaling_factor)
    return new_width, new_height

def adjust_to_multiple_of_32(width: int, height: int):
    width = width - (width % 32)
    height = height - (height % 32)
    return width, height

@spaces.GPU(duration=120)
def process_images(image, prompt="a girl", strength=0.75, seed=0, inference_step=4, progress=gr.Progress(track_tqdm=True)):
    progress(0, desc="Starting")

    if image is None or not hasattr(image, 'size'):
        raise gr.Error("Please upload an image.")

    def process_img2img(image, prompt="a person", strength=0.75, seed=0, num_inference_steps=4):
        generator = torch.Generator(device).manual_seed(seed)
        width, height = convert_to_fit_size(image.size)
        width, height = adjust_to_multiple_of_32(width, height)
        image = image.resize((width, height), Image.LANCZOS)
        output = pipe(prompt=prompt, image=image, generator=generator, strength=strength, width=width, height=height, guidance_scale=0, num_inference_steps=num_inference_steps, max_sequence_length=256)
        return output.images[0]
    output = process_img2img(image, prompt, strength, seed, inference_step)
    return output

def read_file(path: str) -> str:
    with open(path, 'r', encoding='utf-8') as f:
        content = f.read()
    return content

css = """
#demo-container {
    border: 4px solid black;
    border-radius: 8px;
    padding: 20px;
    margin: 20px auto;
    max-width: 800px;
}

#image_upload, #output-img {
    border: 4px solid black;
    border-radius: 8px;
    width: 256px;
    height: 256px;
    object-fit: cover;
}

#run_button {
    font-weight: bold;
    border: 4px solid black;
    border-radius: 8px;
    padding: 10px 20px;
    width: 100%
}

#col-left, #col-right {
    max-width: 640px;
    margin: 0 auto;
}
.grid-container {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 10px;
}
.text {
    font-size: 16px;
}
"""

with gr.Blocks(css=css, elem_id="demo-container") as demo:
    with gr.Column():
        gr.HTML(read_file("demo_header.html"))
        # Removed or commented out the demo_tools.html line
        # gr.HTML(read_file("demo_tools.html"))
    with gr.Row():
        with gr.Column():
            image = gr.Image(width=256, height=256, sources=['upload', 'clipboard'], image_mode='RGB', elem_id="image_upload", type="pil", label="Upload")
            prompt = gr.Textbox(label="Prompt", value="", placeholder="Your prompt", elem_id="prompt")
            btn = gr.Button("Generate", elem_id="run_button", variant="primary")
            with gr.Accordion(label="Advanced Settings", open=False):
                strength = gr.Number(value=0.75, minimum=0, maximum=0.75, step=0.01, label="Strength")
                seed = gr.Number(value=100, minimum=0, step=1, label="Seed")
                inference_step = gr.Number(value=4, minimum=1, step=4, label="Inference Steps")
        with gr.Column():
            image_out = gr.Image(width=256, height=256, label="Output", elem_id="output-img", format="jpg")

    gr.HTML(gr.HTML(read_file("demo_footer.html")))
    
    gr.on(
        triggers=[btn.click, prompt.submit],
        fn=process_images,
        inputs=[image, prompt, strength, seed, inference_step],
        outputs=[image_out]
    )

if __name__ == "__main__":
    demo.queue().launch(show_error=True)