import gradio as gr import easyocr from transformers import pipeline from PIL import Image import numpy as np import os from typing import Tuple ## 1. تنظیمات اولیه و مدل‌ها # ---------------------------------- class OCRProcessor: def __init__(self): self.reader = easyocr.Reader(['fa']) def extract_text(self, image: np.ndarray) -> str: """استخراج متن از تصویر با EasyOCR""" try: results = self.reader.readtext(image) return " ".join([result[1] for result in results]) if results else "" except Exception as e: raise RuntimeError(f"خطا در پردازش OCR: {str(e)}") class TextPostProcessor: def __init__(self): # تنظیمات پیش‌پردازش متن self.replacements = { 'ي': 'ی', 'ك': 'ک', '۰':'0', '۱':'1', '۲':'2', '۳':'3', '۴':'4', '۵':'5', '۶':'6', '۷':'7', '۸':'8', '۹':'9' } # بارگذاری مدل زبانی try: self.llm = pipeline("text-generation", model="gpt2") except: self.llm = None def preprocess(self, text: str) -> str: """پیش‌پردازش متن استخراج شده""" if not text: return "" # نرمال‌سازی متن for old, new in self.replacements.items(): text = text.replace(old, new) return " ".join(text.split()) def enhance_with_llm(self, text: str) -> str: """بهبود متن با مدل زبانی""" if not text or not self.llm: return text try: enhanced = self.llm( f"اصلاح و بازنویسی متن فارسی زیر:\n{text}\n\nمتن بهبود یافته:", max_length=200, num_return_sequences=1 ) return enhanced[0]['generated_text'] except: return text ## 2. پردازش اصلی # ---------------------------------- def full_processing(image: np.ndarray) -> Tuple[str, str]: """پایپلاین کامل پردازش تصویر""" try: # 1. استخراج متن ocr_text = OCRProcessor().extract_text(image) # 2. پیش‌پردازش post_processor = TextPostProcessor() cleaned_text = post_processor.preprocess(ocr_text) # 3. بهبود با مدل زبانی enhanced_text = post_processor.enhance_with_llm(cleaned_text) return cleaned_text, enhanced_text except Exception as e: return f"خطا: {str(e)}", "" ## 3. رابط کاربری Gradio # ---------------------------------- with gr.Blocks(title="پایپلاین OCR فارسی با LLM") as app: gr.Markdown(""" # سیستم پیشرفته پردازش متن فارسی استخراج متن از تصاویر + پردازش با مدل زبانی """) with gr.Row(): with gr.Column(): img_input = gr.Image(label="تصویر ورودی", type="numpy") process_btn = gr.Button("پردازش تصویر", variant="primary") with gr.Column(): with gr.Tab("نتایج پردازش"): raw_output = gr.Textbox(label="متن استخراج شده") enhanced_output = gr.Textbox(label="متن بهبود یافته") with gr.Tab("پیش‌نمایش"): gr.Markdown("### تصویر ورودی") img_preview = gr.Image(label="", interactive=False) # پردازش خودکار هنگام آپلود تصویر img_input.change( fn=lambda x: x, inputs=img_input, outputs=img_preview ) # پردازش اصلی هنگام کلیک دکمه process_btn.click( fn=full_processing, inputs=img_input, outputs=[raw_output, enhanced_output] ) if __name__ == "__main__": app.launch()