مقالات متنوعة

المواجهة النهائية للتعرف الضوئي على الحروف العربية: أي ذكاء اصطناعي يقرأ بشكل أفضل؟

الأدمن
8 دقائق للقراءة
اي ذكاء اصطناعي يقرأ بشكل أفضل؟

أجرينا 9 حلول على نفس صفحة خطة العمل العربية. تفوّق أحدها على البقية. إليك مقارنة شاملة بينها جميعًا.

الأقسام:

الإعداد ووثيقة الاختبار

  1. الإعداد واختبار المستند
  2. Nanonets-OCRs
  3. DeepSeek-OCR
  4. PaddleOCR-VL
  5. قاري-OCR
  6. HunyuanOCR
  7. الأدوات القديمة: تيسراكت، إيزي أو سي آر، عربي أو سي آر
  8. بصير (الفائز 🏆)
  9. المقارنة الكاملة

الأدوات التقليدية: Tesseract، EasyOCR، ArabicOCR

بَصير (الفائز 🏆)

مقارنة شاملة

الإعداد ووثيقة الاختبار تم اختبار جميع النماذج على نفس الصورة: صفحة ممسوحة ضوئيًا من خطة عمل عربية (Ocr-Test.jpg)، تتضمن ترويسة ثنائية اللغة ("خطة عمل المشروع / Business Plan")، وشعار جامعة، وعناوين أقسام، وجدول متعدد الأعمدة من اليمين لليسار يحتوي على خلايا مدموجة يسرد فئات تكاليف التأسيس.

هذه ليست وثيقة رقمية نظيفة، بل وثيقة واقعية وصعبة. فهي تمزج النص العربي مع النص اللاتيني، وتحتوي على جدول منظم، وخلايا تستخدم دمج الأعمدة (colspan) ودمج الصفوف (rowspan)، وتتضمن شعارًا رسوميًا. طُلب من كل نموذج استخراج المحتوى بأمانة؛ وبعضها أُعطي تعليمات أوسع لإرجاع الجداول بصيغة HTML وتحديد أماكن الصور.

جميع النماذج القائمة على نماذج الرؤية واللغة (VLM) تم تشغيلها عبر vLLM على وحدة معالجة رسوميات NVIDIA A100 بسعة 40 جيجابايت في بيئة Google Colab. أما نموذج بصير فقد تم استدعاؤه من خلال واجهة برمجة التطبيقات السحابية الخاصة به باستخدام عميل Kawn في بايثون.

Nanonets-OCRs

Nanonets-OCR-s هو نموذج لاستخراج المستندات مبني على Qwen2.5-VL. يستقبل النموذج تعليمة غنية بالمعلومات توجهه لإخراج الجداول بصيغة HTML، والمعادلات بصيغة LaTeX، وتحديد العلامات المائية، ووصف الصور المضمنة. تم تحميله باستخدام vLLM واستدعاؤه بواسطة قالب محادثة مُنشأ يدويًا.

from PIL import Image  
from vllm import LLM, SamplingParams

MODEL = "nanonets/Nanonets-OCR-s"  
PROMPT = """Extract the text from the above document as if you were  
reading it naturally. Return tables in html format. Return equations  
in LaTeX. If there is an image, add a description inside <img></img>.  
Watermarks: <watermark>TEXT</watermark>."""

img = Image.open("document.jpg").convert("RGB")

llm = LLM(  
   model=MODEL,  
   gpu_memory_utilization=0.95,  
   max_model_len=8192,  
   max_num_seqs=1,  
   mm_processor_kwargs={"min_pixels": 28*28, "max_pixels": 1280*28*28},  
   limit_mm_per_prompt={"image": 1},  
   trust_remote_code=True,  
)

prompt_text = (  
   "<|im_start|>system\nYou are a helpful assistant.<|im_end|>\n"  
   "<|im_start|>user\n<|vision_start|><|image_pad|><|vision_end|>"  
   f"{PROMPT}<|im_end|>\n"  
   "<|im_start|>assistant\n"  
)

params = SamplingParams(  
   max_tokens=8192, temperature=0, repetition_penalty=1.1,  
   stop_token_ids=[151645, 151643],  
)

output = llm.generate(  
   [{"prompt": prompt_text, "multi_modal_data": {"image": img}}], params  
)  
print(output[0].outputs[0].text.strip()) 

الخرج:

