چیت‌شیت

OCR و درک سند

OCR and Document Understanding

آموزش CTC OCR، انتخاب استک پردازش سند، بازیابی صفحات با بیشینه‌ی شباهت (MaxSim) و تأیید فیلدها در برابر اسپن‌های دقیق منبع.

  • ۱۲ بخش
  • ۴ درس مرتبط
  • کد و دستورها عیناً از دوره‌ی اصلی
فهرست مطالب
  1. پایپ‌لاین OCR کلاسیک
  2. وظایف در قالب کد
  3. آموزش CRNN به همراه CTC
  4. تعامل متأخر بیشینه‌ی شباهت (MaxSim)
  5. دستورات
  6. پرسش و پاسخ سند مبتنی بر تصویر (Vision-first)
  7. فرمول‌ها و اعداد
  8. پیش‌فرض‌ها و محدودیت‌ها
  9. انتخاب استک پردازش سند
  10. عیب‌یابی
  11. کوته‌نوشت‌ها
  12. پرسش‌ها

پایپ‌لاین OCR کلاسیک

معماری
تصویرتشخیص متنDB، EAST، CRAFTکادرهای محدودکنندهکلمه یا سطربرش هر ناحیهارتفاع ثابتبازشناسیCRNN + CTCرشته‌های متنیمرتب‌سازی ساختار سندترتیب خوانشمتن بر اساس ترتیب خوانش

وظایف در قالب کد

کار و کد
وظیفهکد
تابع زیان (loss) CTCctc_loss(log_probs, targets, ...)
رمزگشایی حریصانه‌ی CTCgreedy_ctc_decode(log_probs, blank=0)
بازشناس خطوطTinyCRNN(vocab_size=40, hidden=128, feat=32)
OCR در محیط عملیاتیPaddleOCR(lang="en").ocr(image_path)
ورودی LayoutLMv3layoutlm_input(tokens)
اسکیمای JSON مدل Donutdonut_schema("invoice")
صفحات برتر (Top-k) با بیشینه‌ی شباهت (MaxSim)retrieve(query, pages, k=3)

آموزش CRNN به همراه CTC

کد
python
vocab = ["_"] + list("0123456789abcdefghijklmnopqrstuvwxyz")  # نماد blank در شاخص 0
model = TinyCRNN(vocab_size=len(vocab))
opt = torch.optim.Adam(model.parameters(), lr=1e-3)
imgs, targets, target_lens = build_batch(strings, vocab)      # ارتفاع 32
log_probs = model(imgs)                                       # (W', N, vocab)
input_lens = torch.full((8,), log_probs.size(0), dtype=torch.long)
loss = F.ctc_loss(log_probs, targets, input_lens, target_lens,
                  blank=0, reduction="mean", zero_infinity=True)
opt.zero_grad(); loss.backward(); opt.step()                  # از حدود 3 تا حدود 0.2 در 200 گام

تعامل متأخر بیشینه‌ی شباهت (MaxSim)

کد
python
def maxsim(query_tokens, patches):
    s = 0.0
    for q in query_tokens:                         # یک بردار به‌ازای هر توکن پرامپت
        best = max(cosine(q, p) for p in patches)  # بهترین پچ صفحه
        s += best                                  # مجموع روی توکن‌های پرامپت
    return s
scored = [(p.doc_id, maxsim(query.tokens, p.patches)) for p in pages]
scored.sort(key=lambda x: -x[1])                   # صفحات برتر (top-k)
idx = build_index(prune=True)                      # با فعال بودن DocPruner، حذف 50٪ پچ‌ها
hits = idx.retrieve(q, k=3)

دستورات

