lunes, 27 de mayo de 2013

Métodos de codificación. Compresión de imágenes.

Que tal gente, esta publicación corresponde a la ultima tarea de la clase de métodos de codificación, en esta ocasión se nos encargo realizar una implementación de un programa que fuera capaz de comprimir imágenes, en mi caso como ya había trabajado algo parecido en el laboratorio de clase de visión computacional, opte por reciclar parte del código y trabajar con la compresión mediante la transformada de onduleta (Wavelet).

Compresión y transmisión de imágenes.

Actualmente los dispositivos de captura de imágenes generan cada vez imágenes con mejor calidad, lo cual permite un mejor procesamiento de las mismas y obtener resultados mas exactos, el inconveniente llega a la hora la hora de almacenamiento o transmisión de dichas imágenes, ya que a imágenes de mayor calidad, imágenes de mayor peso. Debido a esto, es necesario emplear mecanismos de compresión ya sea para almacenar o transmitir este tipo de información.

Existen dos tipos de compresión de imágenes, con perdida o sin perdida, en la compresión con perdida la imagen resultante se ve afectada en cuanto a la calidad de detalle en relación a la original, aspecto que es directamente proporcional al porcentaje de compresión de la imagen, entre mas compresión, mayor sera la perdida de calidad de imagen.

La implementación o no de la compresión dependerá del fin del proceso, en ocasiones se debe priorizar la velocidad de transmisión, un ejemplo donde se puede ver esto fácilmente es cuando vas a google y quieres ver una imagen en su tamaño completo, inicialmente se ve algo pixeleada, pero no pasan mas de unos segundo cuando lo imagen ya se observa perfectamente bien, esto es porque los servidores envían la versión compresa de la imagen, y posteriormente mandan el detalle, visualmente parece que carga rápido, pero realmente hace la carga en dos pasos para evitar verse lento con imágenes grandes.

Teoria, Transformada Wavelet.

La transformada Wavelet básicamente es una función que es valida para ciertas condiciones especificas, es una variante de las transformadas de fourier, pero dado su modelo matemático este concepto está siendo llevado a muchos campos reinventando la forma de aplicación en relación a las transformadas de fourier, ahora se estudiara como se aplica esta transformada en la compresión de imágenes.

Como funciona?
Supongamos que tenemos una matriz de 8 x 8 como la siguiente:
En este caso se estudia la transformada "Haar" que es considerada la transformada wavelet mas sencilla.

El proceso se divide en dos pasos, la matriz se debe procesar por renglones generando una nueva matriz, misma que se procesara de la misma manera, pero ahora por columnas, el resultado final, sera la matriz de la transformada Wavelet.

Para cada renglón, lo que se hace es:
Se agrupan por pares de valores, para cada par se busca el promedio de ambos, y se almacena, entonces, si tenemos 8 valores, la siguiente fila tendrá esos 4 promedios al inicio, para completar el largo de la fila, lo que se hace es obtener la diferencia del promedio respecto al primer valor que genero dicho promedio, con esos 4 valores se complementa la fila, la fila resultante se vuelve a procesar de la misma manera. 

Las iteraciones de procesamiento para un renglón están regidas por la potencia de dos a la que es igual el numero de elementos de la fila, para el primer renglón de la imagen anterior, el resultado del proceso seria el siguiente:

Entonces, una vez obtenida la matiz resultante por renglón  se repite el mismo proceso pero ahora procesando por columnas, lo cual nos generara una matriz con los valores comunes empaquetados, ademas de generar los valores de detalle, mismos que son procesados para lograr la compresión.

Compresión.

Existen varias formas de lograr la compresión  el caso implementado es de los mas sencillos, ya que consiste en manipular los valores de la transformada obtenidos para que al momento de aplicar la transformada inversa, obtener una matriz con menor peso en bits que al final se vera reflejado en la imagen final.

Al aplicar la transformada sobre la matriz, se generan un conjunto de matrices, donde una de ellas contiene el "detalle" de la imagen, esta matriz es la que se va a modificar eliminando el detalle de menos peso, de la forma que se describe a continuación.

La compresión es bastante sencilla, lo que se hace es evaluar la matriz de detalle respecto a un valor umbral, lo que se trata de hacer, es quitar detalle de la imagen cuyo peso especifico este entre el rango del umbral, los valores se igualan a cero, al hacer esto la imagen resultante perderá peso en k's porque el peso lo generan todos los valores distintos de cero contenidos en la imagen, es cuestión de jugar con el valor umbral y ver que tanto se presta la imagen para hacerla mas ligera, si perder demasiado detalle, por lógica, entre mayor sea el umbral, mayor sera la compresión obtenida, pero también sera mayor el detalle perdido.

