Cree un modelo de detección de rostros en un video usando Python

Contenidos

Introducción

«La visión por computadora y el aprendizaje automático verdaderamente han comenzado a despegar, pero para la mayoría de las personas, la idea completa de lo que ve una computadora cuando mira una imagen es relativamente oscura». – Mike Kreiger

El maravilloso campo de la visión por computadora se ha elevado a una liga propia en los últimos años. Hay una cantidad impresionante de aplicaciones que ya se usan ampliamente en todo el mundo, ¡y recién estamos comenzando!

Una de mis cosas favoritas en este campo es la idea de que nuestra comunidad adopte el concepto open source. Inclusive los grandes gigantes de la tecnología están dispuestos a compartir nuevos avances e innovaciones con todo el mundo para que las técnicas no sigan siendo “cosa de los ricos”.

Una de esas tecnologías es la detección de rostros, que ofrece una gran cantidad de aplicaciones potenciales en casos de uso del mundo real (si se utiliza correcta y éticamente). En este post, le mostraré cómo crear un algoritmo de detección de rostros capaz usando herramientas open source. Aquí hay una demostración para entusiasmarlo y preparar el escenario para lo que seguirá:

¿Entonces estas lista? ¡continua leyendo entonces!

Nota: Si desea comprender las complejidades de la visión por computadora, este curso: Visión por computadora usando Deep Learning – es el lugar perfecto para comenzar.

Tabla de contenido

  • Aplicaciones potenciales de la detección de rostros
  • Configuración del sistema: requerimientos de hardware / software
    • configuración de hardware
    • Configuración del software
  • Profundizando en la implementación de Python
    • Tutorial simple
    • Caso de uso de detección facial

Aplicaciones prometedoras de la detección de rostros

Permítanme mostrar algunos ejemplos asombrosos de aplicaciones en las que las técnicas de detección de rostros se usan popularmente. Estoy seguro de que debe haberse encontrado con estos casos de uso en alguna vez y no se dio cuenta de qué técnica se estaba usando detrás de escena.

A modo de ejemplo, Facebook reemplazó el etiquetado manual de imágenes con sugerencias de etiquetas generadas automáticamente para cada imagen que se subió a la plataforma. Facebook utiliza un algoritmo de detección de rostros simple para analizar los píxeles de los rostros en la imagen y compararlos con los usuarios relevantes. Aprenderemos cómo construir un modelo de detección de rostros nosotros mismos, pero antes de entrar en los detalles técnicos de eso, analicemos algunos otros casos de uso.

Nos estamos acostumbrando a desbloquear nuestros teléfonos con la última función de ‘desbloqueo facial’. Este es un ejemplo muy pequeño de cómo se utiliza una técnica de detección de rostros para mantener la seguridad de los datos personales. Lo mismo se puede poner en práctica a mayor escala, lo que posibilita que las cámaras capturen imágenes y detecten rostros.

https://www.youtube.com/watch?v=bYrRQQX2PvY

Hay algunas otras aplicaciones menos reconocidas de detección de rostros en publicidad, atención médica, banca, etc. La mayoría de las compañías, o inclusive en muchas conferencias, se supone que debe llevar una tarjeta de identificación para poder ingresar. Pero, ¿qué pasaría si pudiéramos hallar una manera de que no necesite llevar ninguna tarjeta de identificación para tener acceso? La detección de rostros ayuda a que este procedimiento sea sencillo y fluido. La persona simplemente mira a la cámara y automáticamente detectará si se le debe permitir entrar o no.

Otra aplicación interesante de la detección de rostros podría ser contar el número de personas que asisten a un evento (como una conferencia o un concierto). En lugar de contar manualmente a los asistentes, instalamos una cámara que puede capturar las imágenes de los asistentes y darnos el recuento total de personas. Esto puede ayudar a automatizar el procedimiento y ahorrar una tonelada de esfuerzo manual. Bastante útil, ¿no?

Puede crear muchas más aplicaciones como estas; no dude en compartirlas en la sección de comentarios a continuación.

En este post, me centraré en la aplicación práctica de la detección de rostros y pasaré por alto cómo funcionan verdaderamente los algoritmos que contiene. Si te interesa saber más sobre ellos, lee este post.

Configuración del sistema: requerimientos de hardware / software

Ahora que conoce las aplicaciones potenciales que puede construir con técnicas de detección de rostros, veamos cómo podemos poner en práctica esto usando las herramientas open source disponibles para nosotros. Esa es la ventaja que tenemos con nuestra comunidad: la voluntad de compartir y el código fuente abierto no tiene paralelo en ninguna industria.

