Απλή Ζωή

Ανίχνευση ορόσημων προσώπου με χρήση της βιβλιοθήκης Mediapipe

Αυτό το άρθρο δημοσιεύτηκε ως μέρος του Data Science Blogathon.

ΣΦΑΙΡΙΚΗ ΕΙΚΟΝΑ

Έτσι έχουμε συνεργαστεί στο παρελθόν ανίχνευση προσώπου χρησιμοποιώντας τη βιβλιοθήκη Mediapipe μόνο αλλά υπήρχε πρόβλημα με τον εντοπισμό των σημείων ορόσημων καθώς δεν ήταν τόσο ξεκάθαρα όταν οπτικοποιούσαμε τα άλλα στοιχεία του προσώπου π.χ. τα κύρια σημεία-κλειδιά του προσώπου σε διαφορετικές γωνίες έτσι για να αντιμετωπίσουμε αυτό το πρόβλημα μόνο έχουμε την εναλλακτική μέθοδο που είναι να εντοπίστε όλα τα ορόσηματα συνολικά σημεία ορόσημα είναι 468.

Εφαρμογή του Face Mesh σε πραγματικό κόσμο

  1. Iris detection: Αυτή η εφαρμογή μπορεί να είναι πολύ χρήσιμη στην υγειονομική περίθαλψη και για απλότητα σε αυτό το άρθρο θα είμαστε εστιάζοντας κυρίως στην ανίχνευση οφθαλμικών ορόσημων.
  2. Snapchat's filters: Έτσι έχουμε δει συχνά ένα φίλτρο που δρα όποτε εμείς αλλάξουμε τις στιγμές του προσώπου μας Έτσι πίσω από αυτόν τον αγωγό υπάρχει μια διαδικασία που είναι γνωστή ως ανίχνευση σημείων προσώπου.
  3. Drowsiness detection: Αυτή η εφαρμογή μπορεί να είναι πολύ χρήσιμη για την ανίχνευση υπνηλίας από τον οδηγό ανίχνευση βλεφαρίδων και ανίχνευση χασμουρητού.

Βήματα που εμπλέκονται στη δημιουργία εφαρμογής ανίχνευσης ορόσημων προσώπου

  1. Εισαγωγή όλων των βασικών βιβλιοθηκών
  2. Διαβάζοντας ένα δείγμα εικόνας
  3. Εκτέλεση ανίχνευσης ορόσημων προσώπου και εκτύπωση του αποτελέσματος
  4. Σχεδιάζοντας τα αποτελέσματα στο δείγμα εικόνας

Ας δημιουργήσουμε, λοιπόν, την εφαρμογή face mesh χρησιμοποιώντας Mediapipe.

Εισαγάγετε τις Βιβλιοθήκες

Ας ξεκινήσουμε εισάγοντας τις απαιτούμενες βιβλιοθήκες.

import cv2
import itertools
import numpy as np
from time import time
import mediapipe as mp
import matplotlib.pyplot as plt

Τώρα, θα πρέπει πρώτα να αρχικοποιήσουμε το μοντέλο ανίχνευσης σημείων ορόσημων προσώπου χρησιμοποιώντας το Mediapipe.