Como lo mencionaba antes, una vez que el detalle fue umbralizado, se aplica la transformada inversa, y el valor resultante sera la matriz de nuestra imagen resultante.

Código.

A continuación el código de la implementación.

Y ahora el script de gnuplot para las gráficas.

Pruebas.
Para las pruebas se hizo el ejercicio de probar el script múltiples veces (58) para cada imagen modificando el parámetro umbral, para así poder estudiar hasta que grado se alcanzaba compresion ademas de los tiempos de ejecución del sistema.

Prueba 1.
Tamaño: 128 x 128 px.
La imagen original es la siguiente:
La siguiente gráfica muestra la comparativa del porcentaje de compresión alcanzado en relación al umbral de compresión.

Como se puede observar en la gráfica, se logra una compresión bastante alta, misma que se alcanza con un umbral de 140 aprox. y se mantiene constante para valores mayores.


En la siguiente imagen gif si se presta atención se puede observar como la imagen resultante pierde detalle conforme el parámetro umbral aumenta.

Finalmente se muestra la captura de los pesos desde las propiedades de cada imagen, cabe mencionar un detalle detectado hasta apenas ahora, los valores que se muestran arriba, son porcentajes en relación a la imagen original, y en la evidencia de abajo se esta observando la imagen en escala de grises y la imagen resultante con umbral 300, el filtro de escala de grises automáticamente disminuye el tamaño de la imagen, por lo que es probable que no coincidan los valores de la gráfica con lo que se pudiesen calcular de la siguiente imagen:


Tiempo de ejecución del ciclo completo(58 imágenes) : 5.1019411087 segundos.

Prueba 2.
Tamaño: 256 x 256 px.
La imagen original es la siguiente:

La siguiente imagen muestra la comparacion porcentaje/umbral obtenido en las pruebas.
Se puede observar que se alcanza un máximo de compresión de 83% aprox, y se alcanza a partir del umbral 125 aprox. y se mantiene.


El siguiente gif muestra la perdida de calidad de la imagen conforme aumenta el valor umbral.
Se muestra en menor cantidad la perdida de detalle, esto debido a que el tamaño de la imagen aumento.


Finalmente se muestra los pesos y la evidencia de reducción desde las propiedades de cada imagen.

Tiempo de ejecución del ciclo completo(58 imágenes) : 18.5702998638 segundos.

Prueba 3.
Tamaño de la imagen: 512 x 512 px.
La imagen original es la siguiente:

La siguiente gráfica muestra la comparacion compresión/umbral de los valores resultantes.

Como se puede observar, para umbrales muy bajos en esta imagen la compresión es pésima  ya que incluso la imagen gana peso, en lugar de perder, esto se debe la naturaleza de la imagen y el tamaño, como se puede ver, en la imagen predominan los colores grises, al convertir a grises, el programa se confunde pensando que la imagen cuenta con aun mas detalle, por lo que se genera esta situación.

De todas maneras, a partir de un umbral 30-35 aprox, se empieza a normalizar el funcionamiento y a obtener ganancia, aunque el máximo valor obtenido es mucho menor en relación a las pruebas anteriores, con un 37% de compresión aprox. Aspecto que termina siendo proporcional, ya que la imagen es mucho mayor a la anterior, aunque se tenga menos porcentaje, son mas bits los que se logran perder en la imagen.


El siguiente gif muestra el deterioro de la imagen respecto a umbral.


Finalmente la evidencia desde las propiedades de imagen.

Tiempo de ejecución del ciclo completo(58 imágenes) : 71.8033628464 segundos.

Prueba 4.
Tamaño: 1024 x 1024 px.


Tiempo de ejecución del ciclo completo(58 imágenes) : 414.194577932 segundos.

Tiempos.

La siguiente imagen muestra el comportamiento de los tiempos de ejecución respecto a los tamaños de imagen:

Conclusiones.
En base a lo anterior se pueden deducir un par de cosas:
  • El tiempo de procesamiento aumenta considerablemente conforme aumenta el tamaño de la imagen.
  • Para imágenes grandes, es mejor manejar umbrales mayores, se logran perder mas bytes y la perdida de detalle tiene menos impacto.
  • Para imágenes pequeñas, en mejor manejar umbrales bajos, ya que para umbrales grandes, se pierde mucho detalle al grado de perder la estructura básica de la figura.

Bien, por mi parte es todo.

Saludos!

Referencias.
http://gtwavelet.bme.gatech.edu/wp/kidsA.pdf
http://www-scf.usc.edu/~hbalan/wavelets.pdf
http://www.iberchip.net/VIII/docs/posters/p13.pdf
http://www.pybytes.com/pywavelets/regression/dwt-idwt.html

domingo, 26 de mayo de 2013

Telecomunicaciones. Redes Sensoras.


