space2oon / app.py
suprimedev's picture
Create app.py
c83c9c5 verified
"""
OCR فارسی با یک خط بارگذاری تصویر + نمایش نتایج در گریدیو
"""
import gradio as gr
import cv2, io, os
import numpy as np
from PIL import Image, ImageDraw, ImageFont
import tesserocr # حتماً در تصویر داکر نصب شده باشد
from tesserocr import PyTessBaseAPI
# -------------------------------
# تحریرک Tesseract ساده‌خط
# -------------------------------
DEFAULT_TESS_PATH = '/usr/share/tesseract-ocr/4.00/tessdata/' # در بیشتر تصاویر داکر HuggingFace
RESIZE_LONG_SIDE = 1024 # مقیاس برای کاهش هزینه پردازش
def resize_longest(img: Image.Image, max_long: int = RESIZE_LONG_SIDE):
w, h = img.size
ratio = max_long / max(w, h)
if ratio >= 1:
return img
new_w = int(w * ratio)
new_h = int(h * ratio)
return img.resize((new_w, new_h), Image.LANCZOS)
def persian_ocr_one(file):
if isinstance(file, tuple):
img = Image.open(file[0])
else:
img = Image.open(file)
img = img.convert("RGB")
img = resize_longest(img)
pix = np.array(img)
# تبدیل به طیف‌های تأثیرگذار برای متون فارسی
gray = cv2.cvtColor(pix, cv2.COLOR_RGB2GRAY)
den = cv2.fastNlMeansDenoising(gray, None, 10, 7, 21)
image_bin = Image.fromarray(den)
# راه‌اندازی Tesseract فقط یک‌بار در هر فراخوانی (به دلیل thread-safe بودن)
# دقت کنید زبان را روی 'fas' تنظیم کرده باشید
tess_args = (
6, # PSM__SINGLE_BLOCK
{"lang": "fas"} # فارسی
)
api = PyTessBaseAPI(path=DEFAULT_TESS_PATH,
lang='fas',
psm=tesserocr.PSM.SINGLE_BLOCK)
api.SetImage(image_bin)
text = api.GetUTF8Text().strip()
api.End()
return text
# -------------------------------
# رابط کاربری مینیمال
# -------------------------------
demo = gr.Interface(
fn=persian_ocr_one,
inputs=gr.Image(type="filepath", label="تصویر"),
outputs=gr.Textbox(label="متن استخراج‌شده (فارسی)"),
title="OCR فارسی",
description="تصویری که شامل متن فارسی است را بارگذاری کنید تا متن داخل آن استخراج شود."
)
if __name__ == "__main__":
demo.queue(max_size=20).launch()