#!/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 = '''

☝️ Bigmojis ☝️

An emoji upscaler, for when you really mean it
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()