Πίνακας περιεχομένων:

Σε πραγματικό χρόνο αναγνώριση προσώπου: ένα έργο από άκρο σε άκρο: 8 βήματα (με εικόνες)
Σε πραγματικό χρόνο αναγνώριση προσώπου: ένα έργο από άκρο σε άκρο: 8 βήματα (με εικόνες)

Βίντεο: Σε πραγματικό χρόνο αναγνώριση προσώπου: ένα έργο από άκρο σε άκρο: 8 βήματα (με εικόνες)

Βίντεο: Σε πραγματικό χρόνο αναγνώριση προσώπου: ένα έργο από άκρο σε άκρο: 8 βήματα (με εικόνες)
Βίντεο: WEBINAR | Θετική Γονεϊκότητα - 1η συνάντηση 2024, Ιούλιος
Anonim
Σε πραγματικό χρόνο αναγνώριση προσώπου: ένα έργο από άκρο σε άκρο
Σε πραγματικό χρόνο αναγνώριση προσώπου: ένα έργο από άκρο σε άκρο

Στο τελευταίο μου σεμινάριο εξερεύνησης του OpenCV, μάθαμε AUTOMATIC VISION OBJECT TRACKING. Τώρα θα χρησιμοποιήσουμε το PiCam για να αναγνωρίσουμε πρόσωπα σε πραγματικό χρόνο, όπως μπορείτε να δείτε παρακάτω:

Εικόνα
Εικόνα

Αυτό το έργο έγινε με αυτό το φανταστικό "Open Source Computer Vision Library", το OpenCV. Σε αυτό το σεμινάριο, θα εστιάσουμε στο Raspberry Pi (δηλαδή, Raspbian ως λειτουργικό σύστημα) και στην Python, αλλά δοκίμασα επίσης τον κώδικα στο My Mac και λειτουργεί επίσης καλά. Το OpenCV σχεδιάστηκε για υπολογιστική αποδοτικότητα και με μεγάλη έμφαση σε εφαρμογές σε πραγματικό χρόνο. Έτσι, είναι ιδανικό για αναγνώριση προσώπου σε πραγματικό χρόνο χρησιμοποιώντας κάμερα.

Για να δημιουργήσουμε ένα ολοκληρωμένο έργο για την αναγνώριση προσώπου, πρέπει να εργαστούμε σε 3 πολύ διαφορετικές φάσεις:

  1. Ανίχνευση προσώπου και συγκέντρωση δεδομένων
  2. Εκπαιδεύστε τον Αναγνωριστή
  3. Αναγνώριση προσώπου

Το παρακάτω μπλοκ διάγραμμα συνεχίζει αυτές τις φάσεις:

Εικόνα
Εικόνα

Βήμα 1: BoM - Bill of Material

Κύρια μέρη:

  1. Raspberry Pi V3 - 32,00 $
  2. Μονάδα βίντεο 5 Megapixels 1080p Sensor OV5647 Mini Camera - 13,00 $

Βήμα 2: Εγκατάσταση του πακέτου OpenCV 3

Εγκατάσταση πακέτου OpenCV 3
Εγκατάσταση πακέτου OpenCV 3

Χρησιμοποιώ ένα Raspberry Pi V3 ενημερωμένο στην τελευταία έκδοση του Raspbian (Stretch), οπότε ο καλύτερος τρόπος για να εγκαταστήσετε το OpenCV είναι να ακολουθήσετε το εξαιρετικό σεμινάριο που αναπτύχθηκε από τον Adrian Rosebrock: Raspbian Stretch: Εγκαταστήστε το OpenCV 3 + Python στο Raspberry Pi σας Το

Δοκίμασα αρκετούς διαφορετικούς οδηγούς για να εγκαταστήσω το OpenCV στο Pi μου. Το σεμινάριο του Adrian είναι το καλύτερο. Σας συμβουλεύω να κάνετε το ίδιο, ακολουθώντας τις οδηγίες βήμα προς βήμα.

Μόλις τελειώσετε το σεμινάριο του Adrian, θα πρέπει να έχετε έτοιμο ένα εικονικό περιβάλλον OpenCV για να εκτελέσετε τα πειράματά μας στο Pi σας.

Ας πάμε στο εικονικό μας περιβάλλον και επιβεβαιώστε ότι το OpenCV 3 είναι σωστά εγκατεστημένο.

Ο Adrian συνιστά να εκτελείτε την εντολή "πηγή" κάθε φορά που ανοίγετε ένα νέο τερματικό για να διασφαλίσετε ότι οι μεταβλητές του συστήματός σας έχουν ρυθμιστεί σωστά.

πηγή ~/.προφίλ

