ELO 329 Programación Orientada a Objetos
"Reconocimineto de Rostros"

Luis Leiva
Felipe Muñoz
Sebastián Ubiergo




Descripción del problema

El proyecto consiste en una captura y reconocimiento de rostros en tiempo real. Para ello, el programa debe poseer una base de datos en la cual deben estar registrados todas las personas de interés. El sistema es capaz de decir cuando la persona no está registrada en la base de datos, y debe ser capaz de registrar nuevos usuarios en cualquier momento.

Las aplicaciones de este proyecto son múltiples. En particular, fue pensado para implementarlo en el ambiente de porteria de la Universidad Técnica Federico Santa María.




Análisis del problema

En este caso, se tienen 2 personas identificadas como la persona a reconocer o entrenar en la base de datos y la persona a cargo de observar y/o guardar en base de datos el rostro.

De esta manera, la interacción de las 2 personas se desarrolla en base al ingreso al recinto específico. Por lo cual mediante el sistema implementado, se hace este escenario de forma rápida y eficiente.

Casos de uso

Caso 1: Reconocer a Sansano en la portería
Actor 1 (Sansano) Actor 2 (Guardia) Sistema (Software)
1. El guardia solicita reconocer al sansano 2. El sistema responde con la cámara en tiempo real para reconocer al usuario.
3. El sansano se coloca en posición para que se le reconozca 4. El sistema muestra en pantalla si el usuario esta en base de datos colocando su rol
5. El guardia observa si su rol sale en pantalla y deja entrar al recinto si es el caso
6. El sansano entra a la Universidad

Caso 2: Registrar nuevo Sansano
Actor 1 (Sansano) Actor 2 (Funcionario) Sistema (Software)
1. Funcionario USM solicita guardar rostros en la base de datos 2. El sistema muestra por pantalla rol de la persona que se quiere guardar
3. El sansano de da los datos requeridos al funcionario 4. El usuario escribe los datos requeridos por el Actor 1 5. El sistema muestra en pantalla los botones de menpu principal, recopilar datos, volver a datos para otra persona y la cámara lista para recopilar datos
6. El usuario pide al sansano colocarse en posición y efectuar serie de tomas de fotos
7. El sansano se coloca en posición y efectpua serie de movimientos faciales frontales 8. El usuario presiona la toma de fotos respectiva 9. El sistema guarda esas fotos en la base de datos asignada al nombre y rol correspondiente

Caso 3: Pasar Lista
Actor 1 (Sansano) Actor 2 (Guardia) Sistema (Software)
1. El funcionario inicia el sistema al entrar a la sala de clases 2. El sistema responde con la cámara en tiempo real para reconocer a los asistentes. La cámara debe tener una visión de todas las sillas de la sala
3. Los asistentes a la clase se sientan de forma orientada para que la cámara pueda verlos a todos. 4. El sistema deja una registro de todas las personas que hay en la sala
5. El funcionario debe guardar la información registrada por el sistema




Diagramas

A continuación se presenta el diagrama de clase:

Pantalla inicial

A continuación se presenta el diagrama de secuencia para el caso de uso de roconomiento:

Pantalla inicial




Pruebas

Al ejecutar el programa se abre la siguiente ventana:

Pantalla inicial

Una vez aqui se puede proceder a realizar el entrenamiento apretando el boton "Trainer" y se despliega la siguiente ventana:

Pantalla inicial

Una vez aquí se ingresa el rol de la persona y se aprieta el boton "Aceptar" para que se despliegue la ventana donde se realizará la toma de datos:

Pantalla inicial

El botón de "Capturar imagen" se debe tornar verde cuando el sistema reconoce que existe un rostro y lo puede utilizar para el modelo, en caso contrario es rojo. Si se pulsa el botón "Menú Principal" se regresa a la ventana mostrada en la primera imagen de está sección y si se pulsa "Otra Persona" se vuelve la ventana de registro.

Si por alguna razón cuando se está en la ventana del registro no se ingresa nada en el campo "Rol", el sistema muestra lo siguiente:

Pantalla inicial

Si en la ventana principal (La primera imagen de la sección) se aprieta el botón "Recognition" muestra la siguiente pantalla:

Pantalla inicial

La imagen que se muestra a la izquierda es lo que ve la cámara a tiempo real y la de la derecha es la última en la que se pudo reconocer a una persona.




Dificultades encontradas

Una de las dificultades encontradas es la de definir un valor de umbral que representa el porcentaje de error válido para que el sistema pueda decidir si la persona que está detectando se encuentra o no dentro de la base de datos. Cuando el sistema crece en cantidad de personas registradas este valor puede que sea necesario irlo modificando de forma empírica (la solución a este problema fue encontrada de esta forma). Una posible mejora sería diseñar un algoritmo que lo haga de forma automática.

Tuvimos dificultades para controlar la cámara a voluntad dentro del programa, por lo que se optó por mantenerla encendida por toda la duración del programa. Adicionalmente, para ir actualizando la imagen desplegada por pantalla de la webcam se implementó el programa con hilos. Una de las dificultades fue el uso de hilos con Qt.

Tuvimos unas dificultades al principio para pasar de detectar un rostro a la vez por frame a poder detectar todos los rostros presentes en la pantalla. Esto se terminó consiguiendo básicamente agregando iteraciones y recortes dentro del frame.

Tuvimos dificultades para dejar un registro de las personas que iba detectando el programa y mostrárselas al usuario. La solución que propusimos fue crear dos ventanas de las cuales la izquierda es lo que está viendo la cámara en tiempo real, y en la ventana derecha se ve la última imagen en que fue detectada una persona. De esta forma aparece la identificación de la persona y se puede ver su rostro. Una posible mejora sería buscar dentro de la base de datos una foto estándar de la persona reconocida y esa mostrarla en la ventana derecha.




Listado de bugs presentes

El programa asume que si es que se va a la fase de reconocimiento de rostros ya ha habido anteriormente al menos un entrenamiento, y por ende, al menos una persona en su base de datos. En caso de que el archivo Modelo.txt no existiese o si por alguna razón su contenido fuese borrado, el programa presentará un comportamiento erroneo.

El programa internamente hace una conversión de los datos ingresados en ROL (del tipo string) a tipo entero. En caso de ingresar un ROL con carácteres no numéricos el programa presentará error en tiempo de ejecución. Una posible mejora sería dejar esto dentro de una secuencia try-catch, o bien encontrar una forma alternativa para suplir la necesidad de aquella conversión.

Por alguna razón el programa actualmente se desorienta en presencia de una fuente intensa de luz directa. En general, los cambios de luminocidad en la imágen pueden traer dificultades para el reconocimiento. Para evitar este efecto se ecualizó la imagen y se llevó a escalas de grises. Sin embargo, una posible mejora sería la de emplear otro tipo de filtros que minimicen este problema.

Nuestra implementacion fue implementada y testeada en Qt. Por alguna razón al usar el qmake la funcionalidad del botón de cambiar de color verde a rojo al capturar rostro, en la fase de entrenamiento para decir si es que se puede o no capturar la imagen, se desactiva. Adicionalmente el botón deja de estar pintado, pero en vez de eso, el botón que puede ser seleccionado mediante "enter" se torna color marrón, siendo que en la plataforma de Qt los bordes se tornan azulados pero no así el botón entero. Para evitar esto se recomienda correr el programa desde la consola de Qt.




Compatibilidad

En este caso se usó C++ para el desarrollo del problema. En el caso del codigo visual se utilizó la version "Open Source" de QT versión 5.5.1 y Qmake versión 3.0. Además para la utilización en tiempo real de la cámara y posteriormente el reconocedor de caras, se utilizó la librería abierta OpenCV versión 3.4.1.

Cabe destacar que en versiones distintas a las indicadas es probable que el programa no funcione y se tenga que modificar código que no necesariamente abarque este curso.

El proyecto puede ser descargado desde aquí