Notas de la semana
La reunión inicial correspondiente a esta semana se llevó a cabo el día 30 de enero de 2014.
Las observaciones realizadas a los avances realizados fueron:
- Poner en rojo o dar algún otro formato a las partes que se están redactando
- Reordenar las secciones del capítulo 2
- Agregar la bibliografía
- Dar formato a la redacción (negritas, cursivas, preguntas y listas)
- Revisar la hipótesis y objetivos, la redacción debe ser mas breve y clara
- Verificar ortografía
Evidencia de la tercer semana:
- Redactar una entrada en el blog con los avances realizados durante la semana. (1 punto)
- El tercer avance de código consistió en separar el hilo de la interfaz de los procesos de detección para mejorar el desempeño del sistema. (4 puntos)
- El tercer avance de redacción de tesis consistió en redactar los antecedentes de la tesis (4 puntos)
- Reunión final agendada para el día 07 de febrero de 2014 (1 punto)
Avances de la redacción tesis
Para esta semana se comenzaron a redactar los antecedentes de la tesis.
En la sección de antecedentes se introduce a los lectores todos aquellos conceptos y términos que le permitirán comprender mejor de lo que se esta hablando en el proyecto de tesis.
En la sección de antecedentes se introduce a los lectores todos aquellos conceptos y términos que le permitirán comprender mejor de lo que se esta hablando en el proyecto de tesis.
Para la redacción de la tesis consideré los siguientes antecedentes:
- Realidad Aumentada
- Lentes de realidad aumentada
- Visión computacional
- Reconocimiento de características y patrones (Feature detection)
- Puntos clave y descriptores (keypoints, descriptors)
- Algoritmos de reconocimiento de características
- SURF
- SIFT
- Programación de software
- Python
- Numpy
- OpenCV
Avance en código
Los avances pueden encontrarse en el repositorio: https://github.com/jcespinosa/EcoGlasses
Conforme de avanzó en la detección y clasificación de logotipos se detectaron problemas con la interfaz.
El problema encontrado fue que tanto la interfaz como el proceso de detección/clasificación corrían en el hilo principal por lo que cuando la detección/clasificación tomaba mucho tiempo o recursos todo el sistema se trababa o en el peor caso finalizaba.
La solución implementada fue modelar el sistema en dos hilos separados, un hilo para la interfaz y un hilo para la detección. A pesar que la solución suena simple en realidad hay que reestructurar algunas partes del código y agregar un poco más de complejidad.
Primero se separó el código en dos partes, todo el proceso de preparar y dibujar la interfaz de un lado, y el proceso de detectar y clasificar en otro.
El proceso de detección/clasificación abarca los siguientes puntos:
El objetivo fue comunicar ambos hilos, para ello se utilizó la librería Queue en python.
Se dejó que la interfaz corriera en su propio hilo (mainloop), retirando cualquier componente que la comunicara directamente con el proceso de detección. Posteriormente al hilo se le agrego una cola de peticiones (queue) y una función processQueue que imita un escuchador de eventos (event listener). La función verifica cada cierto tiempo si hay algun elemento en la cola de peticiones, si no lo hay entonces espera hasta la siguiente oportunidad, si hay algún elemento lo extrae y lo procesa. Los elementos en la cola son eventos representados por un diccionario con el siguiente formato:
Donde se especifica lo que la interfaz debe realizar y los argumentos necesarios para llevarlo acabo, en este caso, el evento le indica que debe actualizar la captura (frame) de la vista y el único argumento necesario es la captura misma que es regresada por el hilo de detección.
El hilo de detección lo que hace es procesar la captura y colocar esa captura en forma de un evento en la cola de peticiones y la interfaz se encargará de procesar ese evento después.
Conforme de avanzó en la detección y clasificación de logotipos se detectaron problemas con la interfaz.
El problema encontrado fue que tanto la interfaz como el proceso de detección/clasificación corrían en el hilo principal por lo que cuando la detección/clasificación tomaba mucho tiempo o recursos todo el sistema se trababa o en el peor caso finalizaba.
La solución implementada fue modelar el sistema en dos hilos separados, un hilo para la interfaz y un hilo para la detección. A pesar que la solución suena simple en realidad hay que reestructurar algunas partes del código y agregar un poco más de complejidad.
Primero se separó el código en dos partes, todo el proceso de preparar y dibujar la interfaz de un lado, y el proceso de detectar y clasificar en otro.
El proceso de detección/clasificación abarca los siguientes puntos:
- Comunicar la webcam y detectar errores con la comunicación con el hardware
- Tomar las capturas de la webcam
- Preprocesar las capturas y pasarlas al proceso de clasificación
- Realizar una copia de la captura y dibujar en ella puntos o algún otro indicador de que se ha encontrado algo relevante.
- Si se detecto algo entonces regresar la copia de la captura, si no entonces se regresa la captura original.
El objetivo fue comunicar ambos hilos, para ello se utilizó la librería Queue en python.
Se dejó que la interfaz corriera en su propio hilo (mainloop), retirando cualquier componente que la comunicara directamente con el proceso de detección. Posteriormente al hilo se le agrego una cola de peticiones (queue) y una función processQueue que imita un escuchador de eventos (event listener). La función verifica cada cierto tiempo si hay algun elemento en la cola de peticiones, si no lo hay entonces espera hasta la siguiente oportunidad, si hay algún elemento lo extrae y lo procesa. Los elementos en la cola son eventos representados por un diccionario con el siguiente formato:
{ event: "update_frame" args: [frame_object] }
Donde se especifica lo que la interfaz debe realizar y los argumentos necesarios para llevarlo acabo, en este caso, el evento le indica que debe actualizar la captura (frame) de la vista y el único argumento necesario es la captura misma que es regresada por el hilo de detección.
El hilo de detección lo que hace es procesar la captura y colocar esa captura en forma de un evento en la cola de peticiones y la interfaz se encargará de procesar ese evento después.
Esto es una muy buena aproximación que en un futuro permitirá agregar otro tipo de componentes en la interfaz que podrán ser modificados de esta forma, agregando otros hilos y funciones adicionales.
Como siguiente punto también se trabajó con las eco-etiquetas compartidas en la carpeta del proyecto en Dropbox, se extrajeron sus descriptores y keypoints.
La semana pasada se estuvo analizando el efecto de girar los logotipos para ver si el clasificador seguía dando resultados, sin embargo, se siguen teniendo problemas con la detección. La idea es abordar mejores opciones que un matcher o clasificador ya que cuando la cantidad de datos a utilizar es muy grande estas opciones tienden a consumir mucho tiempo y recursos de procesamiento y los resultados no siempre son los esperados.
Avances para la siguiente semana
Los avances en la redacción de la tesis serán buscar algunos trabajos relacionados con el proyecto.
Los avances en código a realizar son:
Los avances en código a realizar son:
- En lugar de procesar todo el frame de la cámara, se procesará solo una parte del mismo. Se deberá alinear el logotipo que se desea detectar con una zona marcada en la interfaz, esto con el fin de optimizar la detección y disminuir en gran medida el ruido.
- Se investigara sobre el concepto BoW (Bag of Words), un método utilizado en la detección de palabras clave en texto, la variante Visual BoW es una variante aplicada a la detección y búsqueda de patrones en grandes cantidades de imágenes.
No hay comentarios:
Publicar un comentario