Spaces:
Running
Running
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)
|