pylaia-htr / app.py
Flavio de Oliveira
Correct resize function
a8e12af
raw
history blame
3.44 kB
import gradio as gr
import subprocess
from PIL import Image
import tempfile
import os
import yaml
def resize_image(image, base_height):
# Calculate aspect ratio
w_percent = base_height / float(image.size[1])
w_size = int(float(image.size[0]) * float(w_percent))
# Resize the image
return image.resize((w_size, base_height), Image.Resampling.LANCZOS)
def predict(input_image: Image.Image):
try:
# Try to resize the image to a fixed height of 128 pixels
try:
input_image = resize_image(input_image, 128)
except Exception as e:
print(f"Image resizing failed: {e}")
return f"Image resizing failed: {e}"
# Used as a context manager. Takes care of cleaning up the directory.
# Even if an error is raised within the with block, the directory is removed.
# No finally block needed
with tempfile.TemporaryDirectory() as temp_dir:
temp_image_path = os.path.join(temp_dir, 'temp_image.jpg')
temp_list_path = os.path.join(temp_dir, 'temp_img_list.txt')
temp_config_path = os.path.join(temp_dir, 'temp_config.yaml')
input_image.save(temp_image_path)
# Create a temporary img_list file
with open(temp_list_path, 'w') as f:
f.write(temp_image_path)
# Read the original config file and create a temporary one
with open('my_decode_config.yaml', 'r') as f:
config_data = yaml.safe_load(f)
config_data['img_list'] = temp_list_path
with open(temp_config_path, 'w') as f:
yaml.dump(config_data, f)
try:
subprocess.run(f"pylaia-htr-decode-ctc --config {temp_config_path} | tee predict.txt", shell=True, check=True)
except subprocess.CalledProcessError as e:
print(f"Command failed with error {e.returncode}, output:\n{e.output}")
# subprocess.run(f"pylaia-htr-decode-ctc --config {temp_config_path} | tee predict.txt", shell=True, check=True)
# Alternative to shell=True (ChatGPT suggestion)
# from subprocess import Popen, PIPE
# # Run the first command and capture its output
# p1 = Popen(["pylaia-htr-decode-ctc", "--config", temp_config_path], stdout=PIPE)
# output = p1.communicate()[0]
# # Write the output to predict.txt
# with open('predict.txt', 'wb') as f:
# f.write(output)
# Read the output from predict.txt
if os.path.exists('predict.txt'):
with open('predict.txt', 'r') as f:
output_line = f.read().strip().split('\n')[-1] # Last line
_, prediction = output_line.split(' ', 1) # split only at the first space
else:
print('predict.txt does not exist')
return prediction
except subprocess.CalledProcessError as e:
return f"Command failed with error {e.returncode}"
# Gradio interface
title = "PyLaia HTR"
description = "Inference using PyLaia models."
examples = [["examples/example01.jpg"], ["examples/example02.jpg"]]
iface = gr.Interface(
fn=predict,
inputs=gr.inputs.Image(type="pil"),
outputs=gr.outputs.Textbox(),
title=title,
description=description,
examples=examples
)
iface.launch()