👨 Reconocimiento facial para varias personas a la vez 👩 | Python – OpenCV – Face Recognition

Por Administrador

En el anterior post vimos como aplicar RECONOCIMIENTO FACIAL para identificar a una persona, en este tutorial, en cambio, podremos identificar varias personas a la vez. ✨ ¡Anímate a probarlo!.

CONTENIDO

Reconocimiento facial para varias personas a la vez

  • Instalación de requerimientos
  • ¡Vamos con la programación!
  • Referencias

Reconocimiento facial para varias personas a la vez

En el anterior tutorial aplicamos reconocimiento facial para reconocer a una persona. En esta ocasión veremos como aplicar Face Recognition para identificar a varias personas a la vez. Para ello necesitaremos un conjunto de imágenes de los rostros que deseemos identificar, codificarlos, para luego compararlos y determinar de qué personas se trata.

Instalación de requerimientos

A continuación procedemos a usar pip para la instalación de los módulos que necesitamos.

pip install face-recognition
pip install opencv-contrib-python

Si digitamos pip freeze podremos ver todos los paquetes instalados.

Figura 1: Lista de los módulos instalados.

Face Recognition usa entre sus requerimientos DLIB, por lo que si estás en Windows y llegas a obtener un error al querer instalarlo, puedes ir al siguiente tutorial para resolverlo: ⚙️Como instalar DLIB en Windows | Python.

¡Vamos con la programación!

Para una explicación más detallada de los programas que veremos a continuación, por favor dirígete al video que he preparado en mi canal, en donde explico paso a pasito cada procedimiento efectuado. ¡Anímate a verlo 😉!.

A continuación tenemos el programa extracting_faces.py que se usó para extraer los rostros de varias personas en distintas imágenes:

import cv2
import os

imagesPath = "C:/Users/Desktop/faceRecognition2/images/input_images"

if not os.path.exists("faces"):
     os.makedirs("faces")
     print("Nueva carpeta: faces")

# Detector facial
faceClassif = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_default.xml")

count = 0
for imageName in os.listdir(imagesPath):
     print(imageName)
     image = cv2.imread(imagesPath + "/" + imageName)
     faces = faceClassif.detectMultiScale(image, 1.1, 5)
     for (x, y, w, h) in faces:
          #cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)
          face = image[y:y + h, x:x + w]
          face = cv2.resize(face, (150, 150))
          cv2.imwrite("faces/" + str(count) + ".jpg", face)
          count += 1
          #cv2.imshow("face", face)
          #cv2.waitKey(0)

     #cv2.imshow("Image", image)
     #cv2.waitKey(0)
#cv2.destroyAllWindows()

Ahora tenemos el programa f_recognition.py que nos ayudará a llevar a cabo el reconocimiento facial mediante la comparación de rostros codificados:

import cv2
import os
import face_recognition

# Codificar los rostros extraidos
imageFacesPath = "C:/Users/Desktop/faceRecognition2/images/faces"

facesEncodings = []
facesNames = []
for file_name in os.listdir(imageFacesPath):
     image = cv2.imread(imageFacesPath + "/" + file_name)
     image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

     f_coding = face_recognition.face_encodings(image, known_face_locations=[(0, 150, 150, 0)])[0]
     facesEncodings.append(f_coding)
     facesNames.append(file_name.split(".")[0])

#print(facesEncodings)
#print(facesNames)

##############################################
# LEYENDO VIDEO
cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)

# Detector facial
faceClassif = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_default.xml")

while True:
     ret, frame = cap.read()
     if ret == False:
          break
     frame = cv2.flip(frame, 1)
     orig = frame.copy()
     faces = faceClassif.detectMultiScale(frame, 1.1, 5)

     for (x, y, w, h) in faces:
          face = orig[y:y + h, x:x + w]
          face = cv2.cvtColor(face, cv2.COLOR_BGR2RGB)
          actual_face_encoding = face_recognition.face_encodings(face, known_face_locations=[(0, w, h, 0)])[0]
          result = face_recognition.compare_faces(facesEncodings, actual_face_encoding)
          #print(result)
          if True in result:
               index = result.index(True)
               name = facesNames[index]
               color = (125, 220, 0)
          else:
               name = "Desconocido"
               color = (50, 50, 255)

          cv2.rectangle(frame, (x, y + h), (x + w, y + h + 30), color, -1)
          cv2.rectangle(frame, (x, y), (x + w, y + h), color, 2)
          cv2.putText(frame, name, (x, y + h + 25), 2, 1, (255, 255, 255), 2, cv2.LINE_AA)

     cv2.imshow("Frame", frame)
     k = cv2.waitKey(1) & 0xFF
     if k == 27:
          break

cap.release()
cv2.destroyAllWindows()

En el videotutorial se pueden apreciar los resultados obtenidos del reconocimiento facial con un video en vivo, como vemos a continuación:

Figura 2: Reconocimiento de varias personas en una misma imagen o fotograma.

Y bien, esto ha sido todo por el tutorial de hoy. ¡Espero que te haya gustado! 😊 Nos vemos en el siguiente… ¡Qué te vaya súper bien!.

Referencias

🎥 Video detección facial: https://youtu.be/J1jlm-I1cTs
📃 Documentación Face recognition: https://github.com/ageitgey/face_recognition

Imágenes/videos usadas en el video:
📎 https://www.pexels.com/es-es/foto/foto-de-personas-abrazandose-3228749/
📎 https://www.pexels.com/es-es/video/grupo-de-amigos-sonriendo-3248275/