File size: 9,727 Bytes
33adbe7
03fc011
b47a274
796cb1f
b47a274
 
796cb1f
 
 
9a2d101
347eac7
9f894bf
13fe8d9
9a2d101
cc1aefe
13fe8d9
 
 
 
cc1aefe
347eac7
b47a274
34a218b
1291091
347eac7
 
796cb1f
34a218b
 
 
 
 
796cb1f
34a218b
796cb1f
 
 
 
 
 
1291091
347eac7
 
796cb1f
347eac7
1291091
347eac7
 
796cb1f
 
 
99a9568
1291091
99a9568
41b1d8d
1291091
41b1d8d
 
 
 
 
 
 
99a9568
45b14e8
1291091
99a9568
347eac7
 
b47a274
c6ae120
 
b47a274
c6ae120
8c55048
9a2d101
b47a274
8c55048
b47a274
fc2a9f2
b47a274
 
 
 
 
 
 
 
 
 
 
99a9568
b47a274
347eac7
1291091
 
 
 
 
 
b47a274
13fe8d9
0276c07
34a218b
 
13fe8d9
34a218b
cc1aefe
 
 
13fe8d9
 
 
 
 
 
 
 
cc1aefe
 
 
 
 
 
13fe8d9
 
725fd8a
cc1aefe
13fe8d9
 
cc1aefe
 
13fe8d9
cc1aefe
c5aa8f3
99a9568
13fe8d9
cc1aefe
 
 
 
 
725fd8a
 
cc1aefe
13fe8d9
725fd8a
13fe8d9
81c7641
725fd8a
41b1d8d
347eac7
7b55e59
45b14e8
347eac7
 
 
 
 
 
34a218b
 
 
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
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
import gradio as gr
from gradio.themes.utils.colors import Color
import random, time, shared, argparse, modules.path, fooocus_version, modules.html
import modules.async_worker as worker
from math import floor
from PIL import Image, ImageDraw, ImageFont

from modules.sdxl_styles import style_keys, aspect_ratios

QM_LOGO  = Image.open("resources/siemens_qm_logo.png")
QM_COLOR = Color(name="qm", c50="#effaed",c100="#def5db",c200="#64b445",c300="#c6eec0",c400="#b9ebb3",c500="#64b445",c600="#55993b",c700="#467e30",c800="#325a23",c900="#233f18",c950="#192d11")
PROMPT_EXAMPLES = ["Industrial automation in a huge factory", 
                   "Advanced industrial technology in a high tech laboratory", 
                   "A diverse group of happy people in a modern office"]
EXAMPLE_GREETINGS = [ 
    "Siemens: Technology with purpose!",
    "Thank you for your commitment",
    "Happy birthday!",
    "I wish you a wonderful day!"
]
INIT_IMAGE_PATH = "resources/init.png"

def generate(*args):
    yield gr.HTML(value=modules.html.make_progress_html(1, "0/30")), \
          gr.Image(), \
          gr.Text()

    while worker.is_working:
        time.sleep(0.1)
        
    worker.buffer=[list(args)]
    worker.outputs = []

    finished=False
    while not finished:
        time.sleep(0.01)
        if len(worker.outputs) > 0:
            flag, product = worker.outputs.pop(0)
            if flag == 'preview':
                percentage, title, image = product
                yield gr.HTML(value=modules.html.make_progress_html(percentage, title)), \
                      gr.Image(value=image) if image is not None else gr.Image(), \
                      gr.Text()
            if flag == 'results':
                image, image_path = product
                yield gr.HTML(value=""), \
                      gr.Image(value=image), \
                      gr.Text(value=image_path)
                finished = True
    return

def toggle_greet_visibility(is_visible):
    return gr.Row(visible=is_visible)

def __toggle_generate_state(is_preview):
    return gr.Image(visible=is_preview), gr.Image(visible=not is_preview), gr.Button(interactive=not is_preview)

def prepare_generate():
    return __toggle_generate_state(True)

