Optik Karakter Tanıma (OCR), basit desen eşleştirmeden derin öğrenme ve klasik bilgisayar görüşünü kullanan gelişmiş bir alana evrildi. Veri mühendisleri ve geliştiriciler için etkili bir OCR boru hattı oluşturmak, tek bir sihirli algoritma seçmekten çok, bir dizi uzmanlaşmış aşamayı koordine etmekle ilgilidir. İyi tasarlanmış bir boru hattı, ham görüntü girdilerinin minimal insan müdahalesiyle temiz ve yapılandırılmış metin verisine dönüştürülmesini sağlar.
Mimari Genel Bakış
Çoğu üretim düzeyindeki OCR boru hattı doğrusal bir akış izler, ancak bazı modern mimariler paralel işleme veya iteratif iyileştirme içerir. Temel bileşenler genellikle şunları içerir:
- Ön İşleme: Karakter görünürlüğünü en üst düzeye çıkarmak için görüntü kalitesini artırma.
- Tespit: Görüntüde metnin nerede bulunduğunu belirleme.
- Tanıma: Piksel verilerini karakter dizilerine dönüştürme.
- Son İşleme: Hataları düzeltme ve çıktıyı yapılandırma.
Aşama 1: Görüntü Ön İşleme
Ham görüntüler genellikle tanıma doğruluğunu engelleyen gürültü, eğrilik veya düşük kontrast içerir. Verileri bir OCR motoruna beslemeden önce girdiyi normalize etmemiz gerekir. Yaygın teknikler arasında gri tonlamaya dönüştürme, ikileştirme (Otsu eşikleme kullanılarak) ve eğrilik düzeltmesi (deskewing) bulunur.
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
Eğrilik düzeltmesi, taranmış belgeler için özellikle kritiktir. OpenCV, Hough çizgileri veya kontur noktaları üzerindeki minAreaRect kullanarak eğrilik açısını tahmin etmek için araçlar sağlar; bu da görüntüyü yatay bir taban çizgisine geri döndürmemize olanak tanır.
Aşama 2: Model Seçimi ve Tanıma
Görüntü temizlendiğinde, bir motor seçeriz. Tesseract, hızı ve açık kaynaklı doğası nedeniyle genel amaçlı OCR için endüstri standardı olmaya devam etmektedir. Ancak, karmaşık düzenler veya el yazısı metinler için EasyOCR veya PaddleOCR gibi derin öğrenme modelleri genellikle ondan daha iyi performans gösterir.
Tesseract hafiftir ve pytesseract kütüphanesi aracılığıyla kolayca dağıtılabilir:
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
Yapılandırılmış veri çıkarımı (faturalar gibi) için daha yüksek doğruluk gerekiyorsa, AWS Textract veya Google Vision AI gibi sağlayıcılardan gelen uzmanlaşmış API'ler tercih edilebilir; bunlar yerleşik düzen analizi ve tablo tanıma sunar.
Aşama 3: Son İşleme ve Doğrulama
OCR motorları olasılıksaldır; ara sıra karakterleri uydurabilirler. Son işleme, boru hattının zekasının parladığı yerdir. Bu aşama şunları içerir:
- Güven Filtreleme: Düşük güven puanlarına sahip karakterleri atma veya işaretleme.
- Sözlük Düzeltme: Yanlış yazılmış kelimeleri alanına özgü bir sözlüğe karşı düzeltmek için düzen mesafesi algoritmalarını (ör. Levenshtein mesafesi) kullanma.
- Regex Doğrulama: Çıkarılan alanların beklenen biçimlerle eşleştiğinden emin olma (ör. tarihler, SSN'ler, telefon numaraları).
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)
Sonuç
Etkili bir OCR boru hattı oluşturmak, doğruluk, hız ve maliyet arasında denge kurmanın iteratif bir sürecidir. Girdilerinizi normalize etmek için sağlam bir ön işlemeyle başlayın, belirli düzen zorluklarınıza uygun bir tanıma motoru seçin ve her zaman titiz bir son işleme yatırım yapın. OCR'yi tek bir fonksiyon çağrısı olarak değil, çok aşamalı bir mühendislik problemi olarak ele alarak, en yapılandırılmamış belgelerden bile kurumsal düzeyde metin çıkarımı elde edebilirsiniz.