jueves, 16 de mayo de 2013

Visión Computacional. Reporte Proyecto Final.

Que tal gente, esta entrada corresponde al reporte del proyecto final de la clase de visión computacional, se describen a grandes rasgos los aspectos principales del sistema.

A continuación la presentación.


Proyecto.
Validación de rostros.

Que es?
Básicamente es un modulo que complementa un sistema de seguridad, el cual tiene dos funciones macro, registrar un usuario, y validar  un usuario, ambas funciones se basan en las capturar el rostro del usuario y generar un patrón de características en base a distancias de puntos biometricos definidos.

Se supone, que cada persona cuenta con características faciales que pueden conformar un conjunto único de valores, el sistema presentado funciona en base al calculo y evaluación de las distancias calculadas en los siguientes puntos.

  • Distancia entre los centros de los ojos.
  • Distancia entre el centro de cada ojo y el centro de la nariz.
  • Distancia entre el extremo posterior del ojo con el extremo de los labios correspondiente.
  • Distancia entre el extremo interior del ojo con el centro de los labios.
  • Distancia entre el centro de la nariz y el centro de la boca.


En la imagen de la derecha se pueden visualizar un poco mejor las distancias que son estudiadas en la imagen capturada, cabe mencionar que para obtener un resultado satisfactorio, las imágenes debe cumplir algunas características como tener una dimensión definida (130px, 130px), estar en escala de grises, esto con la finalidad de tiempos de procesamiento menores, y el rostro debe estar lo mas centrado posible en la imagen y mostrarse en su totalidad.

Pero antes de entrar en materia, se describe el porque el proyecto.

Justificación y Planificación.

El sistema como ya se menciono antes, complementa un sistema de acceso de usuarios a una oficina existente, donde la llave principal de acceso es un token ya sea RFID o NFC que es única para cada usuario. 

Problema?
El problema surge entendiendo que el token no es una llave lo suficientemente robusta para controlar el sistema, por esta puede manipulada, refiriéndose a que un usuario no autorizado podría hacerse de un token y con eso tener acceso total al sistema.

Propuesta.
En base a lo anterior, se propone mediante este software la creación de una llave de acceso compuesta, donde ademas del token único por usuario, esta llave contendría también las características faciales del usuario, mismas que no pueden ser manipuladas y también son únicas por usuario si se manejan como un conjunto vector. 

Entonces el sistema lo que hace es obtener el rostro del usuario que desea acceder y obtiene el conjunto de características faciales obtenidas previamente para validar que el usuario que uso el token, sea precisamente el usuario asignado a dicho token. Con esta validación se soluciona el problema descrito antes, aunque un usuario no autorizado se haga del token, el sistema no le dará acceso porque sus características faciales no corresponden con las del usuario registrado.


Diseño el software.

La siguiente imagen es una implementación de la arquitectura actual del software.


El sistema esta encapsulado en el modulo oi-Seguridad, el cual es un modulo de python que facilita los proceso mediante la clase Seguridad, contenida en el script con el mismo nombre. a continuación se define la estructura de archivos.

Descripción de clases.

Modulo oi-Seguridad.
  • Seguridad. Contiene las dos funciones principales del sistema, generar las características faciales del usuario y validar el mismo.
  • Utilerias. Contiene todo el trabajo pesado, las funciones para obtener las capturas de las cámaras  y el proceso para realizar a la imagen el proceso de matching con las cascadas xml y obtener los planos de los elementos de la imagen.
  • Properties. Clase que encapsula todas las constantes que se usan en el sistema, esto con la finalidad de que cuando sea necesario realizar un cambio, cambiar solamente el valor en ese archivo y no tener que buscar el parámetro en todos los scripts e ir modificando uno por uno.
  • PuntosBiometricos. obtiene las posiciones de los elementos detectados mediante las cascadas y genera todo el conjunto de coordenadas necesarias para calculas las características faciales, para cada objeto, detecta el centro del mismo, y los valores extremos internos y externos para X de cada elemento, con Y a nivel del centro del elemento.

Algoritmos. Flujo del proceso.

Realmente no se implemento ningún algoritmo tal cual, la implementación surge a partir de una que se fue construyendo en base a diversas lecturas relacionadas al tema.

Proceso. Registra usuario.
Descripción.
Recibe el token del usuario. el objetivo es generar las características faciales del usuario y anexarlas al token.
Pre condiciones.
Obtener un token no asociado a otro usuario.
Flujo del proceso.
Se obtiene el token.
Se capturan una cantidad X definidas en el archivo properties de imágenes del usuario y se almacenan de forma temporal en el sistema.
Se itera sobre las imágenes  para cada imagen, detecta inicialmente el rostro, recorta la imagen en las coordenadas encontradas, la re dimensiona a un tamaño de 130 x 130 y la convierte a escala de grises, para optimizar tiempos y procesos. Después aplica un match con las diversas cascadas de detección  esto con la finalidad de encontrar los ojos, la boca y la nariz, en base a estas coordenadas se calculan las distancias en los puntos descritos al inicio y se generar un objeto de características correspondiente a la imagen, mismo que almacenado al vuelo para su procesamiento mas adelante.
Una vez que se obtienen todos las características  se iteran para ir promediando y obtener un solo vector final, mismo que se agrupa al token anexado.

