File size: 18,440 Bytes
2d9bfd2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9c7e39f
 
 
2d9bfd2
 
9c7e39f
2d9bfd2
9c7e39f
2d9bfd2
 
f6c784d
 
2d9bfd2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6c18e26
 
 
 
 
 
 
 
 
 
 
2d9bfd2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f6c784d
2d9bfd2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6c18e26
2d9bfd2
 
 
 
 
 
 
 
 
 
 
 
 
cccc783
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
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
'''
AnyText: Multilingual Visual Text Generation And Editing
Paper: https://arxiv.org/abs/2311.03054
Code: https://github.com/tyxsspa/AnyText
Copyright (c) Alibaba, Inc. and its affiliates.
'''
import os
import time
import uuid
import cv2
import gradio as gr
import re
import json
import argparse
import random
from src.generation import call_generation
from src.util import upload_np_2_oss

def count_lines(prompt):
    prompt = prompt.replace('“', '"')
    prompt = prompt.replace('”', '"')
    p = '"(.*?)"'
    strs = re.findall(p, prompt)
    if len(strs) == 0:
        strs = [' ']
    return len(strs)


def process(mode, prompt, texts, texts2, layout_radio, sort_radio, revise_pos, base_model_path, lora_path_ratio, show_debug, img_count, ddim_steps, w, h, strength, cfg_scale, seed, eta, a_prompt, n_prompt):
    texts = '"' + texts + '"'
    n_lines = count_lines(texts)
    if texts2 != "":
        texts2 = '"' + texts2 + '"'
        n_lines += count_lines(texts2)
        texts += texts2

    layout_dict = {"top": "example_images/templates/top_512_512.png",
                   "down": "example_images/templates/bottom_512_512.png",
                   "left": "example_images/templates/left_512_512.png",
                   "right": "example_images/templates/right_512_512.png",
                   "top two": "example_images/templates/top2_512_512.png",
                   "down two": "example_images/templates/bottom2_512_512.png",
                   "left and right": "example_images/templates/left_right_512_512.png",
                   "top and down": "example_images/templates/top_bottom_512_512.png"}


    temp_path = layout_dict[layout_radio]

    pos_imgs = cv2.imread(temp_path)
    pos_imgs = cv2.resize(pos_imgs, (w, h), interpolation=cv2.INTER_NEAREST)

    pos_imgs_url = upload_np_2_oss(pos_imgs, 'pos_imgs.png')

    print(pos_imgs_url)
    
    
    results = call_generation(prompt + texts, pos_imgs_url, lora_path_ratio, w, h, img_count)

    return results



is_t2i = 'true'
block = gr.Blocks(css='css/style.css', theme=gr.themes.Soft()).queue()

#with open('javascript/bboxHint.js', 'r') as file:
#    value = file.read()
#escaped_value = json.dumps(value)

