Εφαρμογή Face Mesh χρησιμοποιώντας OpenCV και dlib

Κόμβος πηγής: 1246086

Σε αυτό το άρθρο, θα χρησιμοποιήσουμε OpenCV και dlib προς την εξάγουν πρόσωπα από μια δεδομένη εικόνα και μετά θα προσπαθήσουμε να δικτυώστε και τα δύο πρόσωπα. Εν ολίγοις, θα προσπαθήσουμε να συνδυάσουμε τα πρόσωπα από δύο διαφορετικές εικόνες. Θα χρησιμοποιήσουμε ένα προεκπαιδευμένο μοντέλο για να εξαγάγουμε ορόσημα από τα πρόσωπα (Ανίχνευση 68 ορόσημων).

face mesh - Εφαρμογή Face Mesh

Βιομηχανική εφαρμογή εφαρμογής ματιών προσώπου

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

Λογισμικό επαυξημένης πραγματικότητας: Το AR/VR μπορεί επίσης να χρησιμοποιήσει αυτήν τη συγκεκριμένη λειτουργικότητα σε ορισμένες από τις περιπτώσεις χρήσης τους για να το δείξει και να το κάνει πιο δημιουργικό.

εισαγωγή cv2 εισαγωγή numpy ως np εισαγωγή dlib αιτήματα εισαγωγής από το PIL import Image
dlib για την εφαρμογή Face Mesh
1 εικόνα

  1. Εγκαταστήστε το visual studio (τελευταία έκδοση)- ανατρέξτε σε αυτό σύνδεσμος.
  2. Στο visual studio χρειάζεται εγκατάσταση το πακέτο CMake.
  3. Μετά την εγκατάσταση από το Visual studio, πρέπει να το εγκαταστήσουμε ξανά χρησιμοποιώντας – pip εγκατάσταση CMake.
  4. Εδώ έρχεται το τελευταίο μέρος τώρα, πρέπει να εγκαταστήσουμε το dlib από – pip εγκατάσταση dlib.

Κατεβάστε το προεκπαιδευμένο μοντέλο shape_predictor

https://github.com/tzutalin/dlib-android/raw/master/data/shape_predictor_68_face_landmarks.dat

Τώρα θα δημιουργήσουμε μια συνάρτηση για την εξαγωγή του ευρετηρίου από τον πίνακα NumPy.

# Εξαγωγή ευρετηρίου από τον πίνακα def extract_index_nparray(nparray): index = None for num in nparray[0]: index = num break return index

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

# Ανάγνωση εικόνας πηγής url image1 = Image.open(requests.get('https://encrypted-tbn0.gstatic.com/images?q=tbn:AND9GcSx8Pu1tW1uCiZPfj9K1EL6uHxbg3bOKO9XkA&usqp=CAU1 εικόνας ροής =1 εικόνα ροής). .resize((300,300)) image1

Παραγωγή:

εικόνα για εφαρμογή ματιών προσώπου

 

Εδώ θα φορτώσουμε την εικόνα προορισμού μας από το διαδίκτυο χρησιμοποιώντας μια διεύθυνση URL και θα αλλάξουμε το μέγεθός της.

# Ανάγνωση φόρμας εικόνας προορισμού url image2 = Image.open(requests.get('https://encrypted-tbn0.gstatic.com/images?q=tbn:AND9GcTYX1dyl9INRo5cbvDeTILRcZVzfcMsCsE0kg&usqp=CAU', stream2 image =Tru'). .resize((2)) image300,300

Παραγωγή:

αλλαγή μεγέθους προσώπου για την εφαρμογή Mesh

Τώρα θα μετατρέψουμε τις εικόνες μας σε πίνακα NumPy και θα χρησιμοποιήσουμε το cv2 για να τις μετατρέψουμε σε κλίμακα του γκρι. Θα δημιουργήσουμε μια κενή εικόνα ή μάσκα παρόμοια με την εικόνα της πηγής μας με μηδενικά.

# Μετατροπή εικόνας σε πίνακα και μετατροπή τους σε κλίμακα του γκρι img = np.array(image1) img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) mask = np.zeros_like(img_gray) img2 = np.array(2_gray2) img. cvtColor(img2, cv2.COLOR_BGR2GRAY)

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

