File size: 3,591 Bytes
75470d6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from diffusers import DiffusionPipeline, ControlNetModel, StableDiffusionXLControlNetPipeline, AutoencoderKL
from diffusers.utils import load_image
from PIL import Image
import os, time
import torch
import numpy as np
import cv2
import gradio as gr
from torchvision import transforms 

lora_path = "/home/user/lora"
output_dir = "/home/user/output"

model = DiffusionPipeline.from_pretrained(
    "SimianLuo/LCM_Dreamshaper_v7",
    safety_checker = None,
)
model.to(torch_device="cpu", torch_dtype=torch.float32).to("mps")

low_threshold = 100
high_threshold = 200

safetensors_files_without_suffix = []

def process(prompt, negative_prompt, width, height, steps, scale, number, loras):
    if len(loras) > 0:
        for item in loras:
            model.load_lora_weights(lora_path, weight_name=f"{item}.safetensors")
        
    for _ in range(number):
        _seed = int.from_bytes(os.urandom(2), "big")
        generator = torch.manual_seed(_seed)
        image = model(
            prompt=prompt, 
            negative_prompt=negative_prompt,
            width=width, 
            height=height,
            num_inference_steps=steps,
            generator=generator,
            guidance_scale=scale
        ).images[0]

        timestamp = time.strftime("%Y%m%d-%H%M%S")
        output_path = os.path.join(output_dir, f"{timestamp}.png")
        image.save(output_path)

        # images.append(image)
    # return images

block = gr.Blocks().queue()

def update_loras_list():
    filenames = os.listdir(lora_path)
    safetensors_files = [filename for filename in filenames if filename.endswith(".safetensors")]
    safetensors_files_without_suffix = [filename[:-len(".safetensors")] for filename in safetensors_files]
    return gr.Dropdown.update(choices=safetensors_files_without_suffix)

with gr.Blocks(css="style.css") as block:
    with gr.Row():
        with gr.Column():
            prompt = gr.Textbox(label="正向提示词", lines=3, value="Warhammer 40k, a new robot in Armor, god of empire detailed face octane painting, Devian art, concept art, The gate of the medieval castle")
            negative_prompt = gr.Textbox(label="反向提示词", value="low quality")
            loras = gr.Dropdown(safetensors_files_without_suffix, multiselect=True, label="Loras", info="增加Loras风格")
            with gr.Row():
                load_loras_btn = gr.Button(value="加载")
                clear_btn = gr.ClearButton(components=[loras], value="清空")
                    
        with gr.Column():
            with gr.Row():
                steps = gr.Slider(label="迭代步数", minimum=1, maximum=50, value=4, step=1)
                scale = gr.Slider(label="引导系数", minimum=1, maximum=50, value=4, step=0.5)
                number = gr.Slider(label="生成数量", minimum=1, maximum=10, value=1, step=1)

            with gr.Row():
                width = gr.Slider(label="宽度", minimum=384, maximum=1024, value=512, step=128)
                height = gr.Slider(label="高度", minimum=384, maximum=1024, value=512, step=128)

            with gr.Row():
                # result_gallery = gr.Gallery(label='输出', show_label=True, elem_id="gallery", columns=[2], height='auto')
                run_button = gr.Button(value="运行", elem_id="blue-button",)

    ips = [prompt, negative_prompt, width, height, steps, scale, number, loras]
    run_button.click(fn=process, inputs=ips)
    load_loras_btn.click(fn=update_loras_list, outputs=loras)


def main():
    block.launch(debug=True, share=False)

if __name__ == "__main__":
    main()