Python | Reconocimiento facial múltiple con dlib

Este artículo tiene como objetivo crear rápidamente un programa de reconocimiento facial de Python para entrenar fácilmente varias imágenes por persona y comenzar a reconocer rostros conocidos en una imagen.

En este artículo, el código utiliza la API de reconocimiento facial de ageitgey para Python. Esta API se crea con los algoritmos de reconocimiento facial de dlib y permite al usuario implementar fácilmente la detección facial, el reconocimiento facial e incluso el seguimiento facial en tiempo real en sus proyectos o desde la línea de comandos.

Instalación de la biblioteca:
al principio, asegúrese de que las bibliotecas requeridas estén instaladas en su computadora.

pip install face_recognition Scikit-learn dlib docopt

Si desea que dlib use CUDA en GPU, asegúrese de que CUDA y cuDNN estén instalados correctamente y luego instale dlib usando pip. Para obtener instrucciones detalladas para la instalación en diferentes plataformas, consulte la Guía de instalación de face_recognition .

Ahora, crea un directorio con las imágenes de entrenamiento para cada persona en el siguiente formato. Asegúrese de tener suficientes imágenes de entrenamiento (al menos 5 para cada persona); de lo contrario , el clasificador de vectores de soporte (SVC) (que se usa en este programa produce resultados sin sentido en conjuntos de datos muy pequeños).

Estructura del archivo:

face_recognize.py
test_image.jpg
train_dir/
    person_1/
        person_1_face-1.jpg
        person_1_face-2.jpg
        .
        .
        person_1_face-n.jpg
    person_2/
        person_2_face-1.jpg
        person_2_face-2.jpg
        .
        .
        person_2_face-n.jpg
    .
    .
    person_n/
        person_n_face-1.jpg
        person_n_face-2.jpg
        .
        .
        person_n_face-n.jpg

Codificación facial:
la API face_recognition genera codificaciones faciales para el rostro que se encuentra en las imágenes. Una codificación facial es básicamente una forma de representar la cara utilizando un conjunto de 128 medidas generadas por computadora. Dos imágenes diferentes de la misma persona tendrían una codificación similar y dos personas diferentes tendrían una codificación totalmente diferente.

Una vez que se generan todas las codificaciones faciales, el Clasificador de vectores de soporte (SVC) con scikit-learn se entrena en las codificaciones faciales junto con sus etiquetas de todas las caras conocidas en el directorio de capacitación. Finalmente, la API detecta todas las caras en la imagen de prueba que proporciona y el SVC entrenado predice todas las caras conocidas en la imagen de prueba.

Código: Para reconocer varias caras.

"""
Usage:
  face_recognize.py -d <train_dir> -i <test_image>
  
Options:
  -h, --help                     Show this help
  -d, --train_dir =<train_dir>   Directory with 
                                 images for training
  -i, --test_image =<test_image> Test image
"""
  
# importing libraries
import face_recognition
import docopt
from sklearn import svm
import os
  
def face_recognize(dir, test):
    # Training the SVC classifier
    # The training data would be all the 
    # face encodings from all the known 
    # images and the labels are their names
    encodings = []
    names = []
  
    # Training directory
    if dir[-1]!='/':
        dir += '/'
    train_dir = os.listdir(dir)
  
    # Loop through each person in the training directory
    for person in train_dir:
        pix = os.listdir(dir + person)
  
        # Loop through each training image for the current person
        for person_img in pix:
            # Get the face encodings for the face in each image file
            face = face_recognition.load_image_file(
                dir + person + "/" + person_img)
            face_bounding_boxes = face_recognition.face_locations(face)
  
            # If training image contains exactly one face
            if len(face_bounding_boxes) == 1:
                face_enc = face_recognition.face_encodings(face)[0]
                # Add face encoding for current image 
                # with corresponding label (name) to the training data
                encodings.append(face_enc)
                names.append(person)
            else:
                print(person + "/" + person_img + " can't be used for training")
  
    # Create and train the SVC classifier
    clf = svm.SVC(gamma ='scale')
    clf.fit(encodings, names)
  
    # Load the test image with unknown faces into a numpy array
    test_image = face_recognition.load_image_file(test)
  
    # Find all the faces in the test image using the default HOG-based model
    face_locations = face_recognition.face_locations(test_image)
    no = len(face_locations)
    print("Number of faces detected: ", no)
  
    # Predict all the faces in the test image using the trained classifier
    print("Found:")
    for i in range(no):
        test_image_enc = face_recognition.face_encodings(test_image)[i]
        name = clf.predict([test_image_enc])
        print(*name)
  
def main():
    args = docopt.docopt(__doc__)
    train_dir = args["--train_dir"]
    test_image = args["--test_image"]
    face_recognize(train_dir, test_image)
  
if __name__=="__main__":
    main()

Cómo ejecutarlo en la terminal:

python face_recognize.py -d train_dir -i test_image.jpg

Producción:
Prueba de imagen y salida

Publicación traducida automáticamente

Artículo escrito por anandbaburajan y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *