File size: 4,860 Bytes
9453eac
2bf547d
24f0403
9453eac
2bf547d
5c3f634
768d260
9453eac
db9549c
768d260
1f0a2e7
768d260
 
 
 
 
 
9453eac
5c3f634
1f0a2e7
5c3f634
768d260
5c3f634
 
1f0a2e7
9453eac
2bf547d
1f0a2e7
dd4c7df
768d260
 
 
 
1f0a2e7
768d260
 
1f0a2e7
768d260
 
 
 
 
 
dd4c7df
1f0a2e7
2bf547d
 
1f0a2e7
2bf547d
 
 
 
 
24f0403
2bf547d
1f0a2e7
db9549c
768d260
 
 
 
 
2bf547d
1f0a2e7
768d260
 
 
 
db9549c
1f0a2e7
 
768d260
 
 
2bf547d
db9549c
 
 
1f0a2e7
 
 
2bf547d
768d260
2bf547d
db9549c
2bf547d
 
db9549c
9453eac
1f0a2e7
 
db9549c
1f0a2e7
 
db9549c
9453eac
 
 
1f0a2e7
768d260
1f0a2e7
768d260
1f0a2e7
768d260
1f0a2e7
279ab91
 
1f0a2e7
 
 
db9549c
 
 
2bf547d
 
 
768d260
db9549c
9453eac
 
 
2bf547d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
import gradio as gr
import time
import numpy as np
from PIL import Image
from transformers import TrOCRProcessor, VisionEncoderDecoderModel
import easyocr
from doctr.models import ocr_predictor

# Initialize models
models = {
    "EasyOCR": easyocr.Reader(['fa']),  # تنظیم زبان فارسی
    "TrOCR": {
        "processor": TrOCRProcessor.from_pretrained("microsoft/trocr-base-printed"),
        "model": VisionEncoderDecoderModel.from_pretrained("microsoft/trocr-base-printed")
    },
    "DocTR": ocr_predictor(det_arch='db_resnet50', reco_arch='crnn_vgg16_bn', pretrained=True)
}

def run_easyocr(image):
    """تابع پردازش تصویر با EasyOCR برای فارسی"""
    try:
        result = models["EasyOCR"].readtext(np.array(image), detail=0)
        return ' '.join(result) if result else ''
    except Exception as e:
        return f"خطا: {str(e)}"

def run_trocr(image):
    """تابع پردازش تصویر با TrOCR برای فارسی"""
    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"خطا: {str(e)}"

def run_doctr(image):
    """تابع پردازش تصویر با DocTR برای فارسی"""
    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"خطا: {str(e)}"

def compare_models(image):
    """تابع اصلی مقایسه مدل‌ها"""
    if isinstance(image, np.ndarray):
        image = Image.fromarray(image)
    image = image.convert("RGB")
    
    results = {}
    times = {}
    
    # اجرای تمام مدل‌های OCR
    for name, func in [("EasyOCR", run_easyocr),
                      ("TrOCR", run_trocr),
                      ("DocTR", run_doctr)]:
        start = time.time()
        results[name] = func(image)
        times[name] = time.time() - start
    
    # ایجاد جدول مقایسه
    table_rows = []
    for name in results:
        table_rows.append(f"""
        <tr>
            <td style="padding: 8px; border: 1px solid #ddd; text-align: center; font-weight: bold;">{name}</td>
            <td style="padding: 8px; border: 1px solid #ddd; text-align: right; direction: rtl;">{results[name]}</td>
            <td style="padding: 8px; border: 1px solid #ddd; text-align: center;">{times[name]:.3f} ثانیه</td>
        </tr>
        """)
    
    comparison = f"""
    <div style="overflow-x: auto;">
    <table style="width:100%; border-collapse: collapse; margin: 15px 0; font-family: Arial, sans-serif;">
        <tr style="background-color: #4CAF50; color: white;">
            <th style="padding: 12px; border: 1px solid #ddd; text-align: center;">مدل</th>
            <th style="padding: 12px; border: 1px solid #ddd; text-align: center;">متن استخراج شده</th>
            <th style="padding: 12px; border: 1px solid #ddd; text-align: center;">زمان پردازش</th>
        </tr>
        {''.join(table_rows)}
    </table>
    </div>
    """
    
    return comparison, results['EasyOCR'], results['TrOCR'], results['DocTR']

# رابط کاربری Gradio
with gr.Blocks(title="مقایسه مدل‌های OCR فارسی", theme=gr.themes.Soft()) as demo:
    gr.Markdown("""
    # 🚀 مقایسه مدل‌های تشخیص متن فارسی
    مقایسه عملکرد مدل‌های مختلف OCR برای استخراج متن از تصاویر فارسی
    """)
    
    with gr.Row():
        with gr.Column():
            img_input = gr.Image(label="تصویر ورودی", type="pil")
            gr.Examples(
                examples=["sample_fa1.jpg", "sample_fa2.png"],
                inputs=img_input,
                label="تصاویر نمونه"
            )
            submit_btn = gr.Button("مقایسه مدل‌ها", variant="primary")
        
        with gr.Column():
            comparison = gr.HTML(label="نتایج مقایسه")
            with gr.Accordion("نتایج تفکیکی", open=False):
                gr.Markdown("### خروجی هر مدل")
                easy_output = gr.Textbox(label="EasyOCR")
                trocr_output = gr.Textbox(label="TrOCR")
                doctr_output = gr.Textbox(label="DocTR")
    
    submit_btn.click(
        fn=compare_models,
        inputs=img_input,
        outputs=[comparison, easy_output, trocr_output, doctr_output]
    )

if __name__ == "__main__":
    demo.launch()