Que tal gente, para esta actividad se realiza una pequeña reseña del documento "System Architectures for sensor networks Issues, Alternatives and directions" que se presenta a continuación.

System Architectures for sensor networks Issues, Alternatives and directions
Jessica Feng, Farinaz Koushanfar and Miodrag Potkonjak.

Introducción.

Las redes sensoras inalambricas son sistemas que se conforman de un un largo numero de nodos donde cada uno de ellos cuenta con un conjuntos de propiedades de entre las cuales destacan la capacidad computacional, capacidad de comunicación, almacenamiento, sondeo y recurso de actuación.

Las redes sensoras están descritas como aquellas que fungen como puente de conexión entre la parte física y la parte computacional de los sistemas.

Las redes sensoras están en constante estudio para buscar los modelos que aporten con mejoras de costo, poder, tamaño y margen de error. Cabe mencionar que el diseño y la arquitectura tanto de software como de hardware de las redes sensoras son los principales responsables del grado de eficiencia que esta pueda llegar a tener, el diseño tiene el principal impacto en el costo y mantenimiento de la red.

Algunos aspectos claves que se deben tener en cuenta al momento de modelar y diseñar una red sensora embebida son los siguientes:

Identificar los puntos de referencia.
  • El diseño de la arquitectura de la red tipicamente esta basado en los puntos de referencia establecidos como objetivos en la aplicación  establecer los objetivos y los puntos de referencia ayudan a determinar la naturaleza hacia la cual va orientada la aplicación.

Tomar en cuenta el potencial tecnológico.
  • Las redes sensoras embebidas suelen ser heterogéneas y complejas, es importante no subestimar las características del hardware, explotar al máximo sus capacidades tratando de relevar parte de las responsabilidad de eficiencia al diseño.

Diseño Balanceado.
  • Es importante lograr un sano balance en la arquitectura de la aplicación, saber donde puede repercutir mas el hecho de aplicar un esfuerzo de optimización.

Componentes fundamentales de uno Nodo.
Las redes sensoras embebidas se conforman de nodos que están en constante interacción, cada nodo cuenta con seis componentes o características fundamentales, las cuales son las siguientes:
  • Procesador
  • Radio de visión
  • Almacenamiento local
  • Sensores
  • Actuadores
  • Fuentes de alimentación

Para realizar mejor la comparativa y estimación de lo necesario de cada uno de los siguientes componentes, se pueden tomar en cuenta los siguientes aspectos:

Tamaño físico pequeño.
  • Un dispositivo físicamente pequeño es sencillo de transportar y reduce incidencias, es necesario realizar la comparativa de las capacidades de procesamiento y almacenamiento que proporciona en relación en su tamaño para realizar la selección correcta.

Poco consumo de batería.
  • El tiempo de vida del dispositivo es fundamental, es necesario que los sensores tengan la capacidad de mantenerse con vida por un periodo de tiempo considerable, ya que en las redes sensoras es de alto costo dar mantenimiento a estos dispositivos.

Concurrencia y capacidad de operación.
  • Para redes sensoras embebidas de gran tamaño es necesario contar con dispositivos con capacidad de soportar concurrencia ademas de poder soportar el procesamiento de operaciones robustas de manera simultanea, los nodos sensores deben de contar con la capacidad de auto medirse, para realizar tuneo de rendimiento, auto calibrarse para comunicación y posicionamiento mas exactos y auto repararse en caso de incidencias que maltraten el dispositivo.

Seguridad.
  • Los nodos deben de contar con mecanismos de seguridad para prevenir accesos no autorizados, ataques, o daño hacia la información que almacena el nodo.

Compatibilidad y Flexibilidad.
El costo del desarrollo de software impacta de manera directa en el costo del sistema en conjunto, es necesario construir software de tal manera que sea reusable para múltiples dispositivos, también es necesario que el software brinde características de flexibilidad que aporten un punto de ajuste medible en caso de ser necesario.


Redes celulares como redes sensoras inalambricas.



En esta arquitectura, cada base de operación se encuentra premeditada y cuenta con un radio que genera una cobertura en una parte del área  los nodos inalambricos móviles se pueden comunicar siempre y cuando estén dentro del área de cobertura de una base.

La comunicación requiere de un consumo de energía medio para los nodos móviles  y un consumo de energía bastante alto para los nodos estáticos, esto para lograr compensar el alto radio de cobertura que tienen y la capacidad de transmisión de bajo coste que facilitan.

Una vez que se esta definida de forma genérica la arquitectura de la red, se pueden definir los mejores candidatos a nodos móviles en base a las características que debe presentar que se han descrito antes.