Στη συνέχεια, ας εισάγουμε το εικονικό μας περιβάλλον:

workon cv

Εάν δείτε το κείμενο (cv) που προηγείται της προτροπής σας, τότε βρίσκεστε στο εικονικό περιβάλλον του cv:

(cv) pi@raspberry: ~ $Ο Adrian επισημαίνει ότι το εικονικό περιβάλλον cv Python είναι εντελώς ανεξάρτητο και δεσμεύεται από την προεπιλεγμένη έκδοση Python που περιλαμβάνεται στη λήψη του Raspbian Stretch. Έτσι, οποιαδήποτε πακέτα Python στον παγκόσμιο κατάλογο πακέτων ιστότοπων δεν θα είναι διαθέσιμα στο εικονικό περιβάλλον cv. Ομοίως, τυχόν πακέτα Python που είναι εγκατεστημένα σε πακέτα cv του ιστότοπου δεν θα είναι διαθέσιμα στην καθολική εγκατάσταση της Python

Τώρα, εισαγάγετε τον διερμηνέα Python:

Πύθων

και επιβεβαιώστε ότι εκτελείτε την έκδοση 3.5 (ή παραπάνω)

Μέσα στο διερμηνέα (θα εμφανιστεί το ">>>"), εισαγάγετε τη βιβλιοθήκη OpenCV:

εισαγωγή cv2

Εάν δεν εμφανιστούν μηνύματα σφάλματος, το OpenCV είναι σωστά εγκατεστημένο στο δικό σας εικονικό περιβάλλον.

Μπορείτε επίσης να ελέγξετε την εγκατεστημένη έκδοση OpenCV:

cv2._ έκδοση_

Θα πρέπει να εμφανιστεί το 3.3.0 (ή μια ανώτερη έκδοση που μπορεί να κυκλοφορήσει στο μέλλον). Η παραπάνω τερματική οθόνη εκτύπωσης εμφανίζει τα προηγούμενα βήματα.

Βήμα 3: Δοκιμή της κάμεράς σας

Δοκιμή της κάμερας σας
Δοκιμή της κάμερας σας

Μόλις εγκαταστήσετε το OpenCV στο RPi σας, ας δοκιμάσουμε να επιβεβαιώσουμε ότι η κάμερα λειτουργεί σωστά.

Υποθέτω ότι έχετε ήδη εγκαταστήσει ένα PiCam στο Raspberry Pi σας.

Εισαγάγετε τον παρακάτω κωδικό Python στο IDE σας:

εισαγωγή numpy ως np

εισαγωγή cv2 cap = cv2. VideoCapture (0) cap.set (3, 640) # set Πλάτος cap.set (4, 480) # set ightψος ενώ (True): ret, frame = cap.read () frame = cv2. flip (καρέ, -1) # Αναστροφή κάμερας κάθετα γκρι = cv2.cvtColor (πλαίσιο, cv2. COLOR_BGR2GRAY) cv2.imshow ("πλαίσιο", πλαίσιο) cv2.imshow ("γκρι", γκρι) k = cv2.waitKey (30) & 0xff αν k == 27: # πατήστε 'ESC' για να κλείσετε το break cap.release () cv2.destroyAllWindows ()

Ο παραπάνω κώδικας θα καταγράψει τη ροή βίντεο που θα δημιουργηθεί από το PiCam, εμφανίζοντας και τα δύο, σε χρώμα BGR και γκρι.

Σημειώστε ότι περιστρέψα την κάμερα κάθετα λόγω του τρόπου συναρμολόγησής της. Εάν δεν είναι η περίπτωσή σας, σχολιάστε ή διαγράψτε τη γραμμή εντολών "flip".

Εναλλακτικά, μπορείτε να κατεβάσετε τον κώδικα από το GitHub μου: simpleCamTest.py

Για εκτέλεση, πληκτρολογήστε την εντολή:

python simpleCamTest.py

Για να ολοκληρώσετε το πρόγραμμα, πρέπει να πατήσετε το πλήκτρο [ESC] στο πληκτρολόγιό σας.

Κάντε κλικ στο ποντίκι σας στο παράθυρο βίντεο, πριν πατήσετε [ESC]

Η παραπάνω εικόνα δείχνει το αποτέλεσμα.

Ορισμένοι κατασκευαστές βρήκαν προβλήματα όταν προσπαθούσαν να ανοίξουν την κάμερα (μηνύματα σφάλματος "Η δήλωση απέτυχε"). Αυτό θα μπορούσε να συμβεί εάν η κάμερα δεν ήταν ενεργοποιημένη κατά την εγκατάσταση του OpenCv και έτσι, τα προγράμματα οδήγησης της κάμερας δεν εγκαταστάθηκαν σωστά. Για να διορθώσετε, χρησιμοποιήστε την εντολή:

sudo modprobe bcm2835-v4l2

Μπορείτε επίσης να προσθέσετε bcm2835-v4l2 στην τελευταία γραμμή του αρχείου /etc /modules έτσι ώστε το πρόγραμμα οδήγησης να φορτώνεται κατά την εκκίνηση.

Για να μάθετε περισσότερα σχετικά με το OpenCV, μπορείτε να ακολουθήσετε το σεμινάριο: φόρτωση -video-python-opencv-tutorial

Βήμα 4: Ανίχνευση προσώπου

Ανίχνευση προσώπου
Ανίχνευση προσώπου
Ανίχνευση προσώπου
Ανίχνευση προσώπου

Το πιο βασικό καθήκον στην αναγνώριση προσώπου είναι φυσικά το "Face Detecting". Πριν από οτιδήποτε, πρέπει να "συλλάβετε" ένα πρόσωπο (Φάση 1) για να το αναγνωρίσετε, σε σύγκριση με ένα νέο πρόσωπο που έχει αποτυπωθεί στο μέλλον (Φάση 3).

Ο πιο συνηθισμένος τρόπος ανίχνευσης ενός προσώπου (ή οποιουδήποτε αντικειμένου), είναι η χρήση του "ταξινομητή Haar Cascade"

Η Ανίχνευση Αντικειμένων χρησιμοποιώντας ταξινομητές καταρράκτη Haar είναι μια αποτελεσματική μέθοδος ανίχνευσης αντικειμένων που προτάθηκε από τους Paul Viola και Michael Jones στην εργασία τους, "Rapid Object Detection using a Boosted Cascade of Simple Features" το 2001. Είναι μια προσέγγιση που βασίζεται στην μηχανική μάθηση όπου Η λειτουργία καταρράκτη εκπαιδεύεται από πολλές θετικές και αρνητικές εικόνες. Στη συνέχεια χρησιμοποιείται για την ανίχνευση αντικειμένων σε άλλες εικόνες.

Εδώ θα εργαστούμε με την ανίχνευση προσώπου. Αρχικά, ο αλγόριθμος χρειάζεται πολλές θετικές εικόνες (εικόνες προσώπων) και αρνητικές εικόνες (εικόνες χωρίς πρόσωπα) για να εκπαιδεύσει τον ταξινομητή. Στη συνέχεια, πρέπει να εξαγάγουμε χαρακτηριστικά από αυτό. Τα καλά νέα είναι ότι το OpenCV συνοδεύεται από εκπαιδευτή καθώς και ανιχνευτή. Εάν θέλετε να εκπαιδεύσετε τον δικό σας ταξινομητή για οποιοδήποτε αντικείμενο όπως αυτοκίνητο, αεροπλάνα κλπ. Μπορείτε να χρησιμοποιήσετε το OpenCV για να δημιουργήσετε ένα. Οι πλήρεις λεπτομέρειες του δίνονται εδώ: Cascade Classifier Training.

Εάν δεν θέλετε να δημιουργήσετε τον δικό σας ταξινομητή, το OpenCV περιέχει ήδη πολλούς προ-εκπαιδευμένους ταξινομητές για πρόσωπο, μάτια, χαμόγελο κ.λπ. Αυτά τα αρχεία XML μπορούν να ληφθούν από τον κατάλογο haarcascades.

Αρκετή θεωρία, ας δημιουργήσουμε έναν ανιχνευτή προσώπου με OpenCV!

Κατεβάστε το αρχείο: faceDetection.py από το GitHub μου.

εισαγωγή numpy ως np

import cv2 faceCascade = cv2. CascadeClassifier ('Cascades/haarcascade_frontalface_default.xml') cap = cv2. VideoCapture (0) cap.set (3, 640) # set Width cap.set (4, 480) # set ightψος ενώ True: ret, img = cap.read () img = cv2.flip (img, -1) γκρι = cv2.cvtColor (img, cv2. COLOR_BGR2GRAY) πρόσωπα = faceCascade.detectMultiScale (γκρι, scaleFactor = 1,2, minNeighbors = 5, minSize = (20, 20)) για (x, y, w, h) σε όψεις: cv2. Ορθογώνιο (img, (x, y), (x+w, y+h), (255, 0, 0), 2) roi_gray = γκρι [y: y+h, x: x+w] roi_color = img [y: y+h, x: x+w] cv2.imshow ('βίντεο', img) k = cv2.waitKey (30) & 0xff αν k == 27: # πατήστε 'ESC' για να κλείσετε το cap cap.release () cv2.destroyAllWindows ()

