- आवश्यक शर्तें
- रास्पबेरी पाई का उपयोग करके लाइसेंस प्लेट मान्यता में शामिल कदम
- 1. लाइसेंस प्लेट डिटेक्शन
- 2. चरित्र विभाजन
- 3. चरित्र पहचान
- नंबर प्लेट मान्यता में विफल मामले
- अन्य सफल उदाहरण हैं
सुरक्षा हमेशा मानव जाति के लिए एक प्रमुख चिंता का विषय रही है। आज हमारे पास स्कूलों, अस्पतालों और हर दूसरे सार्वजनिक स्थान पर वीडियो निगरानी कैमरे हैं जो हमें सुरक्षित महसूस कराते हैं। एचआईएस के एक सर्वेक्षण के अनुसार यह अनुमान है कि 2014 में लगभग 245 मिलियन सुरक्षा कैमरे स्थापित किए गए थे और वापस काम कर रहे थे, जो इस ग्रह पर हर 30 लोगों के लिए एक सुरक्षा कैमरा होने जैसा है। विशेष रूप से इमेज प्रोसेसिंग और मशीन लर्निंग में प्रौद्योगिकी की प्रगति के साथ, इन कैमरों को वीडियो फीड से जानकारी संसाधित करने के लिए प्रशिक्षित करके स्मार्ट बनाना संभव है।
इन कैमरों से वीडियो फीड का उपयोग चेहरे की पहचान, पैटर्न विश्लेषण, भावना विश्लेषण और बहुत कुछ करने के लिए किया जा सकता है जो वास्तव में FF7 फिल्म में दिखाए गए "गॉड्स आई" के समान होगा। वास्तव में, निगरानी कंपनियों जैसे हिकविजन और कई अन्य ने पहले से ही अपने उत्पादों में इन सुविधाओं को लागू करना शुरू कर दिया है। हमने पहले नंबर प्लेट को पढ़ने के लिए MATLAB इमेज प्रोसेसिंग का उपयोग किया था, आज इस लेख में हम सीखेंगे कि रास्पबेरी पाई और ओपनसीवी का उपयोग करके ऑटोमोबाइल से लाइसेंस प्लेट नंबर को कैसे पहचाना और पढ़ा जाए । हम Google से कुछ यादृच्छिक वाहन छवियों का उपयोग करेंगे और OpenCV कंटूर डिटेक्शन का उपयोग करके नंबर प्लेट को पहचानने के लिए एक कार्यक्रम लिखेंगे और फिर टेसेरैक्ट OCR का उपयोग करके प्लेट से नंबर पढ़ेंगे। दिलचस्प सही लगता है !, तो चलिए शुरू करते हैं।
आवश्यक शर्तें
जैसा कि पहले बताया गया है कि हम चेहरे का पता लगाने और पहचानने के लिए ओपनसीवी लाइब्रेरी का उपयोग करेंगे। तो इस ट्यूटोरियल के साथ आगे बढ़ने से पहले रास्पबेरी पाई पर ओपनसीवी लाइब्रेरी स्थापित करना सुनिश्चित करें। इसके अलावा अपने पीए को 2 ए एडाप्टर के साथ पावर करें और इसे आसान डिबगिंग के लिए डिस्प्ले मॉनिटर से कनेक्ट करें।
यह ट्यूटोरियल यह नहीं बताएगा कि OpenCV वास्तव में कैसे काम करता है, यदि आप छवि प्रसंस्करण सीखने में रुचि रखते हैं तो इस OpenCV की मूल बातें और उन्नत छवि ट्यूटोरियल देखें। आप इस छवि विभाजन ट्यूटोरियल में OpenCV का उपयोग करके आकृति, ब्लॉब डिटेक्शन आदि के बारे में भी जान सकते हैं। हम छवि से कार की लाइसेंस प्लेट का पता लगाने के लिए ऐसा ही कुछ करेंगे।
रास्पबेरी पाई का उपयोग करके लाइसेंस प्लेट मान्यता में शामिल कदम
लाइसेंस प्लेट मान्यता या संक्षिप्त रूप से LPR में तीन प्रमुख चरण शामिल हैं। चरण इस प्रकार हैं
1. लाइसेंस प्लेट डिटेक्शन: कार से लाइसेंस प्लेट का पता लगाने के लिए पहला कदम है। हम नंबर प्लेट को खोजने के लिए आयताकार वस्तुओं का पता लगाने के लिए OpenCV में समोच्च विकल्प का उपयोग करेंगे। सटीकता में सुधार किया जा सकता है यदि हम नंबर प्लेट के सटीक आकार, रंग और अनुमानित स्थान को जानते हैं। आम तौर पर डिटेक्शन एल्गोरिथ्म को उस विशेष देश में उपयोग किए जाने वाले कैमरा और नंबर प्लेट की स्थिति के आधार पर प्रशिक्षित किया जाता है। यह पेचीदा हो जाता है यदि छवि के पास कार भी नहीं है, तो इस मामले में हम कार और फिर लाइसेंस प्लेट का पता लगाने के लिए एक अतिरिक्त कदम उठाएंगे।
2. चरित्र विभाजन: एक बार जब हमने लाइसेंस प्लेट का पता लगा लिया तो हमें इसे बाहर निकालना होगा और इसे नई छवि के रूप में सहेजना होगा। फिर से यह OpenCV का उपयोग करके आसानी से किया जा सकता है।
3. चरित्र की पहचान: अब, पिछले चरण में हमें जो नई छवि प्राप्त हुई है, उस पर लिखे गए कुछ अक्षर (संख्या / अक्षर) निश्चित हैं। इसलिए, हम संख्या का पता लगाने के लिए उस पर OCR (ऑप्टिकल कैरेक्टर रिकॉग्निशन) कर सकते हैं। हमने पहले ही रास्पबेरी पाई का उपयोग करके ऑप्टिकल कैरेक्टर रिकॉग्निशन (OCR) के बारे में बताया।
1. लाइसेंस प्लेट डिटेक्शन
इस रास्पबेरी पाई लाइसेंस प्लेट रीडर में पहला कदम लाइसेंस प्लेट का पता लगाना है। चलो एक कार की एक नमूना छवि लेते हैं और उस कार पर लाइसेंस प्लेट का पता लगाने के साथ शुरू करते हैं। इसके बाद हम कैरेक्टर सेगमेंटेशन और कैरेक्टर रिकग्निशन के लिए भी इसी इमेज का इस्तेमाल करेंगे। यदि आप सीधे स्पष्टीकरण के बिना कोड में कूदना चाहते हैं तो आप इस पृष्ठ के नीचे स्क्रॉल कर सकते हैं, जहां पूरा कोड प्रदान किया गया है। इस ट्यूटोरियल के लिए मैं जिस परीक्षण छवि का उपयोग कर रहा हूं, वह नीचे दी गई है।
चरण 1: आवश्यक आकार में छवि का आकार बदलें और फिर उसे स्केल करें । उसी के लिए कोड नीचे दिया गया है
img = cv2.resize (img, (620,480)) ग्रे = cv2.cvtColor (img, cv2.COLOR_BGR2GRAY) # स्केल टू ग्रे स्केल
आकार बदलने में हम बड़ी संकल्प छवियों के साथ किसी भी समस्या से बचने में मदद करते हैं, यह सुनिश्चित करें कि आकार बदलने के बाद भी नंबर प्लेट अभी भी फ्रेम में बनी हुई है। ग्रे स्केलिंग सभी इमेज प्रोसेसिंग चरणों में आम है। यह निम्नलिखित अन्य प्रक्रिया साइन को गति देता है जो अब हमें किसी छवि को संसाधित करते समय रंग विवरण से निपटने के लिए नहीं होता है। जब यह कदम किया जाता है तो छवि कुछ इस तरह से रूपांतरित हो जाएगी
चरण 2: हर छवि में उपयोगी और बेकार जानकारी होगी, इस मामले में हमारे लिए केवल लाइसेंस प्लेट ही उपयोगी जानकारी है बाकी हमारे कार्यक्रम के लिए बहुत बेकार हैं। इस बेकार जानकारी को शोर कहा जाता है। आम तौर पर एक द्विपक्षीय फिल्टर (ब्लरिंग) का उपयोग करके एक छवि से अवांछित विवरण हटा दिया जाएगा । उसी के लिए कोड है
ग्रे = cv2.bilateralFilter (ग्रे, 11, 17, 17)
सिंटैक्स गंतव्य_इमेज = cv2.bilateralFilter (source_image, पिक्सेल का व्यास, sigmaColor, sigmaSpace) है। आप पृष्ठभूमि की अधिक जानकारी को धुंधला करने के लिए सिग्मा रंग और सिग्मा स्थान को 17 से बढ़ा सकते हैं, लेकिन सावधान रहें कि उपयोगी भाग धुंधला न हो। आउटपुट चित्र नीचे दिखाया गया है, जैसा कि आप देख सकते हैं कि पृष्ठभूमि विवरण (पेड़ और भवन) इस छवि में धुंधले हैं। इस तरह हम बाद में इन क्षेत्रों पर ध्यान केंद्रित करने से कार्यक्रम से बच सकते हैं।
चरण 3: अगला चरण दिलचस्प है जहां हम एज डिटेक्शन करते हैं । इसे करने के कई तरीके हैं, सबसे आसान और लोकप्रिय तरीका ओपनसीवी से कैनी एज विधि का उपयोग करना है । ऐसा ही करने की लाइन नीचे दिखाई गई है
edged = cv2.Canny (ग्रे, 30, 200) # बेहतर एज का पता लगाना
वाक्यविन्यास गंतव्य_इमेज = cv2.Canny (source_image, थ्रेशोल्डव्यू 1, थ्रेशोल्डव्यू 2) होगा। थ्रेसहोल्ड Vale 1 और थ्रेसहोल्ड मान 2 न्यूनतम और अधिकतम सीमा मान हैं। केवल उन किनारों को दिखाया गया है जिनकी तीव्रता न्यूनतम दहलीज मूल्य से अधिक है और अधिकतम सीमा मूल्य से कम प्रदर्शित किया जाएगा। परिणामी छवि नीचे दिखाई गई है
चरण 4: अब हम अपनी छवि पर आकृति की तलाश शुरू कर सकते हैं, हम पहले से ही सीख चुके हैं कि अपने पिछले ट्यूटोरियल में OpenCV का उपयोग करके कैसे पता लगाया जाए ताकि हम उसी तरह आगे बढ़ें।
nts = cv2.findContours (edged.copy (), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) cnts = imutils.grabcont-contours (cnts) cnts = सॉर्ट (cnts, key = cv2.contourArea) उल्टा होगा।
एक बार काउंटरों का पता लगने के बाद हम उन्हें बड़े से छोटे तक छांटते हैं और केवल पहले 10 परिणामों पर विचार करते हैं जो दूसरों की अनदेखी करते हैं। हमारी छवि में काउंटर कुछ भी हो सकता है जिसमें एक बंद सतह है लेकिन सभी प्राप्त परिणामों के साथ लाइसेंस प्लेट संख्या भी होगी क्योंकि यह एक बंद सतह भी है।
प्राप्त परिणामों के बीच लाइसेंस प्लेट छवि को फ़िल्टर करने के लिए, हम सभी परिणामों और जाँच करेंगे, जिसमें एक आयताकार आकृति होती है, जिसमें चार तरफ और बंद आकृति होती है। चूंकि लाइसेंस प्लेट निश्चित रूप से एक आयत चार पक्षीय होगी।
cnts में c के लिए हमारे कंट्रोल्स पर # लूप : # समोच्च पेरी = cv2.arcLength (c, True) लगभग = cv2.approxPolyDP (c, 0.018 * peri, True) # अगर हमारे अनुमानित समोच्च में चार अंक हैं, तो # हम मान सकते हैं कि अगर हमने लेन (लगभग) == 4: स्क्रीनकंट = लगभग तोड़ दिया तो हमें अपनी स्क्रीन मिल गई है
0.018 का मान एक प्रायोगिक मान है; आप यह जांचने के लिए इसके चारों ओर खेल सकते हैं कि कौन सा आपके लिए सबसे अच्छा है या कार चित्रों के आधार पर प्रशिक्षित करने के लिए मशीन लर्निंग का उपयोग करके इसे अगले स्तर पर ले जाएं और फिर वहां सही मूल्य का उपयोग करें। एक बार जब हमें सही काउंटर मिल जाता है तो हम इसे स्क्रीनकेन्ट नामक एक चर में सहेजते हैं और फिर यह सुनिश्चित करने के लिए इसके चारों ओर एक आयत बॉक्स बनाते हैं कि हमने लाइसेंस प्लेट का सही पता लगाया है।
चरण 5: अब जब हम जानते हैं कि नंबर प्लेट कहां है, शेष जानकारी हमारे लिए बहुत अधिक बेकार है। इसलिए हम उस नंबर को छोड़कर पूरी तस्वीर को मास्किंग के साथ आगे बढ़ा सकते हैं जहाँ नंबर प्लेट है। ऐसा करने का कोड नीचे दिखाया गया है
# नंबर प्लेट मास्क = np.zeros (ग्रे.शैप, np.uint8) new_image = cv2.drawContours (मास्क,, 0,255, -1) के अलावा अन्य भाग को मास्क करना मुखौटा)
नकाबपोश नई छवि नीचे की तरह दिखाई देगी
2. चरित्र विभाजन
रास्पबेरी पाई नंबर प्लेट मान्यता में अगला कदम छवि से लाइसेंस प्लेट को बाहर निकालना और इसे एक नई छवि के रूप में सहेजना है। हम तब इस छवि का उपयोग इसमें चरित्र का पता लगाने के लिए कर सकते हैं। रोई (ब्याज का क्षेत्र) छवि बनाने के लिए कोड मुख्य छवि को नीचे दिखाया गया है
# अब फसल (x, y) = np.where (मास्क == 255) (topx, topy) = (np.min (x), np.min (y)) (bottomx, bottomy) = (np.max) x), np.max (y)) क्रॉप्ड = ग्रे
परिणामी छवि नीचे दिखाई गई है। आम तौर पर छवि को क्रॉप करने के लिए जोड़ा जाता है, हम इसे ग्रे कर सकते हैं और यदि आवश्यक हो तो इसे किनारे कर सकते हैं। यह अगले चरण में चरित्र की पहचान को बेहतर बनाने के लिए किया जाता है। हालांकि मैंने पाया कि यह मूल छवि के साथ भी ठीक काम करता है।
3. चरित्र पहचान
इस रास्पबेरी पाई नंबर प्लेट मान्यता में अंतिम चरण वास्तव में खंडित छवि से नंबर प्लेट की जानकारी को पढ़ना है । हम चित्र से वर्णों को पढ़ने के लिए pytesseract पैकेज का उपयोग करेंगे, जैसे हमने पिछले ट्यूटोरियल में किया था। उसी के लिए कोड नीचे दिया गया है
# नंबर प्लेट पाठ = pytesseract.image_to_string (क्रॉप्ड, कॉन्फिग = '- psm 11') प्रिंट करें ("पता लगाया गया नंबर है:", पाठ)
हमने पहले ही समझाया है कि टेसेरैक्ट इंजन को कैसे कॉन्फ़िगर किया जाए, इसलिए यदि आवश्यक हो तो फिर से बेहतर परिणाम प्राप्त करने के लिए हम टेसरैक्ट ओसीआर को कॉन्फ़िगर कर सकते हैं। पता चला चरित्र तब कंसोल पर मुद्रित होता है। जब संकलित किया जाता है तो परिणाम नीचे दिखाया गया है
जैसा कि आप देख सकते हैं कि मूल चित्र पर संख्या "HR 25 BR9044" थी और हमारे कार्यक्रम ने पता लगाया है कि यह स्क्रीन पर समान मूल्य मुद्रित करता है।
नंबर प्लेट मान्यता में विफल मामले
पूरी परियोजना फ़ाइल इस रास्पबेरी पाई लाइसेंस प्लेट मान्यता को यहां से डाउनलोड किया जा सकता है, इसमें कार्यक्रम और परीक्षण छवियां शामिल हैं जो हम अपने कार्यक्रम की जांच करते थे। कहा जा रहा है बिना, यह याद रखना है कि इस पद्धति से परिणाम सटीक नहीं होंगे । सटीकता छवि, अभिविन्यास, प्रकाश जोखिम आदि की स्पष्टता पर निर्भर करती है । बेहतर परिणाम प्राप्त करने के लिए आप मशीन लर्निंग एल्गोरिदम को इसके साथ लागू करने का प्रयास कर सकते हैं।
एक विचार प्राप्त करने के लिए, आइए एक और उदाहरण देखें जहां कार सीधे कैमरे का सामना नहीं कर रही है।
जैसा कि आप देख सकते हैं, हमारा कार्यक्रम लाइसेंस प्लेट का सही तरीके से पता लगाने और उसे फसल देने में सक्षम था। लेकिन टेसरेक्ट लाइब्रेरी पात्रों को ठीक से पहचानने में विफल रही है। वास्तविक "टीएस 08 यूई 3396" के बजाय ओसीआर ने इसे "1508 तु 3396" माना है। इस तरह की समस्याओं को बेहतर अभिविन्यास छवियों का उपयोग करके या टेसरैक्ट इंजन को कॉन्फ़िगर करके ठीक किया जा सकता है ।
एक और सबसे खराब स्थिति यह है कि समोच्च लाइसेंस प्लेट का सही पता लगाने में विफल रहता है। नीचे दी गई छवि में बहुत अधिक पृष्ठभूमि की जानकारी और खराब प्रकाश व्यवस्था है कि प्रोग्राम नंबर से लाइसेंस प्लेट की पहचान करने में भी विफल रहा है। इस मामले में हमें फिर से मशीन लर्निंग पर रिले करना होगा या तस्वीर की गुणवत्ता में सुधार करना होगा।
अन्य सफल उदाहरण हैं
छवि गुणवत्ता और अभिविन्यास के अधिकांश समय सही हैं, प्रोग्राम लाइसेंस प्लेट की पहचान करने और उससे संख्या पढ़ने में सक्षम था। नीचे दिए गए स्नैप शॉट्स प्राप्त किए गए कुछ सफल परिणाम दिखाते हैं। फिर से सभी परीक्षण चित्र और यहाँ इस्तेमाल किया गया कोड यहाँ उपलब्ध कराई गई ज़िप फ़ाइल में उपलब्ध होगा।
आशा है कि आप रास्पबेरी पाई का उपयोग करके स्वचालित नंबर प्लेट मान्यता को समझ गए थे और अपने दम पर कुछ ठंडा बनाने का आनंद लिया था। आपको क्या लगता है कि OpenCV और Tesseract के साथ क्या किया जा सकता है ?, मुझे अपने विचार कमेंट सेक्शन में बताएं। यदि इस लेख के बारे में आपके कोई प्रश्न हैं, तो कृपया नीचे टिप्पणी अनुभाग में उन्हें छोड़ने के लिए स्वतंत्र महसूस करें या अन्य तकनीकी प्रश्नों के लिए मंचों का उपयोग करें।