File size: 7,249 Bytes
44d1940
 
 
005cd62
e21e1ed
 
44d1940
1319924
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
44d1940
005cd62
 
44d1940
 
 
 
 
005cd62
e21e1ed
44d1940
 
9da7937
070bee0
e21e1ed
f11f48a
e21e1ed
44d1940
e21e1ed
 
44d1940
 
f11f48a
e21e1ed
44d1940
 
 
 
 
 
ba6d6cf
 
44d1940
 
 
 
ba6d6cf
 
 
 
 
 
 
 
 
 
f11f48a
ba6d6cf
f11f48a
ba6d6cf
f11f48a
ba6d6cf
f11f48a
 
 
 
 
44d1940
 
 
 
 
 
 
 
e21e1ed
44d1940
ba6d6cf
 
 
 
 
 
 
 
 
 
 
44d1940
e21e1ed
ba6d6cf
e21e1ed
44d1940
 
 
 
 
 
 
e21e1ed
f11f48a
e21e1ed
ba6d6cf
44d1940
ba6d6cf
f11f48a
1319924
9b40850
f11f48a
44d1940
 
e21e1ed
44d1940
e21e1ed
9b40850
 
 
 
 
 
e21e1ed
44d1940
e21e1ed
44d1940
 
 
 
 
e21e1ed
44d1940
e21e1ed
44d1940
 
 
 
 
e21e1ed
44d1940
005cd62
e21e1ed
005cd62
 
 
 
 
 
 
ba6d6cf
44d1940
 
 
 
ba6d6cf
f11f48a
 
ba6d6cf
 
f11f48a
 
 
 
 
44d1940
 
005cd62
44d1940
 
 
 
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
import gradio as gr
import numpy as np
import random
from diffusers import DiffusionPipeline
from safetensors.torch import load_file
from huggingface_hub import hf_hub_download
import torch
from typing import Tuple

style_list = [
    {
        "name": "(No style)",
        "prompt": "{prompt}",
        "negative_prompt": "",
    },
    {
        "name": "Cinematic",
        "prompt": "cinematic still {prompt} . emotional, harmonious, vignette, highly detailed, high budget, bokeh, cinemascope, moody, epic, gorgeous, film grain, grainy",
        "negative_prompt": "anime, cartoon, graphic, text, painting, crayon, graphite, abstract, glitch, deformed, mutated, ugly, disfigured",
    },
    {
        "name": "Photographic",
        "prompt": "cinematic photo {prompt} . 35mm photograph, film, bokeh, professional, 4k, highly detailed",
        "negative_prompt": "drawing, painting, crayon, sketch, graphite, impressionist, noisy, blurry, soft, deformed, ugly",
    },
    {
        "name": "Anime",
        "prompt": "anime artwork {prompt} . anime style, key visual, vibrant, studio anime,  highly detailed",
        "negative_prompt": "photo, deformed, black and white, realism, disfigured, low contrast",
    },
    {
        "name": "Digital Art",
        "prompt": "concept art {prompt} . digital artwork, illustrative, painterly, matte painting, highly detailed",
        "negative_prompt": "photo, photorealistic, realism, ugly",
    },
    {
        "name": "Fantasy art",
        "prompt": "ethereal fantasy concept art of  {prompt} . magnificent, celestial, ethereal, painterly, epic, majestic, magical, fantasy art, cover art, dreamy",
        "negative_prompt": "photographic, realistic, realism, 35mm film, dslr, cropped, frame, text, deformed, glitch, noise, noisy, off-center, deformed, cross-eyed, closed eyes, bad anatomy, ugly, disfigured, sloppy, duplicate, mutated, black and white",
    },
    {
        "name": "3D Model",
        "prompt": "professional 3d model {prompt} . octane render, highly detailed, volumetric, dramatic lighting",
        "negative_prompt": "ugly, deformed, noisy, low poly, blurry, painting",
    },
]

