Spaces:
Running
on
Zero
Running
on
Zero
import argparse | |
import os.path | |
from texify.inference import batch_inference | |
from texify.model.model import load_model | |
from texify.model.processor import load_processor | |
from PIL import Image | |
from texify.settings import settings | |
from texify.util import is_valid_image | |
import json | |
def inference_single_image(image_path, json_path, model, processor): | |
image = Image.open(image_path) | |
text = batch_inference([image], model, processor) | |
write_data = [{"image_path": image_path, "text": text[0]}] | |
with open(json_path, "w+") as f: | |
json_repr = json.dumps(write_data, indent=4) | |
f.write(json_repr) | |
def inference_image_dir(image_dir, json_path, model, processor, max=None): | |
image_paths = [os.path.join(image_dir, image_name) for image_name in os.listdir(image_dir)] | |
image_paths = [ip for ip in image_paths if is_valid_image(ip)] | |
if max: | |
image_paths = image_paths[:max] | |
write_data = [] | |
for i in range(0, len(image_paths), settings.BATCH_SIZE): | |
batch = image_paths[i:i+settings.BATCH_SIZE] | |
images = [Image.open(image_path) for image_path in batch] | |
text = batch_inference(images, model, processor) | |
for image_path, t in zip(batch, text): | |
write_data.append({"image_path": image_path, "text": t}) | |
with open(json_path, "w+") as f: | |
json_repr = json.dumps(write_data, indent=4) | |
f.write(json_repr) | |
def main(): | |
parser = argparse.ArgumentParser(description="OCR an image of a LaTeX equation.") | |
parser.add_argument("image", type=str, help="Path to image or folder of images to OCR.") | |
parser.add_argument("--max", type=int, help="Maximum number of images to OCR if a folder is passes.", default=None) | |
parser.add_argument("--json_path", type=str, help="Path to JSON file to save results to.", default=os.path.join(settings.DATA_DIR, "results.json")) | |
args = parser.parse_args() | |
image_path = args.image | |
model = load_model() | |
processor = load_processor() | |
json_path = os.path.abspath(args.json_path) | |
os.makedirs(os.path.dirname(json_path), exist_ok=True) | |
if os.path.isfile(image_path): | |
inference_single_image(image_path, json_path, model, processor) | |
else: | |
inference_image_dir(image_path, json_path, model, processor, args.max) | |
print(f"Wrote results to {json_path}") | |
if __name__ == "__main__": | |
main() | |