File size: 5,175 Bytes
ce207c2
1a41a9d
 
ce207c2
3975802
d09d81b
ce207c2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d09d81b
ce207c2
 
d09d81b
ce207c2
 
 
 
 
1a41a9d
 
 
 
 
33df38a
 
 
 
 
 
 
 
1a41a9d
d09d81b
 
 
47c214a
 
 
 
 
 
 
 
d09d81b
 
47c214a
 
 
 
d09d81b
ce207c2
 
 
 
 
33df38a
 
 
ce207c2
1a41a9d
ce207c2
 
 
 
 
 
 
 
 
1a41a9d
ce207c2
 
 
33df38a
ce207c2
 
d09d81b
1a41a9d
ce207c2
 
 
33df38a
 
 
 
 
 
 
 
47c214a
d09d81b
47c214a
33df38a
d09d81b
ce207c2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1e89a47
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
import gradio as gr
import numpy as np
import PIL.Image as Image
import random
import time
import threading

# Список моделей с отображаемыми названиями и внутренними именами
models = {
    "FLUX.1-dev": "black-forest-labs/FLUX.1-dev",
    "flux-RealismLora": "XLabs-AI/flux-RealismLora",
    "Midjourney": "Jovie/Midjourney",
    "Stable Diffusion v1-5": "stable-diffusion-v1-5/stable-diffusion-v1-5",
    "Pixel Art XL": "nerijs/pixel-art-xl",
    "Knitted Character Flux LoRA": "prithivMLmods/Knitted-Character-Flux-LoRA",
    "Flux Ghibsky Illustration": "aleksa-codes/flux-ghibsky-illustration",
    "Flux Super Realism LoRA": "strangerzonehf/Flux-Super-Realism-LoRA",
    "Flux Game Assets LoRA v2": "gokaygokay/Flux-Game-Assets-LoRA-v2",
    "Flux Animex v2 LoRA": "strangerzonehf/Flux-Animex-v2-LoRA",
    "Flux Qwen Capybara": "cfahlgren1/flux-qwen-capybara",
    "Softserve Anime": "alvdansen/softserve_anime",
    "FLUX Aesthetic Anime": "dataautogpt3/FLUX-AestheticAnime",
    "FLUX Animeo v1 LoRA": "strangerzonehf/Flux-Animeo-v1-LoRA",
    "Fractured Line Flare": "prithivMLmods/Fractured-Line-Flare",
    "Castor 3D Portrait Flux LoRA": "prithivMLmods/Castor-3D-Portrait-Flux-LoRA"
}

# Очередь на генерации
queue = []

def generate_image(prompt, model_name, width, height, seed, steps, guidance_scale, random_seed, output_image, params_textbox):
    # Проверка очереди
    if len(queue) >= 150:
        return "Очередь переполнена. Пожалуйста, подождите.", None, None
    
    # Добавляем задачу в очередь
    task_id = random.randint(100000, 999999)
    queue.append(task_id)
    
    # Генерация сида, если выбрана галочка "Случайный сид"
    if random_seed:
        seed = random.randint(0, 1000000)
    
    # Формирование текста параметров
    params_text = (
        f"Промпт: {prompt}\n"
        f"Модель: {model_name}\n"
        f"Размер: {width}x{height}\n"
        f"Сид: {seed}\n"
        f"Шаги: {steps}\n"
        f"Гуидансе скейл: {guidance_scale}"
    )
    
    # Обновление параметров
    params_textbox.update(params_text)
    
    for step in range(steps):
        # Имитация генерации изображения
        time.sleep(random.uniform(0.1, 0.5))  # Таймаут до 0.5 секунды
        
        # Имитация изображения (шум)
        image_array = np.random.randint(0, 256, (height, width, 3), dtype=np.uint8)
        image = Image.fromarray(image_array)
        
        # Обновление изображения
        output_image.update(image)
    
    # Удаляем задачу из очереди
    queue.remove(task_id)
    
    return output_image, params_text, seed

# Создание интерфейса
with gr.Blocks() as demo:
    gr.Markdown("# Генератор изображений")
    
    with gr.Row():
        prompt_textbox = gr.Textbox(label="Промпт", placeholder="Введите ваш промпт здесь", lines=2)
    
    with gr.Row():
        model_dropdown = gr.Dropdown(list(models.keys()), label="Модель", value="FLUX.1-dev")
    
    with gr.Row():
        with gr.Column():
            width_slider = gr.Slider(128, 1024, value=512, step=64, label="Ширина")
        with gr.Column():
            height_slider = gr.Slider(128, 1024, value=512, step=64, label="Высота")
    
    with gr.Row():
        seed_slider = gr.Slider(0, 1000000, value=random.randint(0, 1000000), step=1, label="Сид")
        random_seed_checkbox = gr.Checkbox(label="Случайный сид")
    
    with gr.Row():
        steps_slider = gr.Slider(1, 100, value=50, step=1, label="Шаги")
        guidance_scale_slider = gr.Slider(0.1, 20.0, value=7.5, step=0.1, label="Гуидансе скейл")
    
    generate_button = gr.Button("Сгенерировать изображение")
    output_image = gr.Image(label="Сгенерированное изображение")
    params_textbox = gr.Textbox(label="Параметры генерации", interactive=False)
    
    generate_button.click(
        fn=generate_image,
        inputs=[
            prompt_textbox,
            model_dropdown,
            width_slider,
            height_slider,
            seed_slider,
            steps_slider,
            guidance_scale_slider,
            random_seed_checkbox,
            output_image,
            params_textbox
        ],
        outputs=[output_image, params_textbox, seed_slider]
    )
    
    demo.queue(max_size=150, api_open=False)
    demo.launch(share=False, server_port=7860)

# Скрытие футера
hide_footer = """
<style>
    .gradio-container .footer {
        display: none !important;
    }
</style>
"""
demo = demo.add_css(hide_footer)

# Установка таймаута
demo.queue(api_name="/generate").set_config(max_size=150, api_open=False, max_threads=1, timeout=125)

demo.launch()