دستورها
دستورکارکرد
python3 cli.py sample.txt --schema schema.json --output output/review.htmlمیز بازبینی HTML و گزارش JSON را می‌سازد
--proposals <file>مدل‌های OCR خارجی یا کاندیداها را بارگذاری می‌کند
--approve <file>تصمیمات دانلودشده از میز HTML را اعمال می‌کند
python3 scripts/project_test.py document-extraction-desk --all --solution --strictراه‌حل مرجع را ارزیابی و نمره‌دهی می‌کند
python main.pyاسکلت نهایی کدنوشته‌ی MaxSim و DocPruner را اجرا می‌کند
npm startبررسی خودکار نمایشگر را یک‌بار اجرا کرده و با کد 0 خارج می‌شود
npm run serveسرور HTTP نمایشگر را روی 127.0.0.1 اجرا می‌کند

پرسش و پاسخ سند مبتنی بر تصویر (Vision-first)

گام‌به‌گام
  1. بارگذاریرندر هر صفحه PDF به یک PNG با ابعاد 1536x2048. ذخیره‌ی {doc_id, page_num, image_path}.
  2. جاسازیاجرای ColQwen2.5-v0.2. دریافت حدود 2048 بردار پچ با بعد 128 به‌ازای هر صفحه.
  3. هرسابزار DocPruner نیمی از پچ‌ها را که بیشترین سیگنال را دارند نگه می‌دارد.
  4. پرامپتجاسازی توکن‌های پرامپت. اجرای بیشینه‌ی شباهت (MaxSim). بازگرداندن صفحات برتر (top-k).
  5. ترکیبارسال پرامپت و تصاویر 5 صفحه‌ی برتر به VLM. ارجاع به (doc_id, page).
  6. شواهدرسم کادرهای محدودکننده‌ی ارجاع‌شده به‌صورت لایه‌های رویی در نمایشگر.
  7. طرح پشتیبان OCRاجرای Nougat یا dots.ocr روی صفحات پر از فرمول.
  8. ارزیابیگزارش ViDoRe v3 nDCG@5 و M3DocVQA در مقایسه با رویکرد «ابتدا OCR، سپس متن».

فرمول‌ها و اعداد

مفهوم‌ها
ادغام CTC
انجام merge روی تکرارها، سپس حذف blankها. تبدیل "h h h _ _ e e l l _ l l o _ _" به "hello".
CER
فاصله‌ی لوون‌اشتاین تقسیم بر طول مرجع. مقدار WER همین است اما بر اساس کلمه.
بیشینه‌ی شباهت (MaxSim)
$\sum_i \max_j \cos(q_i, p_j)$ روی توکن‌های پرامپت $q_i$ و پچ‌های صفحه $p_j$.
فضای ذخیره‌سازی ColPali
50 صفحه ضرب‌در 729 پچ ضرب‌در بعد 128 ضرب‌در 4 بایت = حدود 18 مگابایت خام، حدود 2.3 مگابایت پس از 8x کوانتیزه‌سازی برداری (PQ).
فضای ذخیره‌سازی Text-RAG
50 چانک ضرب‌در بعد 768 ضرب‌در 4 بایت = حدود 150 کیلوبایت. مدل ColPali حدود 120 برابر خام‌تر و پس از PQ حدود 15 برابر بزرگ‌تر است.
ViDoRe
مدل ColPali-v1 امتیاز حدود 80٪ برای nDCG@5 می‌گیرد؛ Text-RAG حدود 50-60٪.

پیش‌فرض‌ها و محدودیت‌ها

پیش‌فرض‌ها
تنظیمپیش‌فرضنکته
CER target< 2%روی اسکن‌های واضح
CRNN input height32شبکه CNN ارتفاع را به 1 کاهش می‌دهد (pooling). عرض همان زمان است
Page render180 DPIPyMuPDF در پروژه‌ی پایانی
DocPruner50%افت دقت کمتر از 0.5٪
Schema fields1 to 30نام‌های حروف کوچک، برچسب‌های یکتا
Document size100000حداکثر کاراکترها
Candidates300حداکثر پیشنهادها در هر بازبینی