# Εκκίνηση ανιχνευτή μετωπικού προσώπου και ανιχνευτή πρόβλεψης σχήματος = dlib.get_frontal_face_detector() predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat") ύψος, πλάτος, κανάλια = img2.shape img2_new_face,height(p. np.uint8)

Τριγωνισμός εικόνων για εφαρμογή Face Mesh

Τριγωνισμός εικόνων
2 εικόνα

Πρώτα, πρέπει να περάσουμε την εικόνα στον ανιχνευτή και, στη συνέχεια, αυτό το αντικείμενο θα χρησιμοποιηθεί για την εξαγωγή ορόσημων χρησιμοποιώντας το predictor. Στη συνέχεια, αποθήκευση των εξαγόμενων ορόσημων (x και y) στα ορόσημα (λίστα). Θα κάνουμε δίχτυ το πρόσωπο σε τρίγωνα. Αυτό το βήμα είναι ο πυρήνας της αλλαγής προσώπων μας. Εδώ θα ανταλλάξουμε κάθε τρίγωνο με το αντίστοιχο τρίγωνο της εικόνας προορισμού. Ο τριγωνισμός της εικόνας προορισμού πρέπει να έχει το ίδιο μοτίβο με αυτόν του τριγωνισμού της εικόνας προέλευσης. Αυτό σημαίνει ότι η σύνδεση των συμβόλων σύνδεσης πρέπει να είναι η ίδια. Αφού λοιπόν κάνουμε τον τριγωνισμό της εικόνας προέλευσης, από αυτόν τον τριγωνισμό παίρνουμε τους δείκτες των (x και y) έτσι ώστε να μπορούμε να αντιγράψουμε τον ίδιο τριγωνισμό στην εικόνα προορισμού. Αφού έχουμε τα ευρετήρια των τριγώνων, περνάμε μέσα από αυτά και τριγωνίζουμε την όψη προορισμού.

# Πρόσωπο 1
faces = ανιχνευτής(img_gray) για πρόσωπο σε πρόσωπα: ορόσημα = προγνωστικό (img_gray, πρόσωπο) landmarks_points = [] για n στην περιοχή (0, 68): x = landmarks.part(n).xy = landmarks.part(n) .y landmarks_points.append((x, y)) points = np.array(landmarks_points, np.int32) convexhull = cv2.convexHull(points) cv2.fillConvexPoly(mask, convexhull, 255) face_image_1 = cv. img, μάσκα=μάσκα) # Τριγωνισμός Delaunay rect = cv2.boundingRect(convexhull) subdiv = cv2.Subdiv2D(rect) subdiv.insert(landmarks_points) τρίγωνα = subdiv.getTriangleList() τρίγωνα = np.array(τρίγωνα, dtype=np.int32) ttriangles για δείκτες =] τρίγωνα: pt1 = (t[0], t[1]) pt2 = (t[2], t[3]) pt3 = (t[4], t[5]) index_pt1 = np.where((points = = pt1).all(axis=1)) index_pt1 = extract_index_nparray(index_pt1) index_pt2 = np.where((points == pt2).all(axis=1)) index_pt2 = extract_index_nparray(index_pt2) index_pt3 = np.where(( points == pt3).all(axis=1)) index_pt3 = extract_index_nparray(index_pt3) εάν το index_pt1 δεν είναι None και το index_pt2 δεν είναι None και το index_pt3 δεν είναι None: τρίγωνο = [index_pt1, index_pt2, index_pt3] indexes_triangle.append.

Μοτίβο τριγωνοποίησης – Delaunay Triangulation

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

Το # Πρόσωπο θα αντικατασταθεί επιτυχώς με κυρτή κατάτμηση γάστρας img2_face_mask = np.zeros_like(img2_gray) img2_head_mask = cv2.fillConvexPoly(img2_face_mask, convexhull2, 255) img2_imse_face.

Το πρόσωπο είναι τώρα έτοιμο για αντικατάσταση.

Παίρνουμε λοιπόν το νέο πρόσωπο και την εικόνα προορισμού χωρίς πρόσωπο και τα συνδέουμε μεταξύ τους.

img2_head_noface = cv2.bitwise_and(img2, img2, mask=img2_face_mask) αποτέλεσμα = cv2.add(img2_head_noface, img2_new_face)

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

