Visión artificial: Reconocimiento facial

Introducción

En este post desarrollaremos nuestro segundo proyecto de visión artificial y este consiste en el reconocimiento facial mediante el uso principal de 2 bibliotecas: OpenCV y Mediapipe.

La primera es la biblioteca por esencia para aplicaciones de visión artificial, mientras que Mediapipe es un framework multiplataforma que aplica Machine Learning para diversas tareas tales como: face detection, face mesh, object detection, hands detection, etc.

El reconocimiento facial básicamente emplea la detección de rostros para poder identificar a la persona a la cual le pertenece aquel rostro detectado, es decir, los pasos que emplea son 2: Primero tenemos la detección facial y luego el reconocimiento facial.

Para este proyecto únicamente necesitamos nuestra Raspberry Pi y una cámara, así que vamos a ello.

Instalación de Mediapipe

Para lograr la instalación correcta de Mediapipe en nuestra Raspberry Pi 3 o 4 vamos a dirigirnos a este link y seguiremos los pasos indicados para le modelo de Raspberry Pi que tenemos, en este caso la instalación se está realizando en una Raspberry Pi 3B+.

Empezamos descargando FFmpeg (software libre que permite grabar, convertir y hacer streaming de audio y vídeo) y OpenCV (biblioteca libre de visión artificial).

Si desean leer más acerca de Mediapipe y su aplicación en la detección de rostros puede ir a este enlace.

Pasamos a instalar algunos pre-requisitos indicados.

Y ahora si pasamos a instalar mediapipe tomando en cuenta si tenemos una Raspberry Pi 3 o una Raspberry Pi 4. Como mencioné al principio realizaré la instalación en una Raspberry Pi 3B+.

Ahora podemos comprobar que la instalación se realizó de manera correcta, así que accedemos al entorno de Python3 e importamos el paquete mediapipe.

¡A codificar!

"""
 * Detección de rostros con OpenCV y Mediapipe
 * Carlos Andrés Saldaña Amézquita
 * 
 * ▬▬▬▬▬▬▬▬▬ SÍGUEME TODOMAKER ▬▬▬▬▬▬▬▬▬▬
 * Sitio web: https://todomaker.com/
 * Instagram: https://bit.ly/3v1NmXp
 * Facebook: https://bit.ly/34IWbuH
 * YouTube: https://bit.ly/3LJRtx6
"""

#Incluímos las librerías a emplear
import cv2
import mediapipe as mp

#Función de mediapipe para la detección de rostros
mp_face_detection = mp.solutions.face_detection
#Función de mediapipe para la gráfica de un rectángulo y puntos claves
mp_drawing = mp.solutions.drawing_utils

#Declaramos el puerto en el que está conectada nuestra cámara
capture = cv2.VideoCapture(0)

#Condiguración de la detección de rostros
   #min_detection_confidence: Valor mínimo de confianza
with mp_face_detection.FaceDetection(
    min_detection_confidence=0.5) as face_detection:

    #Capturamos la imagen en todo momenot
    while True:
        #True: Inicia captura de imagen
        value, frame = capture.read()
        
        #Si no obtenemos imágenes terminamos la simulación
        if value == False:
            break

        #Aplicamos un espejado al video captado
        frame = cv2.flip(frame, 1)

        #Pasamos de formato BGR a RGB
        frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

        #Guardamos la imagen lista para la detección de rostros     
        results = face_detection.process(frame_rgb)

        #Visualizamos los resultados siempre y cuando no tengamos valores nulos
        if results.detections is not None:
            #Recorremos la lista con todos los rostros detectados
            for detection in results.detections:
                #Graficamos los puntos detectados y rectángulo
                mp_drawing.draw_detection(frame, detection)

        #Mostramos la ventana de captura
        cv2.imshow("Face detection", frame)

        #Detenemos la visualización con la letra 's'
        if cv2.waitKey(1) & 0xFF == ord('s')
            break

#Terminamos la simulación y cerramos ventanas
capture .release()
cv2.destroyAllWindows()

Explicación del código

Empezamos incluyendo 2 librerías claves: OpenCV, enfocada a visión artificial y Mediapipe que, en esta oportunidad, permitirá la detección de rostros.