لاحظنا أن النموذج لم يتمكن من استخراج الجدول بشكل صحيح وأصدر هلاوس (تخيل معلومات غير موجودة) لأنه لم يعرف متى يتوقف عن توليد كود HTML. يعود السبب في ذلك إلى وجود العديد من الخلايا الفارغة، مما يُعتبر تحديًا حقيقيًا لمثل هذا النموذج.

DeepSeek-OCR

DeepSeek-ocr هو نموذج مستندات يعمل بتقنية خليط الخبراء (Mixture-of-Experts) ويتطلب معالج لوجيتس مخصص يُدعى NGramPerReqLogitsProcessor من منفذ النماذج الخاص بـ vLLM. التعليمات المُعطاة له بسيطة للغاية عن قصد — فقط "Free OCR." — ويعتمد النموذج على معرفته الداخلية لتنظيم وهيكلة المخرجات.

from vllm import LLM, SamplingParams  
from vllm.model_executor.models.deepseek_ocr import NGramPerReqLogitsProcessor  
from PIL import Image

MODEL = "deepseek-ai/DeepSeek-OCR"  
img   = Image.open("document.jpg").convert("RGB")

llm = LLM(  
   model=MODEL,  
   enable_prefix_caching=False,  
   mm_processor_cache_gb=0,  
   logits_processors=[NGramPerReqLogitsProcessor],  
   limit_mm_per_prompt={"image": 1},  
   trust_remote_code=True,  
   max_model_len=8192,  
   max_num_seqs=2,  
)

params = SamplingParams(  
   temperature=0.0, max_tokens=8192,  
   skip_special_tokens=False,  
   extra_args={  
       "ngram_size": 30, "window_size": 90,  
       "whitelist_token_ids": {128821, 128822},  # <bbox>, </bbox>  
   },  
)

output = llm.generate(  
   [{"prompt": "<image>\nFree OCR.", "multi_modal_data": {"image": img}}],  
   params,  
)  
print(output[0].outputs[0].text.strip()) 

الخرج: !

المخرجات كانت مخيبة تماما؛ لم يتمكن النموذج من إنتاج البنية الصحيحة، كما أنه لم يستطع إخراج المعلومات الأخرى الموجودة على الصفحة.

PaddleOCR-VL

PaddleOCR-VL هو نموذج رؤية-لغة خفيف الوزن (~2 مليار معامل) من بايدو PaddlePaddle. يستخدم قالب محادثة يتم تطبيقه عبر AutoTokenizer ويستقبل تعليمة بسيطة جدًا: "OCR:". حجمه الصغير يجعله جذابًا للنشر في البيئات محدودة الموارد.

from transformers import AutoTokenizer  
from vllm import LLM, SamplingParams  
from PIL import Image

MODEL = "PaddlePaddle/PaddleOCR-VL"  
img   = Image.open("document.jpg").convert("RGB")

llm = LLM(  
   model=MODEL, trust_remote_code=True,  
   max_model_len=4096, max_num_seqs=5,  
   limit_mm_per_prompt={"image": 1},  
   gpu_memory_utilization=0.95,  
   enable_prefix_caching=False, mm_processor_cache_gb=0,  
)

tokenizer = AutoTokenizer.from_pretrained(MODEL, trust_remote_code=True)  
messages = [{"role": "user", "content": [  
   {"type": "image"}, {"type": "text", "text": "OCR:"}  
]}]

prompt_text = tokenizer.apply_chat_template(  
   messages, tokenize=False, add_generation_prompt=True  
)

params = SamplingParams(  
   max_tokens=4096, temperature=0,  
   repetition_penalty=1.1, stop_token_ids=[151645, 151643],  
)

output = llm.generate(  
   [{"prompt": prompt_text, "multi_modal_data": {"image": img}}], params  
)  
print(output[0].outputs[0].text.strip())

الخرج:

الناتج عبارة عن نص عادي مسطح بدون أي بنية على الإطلاق: لا جدول، ولا تسلسل هرمي للعناوين. مناسب لاستخراج النص الخام من التخطيطات البسيطة؛ لكنه غير مناسب عندما تكون بنية المستند مهمة.

Qari-OCR

Qari قارئ هو نموذج تعرف ضوئي على الحروف (OCR) موجه للغة العربية أولاً من NAMAA Space، تم ضبطه بدقة خصيصًا لفهم المستندات العربية على قاعدة Qwen2-VL بحجم 2 مليار معامل. على الرغم من صغر حجمه، إلا أنه يُخرج HTML غنيًا بالبنية - عناوين، ونص غامق/مائل، وترميز كامل للجداول - مما يجعله أحد أكثر النماذج وعيًا بالإخراج في هذه المقارنة.

