File size: 5,349 Bytes
5e8d978
 
 
 
cf7d317
 
5e8d978
 
 
cf7d317
5e8d978
cf7d317
5e8d978
 
cf7d317
19ef2ed
 
cf7d317
5e8d978
19ef2ed
 
 
cf7d317
5e8d978
19ef2ed
5e8d978
19ef2ed
 
 
 
 
 
 
 
 
5e8d978
19ef2ed
 
 
5e8d978
 
 
 
 
 
 
19ef2ed
5e8d978
 
 
 
 
19ef2ed
 
5e8d978
19ef2ed
5e8d978
19ef2ed
5e8d978
 
00e3bd5
5e8d978
 
 
 
 
 
 
 
19ef2ed
00e3bd5
 
19ef2ed
cf7d317
 
5e8d978
19ef2ed
32916a7
19ef2ed
 
5e8d978
 
19ef2ed
 
cf7d317
 
5e8d978
 
 
19ef2ed
5e8d978
cf7d317
5e8d978
 
cf7d317
5e8d978
cf7d317
19ef2ed
 
cf7d317
5e8d978
19ef2ed
5e8d978
19ef2ed
5e8d978
19ef2ed
 
 
 
 
5e8d978
19ef2ed
 
 
 
5e8d978
 
 
 
 
 
19ef2ed
5e8d978
cf7d317
5e8d978
19ef2ed
5e8d978
 
cf7d317
5e8d978
19ef2ed
5e8d978
19ef2ed
 
 
5e8d978
 
 
19ef2ed
 
 
 
 
 
 
cf7d317
5e8d978
19ef2ed
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
#!/usr/bin/env python
import os
import random
import uuid
import gradio as gr
import numpy as np
from PIL import Image
import spaces
from typing import Tuple
import torch
from diffusers import StableDiffusionXLPipeline, EulerAncestralDiscreteScheduler

DESCRIPTION = """# InterDiffusion-4.0
### [https://huggingface.co/cutycat2000x/InterDiffusion-4.0](https://huggingface.co/cutycat2000x/InterDiffusion-4.0)"""

MAX_SEED = np.iinfo(np.int32).max
DEFAULT_STYLE_NAME = "(LoRA)"

def save_image(img):
    filename = str(uuid.uuid4()) + ".png"
    img.save(filename)
    return filename

def randomize_seed_fn(seed: int, randomize_seed: bool) -> int:
    return random.randint(0, MAX_SEED) if randomize_seed else seed

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

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

if torch.cuda.is_available():
    pipe = StableDiffusionXLPipeline.from_pretrained(
        "cutycat2000x/InterDiffusion-4.0",
        torch_dtype=torch.float16,
        use_safetensors=True,
    )
    pipe.scheduler = EulerAncestralDiscreteScheduler.from_config(pipe.scheduler.config)
    pipe.load_lora_weights("cutycat2000x/LoRA2", weight_name="lora.safetensors", adapter_name="adapt")
    pipe.set_adapters("adapt")
    pipe.to("cuda")

@spaces.GPU(enable_queue=True)
def generate(prompt, negative_prompt, style, use_negative_prompt, num_inference_steps,
             num_images_per_prompt, seed, width, height, guidance_scale, randomize_seed, progress=gr.Progress(track_tqdm=True)):

    seed = randomize_seed_fn(seed, randomize_seed)
    if not use_negative_prompt:
        negative_prompt = ""
    prompt, negative_prompt = apply_style(style, prompt, negative_prompt)

    result = pipe(
        prompt=prompt,
        negative_prompt=negative_prompt,
        width=width,
        height=height,
        guidance_scale=guidance_scale,
        num_inference_steps=num_inference_steps,
        num_images_per_prompt=num_images_per_prompt,
        cross_attention_kwargs={"scale": 0.65},
        output_type="pil"
    )
    return result.images, seed


examples = [
    'a smiling girl with sparkles in her eyes, walking in a garden, in the morning --style anime',
    'firewatch landscape, Graphic Novel, Pastel Art...',
    'Cat on a tree sitting in between parrots.',
    'cat, 4k, hyperrealistic, Cinematic, unreal engine 5',
    'cinematic closeup of burning skull',
    'frozen elsa',
    'A rainbow tree, anime style, tree in focus',
    'A cat holding a sign that reads "Hello World"',
    'Odette the butterfly goddess wondering in the cosmos'
]

css = '''
.gradio-container{max-width: 560px !important}
h1{text-align:center}
footer { visibility: hidden }
'''

with gr.Blocks(css=css, theme="xiaobaiyuan/theme_brief") as demo:
    gr.Markdown(DESCRIPTION)

    with gr.Group():
        with gr.Row():
            prompt = gr.Textbox(
                label="Prompt", placeholder="Enter your prompt", lines=1
            )
            run_button = gr.Button("Run")

        result = gr.Gallery(label="Result", columns=1, preview=True)

    with gr.Accordion("Advanced options", open=False):
        use_negative_prompt = gr.Checkbox(label="Use negative prompt", value=False)
        negative_prompt = gr.Textbox(label="Negative prompt", lines=1, visible=True)
        num_inference_steps = gr.Slider(label="Steps", minimum=10, maximum=60, step=1, value=30)
        num_images_per_prompt = gr.Slider(label="Images", minimum=1, maximum=5, step=1, value=2)
        seed = gr.Slider(label="Seed", minimum=0, maximum=MAX_SEED, step=1, value=0)
        randomize_seed = gr.Checkbox(label="Randomize seed", value=True)
        width = gr.Slider(label="Width", minimum=512, maximum=2048, step=8, value=1024)
        height = gr.Slider(label="Height", minimum=512, maximum=2048, step=8, value=1024)
        guidance_scale = gr.Slider(label="Guidance Scale", minimum=0.1, maximum=20.0, step=0.1, value=6.0)
        style_selection = gr.Radio(label="Image Style", choices=STYLE_NAMES, value=DEFAULT_STYLE_NAME)

    gr.Examples(
        examples=examples,
        inputs=prompt,
        outputs=[result, seed],
        fn=generate,
        cache_examples=False
    )

    use_negative_prompt.change(
        lambda x: gr.update(visible=x),
        inputs=use_negative_prompt,
        outputs=negative_prompt,
    )

    prompt.submit(
        fn=generate,
        inputs=[prompt, negative_prompt, style_selection, use_negative_prompt,
                num_inference_steps, num_images_per_prompt, seed,
                width, height, guidance_scale, randomize_seed],
        outputs=[result, seed],
    )

    run_button.click(
        fn=generate,
        inputs=[prompt, negative_prompt, style_selection, use_negative_prompt,
                num_inference_steps, num_images_per_prompt, seed,
                width, height, guidance_scale, randomize_seed],
        outputs=[result, seed],
    )

if __name__ == "__main__":
    demo.queue(max_size=20).launch(show_api=False, debug=False)