Gereksinimler ve Ön Hazırlık
Projeye başlamadan önce bilgisayarınızda Python 3.10 veya daha güncel bir sürümün kurulu olduğundan emin olmalısınız. OCR işlemleri için en popüler ve güvenilir araç olan Tesseract OCR motorunu sisteminize kurmanız gerekmektedir. Tesseract, Google tarafından desteklenen açık kaynaklı bir metin tanıma motorudur.
Gerekli kütüphaneleri kurmak için terminal veya komut satırınıza aşağıdaki komutu girin:
pip install pytesseract pillow opencv-python
Bu komut, Tesseract'ın Python arayüzü olan pytesseract, görüntü işleme için Pillow ve gelişmiş görüntü manipülasyonu için OpenCV kütüphanelerini sisteminize dahil edecektir. Ayrıca, işletim sisteminize uygun Tesseract OCR yazılımını indirip kurulum yolunu (PATH) sistem değişkenlerine eklemeyi unutmayın.
Temel OCR İşlemi: İlk Metin Okuma Denemesi
OCR sürecinin ilk adımı, basit bir görseli okuyup metni konsola yazdırmaktır. Bunun için Pillow kütüphanesi ile resmi açıp pytesseract ile işleyeceğiz. Aşağıdaki kod bloğu, temel bir metin okuma işleminin nasıl yapılacağını göstermektedir.
import pytesseract
from PIL import Image
# Tesseract kurulum yolunu belirtin (Windows için gereklidir)
# pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
# Görseli yükle
gorsel = Image.open('ornek_metin.png')
# Metni oku
metin = pytesseract.image_to_string(gorsel, lang='tur')
print("Okunan Metin:")
print(metin)
Bu kod, görseli analiz eder ve 'tur' parametresi ile Türkçe karakterleri destekleyecek şekilde metni ayrıştırır. Eğer metin okunamazsa, görselin çözünürlüğünün düşük olup olmadığını kontrol etmeniz gerekir.
Görüntü İşleme ile OCR Başarısını Artırma
Ham görsellerde bazen gürültü, düşük kontrast veya yanlış ışıklandırma metin okumayı zorlaştırır. OpenCV kullanarak görüntüyü gri tonlamaya çevirmek ve eşikleme (thresholding) yapmak, OCR başarısını %80 oranında artırabilir. İşte adım adım görüntü ön işleme örneği:
import cv2
import pytesseract
# Görseli OpenCV ile oku
resim = cv2.imread('belge.jpg')
# Gri tonlamaya çevir
gri_resim = cv2.cvtColor(resim, cv2.COLOR_BGR2GRAY)
# Gürültüyü azaltmak için eşikleme uygula
_, islenmis_resim = cv2.threshold(gri_resim, 150, 255, cv2.THRESH_BINARY)
# İşlenmiş görseli kullanarak metni oku
metin = pytesseract.image_to_string(islenmis_resim, lang='tur')
print(metin)
Bu yöntem, özellikle tarayıcıdan taranmış belgelerdeki "kumlanma" etkisini yok ederek Tesseract'ın harfleri daha net tanımasını sağlar.
OCR Yöntemlerinin Karşılaştırılması
Projeniz için en uygun yöntemi seçerken aşağıdaki tabloyu referans alabilirsiniz:
| Yöntem | Avantajları | Dezavantajları |
|---|---|---|
| Tesseract (Yerel) | Ücretsiz, gizlilik odaklı, çevrimdışı | Karmaşık el yazısında düşük başarı |
| Cloud API (Google/AWS) | Çok yüksek doğruluk, el yazısı desteği | Ücretli, internet bağımlılığı |
| EasyOCR | GPU desteği, derin öğrenme tabanlı | Daha yüksek sistem kaynağı kullanımı |
Veri Çıktılarını Yapılandırma ve Kaydetme
Okunan metinleri sadece ekrana yazdırmak yerine, bir JSON veya TXT dosyasına kaydetmek daha profesyonel bir yaklaşımdır. Aşağıdaki kod, okunan metni bir dosyaya nasıl yazacağınızı gösterir.
def metni_kaydet(metin, dosya_adi='cikti.txt'):
try:
with open(dosya_adi, 'w', encoding='utf-8') as f:
f.write(metin)
print(f"Başarılı: Metin {dosya_adi} dosyasına kaydedildi.")
except Exception as e:
print(f"Hata oluştu: {e}")
# Kullanım
metni_kaydet(metin)
Dosya işlemlerinde utf-8 kodlamasını kullanmak, Türkçe karakterlerin bozulmadan kaydedilmesi için hayati önem taşır.
Güvenlik Uyarısı: Kullanıcıdan alınan görselleri işlerken, dosya yükleme güvenliğine dikkat edin. Yüklenen dosyaların uzantılarını mutlaka kontrol edin (sadece .jpg, .png gibi) ve dosya isimlerini rastgele karakterlerle yeniden adlandırarak "Path Traversal" saldırılarını engelleyin.
Yaygın Hatalar ve Debug İpuçları
OCR projelerinde en sık karşılaşılan sorunlar genellikle görsel kalitesiyle ilgilidir. Eğer metinler yanlış okunuyorsa şu adımları izleyin:
- DPI Kontrolü: Görselin en az 300 DPI çözünürlüğünde olduğundan emin olun.
- Dil Paketi: Tesseract'ın ilgili dil paketinin (tessdata) yüklü olduğunu doğrulayın.
- Gürültü Giderme: OpenCV'nin GaussianBlur fonksiyonunu kullanarak görseldeki pürüzleri temizleyin.
# Gürültü giderme örneği
blur = cv2.GaussianBlur(gri_resim, (5, 5), 0)
metin = pytesseract.image_to_string(blur, lang='tur')
Sıkça Sorulan Sorular
OCR uygulaması el yazısını okuyabilir mi?
Tesseract temel olarak basılı metinler için tasarlanmıştır. El yazısı için EasyOCR veya Google Vision API gibi derin öğrenme tabanlı modeller çok daha başarılı sonuçlar verir.
Tesseract'ın Türkçe karakterleri yanlış okumasını nasıl engellerim?
Görselin netliğini artırın ve `lang='tur'` parametresini doğru kullandığınızdan emin olun. Ayrıca, `psm` (Page Segmentation Mode) ayarlarını değiştirerek metin yapısına uygun modu seçebilirsiniz.
Bu uygulama ticari projelerde kullanılabilir mi?
Evet, Tesseract Apache 2.0 lisansına sahiptir ve ticari projelerde kullanılabilir. Ancak, çok yüksek yoğunluklu işlemlerde sunucu maliyetlerini göz önünde bulundurmalısınız.
Görüntüdeki belirli bir alanı nasıl okutabilirim?
OpenCV ile görseli kırparak (cropping) sadece metnin olduğu bölgeyi Tesseract'a gönderebilirsiniz. Bu, doğruluk oranını ciddi ölçüde artırır.
GPU hızlandırma kullanabilir miyim?
Tesseract doğrudan GPU hızlandırmasını desteklemez ancak EasyOCR kütüphanesi ile NVIDIA CUDA kullanarak çok daha hızlı OCR işlemleri gerçekleştirebilirsiniz.
OCR Projelerinde Performans Optimizasyonu ve Ölçeklendirme
OCR projelerinizde işlem hacmi arttıkça, tekil görüntü işleme süreçleri darboğaz oluşturmaya başlar. Özellikle binlerce sayfalık dokümanları taramanız gerektiğinde, CPU tabanlı işlemler sisteminizi yavaşlatacaktır. Bu noktada, çoklu iş parçacığı (multithreading) veya asenkron işleme tekniklerini kullanarak performansı optimize etmeniz gerekir.
Aşağıdaki örnekte, concurrent.futures kütüphanesini kullanarak bir klasördeki tüm görüntüleri eşzamanlı olarak nasıl işleyebileceğinizi görebilirsiniz:
import pytesseract
from PIL import Image
import concurrent.futures
import os
def process_image(image_path):
img = Image.open(image_path)
text = pytesseract.image_to_string(img, lang='tur')
return f"{image_path}: {text[:50]}..."
image_files = [f for f in os.listdir('images/') if f.endswith('.jpg')]
with concurrent.futures.ThreadPoolExecutor() as executor:
results = list(executor.map(process_image, [f"images/{f}" for f in image_files]))
for result in results:
print(result)
OCR Çıktılarında Doğruluk Payını Artırmak İçin İleri Teknikler
OCR motorlarının hata payını düşürmek için sadece görüntü işleme yeterli değildir. Elde edilen ham metin verisi üzerinde NLP (Doğal Dil İşleme) teknikleri kullanarak "post-processing" (işlem sonrası düzenleme) yapmanız gerekebilir. Özellikle düşük kaliteli taramalarda karakter kaymaları kaçınılmazdır.
Fuzzy Matching (Bulanık Eşleştirme) Kullanımı
Eğer okuduğunuz metin belirli bir formata veya sözlüğe (örneğin fatura numaraları veya ürün kodları) sahipse, thefuzz kütüphanesini kullanarak OCR çıktısını beklenen verilerle karşılaştırabilir ve en yakın eşleşmeyi seçebilirsiniz.
from thefuzz import process
# OCR'den gelen hatalı çıktı
ocr_output = "Fatura No: 12345-AB"
# Beklenen format listesi
valid_codes = ["12345-AC", "12345-AB", "12346-AB"]
best_match, score = process.extractOne(ocr_output, valid_codes)
if score > 80:
print(f"Düzeltilmiş veri: {best_match}")
else:
print("Veri doğrulanamadı.")
Düzenli İfadeler (Regex) ile Veri Ayıklama
OCR sonucunda gelen karmaşık metin yığınından sadece ihtiyacınız olan veriyi (tarih, tutar, vergi no) çekmek için Python'un re modülü vazgeçilmezdir. İşte bir metin içerisinden tarih formatını ayıklayan pratik bir örnek:
import re
text = "Fatura Tarihi: 12.05.2023, Toplam Tutar: 500 TL"
date_pattern = r"\d{2}\.\d{2}\.\d{4}"
match = re.search(date_pattern, text)
if match:
print(f"Bulunan Tarih: {match.group()}")
Bu yöntemler, uygulamanızın sadece metin okuyan bir araçtan, veriyi anlamlandıran akıllı bir sisteme dönüşmesini sağlar. Özellikle kurumsal projelerde, OCR sonrası bu tür bir doğrulama katmanı eklemek, hata oranını %90'a varan oranda düşürebilir.
Sonuç
Python ile görüntüden metin okuma uygulaması geliştirmek, doğru kütüphaneler ve görüntü ön işleme teknikleriyle oldukça verimli sonuçlar verir. Tesseract ve OpenCV ikilisi, çoğu yerel proje için yeterli performansı sunmaktadır. Bir sonraki adım olarak, okuduğunuz metinleri bir veritabanına (SQLite veya PostgreSQL) kaydeden bir web arayüzü (Flask veya FastAPI kullanarak) geliştirmeyi deneyebilirsiniz. Bu sayede projenizi sadece bir script olmaktan çıkarıp, kullanılabilir bir yazılım ürününe dönüştürebilirsiniz.


Yorumlar (0)
Yorum Yaz