|
|
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) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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(): |
|
|
|
|
|
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() |
|
|
|