with block:
    block.load(fn=None)
    gr.HTML('<div style="text-align: center; margin: 20px auto;"> \
            <img id="banner" src="https://huggingface.co/spaces/martinxm/MemeMaster/resolve/main/example_images/banner2.png" alt="anytext_meme"> <br>  \
            [<a href="https://arxiv.org/abs/2311.03054" style="color:blue; font-size:18px;">arXiv</a>] \
            [<a href="https://github.com/tyxsspa/AnyText" style="color:blue; font-size:18px;">Code</a>] \
            [<a href="https://modelscope.cn/studios/iic/MemeMaster/summary" style="color:blue; font-size:18px;">ModelScope</a>]\
            [<a href="https://huggingface.co/spaces/modelscope/MemeMaster" style="color:blue; font-size:18px;">HuggingFace</a>]\
            version: 0.1.0 </div>')
    with gr.Row(variant='compact'):
        with gr.Accordion('🕹Instructions', open=True,):
                with gr.Tabs():
                    gr.Markdown('<span style="color:black;font-size:16px">Step1: Choose meme style</span>')
                    gr.Markdown('<span style="color:black;font-size:16px">Step2: Write texts (support 1-2 lines/Chinese and English)</span>')
                    gr.Markdown('<span style="color:black;font-size:16px">Step3: Choose texts layout</span>')
                    gr.Markdown('<span style="color:black;font-size:16px">Step4: Generate meme</span>')             
    
    
    with gr.Tab("🖼Meme Gallery"):
        gallery = gr.Gallery(
            label="Generated images", value = [os.path.join('example_images/gallery/',path) for path in os.listdir('example_images/gallery/')],show_label=False, elem_id="gallery"
                , columns=[4], rows=[1], object_fit="contain", height="auto")     
    
    with gr.Tab("🔧Meme Generation"):
        with gr.Row(variant='compact'):
            with gr.Column() as left_part:
                pass
            with gr.Column():
                result_gallery = gr.Gallery(label='results', show_label=True, preview=True, columns=2, allow_preview=True, height=600)
                # result_info = gr.Markdown('', visible=False)
            with left_part:
                with gr.Accordion('🛠Parameters', open=False):
                    # with gr.Row(variant='compact'):
                    prompt = gr.Textbox(label="Prompt", elem_id='t2i_prompt', value='Cute Chinese Dragon, (Best quality: 1.1), (Realistic: 1.1), (Photography: 1.1), (highly details: 1.1) with the words ', visible=False)
                    with gr.Row(variant='compact'):
                        img_count = gr.Slider(label="image number", minimum=1, maximum=4, value=4, step=1)
                        ddim_steps = gr.Slider(label="steps", minimum=1, maximum=100, value=20, step=1, visible=False)
                    with gr.Row(variant='compact'):
                        image_width = gr.Slider(label="width", minimum=256, maximum=768, value=512, step=64)
                        image_height = gr.Slider(label="height", minimum=256, maximum=768, value=512, step=64)
                        strength = gr.Slider(label="Strength", minimum=0.0, maximum=2.0, value=1.0, step=0.01, visible=False)
                        cfg_scale = gr.Slider(label="CFG scale", minimum=0.1, maximum=30.0, value=9.0, step=0.1, visible=False)
                        seed = gr.Slider(label="seed", minimum=-1, maximum=99999999, step=1, randomize=False, value=-1, visible=False)
                        eta = gr.Number(label="eta (DDIM)", value=0.0, visible=False)
                        show_debug = gr.Checkbox(label='debug', value=False, visible=False)
                    a_prompt = gr.Textbox(label="Added Prompt", value='best quality, extremely detailed,4k, HD, supper legible text,  clear text edges,  clear strokes, neat writing, no watermarks', visible=False)
                    n_prompt = gr.Textbox(label="Negative Prompt", value='low-res, bad anatomy, extra digit, fewer digits, cropped, worst quality, low quality, watermark, unreadable text, messy words, distorted text, disorganized writing, advertising picture', visible=False)
                base_model_path = gr.Textbox(label='Base Model Path', visible=False, value='./')
                lora_path_ratio = gr.Textbox(label='LoRA Path and Ratio', visible=False, value='9 0.5')
                
                with gr.Column():
                    with gr.Row(variant='compact'):
                        style_radio = gr.Radio(["Q版3D小龙(3D dragon)", "红火财神爷(Red wealthgod)", "2D手绘小龙(2D dragon)","黄金财神爷(Gold wealthgod)","喜庆灯笼(Lantern)","可爱贴纸(Sticker)","可爱喷绘(Splash)","卡通门神(Doorgod)","可爱盲盒(Blindbox)","蜡笔女孩(Crayon)","肥龙在天(Fat dragon)"], value='Q版3D小龙(3D dragon)', label="Meme Style", visible=True)
                        example_style1 = gr.Image(value='example_images/example_style/3dcute_dragon.jpg',visible=True, label="Q版3D小龙(3D dragon)", height=320, width=320, elem_id="example_style1")
                        example_style2 = gr.Image(value='example_images/example_style/caishenye1.jpg',visible=False, label="红火财神爷(Red wealthgod)", height=320, width=320, elem_id="example_style2")
                        example_style3 = gr.Image(value='example_images/example_style/2dcartoon_dragon.jpg',visible=False, label="2D手绘小龙(2D dragon)", height=320, width=320, elem_id="example_style3")
                        example_style4 = gr.Image(value='example_images/example_style/caishenye2.jpg',visible=False, label="黄金财神爷(Gold wealthgod)", height=320, width=320, elem_id="example_style4")
                        example_style5 = gr.Image(value='example_images/example_style/cute_lantern_girl.jpg',visible=False, label="喜庆灯笼(Lantern)", height=320, width=320, elem_id="example_style5")
                        example_style6 = gr.Image(value='example_images/example_style/cute_baby_girl.jpg',visible=False, label="可爱贴纸(Sticker)", height=320, width=320, elem_id="example_style6")
                        example_style7 = gr.Image(value='example_images/example_style/cutegirl1.jpg',visible=False, label="可爱喷绘(Splash)", height=320, width=320, elem_id="example_style7")
                        example_style8 = gr.Image(value='example_images/example_style/cartoon_doorgod.jpg',visible=False, label="卡通门神(Doorgod)", height=320, width=320, elem_id="example_style8")
                        example_style9 = gr.Image(value='example_images/example_style/blindbox.jpg',visible=False, label="可爱盲盒(Blindbox)", height=320, width=320, elem_id="example_style9")
                        example_style10 = gr.Image(value='example_images/example_style/crayon.jpg',visible=False, label="蜡笔女孩(Crayon)", height=320, width=320, elem_id="example_style10")
                        example_style11 = gr.Image(value='example_images/example_style/fatdragon.jpg',visible=False, label="肥龙在天(Fat dragon)", height=320, width=320, elem_id="example_style11")
          

                def change_options2(selected_option):
                    if selected_option == 'Q版3D小龙(3D dragon)':
                        _text = 'Cute Chinese Dragon, (Best quality: 1.1), (Realistic: 1.1), (Photography: 1.1), (highly details: 1.1), with a sign written '
                        _lora = '9 0.5'
                    elif selected_option == '红火财神爷(Red wealthgod)':
                        _text = '1boy,chinese clothes,facial hair,solo,full body,red_background,chibi, with a sign written '
                        _lora = '13 1.0'
                    elif selected_option == '2D手绘小龙(2D dragon)':
                        _text = 'Cute Chinese Dragon, no humans,white background,solo,full body,looking at viewer,blush stickers,claws, (Best quality: 1.1), (Realistic: 1.1), (Photography: 1.1), (highly details: 1.1), written, with a sign written '
                        _lora = '9 0.5'
                    elif selected_option == '黄金财神爷(Gold wealthgod)':
                        _text = 'dafengcaishen,solo,blush,simple background,long sleeves,1boy,hat,white background,standing,full body,Smiling eyes,male focus,wide sleeves,chibi,facial hair,chinese clothes,crown,facing viewer,mustache, on the sign reads, with a sign written '
                        _lora = '10 0.8'
                    elif selected_option == '可爱贴纸(Sticker)':
                        _text = 'masterpiece,cartoon, best quality,high quality, sticker, 1girl, chinese new year, happy, smiling, with a sign written '
                        _lora = '1 0.8'
                    elif selected_option == '喜庆灯笼(Lantern)':
                        _text = "children's animation, masterpiece,best quality,chinese new year, cartoon drawing,  1girl, cute face, fish, red Chinese dress, half-body,  lantern, fireworks, cartoon style, 2d-drawing, with a sign written "
                        _lora = '3 0.65'
                    elif selected_option == '可爱喷绘(Splash)':
                        _text = 'masterpiece,best quality,chinese new year,1girl,close-up portrait, solo, joyful festive expression, cute face, looking at viewer, golden chinese dragon,short hair,blue hair,red background,dress,chinese clothes,red dress,china dress,simple background,cnd style,pose, cndstyle, on the wall that reads, with a sign written '
                        _lora = '15 0.8'
                    elif selected_option == '卡通门神(Doorgod)':
                        _text = 'chinese door gods, a painting of god with a sword and armor, full body, 1boy, male focus, solo, drawing, with a sign written '
                        _lora = '2 0.5'
                    elif selected_option == '可爱盲盒(Blindbox)':
                        _text = 'chinese new year, (masterpiece),(best quality),(ultra-detailed), (full body:1.2),1girl,chibi,cute, smile, open mouth,flower, outdoors, beret, jacket, blush, tree, :3, shirt, short hair, cherry blossoms, red headwear, blurry, brown hair, blush stickers, long sleeves, bangs, headphones, black hair, pink flower,(beautiful detailed face), (beautiful detailed eyes), with a sign written '
                        _lora = '6 0.8'
                    elif selected_option == '蜡笔女孩(Crayon)':
                        _text = 'masterpiece,cartoon, best quality,high quality, 1girl, chinese new year, happy, smiling, with a sign written '
                        _lora = '8 0.8'
                    elif selected_option == '肥龙在天(Fat dragon)':
                        _text = 'Cute yellow fat Dragon, flying in the cloud, simple background, 2D cartoon, 2D sticker, with a sign written '
                        _lora = '9 0.5'
                        
                    return [
                            gr.Textbox(value=_text),
                            gr.Textbox(value=_lora),
                            gr.Image(visible=selected_option == 'Q版3D小龙(3D dragon)'),
                            gr.Image(visible=selected_option == '红火财神爷(Red wealthgod)'),
                            gr.Image(visible=selected_option == '2D手绘小龙(2D dragon)'),
                            gr.Image(visible=selected_option == '黄金财神爷(Gold wealthgod)'),
                            gr.Image(visible=selected_option == '喜庆灯笼(Lantern)'),
                            gr.Image(visible=selected_option == '可爱贴纸(Sticker)'),
                            gr.Image(visible=selected_option == '可爱喷绘(Splash)'),
                            gr.Image(visible=selected_option == '卡通门神(Doorgod)'),
                            gr.Image(visible=selected_option == '可爱盲盒(Blindbox)'),
                            gr.Image(visible=selected_option == '蜡笔女孩(Crayon)'),
                            gr.Image(visible=selected_option == '肥龙在天(Fat dragon)'),
                            ]
                style_radio.change(change_options2, style_radio, [prompt, lora_path_ratio, example_style1, example_style2, example_style3,example_style4,example_style5,example_style6,example_style7,example_style8,example_style9, example_style10, example_style11], show_progress=False, queue=False)




                def change_buttons(selected_option):
                    if selected_option == 'Add a line':
                        return [gr.Button(value="Delete a line", scale=0.3, elem_classes='add_row'),
                                gr.Textbox(value='恭喜发财', visible=True),
                                gr.Radio(["top two","down two","left and right","top and down"], value='left right')]
                    elif selected_option == 'Delete a line':
                        return [gr.Button(value="Add a line", scale=0.3, elem_classes='add_row'),
                                gr.Textbox(value="", visible=False),
                                gr.Radio(["top","down","left","right"], value='down')]




                texts = gr.Textbox(label="Input Texts(first line)", value='新春快乐')
                texts2 = gr.Textbox(label="Input Texts(second line)", value='', visible=False)
                layout_radio = gr.Radio(["top","down","left","right"], value='down', label="Text layout", visible=True)
                
                def text_change(in_texts):
                    if len(in_texts)> 10:
                        gr.Warning("The text length is too long, please input a shorter text for better quality.")
                    
                    return


                texts.change(fn=text_change, inputs=texts, outputs=None)
                texts2.change(fn=text_change, inputs=texts2, outputs=None)

                with gr.Row():
                    gr.Markdown("")
                    add_row_bt = gr.Button(value="Add a line", scale=0.3, elem_classes='add_row')
                    gr.Markdown("")
                
                add_row_bt.click(change_buttons, add_row_bt, [add_row_bt,texts2,layout_radio], show_progress=False, queue=False)

                layout_radio.change(fn=None, inputs=layout_radio, outputs=layout_radio, show_progress=False, queue=False)


                def exp_gen_click():
                    return [gr.Slider(value=512), gr.Slider(value=512)]  # all examples are 512x512, refresh draw_img
                with gr.Tab("Examples"):
                            with gr.Row(variant='compact'):
                                exp_gen_en = gr.Examples(
                                    [
                                        ['新年快乐'],
                                        ['Happy New Year'],
                                        ['恭贺新年'],
                                        ['新春快乐'],
                                        ['龙年吉祥'],
                                        ['万事如意'],
                                        ['大吉大利'],
                                        ['恭贺新禧'],
                                        ['初五迎财神'],
                                        ['恭喜发财']                             
                                    ],
                                    [texts],
                                    examples_per_page=15,
                                    label=''
                                )
                                exp_gen_en.dataset.click(exp_gen_click, None, [image_width, image_height])
                

                with gr.Row():
                    sort_radio = gr.Radio(["↕", "↔"], value='↕', label="Sort Position", visible=False)
                    revise_pos = gr.Checkbox(label='Revise Position', value=False, visible=False)

                with gr.Row():
                    gr.Markdown("")
                    run_gen = gr.Button(value="Generate meme!", scale=0.3, elem_classes='run')
                    gr.Markdown("")
                            

  

    ips = [prompt, texts, texts2, layout_radio, sort_radio, revise_pos, base_model_path, lora_path_ratio, show_debug,img_count, ddim_steps, image_width, image_height, strength, cfg_scale, seed, eta, a_prompt, n_prompt]
    run_gen.click(fn=process, inputs=[gr.State('gen')] + ips, outputs=[result_gallery])

block.launch(share=True)