Είτε το πιστεύετε είτε όχι, οι παραπάνω λίγες γραμμές κώδικα είναι ό, τι χρειάζεστε για να εντοπίσετε ένα πρόσωπο, χρησιμοποιώντας Python και OpenCV.

Όταν συγκρίνετε με τον τελευταίο κωδικό που χρησιμοποιήθηκε για τη δοκιμή της κάμερας, θα συνειδητοποιήσετε ότι λίγα μέρη προστέθηκαν σε αυτήν. Σημειώστε την παρακάτω γραμμή:

faceCascade = cv2. CascadeClassifier ('Cascades/haarcascade_frontalface_default.xml')

Αυτή είναι η γραμμή που φορτώνει τον "ταξινομητή" (που πρέπει να βρίσκεται σε έναν κατάλογο με το όνομα "Cascades/", κάτω από τον κατάλογο του έργου σας).

Στη συνέχεια, θα ρυθμίσουμε την κάμερά μας και μέσα στον βρόχο, θα φορτώσουμε το βίντεο εισόδου μας σε κατάσταση κλίμακας του γκρι (το ίδιο είδαμε και πριν).

Τώρα πρέπει να καλέσουμε τη συνάρτηση ταξινόμησης, μεταφέροντάς της ορισμένες πολύ σημαντικές παραμέτρους, ως συντελεστή κλίμακας, αριθμό γειτόνων και ελάχιστο μέγεθος της ανιχνευόμενης όψης.

πρόσωπα = faceCascade.detectMultiScale (γκρι, scaleFactor = 1,2, min Γείτονες = 5, minSize = (20, 20))

Οπου,

  • γκρι είναι η εικόνα κλίμακας του γκρι εισόδου.
  • scaleFactor είναι η παράμετρος που καθορίζει πόσο μειώνεται το μέγεθος της εικόνας σε κάθε κλίμακα εικόνας. Χρησιμοποιείται για τη δημιουργία της πυραμίδας κλίμακας.
  • Το minNeighbors είναι μια παράμετρος που καθορίζει πόσους γείτονες πρέπει να έχει κάθε υποψήφιο ορθογώνιο, για να το διατηρήσει. Ένας υψηλότερος αριθμός δίνει χαμηλότερα ψευδώς θετικά.
  • minSize είναι το ελάχιστο μέγεθος ορθογωνίου που πρέπει να θεωρείται πρόσωπο.

Η λειτουργία εντοπίζει πρόσωπα στην εικόνα. Στη συνέχεια, πρέπει να "σημειώσουμε" τα πρόσωπα στην εικόνα, χρησιμοποιώντας, για παράδειγμα, ένα μπλε ορθογώνιο. Αυτό γίνεται με αυτό το τμήμα του κώδικα:

για (x, y, w, h) στα πρόσωπα:

cv2. ορθογώνιο (img, (x, y), (x+w, y+h), (255, 0, 0), 2) roi_gray = γκρι [y: y+h, x: x+w] roi_color = img [y: y+h, x: x+w]

Αν βρεθούν όψεις, επιστρέφει τις θέσεις των ανιχνευόμενων όψεων ως ορθογώνιο με την αριστερή επάνω γωνία (x, y) και έχοντας "w" ως πλάτος και "h" ως ύψος ==> (x, y, w, η) Παρακαλώ δείτε την παραπάνω εικόνα.

Μόλις λάβουμε αυτές τις τοποθεσίες, μπορούμε να δημιουργήσουμε ένα "ROI" (σχεδιάζεται ορθογώνιο) για το πρόσωπο και να παρουσιάσουμε το αποτέλεσμα με τη λειτουργία imshow ().

Εκτελέστε το παραπάνω Python Script στο περιβάλλον python σας, χρησιμοποιώντας το τερματικό Rpi:

python faceDetection.py

Το αποτέλεσμα:

Εικόνα
Εικόνα

Μπορείτε επίσης να συμπεριλάβετε ταξινομητές για "ανίχνευση ματιών" ή ακόμα και "ανίχνευση χαμόγελου". Σε αυτές τις περιπτώσεις, θα συμπεριλάβετε τη λειτουργία ταξινόμησης και την ορθογώνια σχεδίαση μέσα στο βρόχο του προσώπου, διότι δεν θα είχε νόημα να εντοπίσετε ένα μάτι ή ένα χαμόγελο έξω από το πρόσωπο.

