इमेज और टेक्स्ट कैप्चा OCR: विकृत कैप्चा कैसे पढ़ें
इमेज कैप्चा अक्षरों या अंकों की एक छोटी स्ट्रिंग को तस्वीर के रूप में दिखाता है, कभी शोर, घुमाव और लहरदार रेखाओं के साथ। Optical character recognition (OCR) Tesseract जैसे ओपन-सोर्स इंजन से इनके सरल रूप पढ़ सकता है। सटीकता इस पर निर्भर करती है कि इमेज कितनी साफ़ है, इसलिए ज़्यादातर काम प्रीप्रोसेसिंग का है। यह गाइड एक काम करने वाला Python सेटअप दिखाती है, बताती है कि वह कहां विफल होता है, और एक बात साफ़ करती है: Scarnox का लाइव API PopularCaptcha विजेट टोकन हल करता है, इमेज-से-टेक्स्ट कैप्चा नहीं। OCR को API कॉल की तरह नहीं, अपने ही कोड की तरह योजना बनाएं।
OCR कब काम करता है और कब नहीं
OCR पहली कोशिश के लिए ठीक है जब टेक्स्ट:
- एक लाइन में हो, बराबर दूरी के साथ।
- हाई कॉन्ट्रास्ट हो, हल्के बैकग्राउंड पर गहरे अक्षर।
- भारी विकृति, एक-दूसरे पर चढ़े अक्षरों और आर-पार जाती रेखाओं से मुक्त हो।
घुमाए गए अक्षरों, आपस में छूते अक्षरों, बैकग्राउंड की बनावट और अक्षरों के बीच से गुजरती रेखाओं के साथ यह संघर्ष करता है। इनमें से हर एक को अलग प्रीप्रोसेसिंग चरण चाहिए, और कुछ के लिए पूरी तरह अलग मॉडल। सटीकता मानकर न चलें, उसे मापने के लिए तैयार रहें।
टूल इंस्टॉल करें
आपको Python, Tesseract बाइनरी और दो Python पैकेज चाहिए:
pip install pillow pytesseract
Tesseract अलग से इंस्टॉल होता है। Windows पर Tesseract प्रोजेक्ट का इंस्टॉलर इस्तेमाल करें और सुनिश्चित करें कि executable आपके PATH में हो, या pytesseract.pytesseract.tesseract_cmd को उसकी ओर इंगित करें।
प्रीप्रोसेस करें, फिर पढ़ें
ज़्यादातर सटीकता साफ़ इनपुट से आती है। नीचे का क्रम इमेज को ग्रेस्केल में बदलता है, कॉन्ट्रास्ट बढ़ाता है, एक सख्त threshold लगाता है, इमेज को बड़ा करता है और आउटपुट को उन्हीं अक्षरों तक सीमित करता है जो कैप्चा इस्तेमाल करता है:
from PIL import Image, ImageOps
import pytesseract
# वे अक्षर जो कैप्चा इस्तेमाल कर सकता है। मिलते-जुलते अक्षर 0/O और 1/I छोड़ दें, अगर कैप्चा
# उन्हें कभी इस्तेमाल नहीं करता।
ALLOWED = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789"
def read_text(path: str) -> str:
img = Image.open(path)
gray = ImageOps.grayscale(img)
gray = ImageOps.autocontrast(gray)
# सख्त threshold: 140 से ज़्यादा चमक वाले पिक्सेल सफ़ेद, बाकी काले हो जाते हैं।
bw = gray.point(lambda p: 255 if p > 140 else 0)
# Tesseract बड़े अक्षरों पर बेहतर काम करता है।
bw = bw.resize((bw.width * 3, bw.height * 3))
config = f"--psm 7 -c tessedit_char_whitelist={ALLOWED}" # psm 7: एक टेक्स्ट लाइन
return pytesseract.image_to_string(bw, config=config).strip()
if __name__ == "__main__":
print(read_text("sample_captcha.png"))
threshold का मान 140 एक शुरुआती बिंदु है। प्रोसेस की गई इमेज प्रिंट करें, उसे मूल से मिलाएं, और तब तक समायोजित करें जब तक अक्षर ठोस न दिखें और बैकग्राउंड साफ़ न हो।
सटीकता मापें, फिर भरोसा करें
एक इमेज पर एक सही पढ़ाई कुछ साबित नहीं करती। जिनके सही उत्तर पता हों ऐसे कैप्चा का एक सेट सहेजें, सभी पर फ़ंक्शन चलाएं, और मिलान गिनें:
def accuracy(samples: dict[str, str]) -> float:
# samples फ़ाइल पथ को सही टेक्स्ट से मैप करता है
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"accuracy: {accuracy(labelled):.0%}")
प्रीप्रोसेसिंग बदलते समय यह संख्या ट्रैक करें। कई बदलावों के बाद भी अगर यह संख्या कम रहती है, तो शायद उस कैप्चा शैली के लिए OCR गलत टूल है, और आपको कोई दूसरा तरीका देखना चाहिए।
यह कहां टूटता है
- शोर और रेखाएं। morphological operations से रेखाएं हटाएं, या कम दर स्वीकार करें।
- घुमाव। कोण का अनुमान लगाएं और पढ़ने से पहले इमेज घुमाएं।
- आपस में छूते अक्षर। कॉलम के हिसाब से अक्षरों को अलग करके हर एक को अलग पढ़ना अक्सर पूरी लाइन पढ़ने से बेहतर काम करता है।
- समय के साथ बदलाव। कोई साइट बिना सूचना के अपनी शैली बदल सकती है, जिससे सटीकता रातों-रात गिर सकती है। लेबल वाला सेट रखें और उसे नियमित रूप से दोबारा चलाएं।
प्रीप्रोसेसिंग चेकलिस्ट
जब पढ़ाई विफल हो, तो इन्हें क्रम से देखें। एक समय में एक चीज़ बदलें, ताकि पता चले कि कौन सा कदम मदद कर रहा है:
- इनपुट का साइज़ जांचें। बहुत छोटे कैप्चा अक्सर 3x अपस्केल के बाद बेहतर पढ़े जाते हैं।
- ग्रेस्केल में बदलें और कॉन्ट्रास्ट बढ़ाएं ताकि अक्षर उभरें।
- threshold लगाएं, और कोई एक मान तय करने से पहले कुछ मान आज़माएं।
- median filter से स्पेकल शोर हटाएं, फिर ज़रूरत हो तो दोबारा threshold लगाएं।
- इमेज को टेक्स्ट वाले हिस्से तक क्रॉप करें, ताकि बैकग्राउंड इंजन को भ्रमित न करे।
- अक्षरों का सेट उसी तक सीमित करें जो कैप्चा इस्तेमाल करता है।
- अगर टेक्स्ट बिखरा या एक के ऊपर एक हो, तो अलग page segmentation mode आज़माएं।
क्रम और सेटिंग्स को लेबल किए गए नमूनों के साथ version control में रखें। प्रीप्रोसेसिंग पाइपलाइन एक कोड है, और उसकी समीक्षा कोड की तरह होनी चाहिए।
OCR या अपना खुद चलाया मॉडल
क्लासिक OCR तेज़ है और लैपटॉप पर चलता है, लेकिन जब कैप्चा की शैली बदलती है तो यह नाज़ुक साबित होता है। अपने लेबल वाले सेट पर ट्रेन किए गए इमेज मॉडल ज़्यादा विविधता संभाल सकते हैं, लेकिन इसकी कीमत है डेटा इकट्ठा करना और inference चलाना। दोनों को बनाने और संभालने की ज़िम्मेदारी आपकी है। आज इनमें से कोई भी Scarnox होस्टेड एंडपॉइंट नहीं है, इसलिए किसी एक को चुनने से पहले इन्फ्रास्ट्रक्चर की योजना बना लें।
Scarnox यहां क्या करता है और क्या नहीं
Scarnox का लाइव API PopularCaptcha विजेट टोकन हल करता है। रिक्वेस्ट POST https://api.scarnox.com/api/tasks/create पर जाती है, जिसमें PopularCaptcha टास्क टाइप, sitekey और पेज URL होते हैं, और जवाब फॉर्म फ़ील्ड के लिए एक टोकन होता है। यह इमेज का टेक्स्ट पढ़ने से अलग काम है, और Scarnox आज इमेज-से-टेक्स्ट एंडपॉइंट नहीं देता। अगर आपकी समस्या इमेज कैप्चा है, तो OCR या अपना चलाया मॉडल इस्तेमाल करें, और देखें कि Scarnox किन चीज़ों को कवर करता है। समर्थित PopularCaptcha फ्लो के लिए आप खाता बनाएं और मुफ्त ट्रायल क्रेडिट के साथ शुरू कर सकते हैं, कार्ड की ज़रूरत नहीं। मौजूदा कीमतें प्राइसिंग पेज पर हैं।
वैध उपयोग
- स्कैन किए गए दस्तावेज़ों, स्क्रीनशॉट या अपनी टेस्ट इमेज से टेक्स्ट पढ़ना।
- एक्सेसिबिलिटी टूल जो कैप्चा का वर्णन या पढ़ाई करते हैं, ताकि दृष्टि-बाधित उपयोगकर्ता साइट के दिए हुए वैकल्पिक रास्ते का उपयोग कर सकें।
- अपने कैप्चा डिज़ाइन का परीक्षण यह देखने के लिए कि स्वचालित टूल उसे कितनी आसानी से पढ़ सकते हैं, ताकि आप उसे और मज़बूत बना सकें।
जिस साइट पर स्वचालित एक्सेस की अनुमति नहीं है, वहां कैप्चा पार करने के लिए OCR न इस्तेमाल करें। इमेज कैप्चा ठीक उसी तरह की गति को धीमा करने के लिए मौजूद हैं।