|
import gradio as gr |
|
from random import randint |
|
from all_models import models |
|
|
|
def load_fn(models): |
|
global models_load |
|
models_load = {} |
|
|
|
for model in models: |
|
if model not in models_load.keys(): |
|
try: |
|
m = gr.load(f'models/{model}') |
|
except Exception as error: |
|
m = gr.Interface(lambda txt: None, ['text'], ['image']) |
|
models_load.update({model: m}) |
|
|
|
load_fn(models) |
|
|
|
num_models = 32 |
|
default_models = models[:num_models] |
|
|
|
def extend_choices(choices): |
|
return choices + (num_models - len(choices)) * ['NA'] |
|
|
|
def update_imgbox(choices, height, width): |
|
choices_plus = extend_choices(choices) |
|
return [gr.Image(None, label=m, visible=(m != 'NA'), height=height, width=width) for m in choices_plus] |
|
|
|
def gen_fn(model_str, prompt, height, width, use_ratio): |
|
if model_str == 'NA': |
|
return None |
|
noise = str(randint(0, 99999999999)) |
|
|
|
|
|
if use_ratio: |
|
height = int(width * 10 / 16) |
|
|
|
|
|
size_prompt = f"{prompt}, {width}x{height} resolution {noise}" |
|
return models_load[model_str](size_prompt) |
|
|
|
with gr.Blocks() as demo: |
|
with gr.Tab('Multiple models'): |
|
with gr.Accordion('Model selection'): |
|
model_choice = gr.CheckboxGroup(models, label=f'Choose up to {num_models} different models', value=default_models, multiselect=True, max_choices=num_models, interactive=True, filterable=False) |
|
|
|
with gr.Row(): |
|
img_width = gr.Slider(100, 1200, value=1024, step=2, label='Image Width (px)') |
|
img_height = gr.Slider(100, 1200, value=640, step=2, label='Image Height (px)') |
|
use_ratio = gr.Checkbox(label='Use 16:10 ratio', value=True) |
|
|
|
|
|
img_width.change( |
|
lambda w, r: gr.update(value=int(w * 10 / 16)) if r else gr.update(), |
|
[img_width, use_ratio], |
|
img_height |
|
) |
|
use_ratio.change( |
|
lambda w, r: gr.update(value=int(w * 10 / 16)) if r else gr.update(), |
|
[img_width, use_ratio], |
|
img_height |
|
) |
|
|
|
txt_input = gr.Textbox(label='Prompt text') |
|
gen_button = gr.Button('Generate') |
|
stop_button = gr.Button('Stop', variant='secondary', interactive=False) |
|
gen_button.click(lambda s: gr.update(interactive=True), None, stop_button) |
|
|
|
with gr.Row(): |
|
output = [gr.Image(label=m, height=640, width=1024) for m in default_models] |
|
current_models = [gr.Textbox(m, visible=False) for m in default_models] |
|
|
|
model_choice.change(update_imgbox, [model_choice, img_height, img_width], output) |
|
model_choice.change(extend_choices, model_choice, current_models) |
|
img_height.change(update_imgbox, [model_choice, img_height, img_width], output) |
|
img_width.change(update_imgbox, [model_choice, img_height, img_width], output) |
|
|
|
for m, o in zip(current_models, output): |
|
gen_event = gen_button.click( |
|
gen_fn, |
|
[m, txt_input, img_height, img_width, use_ratio], |
|
o, |
|
queue=False |
|
) |
|
|
|
with gr.Tab('Single model'): |
|
model_choice2 = gr.Dropdown(models, label='Choose model', value=models[0], filterable=False) |
|
txt_input2 = gr.Textbox(label='Prompt text') |
|
|
|
with gr.Row(): |
|
img_width2 = gr.Slider(100, 1200, value=1024, step=2, label='Image Width (px)') |
|
img_height2 = gr.Slider(100, 1200, value=640, step=2, label='Image Height (px)') |
|
use_ratio2 = gr.Checkbox(label='Use 16:10 ratio', value=True) |
|
|
|
|
|
img_width2.change( |
|
lambda w, r: gr.update(value=int(w * 10 / 16)) if r else gr.update(), |
|
[img_width2, use_ratio2], |
|
img_height2 |
|
) |
|
use_ratio2.change( |
|
lambda w, r: gr.update(value=int(w * 10 / 16)) if r else gr.update(), |
|
[img_width2, use_ratio2], |
|
img_height2 |
|
) |
|
|
|
max_images = 16 |
|
num_images = gr.Slider(1, max_images, value=max_images, step=1, label='Number of images') |
|
|
|
gen_button2 = gr.Button('Generate') |
|
stop_button2 = gr.Button('Stop', variant='secondary', interactive=False) |
|
gen_button2.click(lambda s: gr.update(interactive=True), None, stop_button2) |
|
|
|
with gr.Row(): |
|
output2 = [gr.Image(label='', height=640, width=1024) for _ in range(max_images)] |
|
|
|
for i, o in enumerate(output2): |
|
img_i = gr.Number(i, visible=False) |
|
num_images.change(lambda i, n: gr.update(visible=(i < n)), [img_i, num_images], o) |
|
img_height2.change(lambda h: gr.update(height=h), img_height2, o) |
|
img_width2.change(lambda w: gr.update(width=w), img_width2, o) |
|
gen_event2 = gen_button2.click( |
|
lambda i, n, m, t, h, w, r: gen_fn(m, t, h, w, r) if (i < n) else None, |
|
[img_i, num_images, model_choice2, txt_input2, img_height2, img_width2, use_ratio2], |
|
o |
|
) |
|
stop_button2.click(lambda s: gr.update(interactive=False), None, stop_button2, cancels=[gen_event2]) |
|
|
|
demo.queue(concurrency_count=36) |
|
demo.launch() |