|
from typing import Any |
|
import gradio as gr |
|
from backend.models.lcmdiffusion_setting import DiffusionTask |
|
from context import Context |
|
from models.interface_types import InterfaceType |
|
from frontend.utils import is_reshape_required |
|
from constants import DEVICE |
|
from state import get_settings |
|
from concurrent.futures import ThreadPoolExecutor |
|
|
|
app_settings = get_settings() |
|
|
|
context = Context(InterfaceType.WEBUI) |
|
previous_width = 0 |
|
previous_height = 0 |
|
previous_model_id = "" |
|
previous_num_of_images = 0 |
|
|
|
|
|
def generate_image_to_image( |
|
prompt, |
|
negative_prompt, |
|
init_image, |
|
strength, |
|
) -> Any: |
|
global previous_height, previous_width, previous_model_id, previous_num_of_images, app_settings |
|
w, h = init_image.size |
|
newW = app_settings.settings.lcm_diffusion_setting.image_width |
|
newH = int(h * newW / w) |
|
img = init_image.resize((newW, newH)) |
|
print("新图",newH,newW) |
|
app_settings.settings.lcm_diffusion_setting.prompt = prompt |
|
app_settings.settings.lcm_diffusion_setting.negative_prompt = negative_prompt |
|
app_settings.settings.lcm_diffusion_setting.init_image = img |
|
app_settings.settings.lcm_diffusion_setting.strength = strength |
|
|
|
app_settings.settings.lcm_diffusion_setting.diffusion_task = ( |
|
DiffusionTask.image_to_image.value |
|
) |
|
model_id = app_settings.settings.lcm_diffusion_setting.openvino_lcm_model_id |
|
reshape = False |
|
app_settings.settings.lcm_diffusion_setting.image_height=newH |
|
image_width = app_settings.settings.lcm_diffusion_setting.image_width |
|
image_height = app_settings.settings.lcm_diffusion_setting.image_height |
|
num_images = app_settings.settings.lcm_diffusion_setting.number_of_images |
|
if app_settings.settings.lcm_diffusion_setting.use_openvino: |
|
reshape = is_reshape_required( |
|
previous_width, |
|
image_width, |
|
previous_height, |
|
image_height, |
|
previous_model_id, |
|
model_id, |
|
previous_num_of_images, |
|
num_images, |
|
) |
|
|
|
|
|
with ThreadPoolExecutor(max_workers=1) as executor: |
|
future = executor.submit( |
|
context.generate_text_to_image, |
|
app_settings.settings, |
|
reshape, |
|
DEVICE, |
|
) |
|
images = future.result() |
|
|
|
|
|
|
|
|
|
|
|
previous_width = image_width |
|
previous_height = image_height |
|
previous_model_id = model_id |
|
previous_num_of_images = num_images |
|
return images |
|
|
|
|
|
def get_image_to_image_ui() -> None: |
|
with gr.Blocks(): |
|
with gr.Row(): |
|
with gr.Column(): |
|
input_image = gr.Image(label="Init image", type="pil") |
|
with gr.Row(): |
|
prompt = gr.Textbox( |
|
show_label=False, |
|
lines=3, |
|
placeholder="A fantasy landscape", |
|
container=False, |
|
) |
|
|
|
generate_btn = gr.Button( |
|
"Generate", |
|
elem_id="generate_button", |
|
scale=0, |
|
) |
|
negative_prompt = gr.Textbox( |
|
label="Negative prompt (Works in LCM-LoRA mode, set guidance > 1.0):", |
|
lines=1, |
|
placeholder="", |
|
) |
|
strength = gr.Slider( |
|
0.1, |
|
1, |
|
value=app_settings.settings.lcm_diffusion_setting.strength, |
|
step=0.01, |
|
label="Strength", |
|
) |
|
|
|
input_params = [ |
|
prompt, |
|
negative_prompt, |
|
input_image, |
|
strength, |
|
] |
|
|
|
with gr.Column(): |
|
output = gr.Gallery( |
|
label="Generated images", |
|
show_label=True, |
|
elem_id="gallery", |
|
columns=2, |
|
height=512, |
|
) |
|
|
|
generate_btn.click( |
|
fn=generate_image_to_image, |
|
inputs=input_params, |
|
outputs=output, |
|
) |
|
|