Σημειώστε ότι σε ένα Pi, η ύπαρξη πολλών ταξινομητών στον ίδιο κώδικα θα επιβραδύνει την επεξεργασία, μόλις αυτή η μέθοδος ανίχνευσης (HaarCascades) χρησιμοποιήσει μεγάλη υπολογιστική ισχύ. Σε έναν επιτραπέζιο υπολογιστή, είναι ευκολότερο να το εκτελέσετε.

Στο GitHub μου θα βρείτε άλλα παραδείγματα:

faceEyeDetection.py

faceSmileDetection.py

faceSmileEyeDetection.py

Και στην παραπάνω εικόνα, μπορείτε να δείτε το αποτέλεσμα.

Μπορείτε επίσης να ακολουθήσετε το παρακάτω σεμινάριο για να κατανοήσετε καλύτερα την Ανίχνευση Προσώπου:

Haar Cascade Object Detection Face & Eye OpenCV Python Tutorial

Βήμα 5: Συγκέντρωση δεδομένων

Συλλογή πληροφοριών
Συλλογή πληροφοριών
Συλλογή πληροφοριών
Συλλογή πληροφοριών

Πρώτα απ 'όλα, πρέπει να ευχαριστήσω τον Ramiz Raja για το υπέροχο έργο του στην αναγνώριση προσώπου στις φωτογραφίες:

ΑΝΑΓΝΩΡΙΣΗ ΠΡΟΣΩΠΟΥ ΧΡΗΣΗ OPENCV ΚΑΙ PYTHON: A BEGINNER’S GUIDE

και επίσης Anirban Kar, που ανέπτυξε ένα πολύ περιεκτικό σεμινάριο χρησιμοποιώντας βίντεο:

ΑΝΑΓΝΩΡΙΣΗ ΠΡΟΣΩΠΟΥ - 3 μέρη

Σας συνιστώ πραγματικά να ρίξετε μια ματιά και στα δύο μαθήματα.

Λέγοντας αυτό, ας ξεκινήσουμε την πρώτη φάση του έργου μας. Αυτό που θα κάνουμε εδώ, ξεκινά από το τελευταίο βήμα (Face Detecting), απλά θα δημιουργήσουμε ένα σύνολο δεδομένων, όπου θα αποθηκεύσουμε για κάθε αναγνωριστικό, μια ομάδα φωτογραφιών σε γκρι χρώμα με το τμήμα που χρησιμοποιήθηκε για την ανίχνευση προσώπου.

Αρχικά, δημιουργήστε έναν κατάλογο στον οποίο αναπτύσσετε το έργο σας, για παράδειγμα, FacialRecognitionProject:

mkdir ΠρόσωποΑναγνώρισηςΠροβολή

Σε αυτόν τον κατάλογο, εκτός από τα 3 σενάρια python που θα δημιουργήσουμε για το έργο μας, πρέπει να έχουμε αποθηκεύσει σε αυτό το Facial Classifier. Μπορείτε να το κατεβάσετε από το GitHub μου: haarcascade_frontalface_default.xml

Στη συνέχεια, δημιουργήστε έναν υποκατάλογο όπου θα αποθηκεύσουμε τα δείγματα του προσώπου μας και θα το ονομάσουμε "σύνολο δεδομένων":

σύνολο δεδομένων mkdir

Και κατεβάστε τον κώδικα από το GitHub μου: 01_face_dataset.py

εισαγωγή cv2

import os cam = cv2. VideoCapture (0) cam.set (3, 640) # set video width cam.set (4, 480) # set video height face_detector = cv2. CascadeClassifier ('haarcascade_frontalface_default.xml') # Για κάθε άτομο, εισαγάγετε ένα αριθμητικό αναγνωριστικό προσώπου face_id = είσοδο ('\ n εισαγωγή αναγνωριστικού χρήστη τέλος ==>') εκτύπωση ("\ n [ΠΛΗΡΟΦΟΡΙΕΣ] Αρχικοποίηση λήψης προσώπου. Κοιτάξτε την κάμερα και περιμένετε …") # Αρχικοποίηση αρίθμησης ατομικού αριθμού δειγματοληψίας = 0 while (True): ret, img = cam.read () img = cv2.flip (img, -1) # αναστροφή εικόνας βίντεο κάθετα γκρι = cv2.cvtColor (img, cv2. COLOR_BGR2GRAY) πρόσωπα = face_detector.detectMultiScale (γκρι, 1,3, 5) για (x, y, w, h) στις όψεις: cv2. ορθογώνιο (img, (x, y), (x+w, y+h), (255, 0, 0), 2) count + = 1 # Αποθηκεύστε τη λήψη της εικόνας στο φάκελο συνόλων δεδομένων cv2.imwrite ("dataset/User." + str (face_id) + '.' + str (count) + ".jpg", γκρι [y: y + h, x: x+w]) cv2.imshow ('image', img) k = cv2.waitKey (100) & 0xff # Πατήστε 'ESC' για έξοδο από το βίντεο εάν k == 27: break elif count> = 30: # Πάρτε δείγμα 30 προσώπων και σταματήστε το διάλειμμα βίντεο # Do ab εκτύπωση εκκαθάρισης ("\ n [INFO] Έξοδος από το πρόγραμμα και πράγματα καθαρισμού") cam.release () cv2.destroyAllWindows ()