Almacenamiento.
Este aspecto se puede evaluar de diversas formas, pero para el caso de este tipo de red, donde la información pasa casi de forma de inmediata de un nodo a otro, no es necesario contar con un gran porcentaje de almacenamiento, caso contrario a que si el escenario fuera lograr la menor taza de comunicación entre nodos, la capacidad de almacenamiento requerida seria necesario de forma considerable.

Fuente de alimentación.
Para este tipo de red es complicado evaluar este aspecto, ya que los nodos móviles serán regularmente equipos móviles donde podría decirse que se cuenta con un dispositivo de comunicación común y existen pocas o nulas variantes de carga, a diferencia de otro tipo de nodos, que son capaces de adaptarse a las fuentes de energía naturales para alimentarse. De todas formas, la capacidad de almacenamiento de energía va de la mano con la forma de transmisión de bajo coste.

Radios.
Este aspecto de evaluación va mas para el lado de los nodos estáticos, donde su radio de cobertura impactara directamente en la conexión entre nodos, los radios de cobertura regularmente son enormes, a tal grado que los nodos móviles tienen la facilidad de conectarse con múltiples nodos base al mismo tiempo, cosa que facilita acciones como la geolocalización  el radio también repercute aunque en menor medida a los nodos móviles  si capacidad de recepción esta definida por ese radio, y a mayor alcance, es necesario un consumo de energía mayor.


Conclusión y Critica.

Sobre el documento:
Me parece muy buena la redacción, desde mi punto de vista el documento puede considerarse como un punto de partida para aquellas personas que buscan apoyo al momento de diseñar la arquitectura de una red sensora, la forma en la que se lleva a campo la teoría que describe al inicio del documento, permite aterrizar la información para obtener un resultado mas entendible.

En general:
Las redes sensoras se están expandiendo hacia muchos campos de aplicación por su dinamismo y adaptabilidad, desde mi punto de vista, las consideraciones descritas antes son vitales para lograr un buen modelo e implementación, yo pienso que se debería de dar un peso ponderado a cada característica existente en el nodo, ya que para mi, existe un nivel de jerarquía donde hay características que son completamente dependientes de otras, el tiempo de vida de la batería es mucho mas relevante a mi parecer al radio o al tamaño del nodo, por decir un ejemplo. Esta podría ser una forma mas exacta de  definir los necesario según el momento que se desea implementar.

Bien, por mi parte es todo.

Saludos!

Referencias.
http://ieeexplore.ieee.org(n.f.)System Architectures for sensor networks Issues, Alternatives and directions[PDF]disponible en:

jueves, 23 de mayo de 2013

Labo Visión. Wavelets. Compresión de imágenes.

Que tal gente, esta entrada es correspondiente al laboratorio de visión computacional, se habla de waveletes y su aplicación en el procesamiento de imágenes.

Compresión y transmisión de imágenes.

Actualmente los dispositivos para captura de imágenes generan cada vez imágenes con mejor calidad, lo cual permite un mejor procesamiento de las mismas y obtener resultados mas exactos, el inconveniente llega a la hora la hora de almacenamiento o transmisión de dichas imágenes, ya que a imágenes de mayor calidad, imágenes de mayor peso. Debido a esto, es necesario emplear mecanismos de compresión ya sea para almacenar o transmitir este tipo de información.

Existen métodos para comprimir imágenes donde no se pierde información  y existen métodos donde si se pierde información, por información me refiero a detalle en la imagen, el proceso que se va a estudiar si genera algo de perdida de detalle durante el proceso, pero el nivel de compresión resultante es considerablemente bueno.

La implementación o no de la compresión dependerá del fin del proceso, en ocasiones se debe priorizar la velocidad de transmisión, un ejemplo donde se puede ver esto fácilmente es cuando vas a google y quieres ver una imagen en su tamaño completo, inicialmente se ve algo pixeleada, pero no pasan mas de unos segundo cuando lo imagen ya se observa perfectamente bien, esto es porque los servidores envían la versión compresa de la imagen, y posteriormente mandan el detalle, visualmente parece que carga rápido, pero realmente hace la carga en dos pasos para evitar verse lento con imágenes grandes.

Wavelets.

La transformada wavelet básicamente es una función que es valida para ciertas condiciones especificas, es una variante de las transformadas de fourier, pero dado su modelo matemático esta siendo lleva a mucho campos reinventando la forma de aplicación en relación a las transformadas de fourier, ahora se estudiara como se aplica esta transformada en la compresión de imágenes.

Como funciona?

Supongamos que tenemos una matriz de 8 x 8 como la siguiente:

El proceso se divide en dos pasos, la matriz se debe procesar por renglones generando una nueva matriz, misma que se procesara de la misma manera, pero ahora por columnas, el resultado final, sera la matriz de la transformada haar wavelet.