انتخاب استک پردازش سند

مفهوم‌ها
فاکتورهای چاپی در مقیاس بالا
ترکیب LayoutLMv3 + قوانین. مقرون‌به‌صرفه.
فرم‌های ترکیبی و دست‌نویس
مبتنی بر VLM بومی (PaliGemma 2 یا Qwen2.5-VL).
مقاله‌های arXiv
ابزار Nougat برای ریاضیات، VLM برای شکل‌ها.
حوزه‌های تحت نظارت قانونی
پایپ‌لاین OCR + اعتبارسنج VLM جهت بررسی مضاعف.
رسیدها با ساختار ثابت
فاین‌تیون Donut.
اسناد متنی خالص
بازیابی مبتنی بر متن (Text-RAG). ساده‌تر است و ذخیره‌سازی کمتری مصرف می‌کند.
PDFهای غنی از تصویر
ابزار ColPali برای کیفیت، VisRAG برای مقیاس‌پذیری بالا.

عیب‌یابی

عیب‌یابی
  • "Approval belongs to another document version"

    علت
    متن تغییر کرده است، sourceSha256 تطابق ندارد
    راه‌حل
    نسخه‌ی جدید را دوباره بازبینی کنید
  • "Proposal does not match its exact source span"

    علت
    عبارت نقل‌شده در start و end قرار ندارد
    راه‌حل
    آفست‌های پیشنهاد را اصلاح کنید
  • "Use an ISO date: YYYY-MM-DD"

    علت
    متن فیلد تاریخ در فرمت ISO نیست
    راه‌حل
    متن مبدأ را اصلاح کنید
  • وضعیت فیلد مبهم است

    علت
    دو نقل‌قول برای صندلی‌ها وجود دارد
    راه‌حل
    یک اسپن را با --approve انتخاب کنید
  • شکست Donut روی مقاله

    علت
    مدل‌های بدون نیاز به OCR ابزارهایی تخصصی هستند
    راه‌حل
    برای مقاله‌ها از Nougat استفاده کنید
  • داده‌های نمودار در RAG وجود ندارند

    علت
    موتور OCR داده‌های نمودار را نادیده می‌گیرد
    راه‌حل
    تصاویر صفحات را با ColPali جاسازی کنید

کوته‌نوشت‌ها

اصطلاح‌ها
CTC
رده‌بندی زمانی پیوندگرا. آموزش بدون نیاز به برچسب‌های گام‌به‌گام زمانی.
CRNN
ویژگی‌های کانولوشنی + BiLSTM + CTC. خط مبنا سال 2015.
VLM-OCR
یک مدل بینایی-زبان که برای OCR آموزش دیده یا پرامپت‌نویسی شده است.
DocVQA
استاندارد VQA اسناد؛ پرارجاع‌ترین معیار.
ViDoRe
ارزیابی بازیابی اسناد بصری؛ معیار ارزیابی: nDCG@5.
PQ
کوانتیزه‌سازی حاصل‌ضربی (Product Quantization). کاهش حجم ذخیره‌سازی تا حدود 8 برابر.

پرسش‌ها

پرسش و پاسخ
چرا CTC؟
بدون نیاز به ترازسازی در سطح کاراکتر آموزش می‌بیند.
چرا پایپ‌لاین‌های OCR هنوز برنده هستند؟
برای مقیاس‌های بسیار بزرگ اسکن، خطاهای قطعی و خروجی قابل بازرسی.
چرا بیشینه‌ی شباهت (MaxSim) به جای میانگین؟
هر توکن پرامپت بهترین پچ خود را برمی‌گزیند؛ پچ‌های نامرتبط اثر آن را خنثی نمی‌کنند.
آیا آفست‌ها صحت مقدار را اثبات می‌کنند؟
خیر. آنها فقط منشأ و سندیت را اثبات می‌کنند؛ یک بازبین انسانی فیلد را تأیید می‌کند.