File size: 4,288 Bytes
6b394d7
 
 
 
 
 
 
 
 
 
85009ce
 
6b394d7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
68b0b4d
87d52f5
6b394d7
 
87d52f5
 
 
6b394d7
 
 
 
 
 
 
87d52f5
 
6b394d7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d6c27f8
6b394d7
 
 
 
 
 
 
 
 
85009ce
6b394d7
 
 
85009ce
6b394d7
 
 
d6c27f8
6b394d7
 
 
 
 
 
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
import gradio as gr

import torch
from PIL import Image, ImageDraw, ImageFont, ImageOps, ImageEnhance
from quanto import qfloat8, quantize, freeze
from diffusers import StableDiffusionControlNetPipeline, ControlNetModel
from diffusers.utils import make_image_grid

atkbold = ImageFont.truetype("Atkinson-Hyperlegible-Bold-102.otf",50)

default_width = 1920
default_height = 1080
default_timesteps = 8

def mask_image_factory(mask_text="ASK FOR\nA SNACK", width=default_width, height=default_height):
    img = Image.new("L", (width, height), (0,))
    draw = ImageDraw.Draw(img)
    draw.multiline_text(
        xy=(0,0),
        text=mask_text,
        fill=(255,),
        font=atkbold,
        align="center",
        spacing=0,
    )
    cropped = img.crop(img.getbbox())
    # Calculate aspect ratios
    image_aspect_ratio = width / height
    cropped_aspect_ratio = cropped.size[0] / cropped.size[1]

    # Determine which dimension of cropped.size is larger
    if cropped_aspect_ratio > image_aspect_ratio:
        # Calculate new dimensions for padding
        new_width = int(cropped.size[1] * image_aspect_ratio)
        new_height = cropped.size[1]
    else:
        new_width = cropped.size[0]
        new_height = int(cropped.size[0] / image_aspect_ratio)

    # Pad the image to the desired aspect ratio
    padded = ImageOps.pad(cropped, (new_width, new_height))

    resized = padded.resize((width, height), resample=Image.Resampling.LANCZOS)
    return resized

preferred_device = "cuda" if torch.cuda.is_available() else ("mps" if torch.backends.mps.is_available() else "cpu")
# preferred_device = "cpu"
preferred_dtype = torch.float32

controlnet = ControlNetModel.from_pretrained(
    "monster-labs/control_v1p_sd15_qrcode_monster",
#    "monster-labs/control_v1p_sdxl_qrcode_monster",
    subfolder="v2",
    torch_dtype=preferred_dtype,
    #torch_dtype=unet_preferred_dtype
).to(preferred_device)

#quantize(controlnet, weights=qfloat8)
#freeze(controlnet)

ctlpipe = StableDiffusionControlNetPipeline.from_pretrained(
    "SimianLuo/LCM_Dreamshaper_v7",
    controlnet=controlnet,
    torch_dtype=preferred_dtype,
    safety_checker=None,
).to(preferred_device)

#quantize(ctlpipe.unet, weights=qfloat8)
#freeze(ctlpipe.unet)
#quantize(ctlpipe.text_encoder, weights=qfloat8)
#freeze(ctlpipe.text_encoder)

def app(prompt, negative_prompt, mask_text, num_inference_steps, controlnet_conditioning_scale, width, height, seed, count):
    all_images = [ctlpipe(
        prompt=prompt,
        negative_prompt=negative_prompt,
        image=mask_image_factory(mask_text=mask_text, width=width, height=height),
        num_inference_steps=int(num_inference_steps),
        guidance_scale=8.0,
        controlnet_conditioning_scale=float(controlnet_conditioning_scale),
        generator=torch.manual_seed(int(seed + i)),
        height=height,
        width=width,
    ).images[0] for i in range(count)]
    if count == 1:
        cols = 1
        rows = 1
    elif count == 2:
        cols = 1
        rows = 2
    else:
        cols = 2 if count % 2 == 0 else 1
        rows = count // cols
    return make_image_grid(all_images, cols=cols, rows=rows)


app("corgis running in the park", "ugly, wrong", "ASK FOR\nA SNACK", 1, 1.0, default_height, default_width, 42, 1)

iface = gr.Interface(
    app,
    [
        gr.Textbox(label="Prompt", value="large happy dogs frolic on the seashore, tall cliffs, sun at the horizon, boulders, tide pools, golden hour"),
        gr.Textbox(label="Negative Prompt", value="ugly, wrong"),
        gr.Textbox(label="Mask Text", value="ASK FOR\nA SNACK"),
        gr.Number(label="Number of Inference Steps", value=default_timesteps, minimum=1, maximum=50, step=1),
        gr.Slider(label="ControlNet Conditioning Scale", value=0.6, minimum=-1.0, maximum=2.0, step=0.01),
        gr.Number(label="Width", value=default_width, minimum=256, maximum=2048, precision=0),
        gr.Number(label="Height", value=default_height, minimum=256, maximum=2048, precision=0),
        gr.Number(label="Random Number Seed", value=42, minimum=0, maximum=2**32-1, precision=0),
        gr.Radio(label="Number of Images to Generate with Subsequent Consecutive Seeds", choices=[1, 2, 4, 6, 10], value=2),
    ],
    "image",
)

iface.launch()