Para cada renglón, lo que se hace es:
Se agrupan por pares de valores, para cada par se busca el promedio de ambos, y se almacena, entonces , si tenemos 8 valores, la siguiente fila tendrá esos 4 promedios al inicio, para completar el largo de la fila, lo que se hace es obtener la diferencia del promedio respecto al primer valor que genero dicho promedio, con esos 4 valores se complementa la fila, la fila resultante se vuelve a procesar de la misma manera, realmente la cada renglón se procesa hasta obtener en la fila resultante un solo valor de promedio, la cantidad de veces a procesar esta regida por la potencia de dos a la que es igual el numero de elementos de la fila, para el primer renglón de la imagen anterior, el resultado del proceso seria el siguiente:

Entonces, una vez obtenida la matiz resultante por renglón  se repite el mismo proceso pero ahora procesando por columnas, lo cual nos generara una matriz con los valores comunes empaquetados, ademas de generar los valores de detalle, mismos que son procesados para lograr la compresión.

Compresión.

La compresión es bastante sencilla, lo que se hace es evaluar la matriz resultante respecto a un valor umbral, lo que se trata de hacer, es quitar detalle de la imagen cuyo peso especifico este entre el rango del umbral, los valores se igualan a cero, al hacer esto la imagen resultante perderá peso en k's porque el peso lo generan todos los valores distintos de cero contenidos en la imagen, es cuestión de jugar con el valor umbral y ver que tanto se presta la imagen para hacerla mas ligera, si perder demasiado detalle, por lógica, entre mayor sea el umbral, mayor sera la compresión obtenida, pero también sera mayor el detalle perdido.

Una vez que el detalle fue umbralizado, se aplica la transformada inversa, y el valor resultante sera la matriz de nuestra imagen resultante.

Código.

Uno de los aspectos mas fuertes de python es que tiene una cantidad inmensa de módulos, para esta tarea, se nos facilita la vida al hechar mano de dos librerías, se explotara la velocidad de procesamiento de numpy en conjunto con la librería pywavelets, la cual es capaz de realizar los cálculos de este tipo de transformadas de forma bastante rápida, lo cual nos permite enfocarnos directamente a la implementación.

Bien, el flujo del código es el siguiente:
  • Se carga la imagen.
  • Se aplica filtro escala de grises.
  • Se genera un array de numpy con los valores de cada pixel de la imagen.
  • Se obtienen las matrices resultantes y de detalle aplicando la transformada haar wavelet a la matriz con la ayuda de la pywavelets.
  • Se toman las matrices de detalle resultantes y se procesan con numpy para discriminar todos los valores que caen dentro del umbral establecido, convertiendolos a cero.
  • se genera un nuevo conjunto de coeficientes con las nuevas matrices de detalle y se aplica la transformada inversa para obtener los nuevos valores de la imagen.
  • Se procesa el array resultante para generar la imagen de salida en base sus valores.
  • Se ejecuta el proceso de evaluación, para comparar los pesos de imagen original y resultante y determinar el porcentaje de compresión obtenido.
El código no esta del todo limpio, pero las lineas comentarizadas sirven para ver y entender un poco mejor todo lo que hace esta librería por abajo antes de arrojarnos el resultado.


Pruebas.
Para las pruebas se ejecuto el script con diversos umbrales, para estudiar el grado de compresión y la calidad de imagen resultante, cabe mencionar que las imágenes tienen que ser de dimensiones potencias de dos.

Prueba 1.
Resultados.
Maximizar la imagen para apreciar como decrece la calidad de la imagen de salida conforme aumenta el umbral.


En las siguientes gráficas se observan las matrices de detalle para cada umbral, se logra apreciar como va disminuyendo el detalle conforme aumenta aumenta el umbral.

Detalle original.


Detalle umbralizado a 10.


Detalle umbralizado a 50.



Prueba 2.

Se puede observar, que para aun y cuando la imagen es del mismo tamaño a la anterior (256, 256) los resultado obtenido son menos eficientes respecto a la prueba anterior.


Aquí se aprecia un poco mas la perdida de detalle, esto porque se manejan umbrales mayores. Aun así  el nivel de compresión no es bueno respecto a la prueba anterior. depende también del nivel de detalle de la imagen original.

Bien, por mi parte es todo.

Saludos!

Fuentes:
http://gtwavelet.bme.gatech.edu/wp/kidsA.pdf
http://www-scf.usc.edu/~hbalan/wavelets.pdf
http://www.iberchip.net/VIII/docs/posters/p13.pdf
http://www.pybytes.com/pywavelets/regression/dwt-idwt.html

lunes, 20 de mayo de 2013

Labo Ubicuo. Retroalimentación a proyectos de compañeros.

Que tal gente, en esta ocasión se realizara la retroalimentación a los proyectos presentados por los compañeros.