Proceso. Validar usuario.
Descripción.
Determina si el usuario que esta en cámara es el usuario correspondiente al token que disparo el proceso.
Pre condiciones.
El token que dispara el evento debe tener en el sistema algún vector de características asociado.
Flujo.
Se obtiene el token del usuario, después se obtiene el vector de características de usuario correspondiente a ese token, posteriormente se toma una fotografía del usuario que se desea loguear, y procesa la imagen para obtener sus características  finalmente se hace la comparacion de los vector de características y se toma la decisión del proceso en base a un conjunto de parámetros umbrales, cantidad de coincidencias necesarias, umbral de variación, etc.


Codigo.

Librerias.
El sistema esta escrito en python, y aprovechando su gran catálogo de módulos, se hecho mano de dos librerías:

  • PIL. Visualización y manipulación de imágenes.
  • OpenCV. Uso de la cámara web y explotar la funcionalidad de detección de objetos mediante cascadas.

Enlaces.
El código se encuentra en los repositorios de github, en el siguiente enlace:

Y también se encuentra en el package index de python, en la siguiente dirección:

El modulo cuenta con una licencia de uso libre, y en ambas paginas cuenta con un archivo README que especifica las dependencias del sistema con otras liberias e indica como realizar la configuración.

Pruebas.

Tiempo.
Se realizaron pruebas de tiempo al proceso para registrar el usuario, variando la cantidad de imágenes que captura para generar el vector, los resultados fueron los siguientes:

Proceso con 5 fotografías - 4.7 segundos
Proceso con 20 fotografías - 17.0 segundos.

























Como se puede observar los tiempos no son buenos, esto se debe a que el sistema carga la cámara la abre, toma la imagen y se cierra para cada imagen, provocando un retraso.

Funcionalidad.

Se realizo la prueba para ver que tan bien funcionaba registrando mi rostro como usuario y después tratando de validarme, lo cual fue correcto, después se realizo el ejercicio de tratar de validar pero con otra persona y el resultado fue invalido, lo cual para ejercicio también fue correcto.

 Usuario Valido.













Usuario Invalido
La salida se genera en base a base a valores umbrales de configuración, ya que dependiendo del contexto de la cámara, los  resultados que se generan pueden variar.

Planes a futuro. Mejoras.

En base a todo lo descrito antes, se detectaron algunos puntos críticos que deben ser considerados para optimizar el funcionamiento:

Eliminar las dependencias de XML.
Validar que los objetos que detectan las cascadas sean los elementos que se buscan, realizar una búsqueda especifica sobre el área identificada para obtener las coordenadas exactas de cada objeto.

Optimizar Entrenamiento.
El sistema ahora no aprende, no es mas que un promedio generado con todas las características faciales de todas las fotos que tomo, esto funcionaria bien se se tomaran una gran cantidad de fotos, pero eso cuesta, lo idea es aplicar una red neuronal con los vectores de cada imagen, hasta obtener los pesos específicos que son óptimos para cada usuario.

Agregar mas criterios de comparacion.
Esto con la finalidad de agregar pesos ponderados a cada una de las validaciones y así obtener un sistema con mas exactitud.

Una vez considerado lo anterior, se planea modular el sistema de forma distribuida con la finalidad de obtener procesamiento y toma de decisiones lo mas cercano al tiempo real y que el sistema sea capaz también de manejar múltiples puntos de acceso, cosa que no soporta actualmente.

Conclusiones.

En conclusión se puede decir que es una idea buena, tal vez no implementada de la mejor manera, pero con una gran área de oportunidad, ya que la seguridad es un punto vital en cualquier sistema, y si el modulo es optimizado como se menciono antes, cualquier sistema tendría un valor agregado al serle implementado.

Bien, por mi parte es todo, dudas comentarios o sugerencias abajo.

Gracias por su tiempo.

Saludos!

2 comentarios:

  1. Revisa bien la ortografía del reporte antes de que toque calificarlo. Sería bueno limpiar los archivos respaldo ~ del repositorio. Van 10 pts por la presentación.

    ResponderEliminar
  2. El reporte tiene algunos detalles de ortografía. 9 pts.

    En el readme hubiera esperado los datos de contacto del autor. El tar.gz contiene algunos archivos de basura; además hubiera sido bueno poder ver el código tal cual desde el repositorio. Se pudiera haber comentarizado más el código. 8 pts por el repositorio.

    ResponderEliminar