import gradio as gr import time import numpy as np from PIL import Image from paddleocr import PaddleOCR from transformers import TrOCRProcessor, VisionEncoderDecoderModel import easyocr import pytesseract from doctr.models import ocr_predictor # Initialize all models models = { "PaddleOCR": PaddleOCR(lang='en'), "EasyOCR": easyocr.Reader(['en']), "TrOCR": { "processor": TrOCRProcessor.from_pretrained("microsoft/trocr-base-printed"), "model": VisionEncoderDecoderModel.from_pretrained("microsoft/trocr-base-printed") }, "Tesseract": None, # Initialized by pytesseract "DocTR": ocr_predictor(det_arch='db_resnet50', reco_arch='crnn_vgg16_bn', pretrained=True) } def run_paddleocr(image): try: result = models["PaddleOCR"].ocr(np.array(image)) return ' '.join([line[1][0] for line in result[0]]) if result else '' except Exception as e: return f"Error: {str(e)}" def run_easyocr(image): try: result = models["EasyOCR"].readtext(np.array(image), detail=0) return ' '.join(result) if result else '' except Exception as e: return f"Error: {str(e)}" def run_trocr(image): try: pixel_values = models["TrOCR"]["processor"](image, return_tensors="pt").pixel_values generated_ids = models["TrOCR"]["model"].generate(pixel_values) return models["TrOCR"]["processor"].batch_decode(generated_ids, skip_special_tokens=True)[0] except Exception as e: return f"Error: {str(e)}" def run_tesseract(image): try: return pytesseract.image_to_string(image, lang='eng') except Exception as e: return f"Error: {str(e)}" def run_doctr(image): try: if isinstance(image, Image.Image): image = np.array(image) result = models["DocTR"]([image]) return ' '.join([word[0] for page in result.pages for block in page.blocks for line in block.lines for word in line.words]) except Exception as e: return f"Error: {str(e)}" def compare_models(image): if isinstance(image, np.ndarray): image = Image.fromarray(image) image = image.convert("RGB") results = {} times = {} # Run all OCR models for name, func in [("PaddleOCR", run_paddleocr), ("EasyOCR", run_easyocr), ("TrOCR", run_trocr), ("Tesseract", run_tesseract), ("DocTR", run_doctr)]: start = time.time() results[name] = func(image) times[name] = time.time() - start # Create comparison table table_rows = [] for name in results: table_rows.append(f"""
| Model | Extracted Text | Time (s) |
|---|