pylaia-htr / app.py
Flavio de Oliveira
Update executable command
815b94d
raw
history blame
2.78 kB
import gradio as gr
import subprocess
from PIL import Image
import tempfile
import os
import yaml
def predict(input_image: Image.Image):
try:
# 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 = f.read().strip().split('\n')[-1]
else:
print('predict.txt does not exist')
return output
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()