Επομένως, εάν έχετε διαβάσει τα προηγούμενα άρθρα μου σχετικά με το Mediapipe, τότε πρέπει να έχετε αντιμετωπίσει ότι το πρώτο βήμα που κάνω είναι να αρχικοποιήσω το μοντέλο, επειδή αυτό είναι το υποχρεωτικό βήμα, γι’ αυτό θα κάνουμε την προετοιμασία του το μοντέλο ανίχνευσης ορόσημων προσώπου εδώ πρώτα και για αυτό, θα χρησιμοποιήσουμε το face_mesh μέθοδο της Mediapipe λύσεις τάξη. Στο face_mesh μέθοδο, έχουμε την κύρια λειτουργία μας που θα εκτελέσει την ανίχνευση ορόσημων που είναι FaceMesh() πριν το χρησιμοποιήσουμε, πρέπει πρώτα να κατανοήσουμε τα επιχειρήματά του. ας δούμε λοιπόν αυτό:

  • static_image_mode: Αυτό το επιχείρημα παίρνει μόνο δύο boolean τύπους των τιμών που είναι είτε Σωστό είτε Λάθος. Αν θέσουμε το όρισμα ως Ψευδής τότε θα ανιχνεύσει τα καρέ και όχι με τον τρόπο των εικόνων, π.χ. στη μορφή ροής βίντεο που μπορεί να είναι χρήσιμο όταν θα προσπαθήσουμε να ανιχνεύσουμε τα ορόσημα του προσώπου σε πραγματικό χρόνο, αλλά σε αυτήν την περίπτωση θέλουμε να εντοπίσουμε τα ορόσημα στις εικόνες οπότε για το λόγο αυτό θα χρησιμοποιήσουμε το Αληθής ως παράμετρος. Η προεπιλεγμένη τιμή είναι Ψευδής.
  • max_num_faces: Αυτό το όρισμα θα καθορίσει πόσα πρόσωπα θα πρέπει να ανιχνεύσει το μοντέλο στην εικόνα ή το πλαίσιο σε μια συγκεκριμένη περίπτωση, δηλαδή σε ένα πλαίσιο/εικόνα το μοντέλο μπορεί να ανιχνεύσει περισσότερα από ένα πρόσωπα, χρειάζεται ακέραιος αριθμός τύπος τιμής π.χ αριθμητικός τιμή και η προεπιλεγμένη τιμή είναι 1 (μόνο ένα πρόσωπο πρέπει να ανιχνευθεί).
  • min_detection_confidence: Αυτό το επιχείρημα είναι βασικά για τη ρύθμιση της τιμής κατωφλίου για την εμπιστοσύνη ανίχνευσης του μοντέλου, δηλαδή πόσο σίγουρο είναι το μοντέλο μας ότι στην εικόνα/κάδρο έχει εντοπίσει όλα τα ορόσημα. Το τυπικό εύρος τιμών που παίρνει είναι [0.0,1.0] και η προεπιλεγμένη τιμή είναι 0,5 δηλαδή η εμπιστοσύνη ανίχνευσης έχει ρυθμιστεί σε 50% αυτοπεποίθηση.
  • min_tracking_confidence: Αυτό το επιχείρημα θα αγνοηθεί όταν το static_image_mode η παράμετρος έχει οριστεί σε Αληθής η οποία ισχύει για τις εικόνες, η προεπιλεγμένη τιμή αυτού του ορίσματος είναι 0,5, δηλαδή 50% εμπιστοσύνη παρακολούθησης της εμπιστοσύνης που βελτιώνει επίσης την ευρωστία της διαδικασίας ανίχνευσης.

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

mp_face_mesh = mp.solutions.face_mesh

face_mesh_images = mp_face_mesh.FaceMesh(static_image_mode=True, max_num_faces=2,
                                         min_detection_confidence=0.5)

mp_drawing = mp.solutions.drawing_utils

mp_drawing_styles = mp.solutions.drawing_styles

Ανάλυση κώδικα:

  1. Όπως συζητήθηκε, θα αρχικοποιήσουμε πρώτα το face_mesh τάξη από τη βιβλιοθήκη Mediapipe.
  2. Τότε θα χρησιμοποιήσουμε το FaceMesh λειτουργία με όλα τα σχετικά χαρακτηριστικά που έχουν ήδη συζητηθεί (αυτή είναι για εικόνες).
  3. Έχουμε συζητήσει το σχέδια_στυλ μέθοδο που θα μας έδινε μερικά επιπλέον στυλ σχεδίασης των αποτελεσμάτων στην εικόνα, αν και για την πραγματική υλοποίηση του ίδιου θα χρειαστούμε επίσης παραδοσιακά σχέδια_χρήσης πολύ.

Διαβάστε μια εικόνα

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

sample_img = cv2.imread('media/sample.jpg')

plt.figure(figsize = [10, 10])

plt.title("Sample Image");plt.axis('off');plt.imshow(sample_img[:,:,::-1]);plt.show()

Παραγωγή:

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

Ανάλυση κώδικα

  1. Αρχικά, διαβάσαμε την εικόνα από το συγκεκριμένο μονοπάτι που πρέπει να αναφέρουμε πλήρης διαδρομή μόνο εάν η εικόνα δεν υπάρχει στον ίδιο φάκελο.
  2. Τότε θα χρησιμοποιήσουμε το εικόνα λειτουργία της βιβλιοθήκης matplotlib για να ορίσετε το μέγεθος του σχήματος, π.χ. μέγεθος εικόνας.
  3. Επιτέλους, θα το κάνουμε εμφανίστε την εικόνα στο οποίο θέλουμε να δοκιμάσουμε το μοντέλο ανίχνευσης ορόσημων προσώπου.

Εκτελέστε ανίχνευση ορόσημων προσώπου

Ανίχνευση ορόσημων προσώπου |  gifs

