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()