- Προαπαιτούμενα
- Βήματα που εμπλέκονται στην αναγνώριση πινακίδων χρήσης με χρήση του Raspberry Pi
- 1. Ανίχνευση πινακίδας κυκλοφορίας
- 2. Τμηματοποίηση χαρακτήρων
- 3. Αναγνώριση χαρακτήρων
- Αποτυχίες σε αναγνώριση πινακίδων αριθμού
- Άλλα επιτυχημένα παραδείγματα
Η ασφάλεια υπήρξε πάντοτε μια μεγάλη ανησυχία για την ανθρωπότητα. Σήμερα έχουμε κάμερες παρακολούθησης βίντεο σε σχολεία, νοσοκομεία και σε κάθε άλλο δημόσιο χώρο για να μας κάνουν να νιώθουμε ασφαλείς. Σύμφωνα με μια έρευνα του HIS, εκτιμάται ότι υπήρχαν περίπου 245 εκατομμύρια κάμερες ασφαλείας που εγκαταστάθηκαν και λειτουργούσαν το 2014, κάτι που μοιάζει με μια κάμερα ασφαλείας για κάθε 30 άτομα σε αυτόν τον πλανήτη. Με την πρόοδο στην τεχνολογία, ιδίως στην επεξεργασία εικόνων και στη μηχανική εκμάθηση, είναι δυνατό να γίνουν αυτές οι κάμερες εξυπνότερες εκπαιδεύοντας τους να επεξεργάζονται πληροφορίες από τη ροή βίντεο.
Η τροφοδοσία βίντεο από αυτές τις κάμερες μπορεί να χρησιμοποιηθεί για την αναγνώριση προσώπου, την ανάλυση μοτίβων, την ανάλυση συναισθημάτων και πολλά άλλα που πραγματικά θα το έκαναν κοντά σε κάτι σαν το «Θεό του Θεού» που εμφανίζεται στην ταινία FF7 Στην πραγματικότητα, εταιρείες παρακολούθησης όπως η Hikvision και πολλές άλλες έχουν ήδη αρχίσει να εφαρμόζουν αυτά τα χαρακτηριστικά στα προϊόντα τους. Χρησιμοποιήσαμε προηγουμένως την επεξεργασία εικόνας MATLAB για να διαβάσουμε την πινακίδα αριθμών, σήμερα σε αυτό το άρθρο θα μάθουμε πώς να αναγνωρίζουμε και να διαβάζουμε τον αριθμό πινακίδας κυκλοφορίας από τα αυτοκίνητα χρησιμοποιώντας Raspberry Pi και OpenCV. Θα χρησιμοποιήσουμε μερικές τυχαίες εικόνες οχημάτων από την Google και θα γράψουμε ένα πρόγραμμα για την αναγνώριση της πινακίδας κυκλοφορίας χρησιμοποιώντας το OpenCV Contour Detection και στη συνέχεια θα διαβάσουμε τον αριθμό από την πινακίδα χρησιμοποιώντας το Tesseract OCR. Ακούγεται ενδιαφέρον, λοιπόν, ας ξεκινήσουμε.
Προαπαιτούμενα
Όπως ειπώθηκε προηγουμένως, θα χρησιμοποιήσουμε τη βιβλιοθήκη OpenCV για να εντοπίσουμε και να αναγνωρίσουμε πρόσωπα. Γι 'αυτό φροντίστε να εγκαταστήσετε τη βιβλιοθήκη OpenCV στο Raspberry Pi πριν συνεχίσετε με αυτό το σεμινάριο. Επίσης, τροφοδοτήστε το Pi με έναν προσαρμογέα 2Α και συνδέστε το σε μια οθόνη για ευκολότερο εντοπισμό σφαλμάτων.
Αυτό το σεμινάριο δεν θα εξηγήσει πώς ακριβώς λειτουργεί το OpenCV, εάν σας ενδιαφέρει να μάθετε την επεξεργασία εικόνων, ρίξτε μια ματιά σε αυτά τα βασικά του OpenCV και σε προχωρημένους οδηγούς επεξεργασίας εικόνων. Μπορείτε επίσης να μάθετε για τα περιγράμματα, το Blob Detection κ.λπ. σε αυτό το σεμινάριο τμηματοποίησης εικόνων χρησιμοποιώντας το OpenCV. Θα κάνουμε κάτι παρόμοιο με αυτό για να εντοπίσουμε την πινακίδα κυκλοφορίας του αυτοκινήτου από την εικόνα.
Βήματα που εμπλέκονται στην αναγνώριση πινακίδων χρήσης με χρήση του Raspberry Pi
Η αναγνώριση πινακίδας κυκλοφορίας ή το LPR για συντομία, περιλαμβάνει τρία σημαντικά βήματα. Τα βήματα έχουν ως εξής
1. Ανίχνευση πινακίδας κυκλοφορίας: Το πρώτο βήμα είναι η ανίχνευση της πινακίδας κυκλοφορίας από το αυτοκίνητο. Θα χρησιμοποιήσουμε την επιλογή περιγράμματος στο OpenCV για να ανιχνεύσουμε ορθογώνια αντικείμενα για να βρούμε την πινακίδα αριθμού. Η ακρίβεια μπορεί να βελτιωθεί εάν γνωρίζουμε το ακριβές μέγεθος, το χρώμα και την κατά προσέγγιση θέση της πινακίδας. Κανονικά ο αλγόριθμος ανίχνευσης εκπαιδεύεται με βάση τη θέση της κάμερας και τον τύπο πινακίδας που χρησιμοποιείται στη συγκεκριμένη χώρα. Αυτό γίνεται πιο δύσκολο εάν η εικόνα δεν έχει καν αυτοκίνητο, σε αυτήν την περίπτωση θα κάνουμε ένα επιπλέον βήμα για να εντοπίσουμε το αυτοκίνητο και μετά την πινακίδα κυκλοφορίας.
2. Τμηματοποίηση χαρακτήρων: Μόλις εντοπίσουμε το License Plate, πρέπει να το κόψουμε και να το αποθηκεύσουμε ως νέα εικόνα. Και πάλι αυτό μπορεί να γίνει εύκολα χρησιμοποιώντας το OpenCV.
3. Αναγνώριση χαρακτήρων: Τώρα, η νέα εικόνα που αποκτήσαμε στο προηγούμενο βήμα είναι βέβαιο ότι θα έχει γράψει μερικούς χαρακτήρες (Αριθμοί / Αλφάβητα). Έτσι, μπορούμε να εκτελέσουμε OCR (Optical Character Recognition) σε αυτό για να ανιχνεύσουμε τον αριθμό. Έχουμε ήδη εξηγήσει την αναγνώριση οπτικών χαρακτήρων (OCR) χρησιμοποιώντας το Raspberry Pi.
1. Ανίχνευση πινακίδας κυκλοφορίας
Το πρώτο βήμα σε αυτό το Raspberry Pi License Plate Reader είναι να εντοπίσετε το License Plate. Ας πάρουμε ένα δείγμα εικόνας ενός αυτοκινήτου και ξεκινήστε με τον εντοπισμό της πινακίδας κυκλοφορίας σε αυτό το αυτοκίνητο. Στη συνέχεια, θα χρησιμοποιήσουμε την ίδια εικόνα για τμηματοποίηση χαρακτήρων και αναγνώριση χαρακτήρων. Εάν θέλετε να μεταβείτε κατευθείαν στον κώδικα χωρίς εξήγηση, μπορείτε να μετακινηθείτε προς τα κάτω στο κάτω μέρος αυτής της σελίδας, όπου παρέχεται ο πλήρης κωδικός. Η δοκιμαστική εικόνα που χρησιμοποιώ για αυτό το σεμινάριο εμφανίζεται παρακάτω.
Βήμα 1: Αλλαγή μεγέθους της εικόνας στο απαιτούμενο μέγεθος και στη συνέχεια σε κλίμακα του γκρι. Ο κωδικός για το ίδιο δίνεται παρακάτω
img = cv2. μέγεθος (img, (620,480)) γκρι = cv2.cvtColor (img, cv2.COLOR_BGR2GRAY) # μετατροπή σε κλίμακα γκρι
Η αλλαγή μεγέθους μας βοηθά να αποφύγουμε προβλήματα με εικόνες μεγαλύτερης ανάλυσης, βεβαιωθείτε ότι η πινακίδα αριθμού παραμένει στο πλαίσιο μετά το μέγεθος. Η γκρίζα κλιμάκωση είναι κοινή σε όλα τα στάδια επεξεργασίας εικόνας. Αυτό επιταχύνει τις υπόλοιπες διαδικασίες που ακολουθούν, δεν χρειάζεται πλέον να εξετάσουμε τις λεπτομέρειες χρώματος κατά την επεξεργασία μιας εικόνας. Η εικόνα θα μεταμορφωθεί κάπως έτσι όταν γίνει αυτό το βήμα
Βήμα 2: Κάθε εικόνα θα έχει χρήσιμες και άχρηστες πληροφορίες, σε αυτήν την περίπτωση μόνο για μας η πινακίδα είναι οι χρήσιμες πληροφορίες, οι υπόλοιπες είναι σχεδόν άχρηστες για το πρόγραμμά μας. Αυτές οι άχρηστες πληροφορίες ονομάζονται θόρυβος. Κανονικά, η χρήση διμερούς φίλτρου (Bluring) θα αφαιρέσει τις ανεπιθύμητες λεπτομέρειες από μια εικόνα. Ο κωδικός για το ίδιο είναι
γκρι = cv2.bilateralFilter (γκρι, 11, 17, 17)
Η σύνταξη είναι destination_image = cv2.bilateralFilter (source_image, diameter pixel, sigmaColor, sigmaSpace). Μπορείτε να αυξήσετε το χρώμα και το διάστημα σίγμα από 17 σε υψηλότερες τιμές για να θολώσετε περισσότερες πληροφορίες φόντου, αλλά προσέξτε ότι το χρήσιμο μέρος δεν θολώνεται. Η εικόνα εξόδου εμφανίζεται παρακάτω, καθώς μπορείτε να δείτε τις λεπτομέρειες φόντου (δέντρο και κτίριο) είναι θολές σε αυτήν την εικόνα. Με αυτόν τον τρόπο μπορούμε να αποφύγουμε το πρόγραμμα να επικεντρωθεί σε αυτές τις περιοχές αργότερα.
Βήμα 3: Το επόμενο βήμα είναι ενδιαφέρον όπου εκτελούμε ανίχνευση άκρων. Υπάρχουν πολλοί τρόποι για να το κάνετε, ο πιο εύκολος και δημοφιλής τρόπος είναι να χρησιμοποιήσετε την έξυπνη μέθοδο του OpenCV. Η γραμμή για να κάνετε το ίδιο φαίνεται παρακάτω
edged = cv2.Canny (γκρι, 30, 200) #Perform Edge εντοπισμός
Η σύνταξη θα είναι destination_image = cv2.Canny (source_image, thresholdValue 1, thresholdValue 2). Η τιμή κατωφλίου 1 και η τιμή κατωφλίου 2 είναι οι ελάχιστες και μέγιστες τιμές κατωφλίου. Θα εμφανίζονται μόνο τα άκρα που έχουν κλίση έντασης μεγαλύτερη από την ελάχιστη τιμή κατωφλίου και μικρότερη από τη μέγιστη τιμή κατωφλίου. Η εικόνα που προκύπτει φαίνεται παρακάτω
Βήμα 4: Τώρα μπορούμε να αρχίσουμε να ψάχνουμε περίγραμμα στην εικόνα μας, έχουμε ήδη μάθει πώς να βρίσκουμε περιγράμματα χρησιμοποιώντας το OpenCV στο προηγούμενο σεμινάριό μας, οπότε προχωράμε ακριβώς όπως το ίδιο.
nts = cv2.findContours (edged.copy (), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) CNTs = imutils.grab_contours (CNTs) CNTs = ταξινομούνται (CNTs, πλήκτρο = cv2.contourArea, αντίστροφη = True) screenCnt = Ουδέν
Μόλις εντοπιστούν οι μετρητές τα ταξινομούμε από μεγάλα σε μικρά και θεωρούμε ότι μόνο τα πρώτα 10 αποτελέσματα αγνοούν τα άλλα. Στην εικόνα μας ο μετρητής θα μπορούσε να είναι οτιδήποτε έχει κλειστή επιφάνεια, αλλά από όλα τα αποτελέσματα που λαμβάνονται ο αριθμός πινακίδας κυκλοφορίας θα είναι επίσης εκεί, καθώς είναι επίσης κλειστή επιφάνεια.
Για να φιλτράρετε την εικόνα της πινακίδας κυκλοφορίας μεταξύ των ληφθέντων αποτελεσμάτων, θα βρούμε όλα τα αποτελέσματα και θα ελέγξουμε ποιος έχει περίγραμμα σχήματος ορθογωνίου με τέσσερις πλευρές και κλειστό σχήμα. Δεδομένου ότι μια πινακίδα θα ήταν σίγουρα ένα τετράγωνο σχήμα ορθογωνίου.
# Βρόχο πάνω από τα περιγράμματα μας για c σε CNTs: # προσεγγίζει το περίγραμμα περι = cv2.arcLength (γ, True) περίπου = cv2.approxPolyDP (γ, 0.018 * περιαστικές, True) # εάν κατά προσέγγιση περιγράμματος μας έχει τέσσερα σημεία, τότε # είμαστε μπορεί να υποθέσει ότι βρήκαμε την οθόνη μας εάν len (κατά προσέγγιση) == 4: screenCnt = κατά προσέγγιση διάλειμμα
Η τιμή 0,018 είναι μια πειραματική τιμή. μπορείτε να παίξετε γύρω για να ελέγξετε ποια είναι η καλύτερη για εσάς. Ή μεταβείτε στο επόμενο επίπεδο χρησιμοποιώντας μηχανική εκμάθηση για εκπαίδευση με βάση τις εικόνες του αυτοκινήτου και στη συνέχεια χρησιμοποιήστε τη σωστή τιμή εκεί. Μόλις βρούμε το σωστό μετρητή το αποθηκεύουμε σε μια μεταβλητή που ονομάζεται screenCnt και στη συνέχεια σχεδιάζουμε ένα ορθογώνιο κουτί γύρω του για να βεβαιωθούμε ότι έχουμε εντοπίσει σωστά την πινακίδα κυκλοφορίας.
Βήμα 5: Τώρα που γνωρίζουμε πού βρίσκεται η πινακίδα αριθμού, οι υπόλοιπες πληροφορίες είναι σχεδόν άχρηστες για εμάς. Έτσι μπορούμε να προχωρήσουμε στην κάλυψη ολόκληρης της εικόνας εκτός από το μέρος όπου βρίσκεται η πινακίδα αριθμού. Ο κώδικας για να κάνετε το ίδιο φαίνεται παρακάτω
# Κάλυψη του μέρους εκτός από τη μάσκα αριθμών πινακίδων = np.zeros (grey.shape, np.uint8) new_image = cv2.drawContours (mask,, 0,255, -1,) new_image = cv2.bitwise_and (img, img, mask = μάσκα)
Η μάσκα νέα εικόνα θα εμφανιστεί όπως παρακάτω
2. Τμηματοποίηση χαρακτήρων
Το επόμενο βήμα στην αναγνώριση αριθμών πινακίδων Raspberry Pi είναι να χωρίσετε την πινακίδα κυκλοφορίας από την εικόνα περικόπτοντάς την και αποθηκεύοντάς την ως νέα εικόνα. Μπορούμε στη συνέχεια να χρησιμοποιήσουμε αυτήν την εικόνα για να ανιχνεύσουμε τον χαρακτήρα σε αυτήν. Ο κώδικας για την περικοπή της εικόνας roi (Περιοχή ενδιαφέροντος) από την κύρια εικόνα φαίνεται παρακάτω
# Τώρα περικοπή (x, y) = np.where (mask == 255) (topx, topy) = (np.min (x), np.min (y)) (bottomx, bottomy) = (np.max (x), np.max (y)) Περικομμένη = γκρι
Η εικόνα που προκύπτει φαίνεται παρακάτω. Συνήθως προστίθεται στην περικοπή της εικόνας, μπορούμε επίσης να την γκρίζουμε και να την ακούμε αν απαιτείται. Αυτό γίνεται για να βελτιωθεί η αναγνώριση χαρακτήρων στο επόμενο βήμα. Ωστόσο, βρήκα ότι λειτουργεί καλά ακόμα και με την αρχική εικόνα.
3. Αναγνώριση χαρακτήρων
Το τελικό βήμα σε αυτήν την αναγνώριση αριθμού πινακίδας Raspberry Pi είναι να διαβάσετε πραγματικά τις πληροφορίες πινακίδων αριθμού από την τμηματοποιημένη εικόνα. Θα χρησιμοποιήσουμε το πακέτο pytesseract για να διαβάσουμε χαρακτήρες από την εικόνα, όπως κάναμε και στο προηγούμενο σεμινάριο. Ο κωδικός για το ίδιο δίνεται παρακάτω
# Διαβάστε την πινακίδα κειμένου = pytesseract.image_to_string (Περικομμένη, config = '- psm 11') εκτύπωση ("Ο αριθμός που εντοπίστηκε είναι:", κείμενο)
Έχουμε ήδη εξηγήσει πώς να διαμορφώσετε έναν κινητήρα Tesseract, οπότε και πάλι εδώ εάν χρειαστεί, μπορούμε να διαμορφώσουμε το Tesseract OCR για να έχουμε καλύτερα αποτελέσματα εάν απαιτείται. Στη συνέχεια, ο εντοπισμένος χαρακτήρας εκτυπώνεται στην κονσόλα. Κατά τη σύνταξη το αποτέλεσμα εμφανίζεται όπως παρακάτω
Όπως μπορείτε να δείτε, η αρχική εικόνα είχε τον αριθμό "HR 25 BR9044" και το πρόγραμμά μας εντόπισε την ίδια τιμή στην οθόνη.
Αποτυχίες σε αναγνώριση πινακίδων αριθμού
Μπορείτε να κατεβάσετε ολόκληρο το αρχείο έργου από αυτό το Raspberry Pi License Plate Recognition, από εδώ, περιέχει το πρόγραμμα και τις δοκιμαστικές εικόνες που χρησιμοποιήσαμε για να ελέγξουμε το πρόγραμμά μας. Χωρίς να ειπωθεί, πρέπει να θυμόμαστε ότι τα αποτελέσματα αυτής της μεθόδου δεν θα είναι ακριβή . Η ακρίβεια εξαρτάται από την καθαρότητα της εικόνας, τον προσανατολισμό, έκθεση σε φως κλπ. Για να έχετε καλύτερα αποτελέσματα, μπορείτε να δοκιμάσετε να εφαρμόσετε αλγόριθμους μηχανικής εκμάθησης μαζί με αυτό.
Για να πάρετε μια ιδέα, ας δούμε ένα άλλο παράδειγμα όπου το αυτοκίνητο δεν βλέπει απευθείας την κάμερα.
Όπως μπορείτε να δείτε, το πρόγραμμά μας μπόρεσε να εντοπίσει σωστά την πινακίδα κυκλοφορίας και να την περικόψει. Ωστόσο, η βιβλιοθήκη Tesseract απέτυχε να αναγνωρίσει τους χαρακτήρες σωστά. Αντί για το πραγματικό "TS 08 UE 3396", το OCR το έχει αναγνωρίσει ως "1508 ye 3396". Προβλήματα όπως αυτό μπορούν να διορθωθούν είτε χρησιμοποιώντας εικόνες καλύτερου προσανατολισμού είτε ρυθμίζοντας τον κινητήρα Tesseract .
Ένα άλλο χειρότερο σενάριο είναι όταν το περίγραμμα δεν εντοπίζει σωστά την πινακίδα κυκλοφορίας. Η παρακάτω εικόνα έχει πάρα πολλές πληροφορίες παρασκηνίου και κακό φωτισμό που το πρόγραμμα δεν κατάφερε ακόμη να αναγνωρίσει την πινακίδα κυκλοφορίας από τον αριθμό. Σε αυτήν την περίπτωση πρέπει να βασίσουμε ξανά στη Μηχανική εκμάθηση ή να βελτιώσουμε την ποιότητα της εικόνας.
Άλλα επιτυχημένα παραδείγματα
Τις περισσότερες φορές η ποιότητα και ο προσανατολισμός της εικόνας είναι σωστές, το πρόγραμμα μπόρεσε να αναγνωρίσει την πινακίδα και να διαβάσει τον αριθμό από αυτήν. Τα παρακάτω στιγμιότυπα δείχνουν μερικά από τα επιτυχή αποτελέσματα που αποκτήθηκαν. Και πάλι όλες οι δοκιμαστικές εικόνες και ο κωδικός που χρησιμοποιείται εδώ θα είναι διαθέσιμες στο αρχείο ZIP που παρέχεται εδώ.
Ελπίζω να καταλάβατε την Αυτόματη αναγνώριση πινακίδων χρησιμοποιώντας το Raspberry Pi και σας άρεσε να φτιάξετε κάτι δροσερό μόνοι σας. Τι άλλο πιστεύετε ότι μπορεί να γίνει με το OpenCV και το Tesseract;, επιτρέψτε μου να ξέρω τις σκέψεις σας στην ενότητα σχολίων. Εάν έχετε οποιεσδήποτε ερωτήσεις σχετικά με αυτό το άρθρο, μη διστάσετε να τα αφήσετε στην παρακάτω ενότητα σχολίων ή να χρησιμοποιήσετε τα φόρουμ για άλλα τεχνικά ερωτήματα.