Spaces:
Sleeping
Sleeping
from .constants import MODEL_PATH | |
from rapidocr_onnxruntime import RapidOCR | |
from numpy.typing import NDArray | |
from os import PathLike | |
from shapely import Polygon | |
from shapely.geometry import box, MultiPolygon | |
from shapely.ops import unary_union | |
from typing import cast | |
_rapid_ocr = RapidOCR(rec_model_path=MODEL_PATH) | |
def ocr(image: NDArray | PathLike, esp: float = 0.5) -> list[tuple[Polygon, str]]: | |
result, _ = _rapid_ocr(image) | |
result.sort(key=lambda x: x[0][0][1]) | |
texts: list[str] = [] | |
shapes: list[Polygon] = [] | |
for points, text, _ in result: | |
x, y, xmax, ymax = Polygon(points).bounds | |
ymax += (ymax - y) * esp | |
shapes.append(box(x, y, xmax, ymax)) | |
texts.append(text) | |
merged_shapes = cast(MultiPolygon, unary_union(shapes)).geoms | |
merged_texts = [""] * len(merged_shapes) | |
visited = [False] * len(texts) | |
for i, shape in enumerate(merged_shapes): | |
for j, text in enumerate(texts): | |
if not visited[j]: | |
if shapes[j].intersects(shape): | |
merged_texts[i] += f" {text}" | |
visited[j] = True | |
return list(zip(merged_shapes, merged_texts)) | |