Στο Opencv έχουμε μια ενσωματωμένη συνάρτηση που ονομάζεται “Απρόσκοπτος κλώνος” που κάνει αυτή τη λειτουργία αυτόματα. Πρέπει να πάρουμε το νέο πρόσωπο (που δημιουργήθηκε στο 6ο βήμα), να πάρουμε την αρχική εικόνα προορισμού και είναι μια μάσκα για να κόψουμε το πρόσωπο, πρέπει να πάρουμε τη μέση του προσώπου.

Δημιουργία του απρόσκοπτου κλώνου δύο προσώπων

(x, y, w, h) = cv2.boundingRect(convexhull2) center_face2 = (int((x + x + w) / 2), int((y + y + h) / 2)) seamlessclone = cv2.seamlessClone (αποτέλεσμα, img2, img2_head_mask, center_face2, cv2.NORMAL_CLONE)

Τέλος, θα οπτικοποιήσουμε την εικόνα εξόδου NumPy μετατρέποντάς την στο αντικείμενο Image του Pillow.

# Μετατροπή πίνακα σε εικόνα Image.fromarray (χωρίς ραφή κλώνος)

Παραγωγή:

Δημιουργία του απρόσκοπτου κλώνου δύο προσώπων

Συμπέρασμα

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

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

Εντάξει, αυτό είναι ένα περιτύλιγμα από την πλευρά μου!

Σημειώσεις

Σας ευχαριστώ που διαβάσατε το άρθρο μου 🙂

Ελπίζω να σας αρέσει αυτή η βήμα προς βήμα εκμάθηση της εφαρμογής Face mesh με χρήση όρασης υπολογιστή. Ας ελπίσουμε ότι στο επόμενο άρθρο θα δουλέψω στην εφαρμογή flask-web μέχρι τότε Ευτυχισμένη μάθηση!

Εδώ είναι το ρεπό σύνδεσμος σε αυτό το άρθρο.

Εδώ μπορείτε να αποκτήσετε πρόσβαση στα άλλα άρθρα μου που δημοσιεύονται στο Analytics Vidhya -Blogathon (σύνδεσμος)

Εάν έχετε κολλήσει κάπου όπου μπορείτε να συνδεθείτε μαζί μου στο LinkedIn, ανατρέξτε σε αυτό σύνδεσμος

Σχετικά με εμένα

Χαιρετίζω όλους, αυτή τη στιγμή δουλεύω in TCS και προηγουμένως εργάστηκα ως Data Science Associate Analyst in Zorba Consulting Ινδία. Μαζί με την εργασία πλήρους απασχόλησης, έχω τεράστιο ενδιαφέρον για τον ίδιο τομέα, π.χ. Επιστήμη Δεδομένων, μαζί με άλλα υποσύνολα Τεχνητής Νοημοσύνης, όπως, Computer Vision, Machine Learning και Deep Learning, μη διστάσετε να συνεργαστείτε μαζί μου σε οποιοδήποτε έργο στους προαναφερθέντες τομείς (LinkedIn).

Πηγές εικόνων

  1. 1 εικόνα: https://th.bing.com/th/id/R.17820239375ad0f8b4088a3d321a72aa?rik=cuc2p43UgbwIoA&riu=http%3a%2f%2fwww.learnopencv.com%2fwp-content%2fuploads%2f2017%2f06%2finstall-dlib-on-windows.jpg&ehk=3TU7GRqxkV7eHDMWY92oO3Gunn3QuNVYoktdQNS0QyM%3d&risl=&pid=ImgRaw&r=0
  2. Εικόνες 2: https://www.researchgate.net/profile/Marcelo-Amaral-2/publication/331984027/figure/download/fig1/AS:[προστασία μέσω email]/The-dual-2-complex-for-the-triangulation-level-1-with-four-tetrahedrons-highlighting-the.ppm

Τα μέσα που εμφανίζονται σε αυτό το άρθρο δεν ανήκουν στο Analytics Vidhya και χρησιμοποιούνται κατά την κρίση του συγγραφέα.

Πηγή: https://www.analyticsvidhya.com/blog/2021/10/face-mesh-application-using-opencv-and-dlib/

Σφραγίδα ώρας:

Περισσότερα από Ανάλυση Vidhya