OCR बनाने की सर्वोत्तम तकनीक
“GPU में न्यूरल नेटवर्क ट्रेनिंग” शीर्षक से मेरा एक पुराना लेख neural-network-training वेबसाइट पर है जिसमें प्रसिद्ध MNIST डैटासेट पर मशीन लर्निंग की MLP न्यूरल नेटवर्क तकनीक द्वारा GPU मोड के प्रोग्राम का व्यावहारिक उदाहरण विस्तार से है । मशीन लर्निंग सीखनेवालों को आरम्भिक स्तर में यह पढ़ाया जाता है जिसे हिन्दी में मैंने सरल करके लिखा है,MNIST प्रोग्राम का मूल लेखक मैं नहीं हूँ,निम्न लेख मेरा है । MNIST डैटासेट रोमन दस अङ्कों के ७०००० हस्तलिखित चिह्नों का भण्डार है जिसके आधार पर यह कृत्रिम बुद्धि का मॉडल् ट्रेनिंग प्रोग्राम है । उस पूरे प्रोग्रम को समझने के पश्चात ही निम्न लेख स्पष्ट हो सकेगा जो किसी भी लिपि का सर्वोत्तम OCR बनाने की व्यावहारिक पद्धति है ।
उपरोक्त लेख में उक्त पायथन प्रोग्राम का विवरण एवं कम्प्यूटर पर चलाने की विधि विस्तार से दी गयी है । यह GPU मोड का प्रोग्राम है,CPU पर अत्यधिक समय लेगा । अतः जिस कम्प्यूटर में GPU है उसी में चलेगा । किन्तु वह केवल १० अङ्कों की OCR स्कैनिंग वाला छोटा प्रोग्राम है जो सीखने वालों के लिए है । किसी सम्पूर्ण लिपि के समस्त हस्तलिपियों एवं अभिलेखों का विश्वसनीय व्यावहारिक OCR बनाने के लिए 24 GB का RTX-3090 GPU वाला लगभग ४ लाख रूपये का डेस्कटॉप कम्प्यूटर न्यूनतम उपकरण है,समस्त समस्त हस्तलिपियों एवं अभिलेखों की समग्र जाँच एवं मशीन लर्निंग बेहतर तरीके से हो इसके लिए उसी कम्प्यूटर में कुल तीन RTX-3090 अर्थात् ७२ GB का GPU हो तो विश्वस्तर का उत्तम OCR बनाया जा सकता है,किन्तु एक RTX-3090 पर भी सम्भव है − यद्यपि समय तीन गुणा लगेगा । एक और तीन GPU वाले दोनों प्रकार के कम्प्यूटरों पर मशीन लर्निंग कैसे की जाय इसका व्यावहारिक कोड बता रहा हूँ ।
एक से अधिक कम्प्यूटरों पर मशीन लर्निंग के लिए Distributed training environment सेटअप करने के लिए बंगलुरु से उच्चकोटि के तकनीशियनों को बुलाना पड़ेगा जिनको इसका अनुभव है । TensorFlow ने इसके लिए निम्न पायथन लाइब्रेरियाँ विकसित की हैं जिनके द्वारा यदि आपके पास संसाधन हों तो कुशल DevOps वा infrastructure engineer को बुलाकर बहुत से उत्तम डेस्कटॉपों को जोड़कर सुपरकम्प्यूटर भी बना सकते हैं —
tf.distribute.MultiWorkerMirroredStrategy
tf.distribute.experimental.MultiWorkerMirroredStrategy
tf.distribute.experimental.CentralStorageStrategy
क्लाउड में गूगल−टीपीयू द्वारा असली सुपरकम्प्यूटर की शक्ति का लाभ लैपटॉप में उठा सकते हैं,केवल संख्याओं की लम्बाई,अर्थात् शुद्धि,सुपरकम्प्यूटर से कम रहेगी,किन्तु गति संसार के सबसे तेज पाँच सुपरकम्प्यूटरों के समकक्ष होगी । उसका तरीका भी वही है जो प्रस्तुत लेख में है,केवल जीपीयू की मेमोरी और कोरों की संख्या अधिक होती है और अनेक जीपीयू होते हैं ।
Distributed training environment स्थापित करना एक वैज्ञानिक के बूते की बात नहीं है,अतः यहाँ उसकी चर्चा करना निरर्थक है । OCR के लिए Distributed कम्प्यूटिंग अनावश्यक है,अत्यधिक जटिल मॉडल और विशाल डैटाबेस हो तो क्लाउड में गूगल−टीपीयू का प्रयोग बहुत सस्ता पड़ेगा,सुरपकम्प्यूटर के तुल्य गति मिलेगी;पद्धति वही रहेगी जो multiGPU वाले मेरे पायथन स्क्रिप्ट में नीचे है ।
न्यूरल नेटवर्क की संरचना में परिवर्तन
सबसे पहले mnist_mlp.py पायथन कोड में एक महत्वपूर्ण विषय का स्पष्टीकरण आवश्यक है जिसपर नेट के जितने भी मशीन ल्रनिंग उदाहरण आपको मिलेंगे उनमें से किसी में मुझे कोई स्पष्टीकरण नहीं मिला है । इस विषय को ठीक से नहीं समझेंगे तो नेट के उदाहरणों को पढ़कर आप अपनी परिस्थिति के अनुसार न्यूरल नेटवर्क में संशोधन नहीं कर सकेंगे । न्यूरल नेटवर्क की आन्तरिक संचरना का पूर्ण स्पष्टीकरण यहाँ अभीष्ट नहीं है,उसपर विकिपेडिया में अच्छे लेख मिल जायेंगे । उतने विस्तार में अभी जाने की आवश्यकता भी नहीं है । प्रस्तुत विषय में जितना आवश्यक है उतना स्पष्टीकरण कर रहा हूँ ।
mnist_mlp.py के आरम्भ में batch_size = 128 लिखा है,4 GB GPU पर भी इससे मुझे कोई समस्या नहीं हुई । किन्तु एक RTX-3090 हो तो बैच को १०२४ तक बढ़ाया जा सकता है,मूल चित्रों का आकार बड़ा न हो तो २०४८ भी सम्भव है । तीन RTX-3090 हों तो बैच बढ़ा सकते हैं । आरम्भ में अचानक १०२४ वा अधिक न करें,१२८ से २५६, फिर ५१२ करते हुए कम्प्यूटर की जाँच करें कि GPU मेमोरी का कितना भाग मशीन लर्निंग ट्रेनिंग ले रहा है,उसी के अनुरूप बैच साइज निर्धारित करें ताकि GPU की क्षमता से अधिक मेमोरी प्रोग्राम न माँगे ।
उसके उपरान्त उक्त फाइल में लिखा है num_classes = 10,जिसका अर्थ है इनपुट में दस प्रकार के चिह्नों की विविध आवृतियाँ हैं । कुल ७०००० चित्र हैं जिनमें ६०००० ट्रेनिंग सेट और १०००० टेस्टिंग सेट में प्रोग्राम देगा,किन्तु वे सारे ७०००० चित्र केवल दस अङ्कों के ही हैं,अर्थात् दस classes हैं । किन्तु यदि ब्राह्मी अथवा मिथिलाक्षर का OCR बनाना हो तो संयुक्ताक्षरों को लेकर कुल classes की संख्या सैकड़ों हो जायगी । आधुनिक भारतीय लिपियों में समाचारपत्रों के कारण संयुक्ताक्षरों की संख्या बहुत घट गयी है किन्तु इन लिपियों में भी पाण्डुलिपियों को ध्यान रखकर OCR बनाना चाहिए । अतः निम्न प्रोग्राम में मैंने classes की संख्या ५०० रखी है,वास्तविक संख्या आपके अपने डैटासेट पर निर्भर करेगी ।
मॉडल के अन्तिम न्यूरल लेयर में भी model.add(Dense(10, activation='softmax')) को संशोधित करके क्लास की संख्या १० से बढ़ाकर ५०० करना पड़ेगा । अन्तिम न्यूरल लेयर को आउटपुट लेयर कहा जाता है जिसके द्वारा उतने ही प्रकारों के चिह्नों का आउटपुट मलेगा जितने प्रकार वा वर्ग इनपुट में है ।
MLP नेटवर्क का वर्णन
mnist_mlp.py में “model = Sequential()” से लेकर “model.add(Dense(10, activation='softmax'))” तक कुल छ पङ्क्तियों में सम्पूर्ण न्यूरल नेटवर्क को बनाया गया है । प्रथम पङ्क्ति का अर्थ है कि यह Sequential प्रकार का न्यूरल नेटवर्क है ।
दूसरी पङ्क्ति model.add(Dense(512, activation='relu', input_shape=(784,))) का अर्थ है कि यह पङ्क्ति “इनपुट लेयर” कहलाती है जो इनपुट चित्रों का संग्रहण करके नेटवर्क को प्रदान करती है । इसमें ५१२ न्यूरॉन हैं जो २८x२८ पिक्सेल के एक चित्र को ७८४ पिक्सेल का लीनीयर डैटा बनाकर उनपर relu activation फंक्शन का प्रयोग करती है ।यह Dense प्रकार का लेयर है,परी तरह से कनेक्टेड,जिसमें हर न्यूरॉन अगले लेयर से जुड़ा रहता है । इसके पश्चात Dropout लेयर २०% डैटा को त्यागता है,मॉडल ओवरफिटिंग से बचने का यह उपाय है । मॉडल ओवरफिटिंग का अर्थ है कि जाँच में मॉडल खरा उतरे किन्तु नवीन डैटा पर गलत परिणाम दे । उसके आगे पुनः 512 न्यूरॉनों का Dense लेयर और पुनः Dropout लेयर है । अन्त में आउटपुट Dense लेयर है ।
यह एक Multi Layer Perceptron MLP है । इसमें बीच के एक डेन्स और एक ड्रापआउट लेयरों को हटा दें तो तीन लेयर बचेंगे जिसे MLP का सरलतम मॉडल माना जाता है ।
उपरोक्त वर्णन में सभी तकनीकी शब्दों पर विकिपेडिया में अच्छे लेख मिल जायेंगे । https://en.wikipedia.org/wiki/Multilayer_perceptron से आरम्भ करें और उसके क्रॉस−लिंकों द्वारा सम्पूर्ण विषय की जानकारी प्राप्त करें ।
Multi Layer Perceptron को ठीक से समझने के पश्चात इमेज प्रोसेसिंग के क्षेत्र में उसको परिष्कृत एवं परिवर्तित करके CNN बनाया गया जिसपर https://en.wikipedia.org/wiki/Convolutional_neural_network लेख है ।
जिन समस्याओं का किसी सूत्र द्वारा समाधान नहीं निकलता उनका लगभग हल ज्ञात करने में MLP बहुत उपयोगी है । किन्तु ईमेज प्रोसेसिंग में जीवित प्राणियों के Visual Cortex की जाँच में पाया गया कि जीवों के मस्तिष्क में दर्शन से सम्बन्धित न्यूरॉनों का परस्पर जुड़ाव Dense लेयर की तरह पूरी तरह कनेक्टेड नहीं होता,बल्कि हर न्यूरॉन समुच्चय दृष्टक्षेत्र के केवल एक छोटे खण्ड को ही देखता है और ऐसे सभी न्यूरॉन समुच्चय मिलकर पूरा दृश्य बनाते हैं ।
जटिल ईमेज प्रोसेसिंग में MLP की बजाय CNN का उपयोग किया जाता है । MLP हर प्रकार की गणितीय समस्या के समाधान में प्रयुक्त हो सकता है किन्तु CNN के कुछ विशिष्ट उपयोग ही हैं जिनमें यह बेहतर है । सुपर रिजॉल्यूशन में भी CNN का उपयाग होता है किन्तु उस गणितीय गेम थ्योरी पर आधारित GAN तकनीक का प्रयोग करके SRGAN न्यूरल आर्किटेक्चर बनाया जाता है ।
अतः केवल १० वर्ग के चिह्नों पर MLP भले ही कार्य कर जाय,५०० चिह्नों वाले जटिल डैटाबेस के लिए CNN ही बेहतर है । किन्तु हस्तलेखों में पाया गया है कई बार एक चिह्न की पूँछ अगले वा पिछले चिह्न के क्षेत्र में प्रवेश कर जाती है । अतः अलग−अलग चिह्नों जाँच करने वाले CNN नेटवर्क से भी बेहतर इस विषय में RNN है जिस कारण अगले अनुच्छेद में मैंने LSTM का उपयोग दिखाया है । किन्तु CNN तथा RNN को मिलाकर जो मॉडल बनेगा वह सबसे अच्छा बनेगा,उसमें उक्त सारे गुण रहेंगे । अतः MNIST के सरल डैटासेट हेतु प्रयुक्त MLP के स्थान पर मैंने CNN तथा RNN को मिलाकर जो मॉडल बनाया उसका वर्णन आगे है ।
CNN
OCR_CNN एवं OCR_RNN केवल सीखने के लिए दे रहा हूँ । व्यावहारिक मॉडल दोनों के योग से मैंने तैयार किया जो नीचे है ।
इनपुट डैटाबेस ७०००० से बहुत अधिक बढ़ाना पड़ेगा तभी विश्वसनीय प्रोग्राम बना सकेंगे । डैटाबेस का आकार, चिह्न का आकार,चिह्नों के वर्गों की संख्या अपनी आवश्यकता के अनुसार परिवर्तित करके ”OCR_CNN+RNN” मॉडल का उपयोग स्तरीय OCR बनाने के लिए कर सकते हैं । यदि विण्डो यूनीवर्सल प्लेटफॉर्म पर प्रोग्राम बनायेंगे तो स्मार्टफोन पर भी कार्य करेगा । डैटाबेस तैयार करने के लिए नेट पर बहुत से लेख मिलेंगे । टेस्सारेक्ट OCR के लिए सम्पूर्ण पैकेज है;बेहतर होगा कि सारा कार्य उसी में करें किन्तु टेस्सारेक्ट के साथ कृत्रिम बुद्धि के मेरे इस मॉडल का प्रयोग करेंगे तो किसी भी लिपि का उत्तम OCR बना सकेंगे ।
OCR_CNN लिंक वाले पायथन स्क्रिप्ट में मैंने इनपुट डैटाबेस के समस्त चिह्नों के ५०० वर्ग दिये हैं ताकि सारे संयुक्ताक्षर समा सकें । किन्तु इसकी वास्तविक संख्या ५०० न होकर आपके डैटाबेस के अनुसार होनी चाहिए । यदि आपकी लिपि में ४५० चिह्न−वर्ग हैं तो ५०० के स्थान पर ४५० लिखें । कुल चिह्नों की संख्या मैंने ६०००० ट्रेनिंग एवं १०००० टेस्टिंग ही रहने दी है किन्तु यह संख्या १० चिह्न−वर्गों के लिए थी । ५०० के लिए बढ़ाना पड़ेगा । चिह्न का आकार मैंने २८x२८ से बढ़ाकर १००x१०० कर दिया है ताकि बेहतर छवियाँ आ सकेंख्आप अपने डैटाबेस के अनेसार इसे सुधार लें । बहुत बड़े चित्र मत रखें वरना ट्रेनिंग नहीं कर सकेगे । चित्र न्यूनतम आकार का हो किन्तु पठनीय हो ।
═══════════════════════════
RNN
LSTM is well-suited for (sequential) data, where there is a time component or order to the data. In the case of OCR, the input data is a sequence of images representing characters, and the order of these images is important for recognizing the characters.
While a CNN model can work well for OCR tasks, using an RNN can have some advantages. For example, an RNN can be better at handling variability in character length, since the output of the network at each time step can depend on the previous time steps. This can make it easier for the network to handle longer sequences of characters. Additionally, RNNs can learn to model dependencies between characters that occur over longer distances in the sequence, which can be important for recognizing some handwriting styles or cursive scripts.
That being said, using an RNN for OCR is not always necessary, and a well-designed CNN model can work just as well or better, depending on the specifics of the task. The choice of model architecture will depend on the characteristics of the dataset, the specific OCR task, and the computational resources available.
For OCR, a common and effective architecture is a combination of a convolutional neural network (CNN) and a recurrent neural network (RNN). The CNN is used to extract features from the input images, and the RNN is used to model the sequence of characters in the image.
The CNN can be used to extract high-level features from the input images, such as edges, corners, and other patterns. These features can be fed into the RNN, which can then learn to recognize and classify the characters in the input image sequence. The RNN can be designed using a variety of recurrent layers, such as LSTM or GRU, which are well-suited for processing sequential data.
In addition to the CNN-RNN architecture, there are also other types of neural networks that can be used for OCR, such as attention-based models, which can dynamically focus on different parts of the input sequence and have shown promising results in recent years. However, the specific architecture that is most appropriate for a given OCR task will depend on the characteristics of the data, the complexity of the task, and the available computational resources.
Best OCR Model
OCR बनाने का सर्वोत्तम मॉडल है CNN+RNN वाला GPU मॉडल जिसका Multi-GPU संस्करण नीचे है =
OCR_CNN+RNN
उपरोक्त OCR_CNN+RNN प्रोग्राम का multiGPU संस्करण, बनेगा जो अनेक GPU होने पर प्रोग्राम को सभी GPU पर बाँटकर ट्रेनिंग करेगा =
RETRAIN from Checkpoint
During training, we added a callback function ModelCheckpoint() to save the model after every 5 epochs. In case of an interruption, this function will save the model in the specified directory, and we can resume training from that point when the script is run again.
When running the script again after an interruption, the code checks if a saved model file exists. If it does, it loads the model and continues training from the last saved checkpoint. If the saved model file does not exist, it creates a new model and starts training from scratch.
Overall, these modifications allow us to save and resume training from saved checkpoints, making the training process more robust and efficient in case of interruptions or other issues.
OCR_CNN+RNN_Retrain