Alarma Inteligente.

Buen proyecto a mi parecer, me agrado la forma en que llevaron las pruebas de concepto al plano real, yo creo que seria cuestión de mejorar la integración  que fuese un poco mas detallada, para obtener un producto final de buena calidad.

Computadora Inteligente.

En conclusión me parece un muy buen proyecto, personalmente creo si compraría la aplicación  aunque insisto en que no es necesario y no se debería dar retroalimentación al usuario, es decir, que el sistema funcione por abajo y no sea perceptible al usuario, al manejarlo de esta forma es mas fácil evitar que potenciales intrusos se den cuenta de la presencia del sistema.

Me parece bien la funcionalidad de suspensión del equipo y reinicio de sesión, aunque también debería tener una funcionalidad que automáticamente cierre tu sesión de Facebook cuando te vallas.

Localizador de personas.

Es un buen proyecto, yo mejoraría un poco la interfaz de la aplicación  y ademas buscaría variantes de conexión  el bluetooth es bueno, pero consume bastante batería, cosa que podría restringir el uso de la aplicación o el interés hacia la misma.

Galería Inteligente.

No tengo nada que agregar, solo que me gustaría ver este sistema en una implementación real.

Cama inteligente.


Me gusto mucho la aplicación  puede ser de gran utilidad, yo recomendaría eliminar la dependencia de android y hacer un prototipo real para evaluar la aceptación de los usuarios.

También seria bueno que el sistema determine en que fase de sueño se encuentra el usuario para despertarlo cuando sea optimo, sin pasarse de la hora de alarma.


Auto Inteligente.

Creo que fue un muy buen proyecto, lamentablemente no fue terminado completamente pero de cierta forma es aceptable ya que su proyecto era demasiado grande, aunque lograron sacar la mayoría de los módulos propuestos, la integración de todo siempre resulta un problema que puede provocar cambios en los módulos, Etc.

Me gustaría bastante saber mas a detalle como funciona esa conexión arduino - android por puerto dedicado, no había visto ese tipo de conexión anteriormente y pienso que podría ser de gran utilidad para proyectos futuros.

Garage Inteligente.

Aplicación muy completa, se aprecia que funciona de manera intuitiva y no es muy complicada, la parte de los códigos QR me parece bastante agradable e innovadora, realmente no hay mucho que decir a mi parecer sobre este proyecto.

Saludos!

Labo Ubicuo. Borrador Plan de Negocio. Oficinas Inteligentes.

Que tal gente, en esta entrada se describe un borrador del plan de negocio para nuestro sistema ubicuo de automatización de oficinas inteligentes.

OFICINAS INTELIGENTES.

Idea.
Establecer una compañía que ofrezca soluciones de automatización de ambientes laborales de oficina, innovadores y de bajo de costo para los clientes, con la posibilidad contar con sistemas embebidos escalables para la implementación de nuevo módulos en el futuro.

Justifación.
Los sistemas inteligentes existen desde hace mucho tiempo, pero particularmente en nuestro país tecnologías de este tipo están resagadas, se busca ser una empresa que funja como pionera en la incursión de este tipo de sistemas en el país.

Accionistas.
Inicialmente estaría compuesto por los elementos del grupo de desarrollo, lo que se buscaría seria producir una compañía de software que ofrezca soluciones a cualquier tipo de problemática, teniendo como base un conjunto de proyectos estandarte donde el sistema de oficinas inteligentes estaría integrado.

Misión. Oficina Inteligente.
Nuestra misión es ofrecer un sistema inteligente que se ocupe de brindar a los usuarios un ambiente de confort y fácil manejo durante el trabajo, ademas de ofrecer a los administradores un completo sistema de acceso a usuarios, seguido de un sistema de tuneo y auditoria agradable a la vista y fácil de manejar.

Objetivos.
Corto plazo.

  • Implementar sistemas de calidad, escalables y económicos.
  • Ganarse un espacio en el mercado de software.
  • Mantenerse en constante innovación.
Largo plazo.

  • Trabajar de la mano con tecnologías innovadoras para continuar en constante crecimiento.
  • Crear sistemas cada vez mejores.
  • Crear una empresa reconocida y de prestigio.

Producto.
Un sistema ubicuo que automatiza acciones de control en un entorno de oficina mediante reglas de negocio regidas por módulos sensores, un sistema de control de acceso con una tecnología de visión artificial innovadora, y un sistema escalable con la capacidad de expandirse en base a las necesidades del usuario.

Visitar el siguiente enlace para conocer un poco mas sobre los aspectos de diseño y construcción del sistema.

Clientes.
El cliente potencial es:
  • Todo aquel corporativo empresarial que no cuente con un sistema de este tipo.
  • Micro Empresas que busquen atraer clientela mediante la innovación en sus instalaciones.
  • El mercado queda abierto al alcance predispuesto por nuestra parte, la sede de la compañía seria esta misma cuidad, la cual es una capital industrial y con un catálogo muy amplio de potenciales clientes.

Competencia.
Hasta el momento, no se han encontrado empresas que ofrezcan un sistema con características similares a las del sistema que nosotros proponemos, aun así  ya se han encontrado corporativos que cuentan con este tipo de sistemas los cuales fueron obtenidos mediante proveedores extranjeros, por lo que la competencia directa serian las empresas extranjeras que exportan sus productos hacia nuestro país.

Fortalezas, Oportunidades, Debilidades y Amenazas.

Fortalezas.
  • Sistemas económicos.
  • Empresa emprendedora, en constante evolución e innovación.
  • Orientados al servicio del cliente.

Oportunidades.
  • Crecimiento por demanda.
  • Falta de competencia de forma local.
  • Tecnología en constante innovación.

Debilidades.
  • Empresa recién fundada.
  • Poca o nula credibilidad.
  • Poca experiencia en trato y manejo de clientes.

Amenazas.
  • Surgimiento de nuevas empresas orientadas a lo mismo.
  • La generalización de este tipo de sistemas por parte de monopolios (Google, Microsoft, Etc.)

Plan de ventas.

La idea seria tener dos formas de relación con el cliente.

Venta directa.
El cliente se hace del sistema, el cual le incluye un tiempo definido de mantenimiento y atención personalizada, posterior a ese tiempo, cada consulta o mantenimiento tendrá un costo.

Programa de Partners.
El cliente a cambio de una retribución anual, se afilia como partner de la empresa, lo cual le permite obtener paquetes de software a precios mas bajos, queda inscrito en el programa de beta testers, lo cual le permitirá probar los sistemas que constantemente se estén liberando, y ademas podrá fungir como intermediario de ventas para nuestro productos con terceros.


Saludos!

Referencias.

(n.d)Ejemplo de un plan de negocios.[En Linea]Disponible en:

(n.d)How to write a business plan.[En Linea]Disponible en:

Labo Ubicuo. Retroalimentacion de nuestro proyecto.


Que tal gente, en esta entrada se hablara un poco sobre nuestro proyecto para la clase de computo ubicuo, se dará una retroalimentación personal sobre lo logrado, lo que falto, las mejoras a futuro desde el punto de vista personal.

Cual fue el proyecto?

El proyecto trata básicamente de un sistema de automatización de una oficina, el cual tiene como objetivo fungir como un control de accesos, implementando un sistema de reconocimiento facial, ademas de facilitar las acciones de control de iluminación y temperatura en base a sensores externos. Todo administrado y visualizado a través de un aplicativo web.

EL sistema usaría como llaves de acceso un llave compuesta por un token (Tag RFID o NFC) y las características faciales de cada usuario, y cada acceso del usuario queda registrado en una base de datos, esto con la finalidad de llevar una auditoria de puntualidad de los usuarios o intentos de violación del sistema.

Aportes personales.

En este proyecto colabore con parte del diseño del modelo conceptual de la solución y a partir  de ese modelo, se generaron cuatro actividades macro de prioridad alta, ya que no se había trabajado anteriormente con las tecnologías, los módulos son los siguientes:

  • Control de accesos por NFC.
  • Control de accesos por RFID.
  • Comunicación entre sistemas embebidos mediante XBEE
  • Aplicativo Web.
Dado que somos cuatro integrantes, cada uno de nosotros tomo una de las actividades, en mi caso, me toco trabajar con el control de accesos mediante NFC, cuya idea principal era escribir una aplicación android background que mediante el NFC del teléfono  leyera el tag de acceso de la oficina y realizara la solicitud de acceso al sistema.

Ademas de esto, se escribió el modulo de reconocimiento de rostros como un proyecto paralelo para otra clase, mismo que actualmente esta implementado por el modulo de acceso RFID.

Que falto hacer?

Dentro de mis actividades personales, falto cubrir la parte de la aplicación android, la aplicación existe, el web service que es consumido también, el problema surgió al momento de trabajar con el componente NFC del teléfono, hasta la fecha no se lograron resultados satisfactorios.

En cuanto al proyecto global, estaba planeado construir una aplicación web que permitiera a todos los usuarios que tienen acceso a las oficinas visualizar los valores de tuneo generados por el sistema, ademas de permitir al administrador del sistema modificar los parámetros de configuración desde el mismo aplicativo, actividad que no fue cerrada tampoco.


Adelantos.

Este aspecto no aplica en nuestro caso, ya que las actividades propuestas inicialmente fueron las suficientes para trabajar durante el periodo completo en el sistema, aunque desde mi punto de vista, escalar un poco el proyecto nos hubiera facilitado una mejor construcción y optimización de los módulos planteados.


