MemeMaster / app.py
承弱
update gallery
f6c784d
'''
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)