from vllm import LLM, SamplingParams  
from PIL import Image

MODEL  = "NAMAA-Space/Qari-OCR-v0.3-VL-2B-Instruct"  
PROMPT = ("Below is the image of one page of a document, as well as "  
         "some raw textual content that was previously extracted for it. "  
         "Just return the plain text representation of this document as if "  
         "you were reading it naturally. Do not hallucinate.")

img = Image.open("document.jpg").convert("RGB")

llm = LLM(  
   model=MODEL,  
   gpu_memory_utilization=0.95, max_model_len=8192, max_num_seqs=1,  
   mm_processor_kwargs={"min_pixels": 28*28, "max_pixels": 1280*28*28},  
   limit_mm_per_prompt={"image": 1}, trust_remote_code=True,  
)

prompt_text = (  
   "<|im_start|>system\nYou are a helpful assistant.<|im_end|>\n"  
   "<|im_start|>user\n<|vision_start|><|image_pad|><|vision_end|>"  
   f"{PROMPT}<|im_end|>\n"  
   "<|im_start|>assistant\n"  
)

params = SamplingParams(  
   max_tokens=8192, temperature=0,  
   repetition_penalty=1.1, stop_token_ids=[151645, 151643],  
)

output = llm.generate(  
   [{"prompt": prompt_text, "multi_modal_data": {"image": img}}], params  
)  
print(output[0].outputs[0].text.strip() 

الخرج:

النموذج يتجاهل الجدول الأول بالكامل؛ حيث قام بدمج رأس الجدول متعدد الصفوف في صف واحد مسطح، وفُقدت بنية الخلايا المدمجة بالكامل.

HunyuanOCR

HunyuanOCR نموذج HunyuanOCR من Tencent يدعم نافذة سياق واسعة تصل إلى 16,384 رمزًا ويستخدم AutoProcessor مع قالب محادثة. يُخرج HTML منظمًا يتضمن ترميزًا سليمًا للجداول ويتعامل مع الصور. العيب الرئيسي فيه هو وقت التحميل الطويل (ما يقارب الدقيقة للتهيئة).

from transformers import AutoProcessor  
from vllm import LLM, SamplingParams  
from PIL import Image

MODEL  = "tencent/HunyuanOCR"  
PROMPT = ("Extract the text from the above document as if you were reading "  
         "it naturally. Return tables in html format. If there is an image "  
         "wrap it as <img>image here</img>. Watermarks: "  
         "<watermark>TEXT</watermark>.")

img = Image.open("document.jpg").convert("RGB")

llm = LLM(  
   model=MODEL, trust_remote_code=True,  
   gpu_memory_utilization=0.90,  
   max_model_len=16384, limit_mm_per_prompt={"image": 1},  
)

processor = AutoProcessor.from_pretrained(MODEL, trust_remote_code=True)  
messages = [  
   {"role": "system", "content": ""},  
   {"role": "user", "content": [  
       {"type": "image"}, {"type": "text", "text": PROMPT}  
   ]}  
]

prompt_text = processor.apply_chat_template(  
   messages, tokenize=False, add_generation_prompt=True  
)

params = SamplingParams(  
   max_tokens=16384, temperature=0, repetition_penalty=1.1,  
)

output = llm.generate(  
   [{"prompt": prompt_text, "multi_modal_data": {"image": img}}], params  
)  
print(output[0].outputs[0].text.strip())

الخرج:

أدى النموذج بشكل جيد جدا، لكنه لا يزال يعاني من أخطاء في عدد صفوف الجداول، مما أدى إلى خطأ في النص المُستخرج.

الأدوات التقليدية: Tesseract و EasyOCR و ArabicOCR

لإكمال الصورة، قمنا أيضًا باختبار ثلاث أدوات تقليدية للتعرف الضوئي على الحروف (غير قائمة على نماذج الرؤية واللغة). كانت النتائج ضعيفة بشكل عام على هذه الوثيقة، وكانت الفجوة بينها وبين النماذج القائمة على VLM شاسعة وواضحة.

Tesseract (سواء عبر pytesseract أو عبر PyMuPDF باستخدام get_textpage_ocr) أنتج مخرجات مشوشة تحتوي على أخطاء كبيرة في الأحرف، ومشاكل في ترتيب النص من اليمين لليسار (RTL)، وانعدام تام للبنية. أمثلة على المخرجات الفعلية: "ات+ا27خطة عمل المشروع" و "51دمجا\" ددعدرةدب8" — مجرد تشويش غير قابل للاستخدام في أي مهمة لاحقة.

EasyOCR كان أداؤه أفضل في الكلمات المنعزلة لكنه فشل في الجدول. استخرج أجزاءً من الكلمات خارج ترتيبها ("فات السابقة للتشغيل" بدلاً من "المصروفات السابقة للتشغيل") ولم يكن لديه أي إدراك لبنية المستند ذات العمودين والجدول الموجه من اليمين لليسار.

ArabicOCR — وهو غلاف (wrapper) حول EasyOCR مُحسّن للغة العربية — أنتج اكتشافات للكلمات أكثر اكتمالاً مع درجات ثقة، لكنه عانى من نفس العمى البنيوي. كما أنه عمل على وحدة المعالجة المركزية فقط في بيئتنا، مما جعله أبطأ بكثير.

بَصير

🏆 أفضل نموذج تعرف ضوئي على الحروف للعربية

بصير هو نموذج متخصص للتعرف الضوئي على الحروف (OCR) للغة العربية طورته Kawn.ai. على عكس النماذج الأخرى في هذه المقارنة، صُمم بصير خصيصًا لفهم المستندات العربية - وليس نموذج رؤية-لغة (VLM) عام تم ضبطه بدقة على بيانات OCR. تتفاعل معه من خلال مكتبة kawn في بايثون، والتي تتولى رفع الملفات، وإدارة قائمة انتظار المهام، واسترجاع النتائج تلقائيًا. وهو يدعم كلاً من الصور وملفات PDF.

ما يميز بصير ليس فقط الدقة - بل أن المخرجات قابلة للاستخدام الفوري. الجداول تصل ببنية HTML صحيحة، والنص العربي مرتب تمامًا من اليمين لليسار، والصور يُشار إليها بعلامة [IMAGE]، وتلميحات التنسيق مثل العناوين العريضة تُحفظ بترميز Markdown.

آلية العمل:

# Install the client

# pip install kawn.ai

import os

from kawn import KawnClient

from kawn.services import OCRService

# Set your API key (or pass directly to KawnClient)

os.environ["MISRAJ_API_KEY"] = "your_api_key_here"

client      = KawnClient(os.environ["MISRAJ_API_KEY"])

ocr_service = OCRService(client)

# Process an image or PDF - it's one call

result = ocr_service.process_file(file_path="document.jpg")

# result.pages is a list of OCRPage objects

for page in result.pages:

   print(f"--- Page {page.index} ---")

   print(page.content)

الخرج:

هذا كل ما في الأمر. لا حاجة لوحدة معالجة رسوميات، ولا إعداد vLLM، ولا بناء قالب محادثة. استدعاء process_file يرفع المستند، يستطلع النتيجة، ويعيد استجابة منظمة. يمكنك أيضًا تمرير رابط URL بدلاً من مسار الملف.

مقارنة شاملة

الخلاصة

بالنسبة للتعرف الضوئي على المستندات العربية في عام 2026، تركت النماذج القائمة على الرؤية واللغة (VLM) الأدوات التقليدية خلفها بفارق كبير. ولكن حتى بين نماذج VLM نفسها، هناك فجوة ملموسة في الجودة، ويجلس بصير على قمة هذه الفجوة.

بصير هو النموذج الوحيد الذي أنتج باستمرار جداول HTML صالحة دلاليًا مع بنية خلايا مدمجة صحيحة، وتنسيق مناسب للعناوين، واكتشاف الصور - كل هذا دون الحاجة إلى وحدة معالجة رسوميات وفقط عبر تنصيب بسيط بواسطة pip. إذا كنت تبني خط أنابيب لمعالجة المستندات العربية اليوم، فهو نقطة البداية الواضحة.

إذا كنت بحاجة إلى حل محلي يُستضاف ذاتيًا، فإن HunyuanOCR هو أقوى بديل. للبيئات محدودة الموارد، نموذج قارئ ذو 2 مليار معامل يؤدي أعلى بكثير من المتوقع لحجمه. وإذا كنت بحاجة إلى نص خام فقط، فإن PaddleOCR-VL يبقي الأمور بسيطة.

لا يزال Tesseract ومشتقاته مفيدًا لمهام النصوص اللاتينية البسيطة، لكن بالنسبة للعربية، خاصة مع الجداول، فهي ليست خيارًا قابلاً للتطبيق في عام 2026.