馃懆 Detectar rostros con modelos pre-entrenados con DNN de OpenCV | Python

Por Administrador

En este tutorial veremos como usar un modelo pre entrenado con aprendizaje profundo para la detecci贸n de rostros con OpenCV, para lo cual usaremos el m贸dulo dnn, as铆 que 隆vamos a por ello!.

CONTENIDO

  • Detecci贸n de rostros con dnn de OpenCV
    • Instalaci贸n de packages
    • Descargar la arquitectura y pesos del modelo para detectar rostros con dnn
    • 隆Vamos con la programaci贸n!
    • Referencias

Detecci贸n de rostros con dnn de OpenCV

En este blog como en mi canal, ya tenemos un par de videos sobre detecci贸n facial como:

En los cuales se busca detectar el rostro de una persona en una imagen. Como podr谩s darte cuenta, podr铆as escoger alguno de estos u otros (puesto que se encuentran muchos detectores de rostros disponibles en repositorios), pero 驴c贸mo escoger alguno?.

Pues bien, esto depender谩 de la aplicaci贸n que desees realizar, es decir, si trabajas en im谩genes con buenas condiciones en el entorno, podr铆as tranquilamente usar el detector de rostros de haar cascades de OpenCV. Sin embargo, si tu proyecto se aplica sobre im谩genes cuyo entorno no es tan controlado, es decir, donde exista poca iluminaci贸n, desorden en el fondo y los rostros de las personas no se muestren muy al frente a la c谩mara, puede que tengas que usar otro detector de rostros m谩s preciso, como el que veremos hoy.

Puede que tambi茅n te encuentres con que necesites buena precisi贸n, pero que el detector no sea tan pesado computacionalmente. En fin, existen un mont贸n de variables a la hora de escoger un detector facial, por ello entre m谩s opciones mejor.

En esta ocasi贸n veremos como usar Dnn de OpenCV para cargar un modelo pre entrenado que nos ayudar谩 a detectar rostros con muy buena precisi贸n en im谩genes o videos. Para conseguirlo, en primer lugar tendremos que instalar OpenCV y luego tendremos que descargar la arquitectura y los pesos ya entrenados por terceros.

Instalaci贸n de packages

Vamos a instalar OpenCV con pip install opencv-contrib-python. Si digitamos pip freeze聽podremos ver todos los paquetes instalados.

Figura 1: Lista de los m贸dulos instalados.

Te preguntar谩s, 驴de d贸nde sale Numpy, si no lo hab铆amos instalado?. Pues bien, al momento de instalar OpenCV, tambi茅n se instala Numpy.

IMPORTANTE: Hay que tomar en cuenta que para el uso del m贸dulo dnn, debemos contar con versiones igual o superiores a OpenCV 3.3.

Descargar arquitectura y pesos del modelo para detectar rostros con dnn

En primer lugar, vamos a descargar la arquitectura de la red, para ello nos dirigimos a este link, elegimos deploy.prototxt, y lo descargamos.

Para los pesos del modelo, vamos a dirigirnos a este link, escogemos res10_300x300_ssd_iter_140000.caffemodel y lo descargamos.

NOTA: En el videotutorial podr谩s encontrar de forma m谩s detallada los pasos a seguir para descargar los archivos.

隆Vamos con la programaci贸n!

Para una explicaci贸n m谩s detallada del programa 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 馃槈!.

El primer programa lo podr谩s probar con im谩genes, solo tendr谩s que cambiar el path del modelo y de las im谩genes de entrada. As铆 que si茅ntete libre de experimentar con este detector:

import cv2

# ------------ READ DNN MODEL ------------
# Model architecture
prototxt = "model/deploy.prototxt"
# Weights
model = "model/res10_300x300_ssd_iter_140000.caffemodel"

# Load the model
net = cv2.dnn.readNetFromCaffe(prototxt, model)

# ------- READ THE IMAGE AND PREPROCESSING -------
image = cv2.imread("Images_videos/imagen_0001.jpg")
height, width, _ = image.shape
image_resized = cv2.resize(image, (300, 300))

# Create a blob
blob = cv2.dnn.blobFromImage(image_resized, 1.0, (300, 300), (104, 117, 123))
print("blob.shape: ", blob.shape)
blob_to_show = cv2.merge([blob[0][0], blob[0][1], blob[0][2]])

# ------- DETECTIONS AND PREDICTIONS ----------
net.setInput(blob)
detections = net.forward()
print("detections.shape:", detections.shape)

for detection in detections[0][0]:
     print("detection:", detection)
     if detection[2] > 0.5:
          box = detection[3:7] * [width, height, width, height]
          x_start, y_start, x_end, y_end = int(box[0]), int(box[1]), int(box[2]), int(box[3])
          cv2.rectangle(image, (x_start, y_start), (x_end, y_end), (0, 255, 0), 2)
          cv2.putText(image, "Conf: {:.2f}".format(detection[2] * 100), (x_start, y_start - 5), 1, 1.2, (0, 255, 255), 2)

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

En cambio, este es el programa en donde podr谩s probar la detecci贸n facial en video:

import cv2

# ------------ READ DNN MODEL ------------
# Model architecture
prototxt = "model/deploy.prototxt"
# Weights
model = "model/res10_300x300_ssd_iter_140000.caffemodel"

# Load the model
net = cv2.dnn.readNetFromCaffe(prototxt, model)

# ------- READ THE IMAGE AND PREPROCESSING -------
cap = cv2.VideoCapture("Images_videos/video_001.mp4")

while True:
     ret, frame = cap.read()
     if ret == False:
          break

     height, width, _ = frame.shape
     frame_resized = cv2.resize(frame, (300, 300))

     # Create a blob
     blob = cv2.dnn.blobFromImage(frame_resized, 1.0, (300, 300), (104, 117, 123))

     # ------- DETECTIONS AND PREDICTIONS ----------
     net.setInput(blob)
     detections = net.forward()
     #print("detections.shape:", detections.shape)

     for detection in detections[0][0]:
          #print("detection:", detection)
          if detection[2] > 0.5:
               box = detection[3:7] * [width, height, width, height]
               x_start, y_start, x_end, y_end = int(box[0]), int(box[1]), int(box[2]), int(box[3])
               cv2.rectangle(frame, (x_start, y_start), (x_end, y_end), (0, 255, 0), 2)
               cv2.putText(frame, "Conf: {:.2f}".format(detection[2] * 100), (x_start, y_start - 5), 1, 1.2, (0, 255, 255), 2)

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

Al ejecutar los programas podr谩s obtener resultados con los siguientes:

Figura 2: Detecci贸n de rostros con dnn de OpenCV.

Figura 3: Detecci贸n de rostros con dnn de OpenCV.

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

馃敆 Blob: https://pyimagesearch.com/2017/11/06/deep-learning-opencvs-blobfromimage-works/

馃敆 https://pyimagesearch.com/2018/02/26/face-detection-with-opencv-and-deep-learning/
馃敆 https://docs.opencv.org/3.4/d6/d0f/group__dnn.html#ga29f34df9376379a603acd8df581ac8d7
馃敆 https://docs.opencv.org/3.4/db/d30/classcv_1_1dnn_1_1Net.html#a98ed94cb6ef7063d3697259566da310b
馃敆 https://docs.opencv.org/3.4/d6/d0f/group__dnn.html#ga29f34df9376379a603acd8df581ac8d7
馃敆 https://learnopencv.com/deep-learning-with-opencvs-dnn-module-a-definitive-guide/
馃敆 https://github.com/opencv/opencv/tree/master/samples/dnn#face-detection