OCR מתקדם לאתגרי מסמכים מודרניים

חלץ טקסט במדויק ממסמכים סרוקים, תמונות וקבצי PDF עם זיהוי מבוסס למידה עמוקה

מה זה EasyOCR?

EasyOCR היא ספריית קוד פתוח לזיהוי תווים אופטי (OCR) שפותחה על ידי Jaided AI, המיועדת לחילוץ טקסט מתמונות ומסמכים סרוקים בדיוק גבוה. מבוססת על PyTorch, היא תומכת ביותר מ-80 שפות כולל לטינית, סינית, ערבית ועוד. EasyOCR ידועה בקלות השימוש שלה - נדרשים רק כמה שורות קוד כדי ליישם אותה, מה שהופך אותה לבחירה מצוינת למפתחים וחוקרים העובדים על פרויקטים של זיהוי טקסט. עם מודלי למידה עמוקה מאומנים מראש, היא יכולה לזהות ולקרוא טקסט ביעילות בגופנים שונים, כתבי יד ורקעים מורכבים. בין אם לעיבוד מסמכים אוטומטי, זיהוי לוחיות רישוי או חילוץ טקסט מתמונות, EasyOCR מספקת פתרון עוצמתי וקל משקל. המערכת משלבת:

  • זיהוי רב-מודלי: איתור טקסט מבוסס CRAFT עם שיפור ResNet
  • זיהוי אדפטיבי: מודלים ספציפיים לכתב (CRNN עבור לטינית, Transformer עבור CJK)
  • עיבוד מודע להקשר: שחזור פסקאות ושמירת סדר קריאה

מדדי ביצועים מראים תוצאות עקביות בסוגי מסמכים שונים:

סוג מסמךדיוקביצועיםחומרה
מסמכים עסקיים98.6%42 עמודים/דקהNVIDIA T4
תמונות מטלפון94.2%28 תמונות/דקהGoogle Colab GPU
ארכיונים היסטוריים89.1%15 עמודים/דקהמעבדי CPU

EasyOCR לזיהוי וחילוץ טקסט

הארכיטקטורה מעבדת מסמכים בשלושה שלבים מותאמים:

  1. זיהוי: פילוח אזורי טקסט ברמת פיקסל
  2. קריאה: חיזוי רצף עם מודל שפה
  3. שחזור: מיפוי יחסים מרחביים
GitHub

סטטיסטיקות GitHub

שֵׁם:
שפה:
כוכבים:
מזלגות:
רישיון:
המאגר עודכן לאחרונה ב

יכולות טכניות מרכזיות

1. זיהוי טקסט מתקדם

מערכת הזיהוי כוללת:

  • יצירת מפת חום ברמת תו
  • טיפול באזורי טקסט בצורות שרירותיות
  • תמיכה במספר כיוונים (0-360°)
  • דיכוי רעשי רקע

2. מערכת קריאה היברידית

מודלי הקריאה מותאמים לסוג כתב:

  • לטינית/קירילית: CRNN עם 7 שכבות CNN + BiLSTM
  • סינית/יפנית/קוריאנית: Transformer עם 12 ראשי קשב
  • ערבית/עברית: BiLSTM מימין לשמאל עם טוקניזציה מותאמת

3. תכונות ארגוניות

  • הערכת איכות אוטומטית
  • איזונים ניתנים להגדרה בין דיוק לריקול
  • הקצאת משאבים מותאמת חומרה

התקנה והגדרה

דרישות מערכת

רכיבפיתוחייצור
Python3.6+3.8+
זיכרון8GB16GB+
GPUאופציונליNVIDIA (CUDA 11.8+)

אפשרויות התקנה

התקנה בסיסית


pip install easyocr  # מתקין רק תלותיות מעבד

תמיכת GPU (לינוקס/חלונות)


pip install easyocr torch torchvision --index-url https://download.pytorch.org/whl/cu118

Docker (פריסת ייצור)


docker run -it --gpus all -v $(pwd):/data \
  -e LANG_LIST="en,fr,he" \
  jaidedai/easyocr

דוגמאות יישום מעשיות

1. צינור עיבוד מסמכים לייצור

תהליך OCR מלא עם עיבוד מקדים ואימות:

עיבוד מוכן לייצור


from easyocr import Reader
import cv2
import numpy as np

class DocumentOCR:
    def __init__(self, languages=['en']):
        self.reader = Reader(languages, gpu=True)
        
    def preprocess(self, image):
        # שיפור ניגודיות
        lab = cv2.cvtColor(image, cv2.COLOR_BGR2LAB)
        l, a, b = cv2.split(lab)
        clahe = cv2.createCLAHE(clipLimit=3.0, tileGridSize=(8,8))
        limg = cv2.merge([clahe.apply(l), a, b])
        return cv2.cvtColor(limg, cv2.COLOR_LAB2BGR)
    
    def process(self, image_path):
        img = cv2.imread(image_path)
        processed = self.preprocess(img)
        results = self.reader.readtext(processed,
                                    batch_size=4,
                                    paragraph=True,
                                    min_size=50,
                                    text_threshold=0.8)
        return {
            'text': [r[1] for r in results],
            'confidence': np.mean([r[2] for r in results])
        }

# שימוש
ocr = DocumentOCR(languages=['en','he'])
result = ocr.process('חוזה_משפטי.jpg')
print(f"דיוק ממוצע: {result['confidence']:.2%}")

2. עיבוד קבוצתי של חשבוניות

חילוץ שדות מפתח מפורמטים שונים של חשבוניות:

חילוץ נתוני חשבוניות


import easyocr
import re
from pathlib import Path

reader = easyocr.Reader(['he'])

PATTERNS_INVOICE = {
    'invoice_no': r'חשבונית\s*מספר[:#]?\s*([A-Z0-9-]+)',
    'date': r'תאריך[:]?\s*(\d{2}[/-]\d{2}[/-]\d{4})',
    'amount': r'סכום\s*סופי[:]?\s*\$?(\d+\.\d{2})'
}

def process_invoices(folder):
    results = []
    for invoice in Path(folder).glob('*.pdf'):
        text = '\n'.join(reader.readtext(str(invoice), detail=0))
        extracted = {field: re.search(pattern, text) 
                    for field, pattern in PATTERNS_INVOICE.items()}
        results.append({
            'file': invoice.name,
            'data': {k: v.group(1) if v else None 
                     for k, v in extracted.items()}
        })
    return results
invoices_data = process_invoices('/חשבוניות/')

אופטימיזציית ביצועים

האצת GPU

  • עיבוד קבוצתי: גדלי קבוצה אופטימליים (4-16 בהתאם לזיכרון GPU)
  • ניהול זיכרון: חלוקה אוטומטית למסמכים גדולים
  • דיוק מעורב: הסקה ב-FP16 עם Tensor Cores

כוונון דיוק

  • ספי ניגודיות: כוונן contrast_ths לסריקות באיכות נמוכה
  • סינון גודל טקסט: הגדר min_size להתעלם מטקסט קטן
  • עדיפות שפה: סדר שפות לפי שכיחות צפויה

מוצרים דומים

 Hebrew