Ο κώδικας είναι πολύ παρόμοιος με τον κώδικα που είδαμε για την ανίχνευση προσώπου. Αυτό που προσθέσαμε, ήταν μια "εντολή εισόδου" για να συλλάβει ένα αναγνωριστικό χρήστη, που πρέπει να είναι ένας ακέραιος αριθμός (1, 2, 3, κλπ)

face_id = είσοδος ('\ n εισαγάγετε το τελικό αναγνωριστικό χρήστη πατήστε ==>')

Και για κάθε ένα από τα καταγεγραμμένα πλαίσια, θα πρέπει να το αποθηκεύσουμε ως αρχείο σε έναν κατάλογο "σύνολο δεδομένων":

cv2.imwrite ("dataset/User." + str (face_id) + '.' + str (count) + ".jpg", γκρι [y: y + h, x: x + w])

Σημειώστε ότι για την αποθήκευση του παραπάνω αρχείου, πρέπει να έχετε εισαγάγει τη βιβλιοθήκη "os". Το όνομα κάθε αρχείου θα ακολουθεί τη δομή:

User.face_id.count.jpg

Για παράδειγμα, για έναν χρήστη με face_id = 1, το 4ο δείγμα αρχείου σε σύνολο δεδομένων/ κατάλογο θα είναι κάτι σαν:

User.1.4.jpg

όπως φαίνεται στην παραπάνω φωτογραφία από το Pi μου. Στον κωδικό μου, καταγράφω 30 δείγματα από κάθε αναγνωριστικό. Μπορείτε να το αλλάξετε στο τελευταίο "elif". Ο αριθμός των δειγμάτων χρησιμοποιείται για να σπάσει ο βρόχος όπου συλλαμβάνονται τα δείγματα προσώπου.

Εκτελέστε το σενάριο Python και τραβήξτε μερικά Ids. Πρέπει να εκτελείτε το σενάριο κάθε φορά που θέλετε να συγκεντρώσετε έναν νέο χρήστη (ή να αλλάξετε τις φωτογραφίες για έναν ήδη υπάρχοντα).

Βήμα 6: Εκπαιδευτής

Προπονητής
Προπονητής

Σε αυτή τη δεύτερη φάση, πρέπει να πάρουμε όλα τα δεδομένα χρήστη από το σύνολο δεδομένων μας και να «εκπαιδεύσουμε» τον Αναγνωριστή OpenCV. Αυτό γίνεται απευθείας από μια συγκεκριμένη λειτουργία OpenCV. Το αποτέλεσμα θα είναι ένα αρχείο.yml που θα αποθηκευτεί σε έναν κατάλογο "trainer/".

Ας ξεκινήσουμε λοιπόν να δημιουργούμε έναν υποκατάλογο όπου θα αποθηκεύσουμε τα εκπαιδευμένα δεδομένα:

mkdir εκπαιδευτής

Κατεβάστε από το GitHub το δεύτερο σενάριο python: 02_face_training.py

εισαγωγή cv2

import numpy as np from PIL import Image import os # Path for face image path path = 'dataset' αναγνώριση = cv2.face. LBPHFaceRecognizer_create () detector = cv2. CascadeClassifier ("haarcascade_frontalface_default.xml"); # λειτουργία για λήψη εικόνων και ετικετών def getImagesAndLabels (path): imagePaths = [os.path.join (path, f) for f in os.listdir (path)] faceSamples = ids = for imagePath in imagePaths: PIL_img = Image.open (imagePath).convert ('L') # μετατρέψτε το σε κλίμακα του γκρι img_numpy = np.array (PIL_img, 'uint8') id = int (os.path.split (imagePath) [-1]. split (".") [1]) face = detector.detectMultiScale (img_numpy) για (x, y, w, h) στα πρόσωπα: faceSamples.append (img_numpy [y: y+h, x: x+w]) ids.append (id) return faceSamples, ids print ("\ n [ΠΛΗΡΟΦΟΡΙΕΣ] Εκπαιδευτικά πρόσωπα. Θα διαρκέσει λίγα δευτερόλεπτα. Περιμένετε …") πρόσωπα, ids = getImagesAndLabels (διαδρομή) αναγνωριστικό. εκπαίδευση (πρόσωπα, np.array (ids)) # Αποθηκεύστε το μοντέλο σε trainer/trainer.yml αναγνωριστικό.write ('trainer/trainer.yml') # αναγνωριστικό.αποθήκευση () σε Mac, αλλά όχι σε Pi # Εκτύπωση του αριθμού των προσώπων που έχουν εκπαιδευτεί και τερματισμός εκτύπωσης προγράμματος ("\ n [INFO] {0} εκπαιδεύονται πρόσωπα. Έξοδος από το πρόγραμμα".format (len (np.unique (id))))

