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