''' 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, _js=f"""() => {{ const script = document.createElement("script"); const text = document.createTextNode({escaped_value}); script.appendChild(text); document.head.appendChild(script); }}""") gr.HTML('
\
\ [arXiv] \ [Code] \ [ModelScope]\ [HuggingFace]\ version: 0.1.0
') with gr.Row(variant='compact'): with gr.Accordion('🕹Instructions', open=True,): with gr.Tabs(): gr.Markdown('Step1: Choose meme style') gr.Markdown('Step2: Write texts (support 1-2 lines/Chinese and English)') gr.Markdown('Step3: Choose texts layout') gr.Markdown('Step4: Generate meme') 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)", info="效果预览", height=320, width=320, elem_id="example_style1") example_style2 = gr.Image(value='example_images/example_style/caishenye1.jpg',visible=False, label="红火财神爷(Red wealthgod)", info="效果预览", 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)", info="效果预览", height=320, width=320, elem_id="example_style3") example_style4 = gr.Image(value='example_images/example_style/caishenye2.jpg',visible=False, label="黄金财神爷(Gold wealthgod)", info="效果预览", 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)", info="效果预览", 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)", info="效果预览", height=320, width=320, elem_id="example_style6") example_style7 = gr.Image(value='example_images/example_style/cutegirl1.jpg',visible=False, label="可爱喷绘(Splash)", info="效果预览", height=320, width=320, elem_id="example_style7") example_style8 = gr.Image(value='example_images/example_style/cartoon_doorgod.jpg',visible=False, label="卡通门神(Doorgod)", info="效果预览", height=320, width=320, elem_id="example_style8") example_style9 = gr.Image(value='example_images/example_style/blindbox.jpg',visible=False, label="可爱盲盒(Blindbox)", info="效果预览", height=320, width=320, elem_id="example_style9") example_style10 = gr.Image(value='example_images/example_style/crayon.jpg',visible=False, label="蜡笔女孩(Crayon)", info="效果预览", height=320, width=320, elem_id="example_style10") example_style11 = gr.Image(value='example_images/example_style/fatdragon.jpg',visible=False, label="肥龙在天(Fat dragon)", info="效果预览", 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", info="position sorting priority", 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(server_name='0.0.0.0',share=False, server_port=7687)