Redes neuronales para predecir la edad y el género





La obtención de información sobre la edad y el sexo de una persona se produce exclusivamente a partir de una fotografía de su rostro. En base a esto, podemos dividir nuestra tarea en dos etapas principales:



  1. Detectando rostros en la imagen de entrada.
  2. Extracción de la región de interés (ROI - Region of Interest) y aplicación del algoritmo del detector de edad y género de la persona.


Para la etapa 1, hay muchas soluciones listas para usar, por ejemplo: cascadas de Haar , HOG ((Histograma de gradientes orientados), modelos de aprendizaje profundo, etc. Consideremos las principales características distintivas de cada una de ellas:



  1. Las cascadas de Haar serán muy rápidas y podrán ejecutarse en tiempo real en dispositivos integrados; el problema es que son menos precisas y muy susceptibles a falsos positivos
  2. Los modelos HOG son más precisos que las cascadas de Haar, pero más lentos. Tampoco son tan tolerantes a la oclusión (es decir, cuando parte de la cara está oculta)
  3. Los detectores faciales de aprendizaje profundo son los más confiables y le brindarán la mejor precisión, pero requieren aún más recursos computacionales que las cascadas Haar y HOG


Para seleccionar un método adecuado para nuestra tarea, se llevó a cabo un análisis comparativo de dos algoritmos: las cascadas de Haar y la red neuronal convolucional MTCNN (Multi-Task Cascaded Convolutional Neural Network). En el primer caso, la biblioteca OpenCV ya contiene muchos clasificadores preparados previamente para rostro, ojos, sonrisa, etc. (los archivos XML se almacenan en la carpeta opencv / data / haarcascades /), en el segundo caso, debe instalar la biblioteca usando el comando pip install mtcnn ...



Importando las bibliotecas necesarias



import cv2
from mtcnn import MTCNN
import matplotlib.pyplot as plt
image = cv2.cvtColor(cv2.imread('f.jpg'), cv2.COLOR_BGR2RGB) #  


A continuación se muestra el código para probar el funcionamiento de los algoritmos



MTCNN:



detector = MTCNN() #  
result = detector.detect_faces(image)  #    
for i in range(len(result)): 
bounding_box = result[i]['box']  #   
cv2.rectangle(image, (bounding_box[0], bounding_box[1]),
(bounding_box[0]+bounding_box[2], bounding_box[1] + bounding_box[3]),
           (0,155,255), 2) #     
plt.imshow(image) #   


cascada de haar:



face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml') #   XML-
faces = face_cascade.detectMultiScale(image, 1.3, 5)  #    
for (x,y,w,h) in faces: #      
    cv2.rectangle(image,(x,y),(x+w,y+h),(255,0,0),2) #     
plt.imshow(image) #   


Realicemos una serie de experimentos para comprobar la calidad de los algoritmos.



- foto única de una persona





- Varias personas en la foto





- Varias personas en la foto, cuando la mirada no se dirige al marco.





- Varias personas en la foto cuando parte de su cara está oculta, por ejemplo, con máscaras.





Se puede concluir que en condiciones ideales (alta definición de la foto, la cara se dirige estrictamente al marco), ambos algoritmos funcionan sin ninguna queja, pero a la más mínima desviación de estas condiciones, las cascadas de Haar comienzan a fallar. Por tanto, la elección se centró en utilizar el modelo MTCNN.



Ahora que hemos descubierto la elección de un método para detectar rostros en una fotografía, pasemos a la tarea en sí. Para determinar la edad y el sexo se utilizaron dos modelos diferentes, entrenados sobre una gran cantidad de datos. Ambos modelos fueron entrenados por Levy y Hassner, su primer trabajo fue publicado en 2015 bajo el título Clasificación de edad y género usando redes neuronales convolucionales.". En su trabajo, demostraron que el entrenamiento con redes neuronales convolucionales profundas (CNN) puede lograr ganancias de rendimiento significativas en las tareas de predicción de edad y género.



Se puede descargar un modelo entrenado en el conjunto de datos de Adience para la predicción de la edad desde el enlace 1 (* .caffemodel) y el enlace 2 (* .prototxt) Este modelo resuelve el problema de clasificación, no de regresión. El rango de edad se divide en ciertos intervalos ["(0-2)", "(4-6)", "(8-12)", "(15-20)", "(25-32)", "(38 -43) "," (48-53) "," (60-100) "], cada uno de los cuales es una clase separada que el modelo puede predecir.



Para determinar el género, se tomó un modelo del repositoriopara el artículo " Comprensión y comparación de redes neuronales profundas para la clasificación por edad y género " . Los modelos se pueden descargar desde el enlace 1 (* .caffemodel) y desde el enlace 2 (* .prototxt). El modelo utiliza la arquitectura de GoogleNet y fue entrenado previamente en el conjunto de datos de ImageNet .



Como puede ver, cada modelo está representado por dos archivos, lo que significa que fue entrenado usando Caffe (un marco de aprendizaje profundo de máquina orientado a la facilidad de uso, alta velocidad y modularidad). El archivo con la extensión prototxt es responsable de la arquitectura de la red y el archivo con la extensión caffemodel. por el peso del modelo.



El código principal se presenta brevemente a continuación, como argumento al modelo que pasamos a la persona definida anteriormente.



AGE_BUCKETS = ["(0-2)", "(4-6)", "(8-12)", "(15-20)", "(25-32)","(38-43)", "(48-53)", "(60-100)"]
gender_list=['Male','Female']
faceBlob = cv2.dnn.blobFromImage(face, 1.0, (227, 227), (78.4, 87.7, 114.8), swapRB=False)
  ageNet.setInput(faceBlob)
  age_preds = ageNet.forward()
  age_i = age_preds[0].argmax()
  age = AGE_BUCKETS[age_i]
  ageConfidence = age_preds[0][age_i]
             age_text = "{}: {:.2f}%".format(age, ageConfidence * 100) #   
  genderNet.setInput(faceBlob)
  gender_preds = genderNet.forward()
  gender_i = gender_preds[0].argmax()
  gender=gender_list[gender_i]
  genderConfidence = gender_preds[0][gender_i]
  gender_text = "{}: {:.2f}%".format(gender, genderConfidence * 100) #   
   y = y1 - 10 if y1 - 10 > 10 else y1 + 10
   cv2.rectangle(image, (x1, y1), (x1+width, y1 + height), (0,155,255),2) 
   v2.putText(image, display_text, (x1, y),
   cv2.FONT_HERSHEY_SIMPLEX, 0.45, (0, 0, 255), 2)


Los resultados obtenidos durante el desarrollo del algoritmo







Como puede ver, el modelo no siempre muestra el resultado correctamente, a veces asigna un género masculino a las fotografías donde se representan mujeres. Quizás esto se deba a la fecha desequilibrada establecida en la que se entrenó el modelo. Siempre que tenga los recursos informáticos necesarios, puede intentar entrenar el modelo usted mismo, llevará algún tiempo, pero con un conjunto de datos equilibrado y una arquitectura de red y parámetros de entrenamiento seleccionados correctamente, la precisión puede mejorar.



All Articles