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