Επιβεβαιώστε εάν έχετε εγκαταστήσει τη βιβλιοθήκη PIL στο Rpi σας. Εάν όχι, εκτελέστε την παρακάτω εντολή στο τερματικό:

μαξιλάρι εγκατάστασης pip

Θα χρησιμοποιήσουμε ως αναγνωριστικό, τον αναγνωριστή προσώπου LBPH (LOCAL BINARY PATTERNS HISTOGRAMS), που περιλαμβάνεται στο πακέτο OpenCV. Το κάνουμε αυτό στην ακόλουθη γραμμή:

αναγνωριστής = cv2.face. LBPHFaceRecognizer_create ()

Η συνάρτηση "getImagesAndLabels (διαδρομή)", θα τραβήξει όλες τις φωτογραφίες στον κατάλογο: "dataset/", επιστρέφοντας 2 πίνακες: "Ids" και "face". Με αυτούς τους πίνακες ως είσοδο, θα "εκπαιδεύσουμε τον αναγνωριστή μας":

αναγνωριστικό τρένο (πρόσωπα, αναγνωριστικά)

Ως αποτέλεσμα, ένα αρχείο με το όνομα "trainer.yml" θα αποθηκευτεί στον κατάλογο εκπαιδευτών που δημιουργήθηκε προηγουμένως από εμάς.

Αυτό είναι! Συμπεριέλαβα την τελευταία δήλωση εκτύπωσης όπου εμφανίστηκα για επιβεβαίωση, τον αριθμό των προσώπων του χρήστη που έχουμε εκπαιδεύσει.

Κάθε φορά που εκτελείτε τη Φάση 1, η Φάση 2 πρέπει επίσης να εκτελείται

Βήμα 7: Αναγνωριστής

Αναγνωρίζων
Αναγνωρίζων
Αναγνωρίζων
Αναγνωρίζων

Τώρα, φτάσαμε στην τελική φάση του έργου μας. Εδώ, θα τραβήξουμε ένα νέο πρόσωπο στην κάμερά μας και αν αυτό το άτομο είχε τραβήξει και εκπαιδεύσει το πρόσωπό του στο παρελθόν, ο αναγνωριστής μας θα κάνει μια "πρόβλεψη" επιστρέφοντας το αναγνωριστικό του και ένα ευρετήριο, που δείχνει πόσο σίγουρος είναι ο αναγνωριστής σε αυτό το ματς.

Ας κατεβάσουμε το σενάριο python τρίτης φάσης από το GitHub μου: 03_face_recognition.py.

εισαγωγή cv2

