Görsel ve metin captcha OCR: bozulmuş captcha'lar nasıl okunur
Bir görsel captcha, kısa bir harf ya da rakam dizisini bir resim olarak gösterir; bazen gürültü, döndürme ve dalgalı çizgilerle birlikte. Optik karakter tanıma (OCR), Tesseract gibi açık kaynak bir motorla bu captcha'ların basit sürümlerini okuyabilir. Doğruluk resmin ne kadar temiz olduğuna bağlıdır, bu yüzden işin çoğu ön işlemedir. Bu rehber çalışan bir Python kurulumunu gösterir, nerede başarısız olduğunu açıklar ve tek bir şeyi net yapar: Scarnox'un canlı API'si görselden metne captcha'ları değil, PopularCaptcha widget token'larını çözer. OCR'ı bir API çağrısı olarak değil, kendi kodunuz olarak planlayın.
OCR ne zaman işe yarar, ne zaman yaramaz?
OCR, metin şu özelliklere sahipse makul bir ilk denemedir:
- Tek satırda ve düzgün aralıklı.
- Yüksek kontrastlı, açık bir arka plan üzerinde koyu harfler.
- Ağır bozulmasız, üst üste binmeyen karakterler ve kesişen çizgiler yok.
Döndürülmüş harflerde, birbirine değen harflerde, arka plan dokularında ve harflerin üzerinden geçen çizgilerde zorlanır. Bunların her biri belirli bir ön işleme adımı gerektirir ve bazıları tamamen farklı bir model ister. Doğruluğu varsaymak yerine ölçmeye hazır olun.
Araçları kurun
Python'a, Tesseract ikilisine ve iki Python paketine ihtiyacınız var:
pip install pillow pytesseract
Tesseract ayrı bir kurulumdur. Windows'ta Tesseract projesinin yükleyicisini kullanın ve çalıştırılabilir dosyanın PATH üzerinde olduğundan emin olun ya da pytesseract.pytesseract.tesseract_cmd değerini ona yönlendirin.
Ön işleyin, sonra okuyun
Doğruluğun büyük kısmı temiz girdiden gelir. Aşağıdaki dizi gri tonlamaya çevirir, kontrastı artırır, sert bir eşik uygular, görüntüyü büyütür ve çıktıyı captcha'nın kullandığı karakterlerle sınırlar:
from PIL import Image, ImageOps
import pytesseract
# Captcha'nın kullanabileceği karakterler. Captcha hiç kullanmıyorsa 0/O ve 1/I
# gibi birbirine benzeyen karakterleri dışarıda bırakın.
ALLOWED = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789"
def read_text(path: str) -> str:
img = Image.open(path)
gray = ImageOps.grayscale(img)
gray = ImageOps.autocontrast(gray)
# Sert eşik: 140'tan parlak pikseller beyaz olur, geri kalanı siyah.
bw = gray.point(lambda p: 255 if p > 140 else 0)
# Tesseract daha büyük gliflerle daha iyi çalışır.
bw = bw.resize((bw.width * 3, bw.height * 3))
config = f"--psm 7 -c tessedit_char_whitelist={ALLOWED}" # psm 7: tek metin satırı
return pytesseract.image_to_string(bw, config=config).strip()
if __name__ == "__main__":
print(read_text("sample_captcha.png"))
Eşik değeri 140 bir başlangıç noktasıdır. İşlenmiş resmi yazdırın, orijinaliyle karşılaştırın ve harfler dolgun, arka plan temiz olana kadar ayarlayın.
Güvenmeden önce doğruluğu ölçün
Bir resimde tek bir doğru okuma hiçbir şeyi kanıtlamaz. Bilinen cevaplara sahip bir captcha kümesi kaydedin, fonksiyonu hepsinde çalıştırın ve eşleşmeleri sayın:
def accuracy(samples: dict[str, str]) -> float:
# samples bir dosya yolunu gerçek metne eşler
hits = sum(read_text(path) == truth for path, truth in samples.items())
return hits / len(samples)
labelled = {
"samples/0001.png": "K7PQ2",
"samples/0002.png": "M3XN9",
}
print(f"doğruluk: {accuracy(labelled):.0%}")
Ön işlemeyi her değiştirdiğinizde bu sayıyı takip edin. Birkaç değişiklikten sonra oran düşük kalırsa, OCR büyük olasılıkla o captcha tarzı için yanlış araçtır ve farklı bir yaklaşıma bakmanız gerekir.
Nerede bozulur?
- Gürültü ve çizgiler. Morfolojik işlemlerle çizgileri kaldırın ya da daha düşük bir oranı kabul edin.
- Döndürme. Açıyı tahmin edin ve okumadan önce resmi döndürün.
- Birbirine değen harfler. Tüm satırı okumak yerine karakterleri sütuna göre bölüp her birini ayrı okumak çoğu zaman daha iyi çalışır.
- Zamanla değişim. Bir site stilini haber vermeden değiştirebilir ve doğruluk bir gecede düşebilir. Etiketli kümeyi saklayın ve düzenli olarak yeniden çalıştırın.
Ön işleme kontrol listesi
Bir okuma başarısız olduğunda bunları sırayla deneyin. Hangi adımın yardımcı olduğunu görebilmek için her seferinde tek bir şeyi değiştirin:
- Girdi boyutunu kontrol edin. Çok küçük captcha'lar çoğu zaman 3 kat büyütmeden sonra daha iyi okunur.
- Gri tonlamaya çevirin ve harflerin öne çıkması için kontrastı genişletin.
- Bir eşik uygulayın ve karar vermeden önce birkaç değer deneyin.
- Median filtre ile benek gürültüsünü temizleyin, gerekirse yeniden eşikleyin.
- Arka plan motoru şaşırtmasın diye resmi metin alanına kırpın.
- Karakter kümesini captcha'nın kullandığı kümeyle sınırlayın.
- Metin yayılmış ya da üst üste yazılmışsa farklı bir sayfa segmentasyon modu deneyin.
Sırayı ve ayarları etiketli örneklerinizle birlikte sürüm kontrolünde tutun. Ön işleme hattı koddur ve kod gibi gözden geçirilmelidir.
OCR mı, kendi çalıştırdığınız bir model mi?
Klasik OCR hızlıdır ve bir dizüstü bilgisayarda çalışır, ama captcha tarzı değiştiğinde kırılgandır. Kendi etiketli kümeniz üzerinde eğitilmiş görüntü modelleri daha fazla çeşitliliği kaldırabilir; bunun bedeli veri toplamak ve çıkarım çalıştırmaktır. İkisini de kurmak ve sürdürmek sizin sorumluluğunuzdadır. Bugün ikisi de Scarnox'un barındırdığı bir uç nokta değil, bu yüzden birini seçmeden önce altyapıyı planlayın.
Scarnox burada ne yapar, ne yapmaz?
Scarnox'un canlı API'si PopularCaptcha widget token'larını çözer. İstek POST https://api.scarnox.com/api/tasks/create adresine, PopularCaptcha görev tipi, sitekey ve sayfa URL'si ile gönderilir; yanıt form alanı için bir token'dır. Bu, bir resimdeki metni okumaktan farklı bir iştir ve Scarnox bugün görselden metne bir uç nokta sunmaz. Probleminiz bir görsel captcha ise OCR'ı ya da kendi çalıştırdığınız bir modeli kullanın; Scarnox'un neleri kapsadığı için diğer rehberlere bakın. Desteklediği PopularCaptcha akışları için hesap oluşturup ücretsiz deneme kredisiyle başlayabilirsiniz; kart gerekmez. Güncel fiyatlar fiyatlandırma sayfasındadır.
Meşru kullanımlar
- Taranmış belgelerden, ekran görüntülerinden ya da kendi test resimlerinizden metin okumak.
- Bir sitenin sunduğu alternatif bir yolu kullanabilmesi için, görme engelli bir kullanıcıya captcha'yı tarif eden ya da okuyan erişilebilirlik araçları.
- Otomatik araçların ne kadar kolay okuyabileceğini görmek ve tasarımı güçlendirmek için kendi captcha tasarımınızı test etmek.
Otomatik erişime izin vermeyen bir sitede captcha'yı aşmak için OCR kullanmayın. Görsel captcha'lar tam olarak bu tür erişimi yavaşlatmak için vardır.