Para este post específicamente, esto es lo que he usado y recomiendo utilizar:

  • Una cámara web (Logitech C920) para construir un detector facial en tiempo real en una computadora portátil Lenovo E470 ThinkPad (Core i5 7th Gen). Además puede utilizar la cámara incorporada de su computadora portátil, o la cámara CCTV, en cualquier sistema apropiado para el análisis de video en tiempo real, en lugar de la configuración que estoy usando
  • Utilizar una GPU para un procesamiento de video más rápido es siempre una ventaja
  • En el lado del software, hemos utilizado el sistema operativo Ubuntu 18.04 con todo el software prerrequisito instalado

Exploremos estos puntos con un poco más de detalle para asegurarnos de que todo esté configurado correctamente antes de construir nuestro modelo de detección de rostros.

Paso 1: configuración del hardware

Lo primero que debe hacer es verificar si la cámara web está configurada correctamente. Un simple truco en Ubuntu: compruebe si el sistema operativo ha registrado el dispositivo. Puede seguir los pasos que se indican a continuación:

  1. Antes de conectar la WebCam a la computadora portátil, verifique todos los dispositivos de video conectados yendo al símbolo del sistema y escribiendo ls / dev / video *. Esto imprimirá los dispositivos de video que ya están conectados al sistema.
  2. Conecte la WebCam y vuelva a ejecutar el comando.Si la WebCam se ha conectado correctamente, el comando mostrará un nuevo dispositivo.
  3. Otra cosa que puede hacer es utilizar cualquier software de cámara web para verificar si la cámara web funciona correctamente. Puede utilizar «Cheese» en Ubuntu para esto.
    Aquí podemos ver que la cámara web está configurada correctamente. ¡Y eso es todo por el lado del hardware!

Paso 2: configuración del software

Paso 2.1: instalar Python

El código de este post se creó con la versión 3.5 de Python. Aún cuando hay varias alternativas para instalar Python, recomendaría utilizar Anaconda, la distribución de Python más popular para la ciencia de datos. Aquí hay un enlace para instalar Anaconda en su sistema.

Paso 2.2: Instale OpenCV

OpenCV (Open Source Computer Vision) es una biblioteca destinada a crear aplicaciones de visión por computadora. Tiene numerosas funciones preescritas para tareas de procesamiento de imágenes. Para instalar OpenCV, haga una instalación pip de la biblioteca:

pip3 install opencv-python

Paso 2.3: Instale la API face_recognition;

En conclusión, usaremos Reconocimiento facial, denominada como la API de acreditación facial más simple del mundo para Python. Instalar:
pip install dlib
pip install face_recognition

Profundicemos en la implementación

Ahora que ha configurado su sistema, por último es el momento de sumergirse en la implementación real. Primero, construiremos rápidamente nuestro programa, posteriormente lo desglosaremos para comprender lo que hicimos.

Tutorial simple

Primero, crea un archivo face_detector.py y posteriormente copie el código que se proporciona a continuación:

# import libraries
import cv2
import face_recognition

# Get a reference to webcam 
video_capture = cv2.VideoCapture("/dev/video1")

# Initialize variables
face_locations = []

while True:
    # Grab a single frame of video
    ret, frame = video_capture.read()

    # Convert the image from BGR color (which OpenCV uses) to RGB color (which face_recognition uses)
    rgb_frame = frame[:, :, ::-1]

    # Find all the faces in the current frame of video
    face_locations = face_recognition.face_locations(rgb_frame)

    # Display the results
    for top, right, bottom, left in face_locations:
        # Draw a box around the face
        cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2)

    # Display the resulting image
    cv2.imshow('Video', frame)

    # Hit 'q' on the keyboard to quit!
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# Release handle to the webcam
video_capture.release()
cv2.destroyAllWindows()

Posteriormente, ejecute este archivo de Python escribiendo:

python face_detector.py

Si todo funciona correctamente, aparecerá una nueva ventana con la detección de rostros en tiempo real en ejecución.

Para resumir, esto es lo que hizo nuestro código anterior:

  1. Primero nosotros definido el hardware en el que se realizará el análisis de video
  2. De esto, nosotros capturó el video en tiempo real, fotograma a fotograma
  3. Entonces nosotros procesó cada cuadro y extrajo las ubicaciones de todas las caras en la imagen
  4. En conclusión nosotros renderizó estos fotogramas en forma de video, junto con las ubicaciones de las caras

Simple, ¿no es así? Si desea entrar en detalles más granulares, he incluido los comentarios en cada sección de código. Siempre puede volver atrás y revisar lo que hemos hecho.

Caso de uso de detección facial

¡La diversión no termina ahí! Otra cosa interesante que podemos hacer: crear un caso de uso completo en torno al código anterior. Y no es necesario comenzar de cero. Podemos hacer solo algunos pequeños cambios en el código y estamos listos para comenzar.

Suponga, a modo de ejemplo, que desea construir un sistema automatizado basado en cámara para rastrear dónde se encuentra el hablante en tiempo real. Según su posición, el sistema gira la cámara para que el hablante esté siempre en medio del video.

¿Cómo lo hacemos? El primer paso es construir un sistema que identifique a las personas en el video y se centre en la ubicación del hablante.

Veamos cómo podemos poner en práctica esto. Para este post, he tomado un video de Youtube que muestra a un orador hablando durante la conferencia DataHack Summit 2017.

Primero, importamos las bibliotecas indispensables:

import cv2
import face_recognition

Posteriormente, lea el video y obtenga la duración:

input_movie = cv2.VideoCapture("sample_video.mp4")
length = int(input_movie.get(cv2.CAP_PROP_FRAME_COUNT))

Después de eso, creamos un archivo de salida con la resolución requerida y la velocidad de fotogramas que es equivalente al archivo de entrada.

Cargue una imagen de muestra del hablante para identificarlo en el video:

image = face_recognition.load_image_file("sample_image.jpeg")
face_encoding = face_recognition.face_encodings(image)[0]

known_faces = [
face_encoding,
]

Todo esto completado, ahora ejecutamos un ciclo que hará lo siguiente:

  • Extrae un fotograma del video
  • Encuentra todas las caras e identificalas
  • Cree un nuevo video para combinar el marco original con la ubicación de la cara del hablante anotada

Veamos el código para esto:

# Initialize variables
face_locations = []
face_encodings = []
face_names = []
frame_number = 0

while True:
    # Grab a single frame of video
    ret, frame = input_movie.read()
    frame_number += 1

    # Quit when the input video file ends
    if not ret:
        break

    # Convert the image from BGR color (which OpenCV uses) to RGB color (which face_recognition uses)
    rgb_frame = frame[:, :, ::-1]

    # Find all the faces and face encodings in the current frame of video
    face_locations = face_recognition.face_locations(rgb_frame, model="cnn")
    face_encodings = face_recognition.face_encodings(rgb_frame, face_locations)

    face_names = []
    for face_encoding in face_encodings:
        # See if the face is a match for the known face(s)
        match = face_recognition.compare_faces(known_faces, face_encoding, tolerance=0.50)

        name = None
        if match[0]:
            name = "Phani Srikant"

        face_names.append(name)

    # Label the results
    for (top, right, bottom, left), name in zip(face_locations, face_names):
        if not name:
            continue

        # Draw a box around the face
        cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2)

        # Draw a label with a name below the face
        cv2.rectangle(frame, (left, bottom - 25), (right, bottom), (0, 0, 255), cv2.FILLED)
        font = cv2.FONT_HERSHEY_DUPLEX
        cv2.putText(frame, name, (left + 6, bottom - 6), font, 0.5, (255, 255, 255), 1)

    # Write the resulting image to the output video file
    print("Writing frame {} / {}".format(frame_number, length))
    output_movie.write(frame)

# All done!
input_movie.release()
cv2.destroyAllWindows()

El código le daría una salida como esta:

Qué gran cosa es verdaderamente la detección de rostros. 🙂

Proyectos

Ahora es el momento de dar el paso y jugar con otros conjuntos de datos reales. Entonces, ¿estás listo para aceptar el desafío? Acelere su viaje de aprendizaje profundo con los siguientes problemas de práctica:

Conclusión

¡Felicidades! Ahora sabe cómo crear un sistema de detección de rostros para varios casos de uso potenciales. El aprendizaje profundo es un campo fascinante y estoy muy emocionado de ver a dónde vamos ahora.

En este post, aprendimos cómo puede aprovechar las herramientas open source para crear sistemas de detección de rostros en tiempo real que tengan utilidad en el mundo real. Te animo a que crees muchas de estas aplicaciones y pruebes esto por tu cuenta. Créame, hay mucho que aprender y ¡es muy divertido!

Como siempre, no dude en comunicarse si tiene alguna duda / sugerencia en la sección de comentarios a continuación.

Suscribite a nuestro Newsletter

No te enviaremos correo SPAM. Lo odiamos tanto como tú.