Πηγή: Πλέγμα προσώπου – Mediapipe

Τώρα που έχουμε αρχικοποιήσει το δικό μας πλέγμα προσώπου μοντέλο χρησιμοποιώντας τη βιβλιοθήκη Mediapipe είναι καιρός να εκτελέσει τη βάση ανίχνευσης ορόσημων στην προηγούμενη προεπεξεργασία και με τη βοήθεια FaceMesh's επεξεργάζομαι, διαδικασία συνάρτηση θα πάρουμε το 468 σημεία ορόσημα του προσώπου στην εικόνα.

face_mesh_results = face_mesh_images.process(sample_img[:,:,::-1])

LEFT_EYE_INDEXES = list(set(itertools.chain(*mp_face_mesh.FACEMESH_LEFT_EYE)))
RIGHT_EYE_INDEXES = list(set(itertools.chain(*mp_face_mesh.FACEMESH_RIGHT_EYE)))

if face_mesh_results.multi_face_landmarks:

    for face_no, face_landmarks in enumerate(face_mesh_results.multi_face_landmarks):

        print(f'FACE NUMBER: {face_no+1}')
        print('-----------------------')

        print(f'LEFT EYE LANDMARKS:n')

        for LEFT_EYE_INDEX in LEFT_EYE_INDEXES[:2]:

            print(face_landmarks.landmark[LEFT_EYE_INDEX])

        print(f'RIGHT EYE LANDMARKS:n')

        for RIGHT_EYE_INDEX in RIGHT_EYE_INDEXES[:2]:

            print(face_landmarks.landmark[RIGHT_EYE_INDEX])

Παραγωγή:

Ανάλυση κώδικα

  1. Όπως συζητήθηκε, θα εκτελέσουμε τον εντοπισμό ορόσημων προσώπου χρησιμοποιώντας process τη συνάρτηση, αλλά πριν από αυτό, θα μετατρέψουμε τη μορφή χρώματος της εικόνας από BGR σε RGB.
  2. Τώρα θα αποθηκεύσουμε το αριστερό μάτι και δεξί μάτι συντεταγμένες τιμές σε ξεχωριστές μεταβλητές χρησιμοποιώντας το iter tools αλυσίδα μέθοδος.
  3. Προτού κατευθυνθείτε προς την κύρια λειτουργικότητα, είναι πάντα καλύτερη ιδέα να κάνετε μερικές επικυρώσεις για αυτό θα ελέγξουμε πρώτα αν έχουμε βρει τα πρόσωπα ή όχι.
  4. Έτσι, τώρα μόνο εάν η παραπάνω δήλωση είναι σωστή, τότε μόνο εμείς θα το κάνουμε επαναλαμβάνεται σε όλα τα πρόσωπα ανάλογα με τα επιχειρήματα.
  5. Στη συνέχεια, θα εμφανίσουμε τον αριθμό προσώπου μετά την επιτυχή ανίχνευση όλων των προσώπων.
  6. Προς το παρόν, αναζητούμε τα ορόσημα του το αριστερό μάτι και δεξί μάτι οπότε θα εμφανίσουμε και το όνομά τους.
    • Αρχικά, θα επαναλάβουμε δύο σημεία-ορόσημα του το αριστερό μάτι.
    • Τότε θα κάνουμε το ίδιο για το δεξί μάτι χρησιμοποιώντας για βρόχο.
  7. Στη συνέχεια, τελικά θα εμφανίσουμε τα σημεία ορόσημα, αλλά αυτοί οι δείκτες θα είναι σε κανονικοποιημένη μορφή, έτσι ώστε ο αγωγός ML πίσω από αυτήν την ανίχνευση να μπορεί να δώσει ίση βαρύτητα σε κάθε σημείο.

Σχεδιάζοντας τα αποτελέσματα

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

Πριν προχωρήσουμε με τον κώδικα, ας καταλάβουμε πρώτα τα επιχειρήματα του the draw_landmarks() λειτουργία.

  • image: Αυτό το όρισμα θα πάρει την εικόνα που θα είναι σε μορφή RGB στην οποία πρέπει να σχεδιάσουμε τα ορόσημα.
  • landmarks_list: Αυτή η λίστα θα αποτελείται από όλα τα σημεία ορόσημα αλλά σε κανονικοποιημένη μορφή.
  • connection: Όπως υποδηλώνει το όνομα αυτό το όρισμα θα έχει μια λίστα ορισμάτων που θα μας πει πώς θα συνδεθούν τα σημεία αναφοράς του προσώπου όταν τα σχεδιάσουμε στην εικόνα.
  • landmark_drawing_spec: Αυτό το όρισμα ορίζει το βασικό στοιχείο του σχεδίου, δηλαδή θα επιλέξει το χρώμα, το πάχος των γραμμών και την ακτίνα του κύκλου των ορόσημων που θα σχεδιαστούν στην εικόνα.
  • connection_drawing_spec: Όπως είδαμε στο η σύνδεση επιχείρημα έχουμε τη λίστα με τα ορόσημα που θα συνδέουν άλλα σημεία του προσώπου, επομένως εδώ θα ρυθμίσουμε το ρυθμίσεις σχεδίασης των γραμμών σύνδεσης.