import numpy as np import os αναγνωριστικό = cv2.face. LBPHFaceRecognizer_create () αναγνωριστικό. (('trainer/trainer.yml') cascadePath = "haarcascade_frontalface_default.xml" faceCascade = cv2. CascadeClassifier (cascadePath); font = cv2. FONT_HERSHEY_SIMPLEX #iniciate id counter id = 0 # names related to ids: example ==> Marcelo: id = 1, etc names = ['None', 'Marcelo', 'Paula', 'Ilza', 'Z ',' W '] # Αρχικοποίηση και εκκίνηση κάμερας λήψης βίντεο σε πραγματικό χρόνο = cv2. VideoCapture (0) cam.set (3, 640) # set video widht cam.set (4, 480) # set ύψος βίντεο # Ορισμός ελάχιστου μεγέθους παραθύρου να αναγνωριστεί ως πρόσωπο minW = 0.1*cam.get (3) minH = 0.1*cam.get (4) ενώ True: ret, img = cam.read () img = cv2.flip (img, -1) # Αναστροφή κάθετα γκρι = cv2.cvtColor (img, cv2. COLOR_BGR2GRAY) πρόσωπα = faceCascade.detectMultiScale (γκρι, scaleFactor = 1,2, minNeighbours = 5, minSize = (int (minW), int (minH)),) για (x, y, w, h) σε όψεις: cv2. ορθογώνιο (img, (x, y), (x+w, y+h), (0, 255, 0), 2) id, εμπιστοσύνη = αναγνωριστής. πρόβλεψη (γκρι [y: y+h, x: x+w]) # Ελέγξτε αν η εμπιστοσύνη είναι μικρότερη από αυτές 100 ==> "0" ταιριάζει απόλυτα εάν (εμπιστοσύνη <100): id = ονόματα [id] εμπιστοσύνη = "{0}% ".format (γύρος (100 - εμπιστοσύνη)) άλλο: id =" άγνωστο "trust =" {0}%". format (round (100 - conf ταυτότητα)) cv2.putText (img, str (id), (x+5, y-5), γραμματοσειρά, 1, (255, 255, 255), 2) cv2.putText (img, str (εμπιστοσύνη), (x+5, y+h-5), γραμματοσειρά, 1, (255, 255, 0), 1) cv2.imshow ('camera', img) k = cv2.waitKey (10) & 0xff # Πατήστε 'ESC' για έξοδο από βίντεο εάν k == 27: διάλειμμα # Κάντε μια εκτύπωση εκκαθάρισης ("\ n [ΠΛΗΡΟΦΟΡΙΕΣ] Έξοδος από το πρόγραμμα και πράγματα καθαρισμού") cam.release () cv2.destroyAllWindows ()

Συμπεριλαμβάνουμε εδώ έναν νέο πίνακα, οπότε θα εμφανίσουμε "ονόματα", αντί για αριθμημένα αναγνωριστικά:

ονόματα = ['Καμία', 'Marcelo', 'Paula', 'Ilza', 'Z', 'W']

Έτσι, για παράδειγμα: Marcelo θα ο χρήστης με id = 1? Paula: id = 2, κ.λπ.

Στη συνέχεια, θα εντοπίσουμε ένα πρόσωπο, όπως κάναμε πριν με τον ταξινομητή haasCascade. Έχοντας ένα ανιχνευμένο πρόσωπο, μπορούμε να καλέσουμε τη σημαντικότερη συνάρτηση στον παραπάνω κώδικα:

αναγνωριστικό, εμπιστοσύνη = αναγνωριστής. πρόβλεψη (γκρι τμήμα του προσώπου)

Το αναγνωριστικό.predict (), θα λάβει ως παράμετρο ένα αποτυπωμένο τμήμα του προσώπου που θα αναλυθεί και θα επιστρέψει τον πιθανό κάτοχό του, υποδεικνύοντας το αναγνωριστικό του και την εμπιστοσύνη του αναγνωριστή σε αυτό το ταίριασμα.

Σημειώστε ότι ο δείκτης εμπιστοσύνης θα επιστρέψει "μηδέν" εάν θεωρηθεί ότι είναι τέλεια

Και τελικά, εάν ο αναγνωριστής μπορούσε να προβλέψει ένα πρόσωπο, βάζουμε ένα κείμενο πάνω στην εικόνα με το πιθανό αναγνωριστικό και πόσο είναι η "πιθανότητα" σε % ότι η αντιστοίχιση είναι σωστή ("πιθανότητα" = 100 - δείκτης εμπιστοσύνης). Εάν όχι, τοποθετείται μια ετικέτα "άγνωστη" στο πρόσωπο.

Παρακάτω ένα-g.webp

Εικόνα
Εικόνα

Στην παραπάνω εικόνα, παρουσιάζω κάποιες δοκιμές που έγιναν με αυτό το έργο, όπου επίσης έχω χρησιμοποιήσει φωτογραφίες για να επαληθεύσω εάν λειτουργεί το αναγνωριστικό.

Βήμα 8: Συμπέρασμα

συμπέρασμα
συμπέρασμα

Όπως πάντα, ελπίζω ότι αυτό το έργο μπορεί να βοηθήσει άλλους να βρουν τον δρόμο τους στον συναρπαστικό κόσμο των ηλεκτρονικών!

Για λεπτομέρειες και τελικό κωδικό, επισκεφθείτε το θεματοφύλακά μου στο GitHub: OpenCV-Face-Recognition

Για περισσότερα έργα, επισκεφθείτε το ιστολόγιό μου: MJRoBot.org

Παρακάτω μια ματιά σε ένα μελλοντικό σεμινάριο, όπου θα διερευνήσουμε την "αυτόματη παρακολούθηση προσώπου και άλλες μεθόδους για την ανίχνευση προσώπου":

Εικόνα
Εικόνα

Saludos από τον νότο του κόσμου!

Τα λέμε στο επόμενο διδακτικό μου!

Σας ευχαριστώ, Μαρσέλο

Συνιστάται: