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
  2. quisiera orientacion para detectar el genero de hombre y mujeres desde la webcam , quisiera una orientacion ya que mi proyecto se basa en traducir gestos manuales , de personas con limitacion auditiva

    ResponderEliminar
    Respuestas
    1. Para aplicar este proyecto a la webcam solo debes acceder a la misma de este modo: http://acodigo.blogspot.com/2013/06/acceso-la-webcam.html dentro del bucle ubicas el código del paso 3.

      Eliminar
  3. como hago para cargar o guardar el archivo xml de cada entrenamiento, he revisado como guardar datos yml o xml pero como se guarda el archivo de reconocimiento de genero o en donde lo encuentro

    ResponderEliminar
    Respuestas
    1. Para guardar usas el método save() por ejemplo:

      Ptr model0 = createEigenFaceRecognizer();
      model0->train(images, labels);
      model0->save("eigenfaces_at.yml");

      El archivo estará ubicado en el directorio de trabajo de la aplicación, para cargar usas el método load() ejemplo:

      Ptr model1 = createEigenFaceRecognizer();
      model1->load("eigenfaces_at.yml");

      Eliminar
  4. hola gracias por tu orientación, como te he comentado mi proyecto se basa en detección de las manos, para después con el algoritmo eigen para entrenar las señas , el archivo xml o yml aplica el mismo código para el entrenamiento. He compilado un tutorial de autos donde creas el archivo xml, bueno iré trabajando en el proyecto y espero pueda contar con tu orientación.

    ResponderEliminar
  5. He intentado buscar bases de datos de manos, en motores de búsqueda y links que he encontrado, pero al parecer tendré que hacer la base de datos manualmente y utilizar objectmarket , o si tu conoces una pagina donde pueda descargar una base de datos de manos, te agradecería ya que agilizaría en cuanto a tiempo el proyecto

    ResponderEliminar

Publicar un comentario

Temas relacionados

Entradas populares de este blog

tkinter Grid

tkinter Canvas

Histogramas OpenCV Python

Python Binance API