#Incluímos las librerías a emplear
import cv2
import mediapipe as mp

Luego de esto pasamos a declarar 2 funciones de Mediapipe:

  • mp.solutions.face_detection: Permite la detección de rostros.
  • mp.solutions.drawing_utils: Permite graficar 6 puntos claves del rostro, además de un rectángulo que encierra la cara detectada.
#Función de mediapipe para la detección de rostros
mp_face_detection = mp.solutions.face_detection
#Función de mediapipe para la gráfica de un rectángulo y puntos claves
mp_drawing = mp.solutions.drawing_utils

Declaramos el puerto en el que tenemos conectada nuestra cámara, en esta ocasión se está utilizando una cámara focal con visión nocturna infrarroja.

#Declaramos el puerto en el que está conectada nuestra cámara
capture = cv2.VideoCapture(0)

En esta sección pasamos a la configuración de algunos parámetros para la detección de rostros, tales como:

  • min_detection_confidence: Valor mínimo de confianza para detectar un rostro.

En las siguiente línea empezamos a capturar la imagen de nuestra cámara en todo momento y verificamos si es que estamos recibiendo o no alguna imagen, en caso de obtener una respuesta negativa, cerramos el ciclo y terminamos con la simulación.

El comando capture.read() devuelve dos parámetros: el primero es un valor booleano y el segundo es la imagen captada por nuestra cámara.

with mp_face_detection.FaceDetection(
    min_detection_confidence=0.5) as face_detection:

    #Capturamos la imagen en todo momenot
    while True:
        #True: Inicia captura de imagen
        value, frame = capture.read()
        
        #Si no obtenemos imágenes terminamos la simulación
        if value == False:
            break

En esta parte vamos a aplicar el comando cv2.flip para poder realizar un espejado a la imagen original captada por nuestra cámara, luego pasamos de formato BGR a RGB con el comando cv2.cvtColor y finalmente almacenamos todos los rostros detectados en la variable results.

        #Aplicamos un espejado al video captado
        frame = cv2.flip(frame, 1)

        #Pasamos de formato BGR a RGB
        frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

        #Guardamos la imagen lista para la detección de rostros     
        results = face_detection.process(frame_rgb)

Ahora visualizamos todos los resultados obtenidos que no sean valores nulos, es decir, vamos a visualizar la detección de rostros en todo momento y esto lo haremos con el comando mp_drawing.draw_detection() que se encuentra dentro del ciclo for.

        #Visualizamos los resultados siempre y cuando no tengamos valores nulos
        if results.detections is not None:
            #Recorremos la lista con todos los rostros detectados
            for detection in results.detections:
                #Graficamos los puntos detectados y rectángulo
                mp_drawing.draw_detection(frame, detection)

En esta sección creamos una ventana que contendrá la captura de la cámara, también declaramos una condicional if que permitirá cerrar dicha ventana al presionar la tecla ‘s’.

        #Mostramos la ventana de captura
        cv2.imshow("Face detection", frame)

        #Detenemos la visualización con la letra 's'
        if cv2.waitKey(1) & 0xFF == ord('s')
            break

Finalizamos el código terminando la simulación y cerrando todas las posibles ventanas que puedan quedar abiertas.

#Terminamos la simulación y cerramos ventanas
capture.release()
cv2.destroyAllWindows()

Resultados

Conclusiones

La detección de rostros es una aplicación muy importante que abarca muchas áreas tales como: biometría, seguridad de la información, vigilancia, en tarjetas inteligentes, control de acceso, etc.

Con lo anterior podemos entender que esta aplicación tiene un alcance muy amplio, por lo que entender y lograr desarrollar algoritmos enfocados a esto nos abre un mundo de posibilidades y permite desarrollar proyectos cada vez más profesionales.

¡Y ya sabes! Mantente al pendiente de nuestras publicaciones y síguenos en nuestras redes sociales, estoy seguro que encontrarán mucha información de su interés. Si desean aprender algo en concreto referente a estas tecnologías lo pueden dejar en los comentarios.

Te invitamos a tomar el curso de Introducción al ESP32: Introducción al ESP32 | TodoMaker’s School

Previous Post
Next Post