شناسایی نوری کاراکترها (OCR) از تطبیق الگوهای ساده به حوزهای پیشرفته با بهرهگیری از یادگیری عمیق و بینایی ماشین کلاسیک تکامل یافته است. برای مهندسان داده و توسعهدهندگان، ساخت یک پایپلاین OCR مؤثر کمتر درباره انتخاب یک الگوریتم جادویی واحد و بیشتر درباره هماهنگسازی مجموعهای از مراحل تخصصی است. یک پایپلاین طراحیشده خوب تضمین میکند که ورودیهای تصویری خام به دادههای متنی تمیز و ساختاریافته با حداقل مداخله انسانی تبدیل شوند.
نمای کلی معماری
بیشتر پایپلاینهای OCR در سطح تولید از یک جریان خطی پیروی میکنند، هرچند برخی از معماریهای مدرن پردازش موازی یا اصلاح تکراری را گنجاندهاند. اجزای اصلی معمولاً شامل موارد زیر هستند:
- پیشپردازش: بهبود کیفیت تصویر برای حداکثر کردن وضوح کاراکترها.
- تشخیص: شناسایی محل وجود متن در تصویر.
- شناسایی: تبدیل دادههای پیکسلی به توالیهای کاراکتر.
- پسپردازش: اصلاح خطاها و ساختاردهی به خروجی.
مرحله ۱: پیشپردازش تصویر
تصاویر خام اغلب حاوی نویز، کجی یا کنتراست پایین هستند که دقت شناسایی را مختل میکند. قبل از تغذیه داده به یک موتور OCR، باید ورودی را نرمال کنیم. تکنیکهای رایج شامل تبدیل به خاکستری، دودوییسازی (با استفاده از آستانهبندی اوتسو) و اصلاح کجی است.
import cv2
import numpy as np
def preprocess_image(image_path):
# Load image
img = cv2.imread(image_path)
# Convert to grayscale
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Apply Gaussian blur to reduce noise
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
# Thresholding to create a binary image
_, thresh = cv2.threshold(blurred, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
return thresh
اصلاح کجی بهویژه برای اسناد اسکنشده حیاتی است. OpenCV ابزارهایی برای تخمین زاویه کجی با استفاده از خطوط هاف یا minAreaRect روی نقاط کانتور ارائه میدهد، که به ما اجازه میدهد تصویر را به خط پایه افقی برگردانیم.
مرحله ۲: انتخاب مدل و شناسایی
وقتی تصویر تمیز شد، یک موتور انتخاب میکنیم. Tesseract به دلیل سرعت و ماهیت متنباز خود، همچنان استاندارد صنعتی برای OCR عمومی باقی مانده است. با این حال، برای چیدمانهای پیچیده یا متن دستنویس، مدلهای یادگیری عمیق مانند EasyOCR یا PaddleOCR اغلب عملکرد بهتری دارند.
Tesseract سبک است و با کتابخانه pytesseract به راحتی قابل استقرار است:
import pytesseract
from PIL import Image
def run_tesseract(image_path):
img = Image.open(image_path)
# Specify PSM (Page Segmentation Mode) for specific layout types
# PSM 3: Fully automatic page segmentation with OSD
text = pytesseract.image_to_string(img, config='--psm 3')
return text
برای دقت بالاتر در استخراج دادههای ساختاریافته (مانند فاکتورها)، APIهای تخصصی از ارائهدهندگان مانند AWS Textract یا Google Vision AI ممکن است ترجیح داده شوند، که تحلیل چیدمان و شناسایی جدول داخلی را ارائه میدهند.
مرحله ۳: پسپردازش و اعتبارسنجی
موتورهای OCR احتمالاتی هستند؛ گاهی اوقات کاراکترهای نادرست را تولید میکنند. پسپردازش جایی است که هوش پایپلاین درخشان میشود. این مرحله شامل موارد زیر است:
- فیلتر کردن اعتماد: رد یا علامتگذاری کاراکترهایی با امتیازهای اعتماد پایین.
- اصلاح واژهنامه: استفاده از الگوریتمهای فاصله ویرایش (مثلاً فاصله Levenshtein) برای اصلاح کلمات غلط املایی در مقابل یک واژهنامه خاص حوزه.
- اعتبارسنجی Regex: اطمینان از اینکه فیلدهای استخراجشده با فرمتهای مورد انتظار مطابقت دارند (مثلاً تاریخها، شمارههای ملی، شمارههای تلفن).
import re
from fuzzywuzzy import fuzz
def post_process(text, valid_names_list):
# Example: Correcting names using fuzzy matching
lines = text.split('\n')
corrected_lines = []
for line in lines:
if len(line) > 2:
best_match = max(valid_names_list, key=lambda x: fuzz.ratio(x, line))
if fuzz.ratio(best_match, line) > 80:
corrected_lines.append(best_match)
else:
corrected_lines.append(line)
else:
corrected_lines.append(line)
return '\n'.join(corrected_lines)
نتیجهگیری
ساخت یک پایپلاین OCR مؤفر یک فرآیند تکراری برای تعادل بین دقت، سرعت و هزینه است. با پیشپردازش مقاوم برای نرمال کردن ورودیهای خود شروع کنید، یک موتور شناسایی را انتخاب کنید که با چالشهای چیدمان خاص شما مطابقت داشته باشد و همیشه در پسپردازش دقیق سرمایهگذاری کنید. با در نظر گرفتن OCR به عنوان یک مسئله مهندسی چندمرحلهای به جای یک فراخوانی تابعی واحد، میتوانید استخراج متن در سطح سازمانی را حتی از اسناد کاملاً بدون ساختار به دست آورید.