|
import os |
|
os.system("pip install git+https://github.com/modelscope/modelscope") |
|
os.system('pip install invisible_watermark safetensors') |
|
os.system('pip install diffusers==0.18.0') |
|
os.system("pip install modelscope") |
|
os.system("pip install torchvision") |
|
os.system("pip install transformers") |
|
|
|
import cv2 |
|
import torch |
|
import gradio as gr |
|
import numpy as np |
|
import modelscope |
|
from modelscope.utils.constant import Tasks |
|
from modelscope.pipelines import pipeline |
|
|
|
|
|
prompt_dict={ |
|
"None": "{prompt}", |
|
"Enhance": "breathtaking {prompt} . award-winning, professional, highly detailed", |
|
"Anime": "anime artwork {prompt} . anime style, key visual, vibrant, studio anime, highly detailed", |
|
"Photographic": "cinematic photo {prompt} . 35mm photograph, film, bokeh, professional, 4k, highly detailed", |
|
"Digital Art": "concept art {prompt} . digital artwork, illustrative, painterly, matte painting, highly detailed", |
|
"Comic Book": "comic {prompt} . graphic illustration, comic art, graphic novel art, vibrant, highly detailed", |
|
"Fantasy Art": "ethereal fantasy concept art of {prompt} . magnificent, celestial, ethereal, painterly, epic, majestic, magical, fantasy art, cover art, dreamy", |
|
"Analog Film": "analog film photo {prompt} . faded film, desaturated, 35mm photo, grainy, vignette, vintage, Kodachrome, Lomography, stained, highly detailed, found footage", |
|
"Neon Punk": "neonpunk style {prompt} . cyberpunk, vaporwave, neon, vibes, vibrant, stunningly beautiful, crisp, detailed, sleek, ultramodern, magenta highlights, dark purple shadows, high contrast, cinematic, ultra detailed, intricate, professional", |
|
"Isometric": "isometric style {prompt} . vibrant, beautiful, crisp, detailed, ultra detailed, intricate", |
|
"Low Poly": "low-poly style {prompt} . low-poly game art, polygon mesh, jagged, blocky, wireframe edges, centered composition", |
|
"Origami": "origami style {prompt} . paper art, pleated paper, folded, origami art, pleats, cut and fold, centered composition", |
|
"Line Art": "line art drawing {prompt} . professional, sleek, modern, minimalist, graphic, line art, vector graphics", |
|
"Craft Clay": "play-doh style {prompt} . sculpture, clay art, centered composition, Claymation", |
|
"Cinematic": "cinematic film still {prompt} . shallow depth of field, vignette, highly detailed, high budget Hollywood movie, bokeh, cinemascope, moody, epic, gorgeous, film grain, grainy", |
|
"3D Model": "professional 3d model {prompt} . octane render, highly detailed, volumetric, dramatic lighting", |
|
"Pixel Art": "pixel-art {prompt} . low-res, blocky, pixel art style, 8-bit graphics", |
|
"Texture": "texture {prompt} top down close-up" |
|
} |
|
|
|
negative_prompt_dict={ |
|
"None": "{negative_prompt}", |
|
"Enhance": "{negative_prompt} ugly, deformed, noisy, blurry, distorted, grainy", |
|
"Anime": "{negative_prompt} photo, deformed, black and white, realism, disfigured, low contrast", |
|
"Photographic": "{negative_prompt} drawing, painting, crayon, sketch, graphite, impressionist, noisy, blurry, soft, deformed, ugly", |
|
"Digital Art": "{negative_prompt} photo, photorealistic, realism, ugly", |
|
"Comic Book": "{negative_prompt} photograph, deformed, glitch, noisy, realistic, stock photo", |
|
"Fantasy Art": "{negative_prompt} photographic, realistic, realism, 35mm film, dslr, cropped, frame, text, deformed, glitch, noise, noisy, off-center, deformed, cross-eyed, closed eyes, bad anatomy, ugly, disfigured, sloppy, duplicate, mutated, black and white", |
|
"Analog Film": "{negative_prompt} painting, drawing, illustration, glitch, deformed, mutated, cross-eyed, ugly, disfigured", |
|
"Neon Punk": "{negative_prompt} painting, drawing, illustration, glitch, deformed, mutated, cross-eyed, ugly, disfigured", |
|
"Isometric": "{negative_prompt} deformed, mutated, ugly, disfigured, blur, blurry, noise, noisy, realistic, photographic", |
|
"Low Poly": "{negative_prompt} noisy, sloppy, messy, grainy, highly detailed, ultra textured, photo", |
|
"Origami": "{negative_prompt} noisy, sloppy, messy, grainy, highly detailed, ultra textured, photo", |
|
"Line Art": "{negative_prompt} anime, photorealistic, 35mm film, deformed, glitch, blurry, noisy, off-center, deformed, cross-eyed, closed eyes, bad anatomy, ugly, disfigured, mutated, realism, realistic, impressionism, expressionism, oil, acrylic", |
|
"Craft Clay": "{negative_prompt} sloppy, messy, grainy, highly detailed, ultra textured, photo", |
|
"Cinematic": "{negative_prompt} anime, cartoon, graphic, text, painting, crayon, graphite, abstract, glitch, deformed, mutated, ugly, disfigured", |
|
"3D Model": "{negative_prompt} ugly, deformed, noisy, low poly, blurry, painting", |
|
"Pixel Art": "{negative_prompt} sloppy, messy, blurry, noisy, highly detailed, ultra textured, photo, realistic", |
|
"Texture": "{negative_prompt} ugly, deformed, noisy, blurry" |
|
} |
|
|
|
def clear_fn(value): |
|
return "", "", "None", 768, 768, 10, 50, None |
|
|
|
def concatenate_images(images): |
|
heights = [img.shape[0] for img in images] |
|
max_width = sum([img.shape[1] for img in images]) |
|
|
|
concatenated_image = np.zeros((max(heights), max_width, 3), dtype=np.uint8) |
|
x_offset = 0 |
|
for img in images: |
|
concatenated_image[0:img.shape[0], x_offset:x_offset+img.shape[1], :] = img |
|
x_offset += img.shape[1] |
|
return concatenated_image |
|
|
|
pipe = pipeline(task=Tasks.text_to_image_synthesis, |
|
model='AI-ModelScope/stable-diffusion-xl-base-1.0', |
|
use_safetensors=True, |
|
model_revision='v1.0.0') |
|
|
|
def display_pipeline(prompt: str, |
|
negative_prompt: str, |
|
style: str = 'None', |
|
height: int = 768, |
|
width: int = 768, |
|
scale: float = 10, |
|
steps: int = 50, |
|
seed: int = 0): |
|
if not prompt: |
|
raise gr.Error('The validation prompt is missing.') |
|
print(prompt_dict[style]) |
|
prompt = prompt_dict[style].format(prompt=prompt) |
|
negative_prompt = negative_prompt_dict[style].format(negative_prompt=negative_prompt) |
|
|
|
generator = torch.Generator(device='cuda').manual_seed(seed) |
|
output = pipe({'text': prompt, |
|
'negative_prompt': negative_prompt, |
|
'num_inference_steps': steps, |
|
'guidance_scale': scale, |
|
'height': height, |
|
'width': width, |
|
'generator': generator |
|
}) |
|
result = output['output_imgs'][0] |
|
|
|
image_path = './lora_result.png' |
|
cv2.imwrite(image_path, result) |
|
image = cv2.cvtColor(cv2.imread(image_path), cv2.COLOR_BGR2RGB) |
|
return image |
|
|
|
|
|
with gr.Blocks() as demo: |
|
with gr.Row(): |
|
with gr.Column(scale=2): |
|
prompt = gr.Textbox(label='提示词',lines=3) |
|
negative_prompt = gr.Textbox(label='负向提示词',lines=3) |
|
style = gr.Dropdown(['None', 'Enhance', 'Anime', 'Photographic', 'Digital Art', 'Comic Book', 'Fantasy Art', 'Analog Film', 'Cinematic', '3D Model', 'Neon Punk', 'Pixel Art', 'Isometric', 'Low Poly', 'Origami', 'Line Art', 'Craft Clay', 'Texture'], value='None', label='风格') |
|
with gr.Row(): |
|
height = gr.Slider(512, 1024, 768, step=128, label='高度') |
|
width = gr.Slider(512, 1024, 768, step=128, label='宽度') |
|
with gr.Row(): |
|
scale = gr.Slider(1, 15, 10, step=.25, label='引导系数') |
|
steps = gr.Slider(25, maximum=100, value=50, step=5, label='迭代步数') |
|
seed = gr.Slider(minimum=1, step=1, maximum=999999999999999999, randomize=True, label='随机数种子') |
|
with gr.Row(): |
|
clear = gr.Button("清除🧹") |
|
submit = gr.Button("提交🚀") |
|
with gr.Column(scale=3): |
|
output_image = gr.Image() |
|
|
|
submit.click(fn=display_pipeline, inputs=[prompt, negative_prompt, style, height, width, scale, steps, seed], outputs=output_image) |
|
clear.click(fn=clear_fn, inputs=clear, outputs=[prompt, negative_prompt, style, height, width, scale, steps, output_image]) |
|
|
|
demo.queue(status_update_rate=1).launch(share=False) |