Spaces:
Running
on
Zero
Running
on
Zero
File size: 5,851 Bytes
0f22bd9 dd67867 95811da af82486 95811da af82486 f65864c 95811da af82486 dd67867 af82486 dd67867 af82486 e85c4c0 4b2f107 af82486 5ab52c6 837968e c359cbc af82486 bee3143 af82486 bee3143 af82486 dbc0774 af82486 4b2f107 af82486 4b2f107 af82486 21dde31 af82486 4b2f107 af82486 4b2f107 af82486 f65864c af82486 6d64c42 af82486 |
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 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 |
import spaces
from diffusers import StableDiffusionPipeline, StableDiffusionImg2ImgPipeline, UniPCMultistepScheduler
import gradio as gr
import torch
from PIL import Image
model_id = 'Norod78/sd2-simpsons-blip'
prefix = None
pipe = StableDiffusionPipeline.from_pretrained(
model_id,
torch_dtype=torch.float16 if torch.cuda.is_available() else torch.float32)
pipe.scheduler = UniPCMultistepScheduler.from_config(pipe.scheduler.config)
pipe_i2i = StableDiffusionImg2ImgPipeline.from_pretrained(
model_id,
torch_dtype=torch.float16 if torch.cuda.is_available() else torch.float32)
pipe_i2i.scheduler = UniPCMultistepScheduler.from_config(pipe_i2i.scheduler.config)
if torch.cuda.is_available():
pipe = pipe.to("cuda")
pipe_i2i = pipe_i2i.to("cuda")
def error_str(error, title="Error"):
return f"""#### {title}
{error}""" if error else ""
@spaces.GPU
def inference(prompt, guidance, steps, width=640, height=640, seed=0, img=None, strength=0.5, neg_prompt=""):
if torch.cuda.is_available():
generator = torch.Generator('cuda').manual_seed(seed) if seed != 0 else None
else:
if seed != 0:
generator = torch.Generator()
generator.manual_seed(seed)
else:
generator = None
try:
if img is not None:
return img_to_img(prompt, neg_prompt, img, strength, guidance, steps, width, height, generator), None
else:
return txt_to_img(prompt, neg_prompt, guidance, steps, width, height, generator), None
except Exception as e:
return None, error_str(e)
def txt_to_img(prompt, neg_prompt, guidance, steps, width, height, generator):
result = pipe(
prompt,
negative_prompt = neg_prompt,
num_inference_steps = int(steps),
guidance_scale = guidance,
width = width,
height = height,
generator = generator)
return replace_nsfw_images(result)
def img_to_img(prompt, neg_prompt, img, strength, guidance, steps, width, height, generator):
ratio = min(height / img.height, width / img.width)
img = img.resize((int(img.width * ratio), int(img.height * ratio)), Image.Resampling.LANCZOS)
result = pipe_i2i(
prompt,
negative_prompt = neg_prompt,
image = img,
num_inference_steps = int(steps),
strength = strength,
guidance_scale = guidance,
generator = generator)
return replace_nsfw_images(result)
def replace_nsfw_images(results):
for i in range(len(results.images)):
if 'nsfw_content_detected' in results and results.nsfw_content_detected[i]:
results.images[i] = Image.open("nsfw.png")
return results.images[0]
css = """.main-div div{display:inline-flex;align-items:center;gap:.8rem;font-size:1.75rem}.main-div div h1{font-weight:900;margin-bottom:7px}.main-div p{margin-bottom:10px;font-size:94%}a{text-decoration:underline}.tabs{margin-top:0;margin-bottom:0}#gallery{min-height:20rem}
"""
with gr.Blocks(css=css) as demo:
gr.HTML(
f"""
<div class="main-div">
<div>
<h1>SDv2 Simpsons</h1>
</div>
<p>
Demo for <a href="https://huggingface.co/Norod78/sd2-simpsons-blip">SD2 Simpsons BLIP</a> Stable Diffusion 2, fine-tuned model.<br>
{"Add the following tokens to your prompts for the model to work properly: <b>prefix</b>" if prefix else ""}
</p>
Running on {"<b>GPU 🔥</b>" if torch.cuda.is_available() else f"<b>CPU 🥶</b>. For faster inference it is recommended to <b>upgrade to GPU in <a href='https://huggingface.co/spaces/Norod78/sd2-simpsons-blip/settings'>Settings</a></b>"}<br><br>
<a style="display:inline-block" href="https://huggingface.co/spaces/Norod78/sd2-simpsons-blip?duplicate=true"><img src="https://bit.ly/3gLdBN6" alt="Duplicate Space"></a>
</div>
"""
)
with gr.Row():
with gr.Column(scale=55):
with gr.Group():
with gr.Row():
prompt = gr.Textbox(label="Prompt", show_label=False, max_lines=2,placeholder="[your prompt]")
generate = gr.Button(value="Generate")
image_out = gr.Image(height=640)
error_output = gr.Markdown()
with gr.Column(scale=45):
with gr.Tab("Options"):
with gr.Group():
neg_prompt = gr.Textbox(label="Negative prompt", placeholder="What to exclude from the image", value="deformed, extra limbs, grainy, unfocused, blurry, NSFW, nude, naked")
with gr.Row():
guidance = gr.Slider(label="Guidance scale", value=7.5, maximum=15)
steps = gr.Slider(label="Steps", value=24, minimum=4, maximum=50, step=1)
with gr.Row():
width = gr.Slider(label="Width", value=640, minimum=64, maximum=1024, step=64)
height = gr.Slider(label="Height", value=640, minimum=64, maximum=1024, step=64)
seed = gr.Slider(0, 2147483647, label='Seed (0 = random)', value=0, step=1)
with gr.Tab("Image to image"):
with gr.Group():
image = gr.Image(label="Image", height=640, type="pil")
strength = gr.Slider(label="Transformation strength", minimum=0, maximum=1, step=0.01, value=0.5)
inputs = [prompt, guidance, steps, width, height, seed, image, strength, neg_prompt]
outputs = [image_out, error_output]
prompt.submit(inference, inputs=inputs, outputs=outputs)
generate.click(inference, inputs=inputs, outputs=outputs)
gr.HTML("""
<div style="border-top: 1px solid #303030;">
<br>
<p>This space was created using <a href="https://huggingface.co/spaces/anzorq/sd-space-creator">SD Space Creator</a>.</p>
</div>
""")
demo.queue()
demo.launch()
|