Lecciones Aprendidas.

En este proyecto como en todos los desarrollados durante este semestre ocurren situaciones que sirven de experiencia para el momento de volver a trabajar en un proyecto, en este proyecto en particular surgen algunas cuestiones que se describen a continuación.

Aspectos a tomar en cuenta para la próxima:

No asumir que se conoce completamente una tecnología.

Un error critico, fue asumir que se tenia el conocimiento necesario para realizar una actividad especifica, quitando de la planeación el tiempo necesario para investigar y realizar pruebas de concepto sobre la actividad, cosa que repercutió de manera considerable al momento de la construcción, ya que se desperdicio mucho tiempo aprendiendo y tratando de implementar algo que se suponía ya conocíamos y no requeriría de tiempo. Es buena idea dejar siempre algo de tiempo dedicado a la investigación y pruebas de las diversas tecnologías a implementar antes de la construcción.

La teoría no es lo mismo que la practica.

Otro detalle que se presento fue que en la planeación se modelo un proceso en base a algo de lectura teórica sobre la tecnología, el problema surgió que para nuestro caso, (Hablando específicamente de los módulos de comunicación XBEE) la forma en que se quería implementar dicha tecnología generaba conflicto con la funcionalidad de otros procesos, en teoría la implementación estaba correcta, pero en el aspecto practico nos genero inconvenientes al grado de tener que remodelar el proceso.

Mas compromiso y mas responsabilidad.

Son aspectos que siempre deben ir a mas cuando se trabaja en equipo, al final de cada proyecto se puede decir que su hubiera logrado un mejor producto, o un valor agregado, si se hubiese mostrado mas responsabilidad y compromiso con el proyecto de cada uno de los integrantes del equipo.

Trabajo en Equipo y colaboración.

Creo que en este proyecto trabajamos de forma correcta como equipo, distribuyendo las actividades de forma equitativa y apoyando a los compañeros cuando la situación se complica, como en todo equipo de trabajo, se presentaron diferencias por formas de trabajo, Etc. Pero es parte del proceso.

Si se tuviese que mencionar algún aspecto a mejorar en cuanto al trabajo de equipo, yo propondría que existiera mas debate al momento del diseño y planeación, aveces por temor o por simple facilidad el equipo regularmente respalda y apoya la primer idea surgida, lo cual aveces lleva a problemas ya que la idea no era completa, o estaba mal encaminada, Etc. Si todos hicieran propuestas y defendieran su punto de vista, probablemente entre todos se llegaría a una solución compuesta superior a todas las ideas individuales.

Rendimiento personal y colectivo.

En cuanto al rendimiento colectivo creo que fue aceptable aunque no se cerraron completamente todas las actividades. En cuanto al rendimiento personal, también que creo que fue aceptable aunque me encuentro inconforme con lo logrado, ya que de haber organizado mejor mis tiempos personales de actividades, hubiera sacado todas mis actividades a tiempo y hubiera podido apoyar a los compañeros para obtener un mejor producto final, pero bueno, al final todo queda en experiencia para proyecto futuros.

Bien, por mi parte es todo.

Saludos!

jueves, 16 de mayo de 2013

Labo Vision. Intento detección Movimiento.

Que tal gente, para el laboratorio de esta semana se nos encargo realizar un programa que detectar movimiento. A continuación les presento mi intento.

Como funciona?

El flujo del programa es el siguiente:

Un loop que esta obteniendo constantes frames de la camara web.
Para cada frame:
  • Redimensiona para procesar mas rapido - OpenCV
  • Convierte a escala de grises - Con librería propia
  • Obtiene bordes - Con librería propia
  • Obtiene diferencias entre bordes del frame actual y el frame referencia (frame anterior) - propia
  • Pinta resultados y cámaras de salida 

El loop siempre trae en memoria el frame anterior sobre el cual se realiza la comparacion, para este laboratorio se hecho mano de OpenCV, pero solamente para cargar los frames a través de la cámara web, lo demás esta hecho a mano en base a ejercicios anteriores. Alli el porqué de la ineficiencia.

Código.

A continuación el código.

Pruebas.
A continuación se muestra un vídeo que demuestra el pseudo-funcionamiento, se puede observar en pantalla como el vídeo de salida esta redimensionado y solo esta mostrando los cambios en los bordes encontrados en los dos frames actuales, por eso cuando ya no hay movimiento, en la salida se ve casi oscuro, porque no hay pixeles con movimientos, la poca fluidez de la salida se debe al tiempo de procesamiento de mis funciones, pero a mi parecer la fluidez esta semi aceptable.



Bien, por mi parte es todo.

Saludos!

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!