def finish_generate():
    return __toggle_generate_state(False)

def debounce():
    time.sleep(0.5)
    return

def overlay_image(image_path, toggle_greet, greet):
    image = ImageDraw.Draw(Image.open(image_path), "RGBA")
    HEIGHT, TEXT_PADDING, TEXTBOX_HEIGHT  = 100, 32, 56
    LOGO_EXTRA_WIDTH = 250
    TEXTBOX_WIDTH = 1280-HEIGHT-4*TEXT_PADDING-LOGO_EXTRA_WIDTH
    
    X_RECT=1280-HEIGHT-2*TEXT_PADDING-LOGO_EXTRA_WIDTH
    image.rectangle(((X_RECT, 768-HEIGHT), (1280, 766)), fill=(0, 0, 0, 75))
    image._image.paste(QM_LOGO, (885,687), QM_LOGO)
    if (toggle_greet):
        image.rectangle(((0, 768-HEIGHT), (X_RECT-1, 768)), fill=(255, 255, 255, 190))
        txt_image = Image.new('RGBA', (4*1280, 4*TEXTBOX_HEIGHT), (255,255,255,0))
        ImageDraw.Draw(txt_image).text(xy=(0,0), text=greet, font=ImageFont.truetype('resources/Neuton-ExtralightItalic.ttf', floor(1.5*TEXTBOX_HEIGHT)), fill=(0, 0, 0))
        image_box = txt_image.getbbox()
        txt_image = txt_image.crop(image_box)
        width, height = txt_image.size
        if (height > 0 and width/height < TEXTBOX_WIDTH/TEXTBOX_HEIGHT):
            txt_image = txt_image.resize((floor((TEXTBOX_HEIGHT/height)*width), TEXTBOX_HEIGHT))
        else:
            txt_image = txt_image.resize((TEXTBOX_WIDTH, floor((TEXTBOX_WIDTH/width)*height)))
        _, height = txt_image.size
        image._image.paste(txt_image, (TEXT_PADDING, 768 - floor((HEIGHT+height)/2)), txt_image)

    return image._image

def make_overlay(image, toggle_greet, greet):
    return gr.Image(value=overlay_image(image, toggle_greet, greet)), gr.Textbox(value=greet)

def verify_latest_overlay(image, toggle_greet, greet, greet_active):
    if greet != greet_active:
        return make_overlay(image, toggle_greet, greet)
    else:
        return gr.Image(), gr.Textbox()