styles = {k["name"]: (k["prompt"], k["negative_prompt"]) for k in style_list}
STYLE_NAMES = list(styles.keys())
DEFAULT_STYLE_NAME = "(No style)"

def apply_style(style_name: str, positive: str, negative: str = "") -> Tuple[str, str]:
    p, n = styles.get(style_name, styles[DEFAULT_STYLE_NAME])
    return p.replace("{prompt}", positive), n + negative

pipe = DiffusionPipeline.from_pretrained("stabilityai/stable-diffusion-xl-base-1.0", torch_dtype=torch.float16, use_safetensors=True, variant="fp16")
pipe.to("cuda")


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

def infer(prompt, negative_prompt, width, height, guidance_scale, style_name=None):
    seed = random.randint(0,4294967295)

    generator = torch.Generator().manual_seed(seed)

    prompt, negative_prompt = apply_style(style_name, prompt, negative_prompt)

    image = [pipe(
        prompt = prompt,
        negative_prompt = negative_prompt,
        guidance_scale = guidance_scale,
        width = width,
        height = height,
        generator = generator
    ).images[0] for _ in range(4)]

    return image

examples = [
    "Astronaut in a jungle, cold color palette, muted colors, detailed, 8k",
    "An astronaut riding a green horse",
    "A delicious ceviche cheesecake slice",
    "A serious capybara at work, wearing a suit",
    'a graffiti of a robot serving meals to people',
]

css="""
#col-container {
            margin: 0 auto;
            max-width: 600px;
            padding-top: 20px;
            text-align: center;
        }
.header {
            margin: 25px auto 10px auto;
            text-align: center;
            max-width: 600px;
        }
.footer {
            margin: 25px auto 45px auto;
            text-align: center;
            max-width: 600px;
        }
.footer>p {
            font-size: .8rem;
            display: inline-block;
            padding: 0 10px;
            transform: translateY(10px);
        }
"""

if torch.cuda.is_available():
    power_device = "GPU"
else:
    power_device = "CPU"

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

    with gr.Column(elem_id="col-container"):
      gr.HTML(
            """
                <div class="header">
                  <h1>Welcome to Metamorph: Your Creative Gateway</h1>
                    <h4>
                    Transform your words into stunning visuals with our advanced AI-powered Text-to-Image generator
                    </h4>
                </div>
           """)
      gr.Markdown(f"""
        Currently running on {power_device}.
        """)

      with gr.Row():

            prompt = gr.Text(
                label="Prompt",
                show_label=False,
                max_lines=1,
                placeholder="Enter your prompt",
                container=False,
            )

            run_button = gr.Button("Generate", scale=0)

      result = gr.Gallery(label="Results", show_label=False, format="png", show_share_button=False)

      with gr.Accordion("Advanced Settings", open=False):

            negative_prompt = gr.Textbox(
                label="Negative prompt",
                show_label=False,
                max_lines=1,
                placeholder="Enter a negative prompt",
                elem_id="negative-prompt-text-input"
            )

            style_selection = gr.Radio(
                               show_label=True, container=True, interactive=True,
                               choices=STYLE_NAMES,
                               value=DEFAULT_STYLE_NAME,
                               label='Image Style'
             )

            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=0.0,
                    maximum=50.0,
                    step=0.1,
                    value=10,
                )
      gr.Examples(
            examples = examples,
            inputs = [prompt]
        )

      gr.HTML(
            """
                <div class="footer">
                    <p>
This application harnesses the cutting-edge Stable Diffusion XL (SDXL) model by <a href="https://huggingface.co/stabilityai" style="text-decoration: underline;" target="_blank">StabilityAI</a>, offering unparalleled text-to-image generation, while acknowledging potential biases and content considerations outlined in the model card.</p>
                    </p>
                </div>
           """
    )

    run_button.click(
        fn = infer,
        inputs = [prompt, negative_prompt, width, height, guidance_scale, style_selection],
        outputs = [result]
    )

demo.queue().launch()