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); } }
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.
No se puede descargar, me sale error
ResponderEliminarEl enlace ha sido reparado, ya puedes descargar:
Eliminarhttps://drive.google.com/uc?export=download&id=0BwsK1ljXxRYBN0lKdXJPaEN4M3M
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
EliminarEste 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.
Eliminarsi 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
EliminarHola 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
EliminarSi usas Visual Studio solo requieres la versión 2015 o superior.
Eliminarquisiera 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
ResponderEliminarPara 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.
Eliminarcomo 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
ResponderEliminarPara guardar usas el método save() por ejemplo:
EliminarPtr 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");
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.
ResponderEliminarHe 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