| import gradio as gr
|
| from PIL import Image
|
| import numpy as np
|
| from io import BytesIO
|
| import glob
|
| import os
|
| import time
|
| from data.dataset import load_itw_samples, crop_
|
| import torch
|
| import cv2
|
| import os
|
| import numpy as np
|
| from models.model import TRGAN
|
| from params import *
|
| from torch import nn
|
| from data.dataset import get_transform
|
| import pickle
|
| from PIL import Image
|
| import tqdm
|
| import shutil
|
| from datetime import datetime
|
|
|
|
|
| wellcomingMessage = """
|
| <h1>π₯ Handwriting Synthesis - Generate text in anyone's handwriting π₯ </h1>
|
| <p>π This app is a demo for the ICCV'21 paper "Handwriting Transformer". Visit our github paper for more information - <a href="https://github.com/ankanbhunia/Handwriting-Transformers" target="_blank">https://github.com/ankanbhunia/Handwriting-Transformers</a></p>
|
| <p>π You can either choose from an existing style gallery or upload your own handwriting. If you choose to upload, please ensure that you provide a sufficient number of (~15) cropped handwritten word images for the model to work effectively. The demo is made available for research purposes, and any other use is not intended.</p>
|
| <p>π Some examples of cropped handwritten word images can be found <a href="https://huggingface.co/spaces/ankankbhunia/HWT/tree/main/files/example_data/style-1" target="_blank">here</a>.
|
| """
|
|
|
| model_path = 'files/iam_model.pth'
|
|
|
|
|
| batch_size = 1
|
| print ('(1) Loading model...')
|
| model = TRGAN(batch_size = batch_size)
|
| model.netG.load_state_dict(torch.load(model_path, map_location=torch.device('cpu')) )
|
| print (model_path+' : Model loaded Successfully')
|
| model.eval()
|
|
|
|
|
| def generate_image(text,folder, _ch3, images):
|
|
|
|
|
| try:
|
| text_copy = text
|
| if images:
|
| style_log = images
|
| style_inputs, width_length = load_itw_samples(images)
|
| elif folder:
|
| style_log = folder
|
| style_inputs, width_length = load_itw_samples(folder)
|
| else:
|
| return None
|
|
|
| text = text.replace("\n", "").replace("\t", "")
|
| text_encode = [j.encode() for j in text.split(' ')]
|
| eval_text_encode, eval_len_text = model.netconverter.encode(text_encode)
|
| eval_text_encode = eval_text_encode.to(DEVICE).repeat(batch_size, 1, 1)
|
|
|
| input_styles, page_val = model._generate_page(style_inputs.to(DEVICE).clone(), width_length, eval_text_encode, eval_len_text, no_concat = True)
|
| page_val = crop_(page_val[0]*255)
|
| input_styles = crop_(input_styles[0]*255)
|
|
|
| max_width = max(page_val.shape[1],input_styles.shape[1])
|
|
|
| if page_val.shape[1]!=max_width:
|
| page_val = np.concatenate([page_val, np.ones((page_val.shape[0],max_width-page_val.shape[1]))*255], 1)
|
| else:
|
| input_styles = np.concatenate([input_styles, np.ones((input_styles.shape[0],max_width-input_styles.shape[1]))*255], 1)
|
|
|
| upper_pad = np.ones((45,input_styles.shape[1]))*255
|
| input_styles = np.concatenate([upper_pad, input_styles], 0)
|
| page_val = np.concatenate([upper_pad, page_val], 0)
|
|
|
| page_val = Image.fromarray(page_val).convert('RGB')
|
| input_styles = Image.fromarray(input_styles).convert('RGB')
|
|
|
| current_datetime = datetime.now()
|
| formatted_datetime = current_datetime.strftime("%Y-%m-%d %H:%M:%S")
|
|
|
| print (f'{formatted_datetime}: input_string - {text_copy}, style_input - {style_log}\n')
|
|
|
| return input_styles, page_val
|
|
|
| except:
|
| print ('ERROR! Try again.')
|
| return None, None
|
|
|
|
|
| input_text_string = "In the quiet hum of everyday life, the dance of existence unfolds. Time, an ever-flowing river, carries the stories of triumph and heartache. Each fleeting moment is a brushstroke on the canvas of our memories."
|
|
|
| iface = gr.Interface(
|
| fn=generate_image,
|
| inputs=[
|
| gr.Textbox(value = input_text_string, label = "Input text"),
|
| gr.Dropdown(value = "files/example_data/style-30", choices=glob.glob('files/example_data/*'), label="Choose from provided writer styles"),
|
| gr.Markdown("### OR"),
|
| gr.File(label="Upload multiple word images", file_count="multiple")
|
| ],
|
| outputs=[
|
| gr.Image(type="pil", label="Style Image"),
|
| gr.Image(type="pil", label="Generated Image")],
|
| description = wellcomingMessage,
|
| thumbnail = "Handwriting Synthesis - Mimic anyone's handwriting!",
|
|
|
|
|
|
|
|
|
| )
|
|
|
|
|
| iface.launch(debug=True, share=True)
|
|
|