shared.gradio_root = gr.Blocks(title='Siemens Factory Automation AI Card Generator', css=modules.html.css, theme=gr.themes.Default(primary_hue=QM_COLOR))
with shared.gradio_root:
    gr.Markdown(
    """
    # Siemens Factory Automation AI Card Generator
    """)
    with gr.Accordion("Info", elem_classes='panel-container', open=False):
        with gr.Column():
            gr.Markdown("""
                * Describe the motif of the card in a prompt, choose a style if necessary and go!
                * To translate a description into English, you can use [deepl.com](https://www.deepl.com/translator#de/Fabrik) for example.
                * Short personal greetings (up to 2 lines) can be added on the front. Longer texts can be added handwritten on the back after printing.
                * Chat AIs like [Bing Chat](https://www.bing.com/search?q=Bing+AI&showconv=1) can help with creating personal greetings, e.g., with prompts like
                    * Create five different personal greetings for my father Anakin (about 120 characters each). Mention our vacation together on Tatooine.
                    * Create three different personal greetings for my esteemed colleague Michael (about 150 characters each). Proceed step by step.
                    * Create five different personal greetings for a card featuring a bulldozer driver (about 133 characters each) and explain them.
                * This tool is based on [Stable Diffusion XL](https://stability.ai/stable-diffusion) v1.0 and the interface [Fooocus](https://github.com/lllyasviel/Fooocus), the code is available open source on [HuggingFace](https://huggingface.co/spaces/QualityMinds/Siemens-Kartengenerator/tree/main).
            """)

    with gr.Row(elem_classes='panel-container'):
        with gr.Column():
            with gr.Row():
                with gr.Column(scale=5):
                    gr.Markdown("##### Prompt", elem_classes="input-label")
                    prompt = gr.Textbox(value="", placeholder="What would you like to depict on the card?", 
                                        autofocus=True, container=False, show_label=False, lines=2)
                with gr.Column(scale=1, min_width="80px"):
                    gr.Markdown("##### Style", elem_classes="input-label")
                    style_selection = gr.Dropdown(choices=style_keys, value='cinematic', container=False, show_label=False, elem_id="style-selection")
                with gr.Column(scale=1, min_width="80px"):
                    progress_html = gr.HTML(visible=True, elem_id='progress-bar', elem_classes='progress-bar')
                    run_button = gr.Button(value="Create\nCard", variant='primary', elem_id='generate-button', )
            with gr.Row():
                gr.Examples(elem_id="prompt-examples", examples=PROMPT_EXAMPLES, inputs=[prompt])
    
    toggle_greet = gr.Checkbox(label="Add personal greetings", elem_id="toggle-greet-checkbox",
                               container=False, value=True, interactive=True)

    greeting_row=gr.Row(elem_classes='panel-container')
    with greeting_row:
        with gr.Column():
            greet = gr.Textbox(value=EXAMPLE_GREETINGS[0], placeholder="", interactive=True, container=False, lines=2, max_lines=2, show_label=False)
            greet_active = gr.Textbox(value=EXAMPLE_GREETINGS[0], visible=False, container=False, show_label=False)
            greet_examples = gr.Examples(elem_id="greet-examples", examples=EXAMPLE_GREETINGS, inputs=[greet])
    generated_image = gr.Image(visible=False, type='pil', label="Creating card...", elem_classes="generated-image", width=1280,
                               value=INIT_IMAGE_PATH, interactive=False, show_share_button=False, show_download_button=False)
    generated_image_overlayed = gr.Image(label="Card", type='pil', elem_classes="generated-image", width=1280,
                                         value=overlay_image(INIT_IMAGE_PATH, toggle_greet.value, greet.value), show_share_button=False)
    generated_image_path = gr.Text(visible=False, value=INIT_IMAGE_PATH, container=False, show_label=False)
    toggle_greet.change(fn=toggle_greet_visibility, inputs=[toggle_greet], outputs=[greeting_row], queue=False, show_progress=False)\
                .then(fn=make_overlay, inputs=[generated_image_path, toggle_greet, greet], outputs=[generated_image_overlayed, greet_active], show_progress=False, queue=False)
    greet.input(fn=None, inputs=[greet], outputs=[greet], _js="(greet) => { return greet.split('\\n').slice(0,2).join('\\n') }")
    greet.change(fn=debounce, queue=False, show_progress=False)\
         .then(fn=make_overlay, inputs=[generated_image_path, toggle_greet, greet], outputs=[generated_image_overlayed, greet_active], queue=False, show_progress=False)
    greet_active.change(fn=verify_latest_overlay, inputs=[generated_image_path, toggle_greet, greet, greet_active], outputs=[generated_image_overlayed, greet_active], queue=False,  show_progress=False)
    run_button.click(fn=prepare_generate, outputs=[generated_image, generated_image_overlayed, run_button], queue=False)\
              .then(fn=generate, inputs=[prompt, style_selection], outputs=[progress_html, generated_image, generated_image_path], queue=True)\
              .then(fn=make_overlay, inputs=[generated_image_path, toggle_greet, greet], outputs=[generated_image_overlayed, greet_active], queue=False)\
              .then(fn=finish_generate, outputs=[generated_image, generated_image_overlayed, run_button], queue=False)

shared.gradio_root.queue(concurrency_count=1, api_open=False)
shared.gradio_root.launch(server_name="0.0.0.0", show_api=False)