import logging from typing import Optional import cv2 import easyocr import torch logger = logging.getLogger("uvicorn") class OCRReader: _instance: Optional["OCRReader"] = None ocr_reader: easyocr.Reader def __new__(cls): if cls._instance is None: logger.info("Loading the OCR model into memory...") cls._instance = super(OCRReader, cls).__new__(cls) cls._instance.ocr_reader = easyocr.Reader( ["en", "fr"], gpu=torch.cuda.is_available() ) return cls._instance def read_text(self, img: cv2.typing.MatLike | None): res = self.ocr_reader.readtext(img, detail=0) if not isinstance(res, list): return None return " ".join([str(item) for item in res])