Clasificación de Genero (FaceRecognizer)

FaceRecognizer a parte de reconocimiento facial lo podemos usar para clasificar el genero de un rostro o sea determinar si es hombre o mujer, usaremos el algoritmo fisherfaces que entrenaremos con una base de datos de rostros correspondientes a hombres y mujeres.

Base de datos de Genero

Como primer paso recolectaremos un conjunto de imágenes pertenecientes a rostros de hombres y mujeres, los mismos han sido recortados y alineados usando la función cropface() que vimos en Reconocimiento Facial.

Para este ejemplo usaremos una pequeña base de datos, la misma esta formada por dos carpetas: hombres y mujeres que contienen los respectivos rostros, dentro de cada carpeta se encuentra un archivo faces.txt este contiene los nombres de las imágenes que se cargaran.

Esta base de datos fue extraída de: http://cswww.essex.ac.uk/mv/allfaces/faces94.html

Si deseamos aumentar la fiabilidad del clasificador de genero lo primero que debes hacer es crear una buena base de datos que contenga diversos rostros.

Cargar los rostros masculinos y femeninos

Necesitamos crear un vector<Mat> lista de rostros y un vector<int> identificador para los rostros, creamos la función read_faces() la cual lee la carpeta indicada, busca el archivo faces.txt y rellena los vector<>.

Como identificación para los rostros usaremos 1 para los hombres y 0 para la mujeres.

vector<Mat> faces;
vector<int> ids;

//Cargar la base de datos de rostros
read_faces("mujeres", faces, ids, 0);
read_faces("hombres", faces, ids, 1);

 

FaceRecognizer para clasificación de genero

Primer paso: Entrenar el clasificador con los rostros que ya hemos obtenido previamente, usaremos el algoritmo fisherface que podemos obtener con createFisherFaceRecognizer(), luego solo necesitamos llamar al método train(faces, ids).

//Entrenar el calsificador
Ptr<FaceRecognizer> model = createFisherFaceRecognizer();
model->train(faces, ids);

Segundo paso: Detectar el rostro presente en la webcam, detectamos también los ojos esto para alinear y recortar correctamente el rostro, usamos los métodos cropface y getfaceandeye que vimos en el Tutorial de Reconocimiento de Rostro.

Tercer paso: Obtener el genero, llamamos al método predict(face) y le pasamos el rostro obtenido en el paso anterior, este nos devolverá un valor int que indica el genero, 0 para mujer y 1 para hombre, –1 indica desconocido.

//Obtener las coordenadas del rostro y los ojos
Rect face, lEye, rEye;

if(GetFaceAndEyes(copyFrame, face, lEye, rEye))
{
 Mat cface;
 CropFace(copyFrame(face), cface, lEye, rEye);

 if(!cface.empty())
 {
  int label = model->predict(cface);

  string gender = label == 0 ? "Mujer" : "Hombre";

  DrawMarker(frame, face, gender, 20);
 }
}
 
Clasificación de Genero con FaceRecognizer

 

Almacenar datos en disco

No es necesario entrenar nuestra aplicación cada vez que la ejecutemos, podemos almacenar nuestra base de datos en un archivo .xml o .yml con el método save(), para cargar el archivo guardado usamos load().

Antes de entrenar el clasificador de genero comprobaremos si existe el archivo face_data_base.yml, de ser así lo cargamos, en caso contrario entrenamos como lo hicimos anteriormente y luego creamos el archivo antes mencionado.

Esta función no esta implementada en este ejemplo.

Descargar Clasificación de Genero.

Comentarios

  1. No se puede descargar, me sale error

    ResponderEliminar
    Respuestas
    1. El enlace ha sido reparado, ya puedes descargar:

      https://drive.google.com/uc?export=download&id=0BwsK1ljXxRYBN0lKdXJPaEN4M3M

      Eliminar
    2. Muchas gracias amigo. Otra pregunta, en la linea 198 me dice que "to_string" no ha sido declarada, a que se debe? Si me pudieras ayudar, te agradecería mucho

      Eliminar
    3. Este método pertenece al estándar C++ 11 por lo que debes tener un compilador que lo soporte, si no puedes cambiar el compilador debes reemplazar este código, lo que el método to_string hace es convertir un número a texto por lo que puedes usar otra función para ello.

      Eliminar
    4. si me funciono, muchas gracias.. oye una preguna y basicamente que caracteristicas tiene que hace la deteccion de genero? o sea para diferenciar entre hombre y mujer

      Eliminar
    5. Hola tengo el mismo problema, pero no puedo descargarme el vc11, he estado buscando una función parecida que me haga la conversión me podrias decir cual has utilizado??. gracias

      Eliminar
    6. Si usas Visual Studio solo requieres la versión 2015 o superior.

      Eliminar

Publicar un comentario

Entradas populares de este blog

Conectar SQL Server con Java

Gauss Seidel y Jacobi

Entrenar OpenCV en Detección de Objetos

Procesamiento de imágenes en OpenCV

Acceso a la webcam con OpenCV