Detección de edad usando Deep Learning en OpenCV

En este tutorial, vamos a ver todo el proceso de creación de un proyecto de predictor de edad y clasificador de género utilizando OpenCV.

Detección de edad 

Nuestro objetivo aquí es crear un programa que prediga el sexo y la edad de la persona que usa una imagen. Pero predecir la edad puede no ser tan simple como crees, ¿por qué? Podrías estar pensando que la predicción de la edad es un problema de regresión, ¿verdad? Y tendrías razón al pensar así. Sin embargo, existen muchas incertidumbres a las que se han enfrentado los investigadores cuando trataron esto como un problema de regresión, como la calidad de la cámara, el brillo, las condiciones climáticas, el fondo, etc. 

¿Cual es la solución? 

La solución a este problema es bastante simple, en lugar de predecir una imagen exacta, clasifiquemos la edad en un rango específico como 0-6, 18-25, etc. Y eso es lo que hicieron los investigadores y encontraron que los resultados fueron sorprendentes y la precisión aumentó mucho en escenarios del mundo real.

Ahora que tenemos claro nuestro problema, sigamos adelante y comencemos a crear nuestro programa.

Flujo de trabajo: 

 

Descarga de los archivos necesarios

Vamos a usar modelos previamente entrenados para la predicción de la edad porque nuestro enfoque principal es cómo implementar el predictor de edad usando OpenCV, usando estos modelos. 

Puede descargar todos los archivos requeridos aquí

Construyendo el programa principal

He dividido el programa principal en 5 pasos para que sea más fácil de entender y, al final, he escrito el código para todo el programa que puede probar y ejecutar usted mismo.

Paso 1: Creación de la instancia de imagen

Aquí vamos a usar el paquete OpenCV para instanciar un objeto para la imagen de entrada, si no entiende esto, primero debe leer sobre cómo leer/capturar un video en OpenCV aquí

Y ahora que tenemos nuestra imagen de entrada, el siguiente paso es instanciar nuestros modelos.

Paso 2: crear DNN usando los modelos

En OpenCV, creamos una DNN (red neuronal profunda) para cargar un modelo previamente entrenado y pasarlo a los archivos del modelo.

Primero creamos variables para almacenar las rutas de archivo de los archivos del modelo y luego definimos las variables del modelo; estas difieren de un modelo a otro, y he tomado estos valores para el modelo de Caffe que estamos usando.

#———-Rutas del archivo del modelo—————-#

ageProto=”Modelos/age_deploy.prototxt”

ageModel=”Modelos/age_net.caffemodel”

#———–Variables del modelo—————#

mean =(78.4263377603, 87.7689143744, 114.895847746) # estos son tomados del sitio oficial

listaEdad=[‘(0-2)’, ‘(4-6)’, ‘(8-12)’, ‘(15-20)’, ‘(25-32)’, ‘(38-43)’ , ‘(48-53)’, ‘(60-100)’]

#————-Creando el DNN————#

age_Net= cv2.dnn.readNet(ageModel,ageProto)

NOTA : Este es el procedimiento o los pasos que debe seguir para usar un modelo preentrenado para la visión por computadora usando OpenCV.

Ahora que tenemos nuestros modelos, intentemos detectar caras en la imagen/video.

Paso 3: Detección de rostros

Para este programa, he usado el método dlib.get_frontal_face_detector() para la detección de rostros por simplicidad, pero definitivamente puede intentar usar modelos personalizados o modelos pre-entrenados.

Hay muchos comentarios para facilitarle la comprensión de cada línea del código.

Paso 4: Detección de edad

Antes de pasar la imagen como entrada, tenemos que cambiarla a las dimensiones requeridas, es decir, de acuerdo con la capa de entrada de nuestro modelo, ¿verdad? Esto se hace mediante la función blobFromImage()  en OpenCV. 

Luego, este blob se pasa como entrada al modelo del detector de edad.

Paso 5: Mostrar la imagen resultante con detección

Ahora que tenemos las predicciones, las pondremos como texto y las mostraremos en la imagen de salida final.

A continuación se muestra la implementación completa

Aquí está el código final del programa que combina los 5 pasos que puede ejecutar directamente en sus computadoras.  

Python3

import cv2
import dlib
import numpy as np
  
img = cv2.imread('assets/kid1.jpg')
img = cv2.resize(img, (720, 640))
frame = img.copy()
  
# ------------ Model for Age detection --------#
age_weights = "Models/age_deploy.prototxt"
age_config = "Models/age_net.caffemodel"
age_Net = cv2.dnn.readNet(age_config, age_weights)
  
# Model requirements for image
ageList = ['(0-2)', '(4-6)', '(8-12)', '(15-20)',
           '(25-32)', '(38-43)', '(48-53)', '(60-100)']
model_mean = (78.4263377603, 87.7689143744, 114.895847746)
  
# storing the image dimensions
fH = img.shape[0]
fW = img.shape[1]
  
Boxes = []  # to store the face co-ordinates
mssg = 'Face Detected'  # to display on image
  
# ------------- Model for face detection---------#
face_detector = dlib.get_frontal_face_detector()
# converting to grayscale
img_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
  
# -------------detecting the faces--------------#
faces = face_detector(img_gray)
  
# If no faces our detected
if not faces:
    mssg = 'No face detected'
    cv2.putText(img, f'{mssg}', (40, 40),
                cv2.FONT_HERSHEY_SIMPLEX, 2, (200), 2)
    cv2.imshow('Age detected', img)
    cv2.waitKey(0)
  
else:
    # --------- Bounding Face ---------#
    for face in faces:
        x = face.left()  # extracting the face coordinates
        y = face.top()
        x2 = face.right()
        y2 = face.bottom()
  
        # rescaling those coordinates for our image
        box = [x, y, x2, y2]
        Boxes.append(box)
        cv2.rectangle(frame, (x, y), (x2, y2), 
                      (00, 200, 200), 2)
  
    for box in Boxes:
        face = frame[box[1]:box[3], box[0]:box[2]]
  
        # ----- Image preprocessing --------#
        blob = cv2.dnn.blobFromImage(
            face, 1.0, (227, 227), model_mean, swapRB=False)
  
        # -------Age Prediction---------#
        age_Net.setInput(blob)
        age_preds = age_Net.forward()
        age = ageList[age_preds[0].argmax()]
  
        cv2.putText(frame, f'{mssg}:{age}', (box[0],
                                             box[1] - 10), 
                    cv2.FONT_HERSHEY_SIMPLEX, 0.8,
                    (0, 255, 255), 2, cv2.LINE_AA)
  
        cv2.imshow("Detecting Age", frame)
        cv2.waitKey(0)

Producción:

imagen de stock de pexels

Mejoras adicionales/Pruébelo usted mismo: 

  1. Prueba a editar el código para el feed en tiempo real 
  2. Intente usar otro modelo previamente entrenado como YOLO o cree el suyo propio 
  3. También puede agregar otro modelo para detectar la Viveza/Emoción de la persona

Publicación traducida automáticamente

Artículo escrito por bobde_yagyesh y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *