Spaces:
Build error
Build error
| #!/usr/bin/env python | |
| from __future__ import annotations | |
| import os | |
| import random | |
| import gradio as gr | |
| import numpy as np | |
| from PIL import Image, ImageDraw, ImageFont, ImageOps | |
| import uuid | |
| import argparse | |
| import cv2 | |
| import glob | |
| import os | |
| from basicsr.archs.rrdbnet_arch import RRDBNet | |
| from basicsr.utils.download_util import load_file_from_url | |
| from realesrgan import RealESRGANer | |
| from realesrgan.archs.srvgg_arch import SRVGGNetCompact | |
| DESCRIPTION = '''<center><h1>☝️ Bigmojis ☝️</h1></span> | |
| <span font-size:16px;">An emoji upscaler, for when you <i>really</i> mean it</span> | |
| </center> | |
| Space by [ZachNagengast](https://huggingface.co/ZachNagengast) | |
| [Follow me on Twitter!](https://twitter.com/ZachNagengast) | |
| Upscaler models provided by the [BasicSR](https://github.com/XPixelGroup/BasicSR) and [Real-ESRGAN](https://github.com/xinntao/Real-ESRGAN) python packages. | |
| Emojis by [Apple](https://www.apple.com). | |
| ''' | |
| upsampler = None | |
| netscale = 4 | |
| # load model | |
| def load_model(model_type='RealESRGAN_x4plus'): | |
| if model_type == 'RealESRGAN_x4plus': # x4 RRDBNet model | |
| model = RRDBNet(num_in_ch=3, num_out_ch=3, num_feat=64, num_block=23, num_grow_ch=32, scale=4) | |
| netscale = 4 | |
| file_url = f'models/{model_type}.pth' | |
| elif model_type == 'RealESRNet_x4plus': # x4 RRDBNet model | |
| model = RRDBNet(num_in_ch=3, num_out_ch=3, num_feat=64, num_block=23, num_grow_ch=32, scale=4) | |
| netscale = 4 | |
| file_url = f'models/{model_type}.pth' | |
| elif model_type == 'RealESRGAN_x4plus_anime_6B': # x4 RRDBNet model with 6 blocks | |
| model = RRDBNet(num_in_ch=3, num_out_ch=3, num_feat=64, num_block=6, num_grow_ch=32, scale=4) | |
| netscale = 4 | |
| file_url = f'models/{model_type}.pth' | |
| elif model_type == 'RealESRGAN_x2plus': # x2 RRDBNet model | |
| model = RRDBNet(num_in_ch=3, num_out_ch=3, num_feat=64, num_block=23, num_grow_ch=32, scale=2) | |
| netscale = 2 | |
| file_url = f'models/{model_type}.pth' | |
| elif model_type == 'realesr-animevideov3': # x4 VGG-style model (XS size) | |
| model = SRVGGNetCompact(num_in_ch=3, num_out_ch=3, num_feat=64, num_conv=16, upscale=4, act_type='prelu') | |
| netscale = 4 | |
| file_url = f'models/{model_type}.pth' | |
| ROOT_DIR = os.path.dirname(os.path.abspath(__file__)) | |
| model_path = os.path.join(ROOT_DIR, file_url) | |
| upsampler = RealESRGANer( | |
| scale=netscale, | |
| model_path=model_path, | |
| model=model, | |
| ) | |
| return upsampler | |
| def switch_model(model_type): | |
| global upsampler | |
| upsampler = load_model(model_type) | |
| def save_image(img): | |
| unique_name = str(uuid.uuid4()) + '.png' | |
| img.save(unique_name) | |
| return unique_name | |
| def generate_emoji_image( | |
| prompt: str, | |
| font_type: str = "Apple", | |
| background: str = "white", | |
| size: int = 160, | |
| padding: int = 0, | |
| ): | |
| font_name = "AppleColorEmoji.ttc" | |
| if font_type == "Google": | |
| font_name = "NotoColorEmoji.ttf" | |
| elif font_type == "Twitter": | |
| font_name = "TwitterColorEmoji.ttf" | |
| font = ImageFont.truetype( | |
| font_name, size=160 | |
| ) | |
| if background == "transparent": | |
| background = (0, 0, 0, 0) | |
| im = Image.new("RGBA", (size, size), background) | |
| d = ImageDraw.Draw(im) | |
| d.text((padding, padding), prompt, fill='white', embedded_color=True, font=font) | |
| return im | |
| def generate_preview( | |
| prompt: str, | |
| font_type: str = "Apple", | |
| background: str = "white", | |
| ): | |
| im = generate_emoji_image(prompt, font_type, background, 180, 10) | |
| return im | |
| def upscale_image(img): | |
| print(f"Upscaling...") | |
| cv2_im = np.array(img) | |
| output, _ = upsampler.enhance(cv2_im, outscale=netscale) | |
| return Image.fromarray(output) | |
| def generate_upscaled_emoji( | |
| prompt: str, | |
| font_type: str = "Apple", | |
| background: str = "white", | |
| model: str = "RealESRGAN_x4plus", | |
| ): | |
| padding = 10 # prevents border artifacts | |
| im = generate_emoji_image(prompt, font_type, background, 160+padding*2, padding) | |
| result = upscale_image(im) | |
| # crop padding | |
| cropped = ImageOps.crop(result, border=padding) | |
| return cropped | |
| examples = ['🤗', '😂', '🦙', '👍', '💸', '✨', '🚀', '🫱🏼🫲🏾', '🎉', '😎', '🛸', '🍩', '🦜', '🗿', '🧌', '🦋', '🆙'] | |
| with gr.Blocks(css="style.css") as demo: | |
| gr.Markdown(DESCRIPTION) | |
| with gr.Row(): | |
| with gr.Column(): | |
| with gr.Group(): | |
| with gr.Row(): | |
| prompt = gr.Text( | |
| label="Emoji", | |
| elem_id="prompt-text", | |
| show_label=True, | |
| max_lines=1, | |
| placeholder="Enter your emoji", | |
| container=False, | |
| ) | |
| run_button = gr.Button("Upscale", scale=0) | |
| with gr.Row(): | |
| preview = gr.Image(label="Glyph Bitmap", show_label=True, scale=1) | |
| background = gr.Radio(choices=["transparent", "white", "black", "red", "green", "blue"], value="transparent", label="Background Color") | |
| font_type = gr.Radio(choices=["Apple", "Google", "Twitter"], value="Apple", label="Type", visible=False) | |
| with gr.Row(): | |
| gr.Examples( | |
| examples=examples, | |
| inputs=prompt, | |
| outputs=[preview], | |
| fn=generate_emoji_image, | |
| cache_examples=False, | |
| ) | |
| with gr.Row(): | |
| model = gr.Radio(choices=['RealESRNet_x4plus','RealESRGAN_x4plus','RealESRGAN_x4plus_anime_6B','RealESRGAN_x2plus', 'realesr-animevideov3'], value="RealESRNet_x4plus", label="Model") | |
| with gr.Column(): | |
| upscaled = gr.Image(label="Upscaled", value="huggingface-big.png") | |
| gr.DuplicateButton( | |
| value="Duplicate Space for private use", | |
| elem_id="duplicate-button", | |
| visible=True, | |
| ) | |
| prompt.change(generate_preview, inputs=[prompt, font_type, background], outputs=[preview], api_name="run") | |
| background.change(generate_preview, inputs=[prompt, font_type, background], outputs=[preview], api_name="run") | |
| font_type.change(generate_preview, inputs=[prompt, font_type, background], outputs=[preview], api_name="run") | |
| model.change(switch_model, inputs=[model], outputs=[]) | |
| prompt.submit(generate_upscaled_emoji, inputs=[prompt, font_type, background, model], outputs=[upscaled], api_name="run") | |
| run_button.click(generate_upscaled_emoji, inputs=[prompt, font_type, background, model], outputs=[upscaled], api_name="run") | |
| if __name__ == "__main__": | |
| upsampler = load_model('RealESRNet_x4plus') | |
| demo.queue(max_size=20).launch() |