2025, Oct 30 19:33
जब chi_sim इंस्टॉल हो, फिर भी Tesseract चीनी टेक्स्ट खाली क्यों लौटाता है
सीखें क्यों Tesseract OCR chi_sim के साथ चीनी टेक्स्ट पर खाली स्ट्रिंग लौटाता है, और इसे ठीक करने के लिए छवि प्रीप्रोसेसिंग, psm, PIL/OpenCV, tessdata कॉन्फ़िग कदम।
जब Tesseract OCR चीनी पाठ के लिए खाली स्ट्रिंग लौटाता है, जबकि chi_sim इंस्टॉल है और आपके टूलिंग में दिख भी रहा है, तो पहला अंदाज़ा अक्सर गलत कॉन्फ़िगरेशन पर जाता है। हकीकत में, बाधा अक्सर खुद छवि होती है। शोर भरी, कम-कॉन्ट्रास्ट फोटो जिसमें टेढ़ापन और बनावट वाला बैकग्राउंड हो, उस दहलीज से नीचे गिर सकती है जहाँ Tesseract अक्षर अलग करके पहचान ही नहीं पाता।
समस्या को दोहराना
नीचे दिया गया स्निपेट फोटो पढ़ता है, उसे PIL इमेज में बदलता है और chi_sim के साथ pytesseract चलाता है। भाषा पैक मौजूद है, फिर भी आउटपुट खाली आता है:
import cv2 as cv
from PIL import Image as PilImage
import pytesseract as ptes
from pyocr import tesseract as pyocr_tess
img_file = 'photo.jpeg'
cv_mat = cv.imread(img_file)
pil_frame = PilImage.fromarray(cv_mat)
result_text = ptes.image_to_string(pil_frame, lang='chi_sim')
print(result_text)
यह भी पुष्टि हो जाती है कि भाषा डिटेक्ट हो रही है:
import pytesseract as ptes
print(ptes.get_languages(config=''))  # ['chi_sim', 'eng', 'osd']
असल में हो क्या रहा है
मूल छवि इतनी कमजोर है कि Tesseract अक्षरों को अलग करके पहचान ही नहीं पाता। पहचान से पहले कई तरह की सफाई चाहिए: परिप्रेक्ष्य या घुमाव को ठीक करने के लिए रेक्टिफिकेशन, शोर स्तर से ऊपर अग्रभूमि को उठाने के लिए कॉन्ट्रास्ट बढ़ाना, और बैकग्राउंड की बनावट हटाने के लिए रंग-आधारित थ्रेशोल्डिंग। सफाई के बाद भी, अगर स्रोत की गुणवत्ता कम है, तो सामान्य OCR के लिए नतीजा अपेक्षा से नीचे रह सकता है।
इसी वजह से कुछ सेवाएँ ऐसी तस्वीरों से मानो “जादू” से साफ़ टेक्स्ट निकालती दिखाई देती हैं। जो सिस्टम कई समान छवियों को एकत्र करते हैं, वे एक कहीं अधिक साफ़ औसत निकाल सकते हैं और वह पढ़ लेते हैं जो एक सिंगल-पास OCR इंजन नहीं कर पाता। इसी तरह के दस्तावेज़ के लिए, नीचे जैसा आउटपुट इस तरह के एग्रीगेशन से संभव हो जाता है:
中华人民共和国
居民身份证
签发机关
有效期限
2007.05.14-2027.05 14
फिर भी, एक अच्छी तरह साफ़ की गई एकल छवि के साथ भी, Tesseract अक्सर कई नमूनों से निकाली गई कृत्रिम रूप से सुधरी व्याख्या के बराबर नहीं पहुँचता।
वास्तव में क्या मदद करता है
शुरुआत छवि से करें। कॉन्ट्रास्ट बढ़ाएँ, दस्तावेज़ क्षेत्र को रेक्टिफाई करें, और बैकग्राउंड दबाने के लिए रंग-आधारित थ्रेशोल्डिंग लगाएँ। Tesseract को सफेद पृष्ठभूमि पर काले अक्षर पसंद हैं, और बहुत छोटे या बहुत बड़े टेक्स्ट पर उसे दिक्कत होती है; पर्याप्त रेज़ोल्यूशन—कम से कम 72 dpi—महत्त्वपूर्ण है। अगर आप बनावटी पृष्ठभूमि और कम कॉन्ट्रास्ट वाली शोरभरी एक ही फोटो पर निर्भर हैं, तो खाली या लगभग खाली नतीजा अपेक्षित है।
इंटीग्रेशन की तरफ, अपने I/O और वातावरण को पूर्वानुमेय रखें। सीधे PIL में लोड करने से रंग चैनल से जुड़ी गड़बड़ियाँ नहीं आतीं, क्योंकि OpenCV BGR पढ़ता है जबकि PIL RGB अपेक्षित करता है। अगर आप OpenCV से पढ़ते हैं, तो imread के बाद shape देखकर सुनिश्चित करें कि छवि खाली नहीं है, क्योंकि गलत पाथ चुपचाप अनुपयोगी मैट्रिक्स दे सकता है। आप कमांड लाइन से भी OCR चलाकर उसे अपने Python स्टैक से मिला सकते हैं। लेआउट असामान्य हो तो psm ट्यून करना मददगार होता है। और अगर आपका tessdata डायरेक्टरी डिफॉल्ट सर्च पाथ में नहीं है, तो भले भाषा उपलब्ध पैकों की सूची में दिख रही हो, फिर भी config में उसे स्पष्ट रूप से पास करना पड़ सकता है।
Python में एक सुरक्षित कॉल पैटर्न
तर्क वही है—छवि लोड करें और image_to_string कॉल करें—लेकिन यह संस्करण BGR/RGB की अस्पष्टता हटाता है और जरूरत होने पर tessdata पाथ पास करने का तरीका दिखाता है:
from PIL import Image as PilImage
import pytesseract as ptes
src_path = 'photo.jpeg'
lang_id = 'chi_sim'
# यदि आपके सिस्टम को स्पष्ट tessdata पाथ चाहिए, तो इसे रखें; वरना इसे खाली स्ट्रिंग रहने दें।
extra_cfg = '--tessdata-dir "/usr/share/tesseract-ocr/5/tessdata"'
img_obj = PilImage.open(src_path)
ocr_text = ptes.image_to_string(img_obj, lang=lang_id, config=extra_cfg)
print(ocr_text)
यह मूल रूप से अपठनीय फोटो से जादुई तौर पर टेक्स्ट नहीं निकाल देगा, लेकिन I/O या कॉन्फ़िगरेशन की विचित्रताओं से जुड़ी गलत-नकारात्मक स्थितियाँ घटा देता है।
यह क्यों मायने रखता है
OCR की सटीकता केवल मॉडल या भाषा पैक पर निर्भर नहीं करती। यह इनपुट की दृश्य गुणवत्ता और पूरी पाइपलाइन पर निर्णायक रूप से टिकी होती है। सीमाएँ जानने से आप अपने कोड में गैर-मुद्दों के पीछे भागने से बचते हैं, जब वास्तविक बाधा डेटा होता है। यह भी साफ़ होता है कि कुछ एंड-टू-एंड सिस्टम एकल फ्रेम पर एक Tesseract कॉल से बेहतर क्यों चलते हैं: वे एग्रीगेशन से शोर घटाते हैं और अधिक कड़ी प्री-प्रोसेसिंग लागू करते हैं।
व्यावहारिक निष्कर्ष
यदि chi_sim के साथ Tesseract शोरभरी दस्तावेज़ फोटो पर खाली लाइन लौटाता है, तो सिर्फ कोड नहीं, छवि का उपचार करें। पेज को रेक्टिफाई करें, कॉन्ट्रास्ट बढ़ाएँ, और बैकग्राउंड पर थ्रेशोल्ड लगाएँ ताकि टेक्स्ट काले पर सफेद दिखे। रेज़ोल्यूशन पर्याप्त हो यह सुनिश्चित करें और असामान्य लेआउट के लिए psm ट्यून करने पर विचार करें। छवियाँ ऐसे लोड करें कि अपेक्षित रंग चैनल सुरक्षित रहें, यह जाँचें कि आपका इनपुट सचमुच लोड हुआ, और ज़रूरत पड़े तो tessdata डायरेक्टरी को स्पष्ट रूप से पास करें। ऐसा करने पर आप कॉन्फ़िगरेशन से जुड़ी दिक्कतों को उस अधिक आम हकीकत से अलग कर पाएँगे: छवि भरोसेमंद OCR के गुणवत्ता मानक से नीचे है।