img_copy = sample_img[:,:,::-1].copy()

if face_mesh_results.multi_face_landmarks:

    for face_landmarks in face_mesh_results.multi_face_landmarks:

        mp_drawing.draw_landmarks(image=img_copy, 
                                  landmark_list=face_landmarks,connections=mp_face_mesh.FACEMESH_TESSELATION,
                                  landmark_drawing_spec=None, 
                                  connection_drawing_spec=mp_drawing_styles.get_default_face_mesh_tesselation_style())
        
        mp_drawing.draw_landmarks(image=img_copy, landmark_list=face_landmarks,connections=mp_face_mesh.FACEMESH_CONTOURS,
                                  landmark_drawing_spec=None, 
                                  connection_drawing_spec=mp_drawing_styles.get_default_face_mesh_contours_style())

fig = plt.figure(figsize = [10, 10])
plt.title("Resultant Image");plt.axis('off');plt.imshow(img_copy);plt.show()

Παραγωγή:

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

Ανάλυση κώδικα

  1. Πρώτα θα δημιουργήσουμε ένα αντίγραφο του δείγματος εικόνας μας και θα το μετατρέψουμε σε μορφή RGB γιατί πρέπει να οπτικοποιήσουμε το αποτέλεσμα τώρα.
  2. Στη συνέχεια, η διαδικασία από εδώ φαίνεται να είναι η ίδια καθώς τώρα θα ελέγξουμε πρώτα αν τα πρόσωπα βρέθηκαν ή όχι και μετά θα επαναλάβουμε τα πρόσωπα που βρήκαμε.
  3. Στη συνέχεια θα σχεδιάσουμε τα αποτελέσματα ή τα σημεία ορόσημων στην εικόνα και εδώ θα χρησιμοποιήσουμε την προεπιλεγμένη ρύθμιση π.χ ύφος με πλέγμα προσώπου στο σύνδεση διαφωνία.
  4. Και μετά για την εμφάνιση του περιγράμματα ματιών προσώπου θα χρησιμοποιήσουμε επίσης την ίδια προεπιλεγμένη ρύθμιση.
  5. Επιτέλους, θα ορίσουμε το μέγεθος του σχήματος/εικόνας και στη συνέχεια θα εμφανίσουμε όλα τα αποτελέσματα στην εικόνα.

συμπέρασμα

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

  1. Μπορούμε να ανιχνεύσουμε τα ορόσημα του προσώπου, τότε μπορούμε επίσης να χτίσουμε Φίλτρα που μοιάζουν με Snapchat που ακμάζουν στη βιομηχανία της ψυχαγωγίας.
  2. Επίσης, όχι μόνο εκτυπώσαμε τα αποτελέσματα αλλά είδαμε επίσης πώς να σχεδιάσουμε τα αποτελέσματα χρησιμοποιώντας το συνάρτηση draw_landmarks()..
  3. Το κύριο στοιχείο από το άρθρο είναι ότι εδώ μπορείτε διαχωρίστε όλες τις προκαθορισμένες συναρτήσεις για να μπορέσουμε να μάθουμε σε βάθος διαίσθηση πίσω από αυτούς τους αλγόριθμους.

Σημειώσεις τέλους

Εδώ είναι το ρεπό Σύνδεσμος σε αυτό το άρθρο. Ελπίζω να σας άρεσε το άρθρο μου Ανίχνευση ορόσημων προσώπου με χρήση της βιβλιοθήκης Mediapipe. Εάν έχετε οποιεσδήποτε απόψεις ή ερωτήσεις, σχολιάστε παρακάτω.

Διαβάστε στο AV Blog σχετικά με διάφορες προβλέψεις που χρησιμοποιούν τη Μηχανική Εκμάθηση.

Σχετικά με τον Συγγραφέα

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

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

Related Articles

Leave a Reply

Your email address will not be published. Required fields are marked *

Back to top button