domingomery / patrones

Curso Reconocimiento de Patrones - UC - Chile
https://domingomery.ing.puc.cl/teaching/patrones/
143 stars 39 forks source link

Tarea 01 #7

Closed domingomery closed 4 years ago

domingomery commented 4 years ago

Por favor hacer comentarios aquí. Respondo todas las preguntas siempre y cuando no las haya aclarado en clases o no estén escritas en el enunciado de la Tarea. Saludos. Domingo

VicenteVicente commented 4 years ago

¡Hola!, quería consultar qué librería recomendaría para la extracción de características en la Tarea 01.

Gracias!

domingomery commented 4 years ago

Hola Vicente, puedes usar solo funciones de procesamiento de imagenes (input = imagen, output = imagen). No esta permitido usar librerias de extraccion de caracteristicas, la ideas es que estas funciones las implementes tú mismo. Saludos. Domingo

lsvargas commented 4 years ago

@domingomery entonces se podrían usar las funciones de la librería scikit-image que permiten: transformar a escala de grises, identificar las letras y luego calcular cosas como area, perímetro, centroide, etc.. ?

domingomery commented 4 years ago

@domingomery entonces se podrían usar las funciones de la librería scikit-image que permiten: transformar a escala de grises, identificar las letras y luego calcular cosas como area, perímetro, centroide, etc.. ?

se puede usar sólo funciones en las que el input es una imagen y el output es una imagen, no se puede usar librerías que calculen características.

domingomery commented 4 years ago

Hola! Con respecto librerías y funciones que se pueden ocupar, tengo una duda con la detección de cada carácter. La idea sería poder extraer una imagen para cada letra y mi duda es si esta separación se puede hacer con una librería o nosotros tenemos que buscar la forma de separarla viendo separaciones entre arrays o cosas del estilo (en el fondo si esta parte es parte del procesamiento).

Gracias!

se puede usar librerías de segmentación para separar cada uno de los caracteres

SarahEverke commented 4 years ago

¿Qué librerías de segmentación recomienda para python?

domingomery commented 4 years ago

¿Qué librerías de segmentación recomienda para python?

se puede usar por ejemplo scikit-image, pero insisto sólo funciones en las que el input es una imagen y el output es una imagen, no se puede usar de esta librería que calculen características

fprebolledo commented 4 years ago

En ese caso se puede usar funciones que calculen bordes, pero solo usarlas para recortar las imagenes ?

domingomery commented 4 years ago

En ese caso se puede usar funciones que calculen bordes, pero solo usarlas para recortar las imagenes ?

puedes usarlas si las funciones que calculan bordes entregan como output una imagen.

caespinoza5 commented 4 years ago

1.- ¿Podemos nosotros manualmente dividir las imagenes en varias sub-imagenes que ingresen al programa (por ejemplo, A_1.png A_2.png, S_1.png...), o es parte del algoritmo que éste detecte la ubicación de las letras?

2.- ¿Una función que toma un archivo de imagen y lo pasa a la representación matricial de la imagen (es decir, la matriz con escala de grises) se considera como un algoritmo de input imagen - output imagen?

domingomery commented 4 years ago

1.- ¿Podemos nosotros manualmente dividir las imagenes en varias sub-imagenes que ingresen al programa (por ejemplo, A_1.png A_2.png, S_1.png...), o es parte del algoritmo que éste detecte la ubicación de las letras?

Sí, se puede

2.- ¿Una función que toma un archivo de imagen y lo pasa a la representación matricial de la imagen (es decir, la matriz con escala de grises) se considera como un algoritmo de input imagen - output imagen?

Sí, se puede una función de este tipo.

ewaugh2 commented 4 years ago

Hola! Pregunta rápida, ¿podemos usar todo lo visto en clases hasta la fecha de entrega de la tarea para resolverla? Por ejemplo los Momentos de Hu o los Descriptores de Fourier.

Gracias.

jisilva8 commented 4 years ago

Hola!

  1. Por temas del enunciado asumo que no podemos hacer uso de la función regionprops() para extracción de algunas características.
  2. En caso de que aplique lo anterior, tiene algún consejo sobre cómo programar la extracción de estas características (no aparecen ecuaciones de modelamiento en el PPT y en los foros que he visitado suelen recurrir a regionprops() u otras funciones predefinidas). Asumo que tampoco es válido usar PAT02_GeoEllipses.m pues se recurre a una función Bfx que asumo debe ser de la toolbox del curso.
  3. ¿Cómo aconseja la estimación de la linea/plano de decisión? ¿Debería ser 'al ojo' o la idea es utilizar algún método más riguroso como knn, mínimos cuadrados, etc?
  4. ¿La 'suavidad' de los histogramas está condicionada a la cantidad de datos o es posible hacer que queden 'bien parecidos'? En comparación con las gráficas casi gaussianas del documento de referencia, logro unas gráficas que, si bien separan algunas clases, se ven bastante erráticas (usé histogram(x) y plot(x)). ¿Conoce alguna forma de 'embellecer' un poco la visualización de los datos?

Saludos!

domingomery commented 4 years ago

Hola! Pregunta rápida, ¿podemos usar todo lo visto en clases hasta la fecha de entrega de la tarea para resolverla? Por ejemplo los Momentos de Hu o los Descriptores de Fourier.

Gracias.

si, pueden usar todo lo visto en clase, pero el código para extraer características deben hacerlo ustedes, ya que no está permitido el uso de librerías para extraer características.

domingomery commented 4 years ago
  1. Por temas del enunciado asumo que no podemos hacer uso de la función regionprops() para extracción de algunas características.

así es, no está permitido el uso de librerías para extraer características.

  1. En caso de que aplique lo anterior, tiene algún consejo sobre cómo programar la extracción de estas características (no aparecen ecuaciones de modelamiento en el PPT y en los foros que he visitado suelen recurrir a regionprops() u otras funciones predefinidas). Asumo que tampoco es válido usar PAT02_GeoEllipses.m pues se recurre a una función Bfx que asumo debe ser de la toolbox del curso.

Esto es parte de procesamiento de imágenes, puedes usar funciones que saquen el borde de la figura, luego estos puntos aproximarlos a una curva (elipse por ejemplo) usando mínimos cuadrados (hay detalles en mi libro de cómo sacar las características de una elipse en la sección 5.2.2 página 155). Puedes inventarte tú también características que funcionen para este problema específico.

  1. ¿Cómo aconseja la estimación de la linea/plano de decisión? ¿Debería ser 'al ojo' o la idea es utilizar algún método más riguroso como knn, mínimos cuadrados, etc?

Al ver los histogramas de características que separen bien, un umbral debería ser suficiente (lo puedes determinar de forma manual). También podrías usar los métodos que mencionas si los implementas tú mismo, no está permitido el uso de librerías para clasificación.

  1. ¿La 'suavidad' de los histogramas está condicionada a la cantidad de datos o es posible hacer que queden 'bien parecidos'? En comparación con las gráficas casi gaussianas del documento de referencia, logro unas gráficas que, si bien separan algunas clases, se ven bastante erráticas (usé histogram(x) y plot(x)). ¿Conoce alguna forma de 'embellecer' un poco la visualización de los datos?

El histograma puede suavizarse si lo tratas como una señal de 1D y la filtras (usando un filtro pasa bajos). Muchas veces no es necesario suavizar el histograma y el umbral con el histograma original funciona bien.

Saludos!

Para ti también:)

alainray commented 4 years ago

Hola profesor,

Entiendo que no podemos ocupar librerías para extraer características. Pero quería ocupar connectedComponentsWithStats de OpenCV para el preprocesamiento de los datos, para poder separar cada caracter y trabajar en el etiquetado, en vez de tener que hacerlo a mano. ¿Asumo que eso se puede?

Saludos!

domingomery commented 4 years ago

Hola profesor,

Entiendo que no podemos ocupar librerías para extraer características. Pero quería ocupar connectedComponentsWithStats de OpenCV para el preprocesamiento de los datos, para poder separar cada caracter y trabajar en el etiquetado, en vez de tener que hacerlo a mano. ¿Asumo que eso se puede?

Saludos!

Hola Alain, no conozco el detalle de la función de OpenCV que mencionas, sin embargo, debes usar el mismo criterio: si el input es imagen y el output es imagen entonces se puede usar. Obviamente, si el output es imagen + características y usas sólo la imagen (y no las características) se puede.

Repito, lo que no está permitido es usar las características que compute una función de una librería.

dndelavega commented 4 years ago

Hola!

En la clase 3, Usted mostró un código donde iba indicando qué carácter era un 1, qué carácter era un 2, ... ¿Está permitido hacer lo mismo en la Tarea o el código no puede pedir como input letra (en la parte de Training)?

Saludos!

domingomery commented 4 years ago

Hola!

En la clase 3, Usted mostró un código donde iba indicando qué carácter era un 1, qué carácter era un 2, ... ¿Está permitido hacer lo mismo en la Tarea o el código no puede pedir como input letra (en la parte de Training)?

Saludos!

Hola Daniel,

espero haberte entendido:

1) para la tarea debes pensar en una solución modular, en que uno de los módulos sea una función que reciba como input una imagen que es un solo carácter y entregue como salida si es una A, S, D, F, o G.

2) Para la evaluación de la tarea el ayudante no va hacer la pega de la supervisión en el Training, (esto es, él no va a decir qué carácter pertenece cada imagen, como yo hice en el ejemplo con los 1, 2, 3). Para esto te pediría que la supervisión esté previamente hecha, es decir, guarda en un vector el input de la supervisión tal cual como si se ingresara por teclado.

No sé si me he explicado bien, de lo contrario lo aclaro el jueves en la clase. Saludos. Domingo

fprebolledo commented 4 years ago

Hola profesor, una pregunta, si ya tengo los parametros que separarán cada letra, puedo utilizar K-NN para decidir la clasificacion ? o debe ser un plano exacto?

domingomery commented 4 years ago

Hola profesor, una pregunta, si ya tengo los parametros que separarán cada letra, puedo utilizar K-NN para decidir la clasificacion ? o debe ser un plano exacto?

Hola Francisca, puedes usar KNN si lo implementas tú misma. La implementación es simple.

Repito, no se pueden usar librerías de clasificación. En esta actividad, salvo lo de procesamiento de imágenes, la extracción y la clasificación la deben implementar ustedes mismos.

Saludos

fprebolledo commented 4 years ago

Eso pregunto, puedo usar KNN programandolo yo?

El mié., 25 mar. 2020 8:16, Domingo Mery notifications@github.com escribió:

Hola profesor, una pregunta, si ya tengo los parametros que separarán cada letra, puedo utilizar K-NN para decidir la clasificacion ? o debe ser un plano exacto?

Hola Francisca, puedes usar KNN si lo implementas tú misma. La implementación es simple.

Repito, no se pueden usar librerías de clasificación. En esta actividad, salvo lo de procesamiento de imágenes, la extracción y la clasificación la deben implementar ustedes mismos.

Saludos

— You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/domingomery/patrones/issues/7#issuecomment-603783196, or unsubscribe https://github.com/notifications/unsubscribe-auth/AGJMCABIZRND5NFVQGHBFWLRJHRXVANCNFSM4LEMLQYQ .

domingomery commented 4 years ago

Eso pregunto, puedo usar KNN programandolo yo?

Sí, eso se puede hacer, como te decía, puedes usar KNN si lo implementas tú misma. La implementación es simple. Saludos

alainray commented 4 years ago

Hola profesor,

Ya he creado código para hacer el cálculo de características (Flusser y Hu, más las básicas) y he estado estudiando los histogramas para hacer las mejores separaciones posibles. Sin embargo, estoy llegando al punto en que es difícil encontrar mejores separaciones. Dado esto, para obtener una cota superior al rendimiento que puedo llegar con mis características es posible usar sklearn para entrenar un árbol de decisión? Entiendo que dijo que no se podían ocupar librerías para la clasificación, pero la quiero ocupar para poner una cota superior al método manual que estoy haciendo y para no persistir hasta el infinito por ganancias menores. Luego no participaría con la clasificación del árbol sino con las separaciones que ya encontré.

Saludos!

domingomery commented 4 years ago

Hola profesor,

Ya he creado código para hacer el cálculo de características (Flusser y Hu, más las básicas) y he estado estudiando los histogramas para hacer las mejores separaciones posibles. Sin embargo, estoy llegando al punto en que es difícil encontrar mejores separaciones. Dado esto, para obtener una cota superior al rendimiento que puedo llegar con mis características es posible usar sklearn para entrenar un árbol de decisión? Entiendo que dijo que no se podían ocupar librerías para la clasificación, pero la quiero ocupar para poner una cota superior al método manual que estoy haciendo y para no persistir hasta el infinito por ganancias menores. Luego no participaría con la clasificación del árbol sino con las separaciones que ya encontré.

Saludos!

Hola Alain, puedes usarlo como referencia para lo que indicas, pero de ninguna manera para basar tu solución en el árbol de decisión propuesto por sklearn. Saludos

diegoheg commented 4 years ago

Hola profesor,

Se puede entregar la tarea completa en un jupyter notebook de python 3, con todo explicado bajo el código, dejando una sección para lo que se pide en el informe, o necesariamente tenemos que entregar un informe en pdf y el código aparte?

domingomery commented 4 years ago

Hola Diego, el codigo puede ser jupyter notebook, pero el informe debe ser un pdf de una pagina como se señala en el enunciado. Saludos

On Fri, Mar 27, 2020 at 7:05 PM Diego Echeverría notifications@github.com wrote:

Hola profesor,

Se puede entregar la tarea completa en un jupyter notebook de python 3, con todo explicado bajo el código, dejando una sección para lo que se pide en el informe, o necesariamente tenemos que entregar un informe en pdf y el código aparte?

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/domingomery/patrones/issues/7#issuecomment-605334560, or unsubscribe https://github.com/notifications/unsubscribe-auth/AAD3BSVNNUTRTNXPBB7RIYLRJUPKFANCNFSM4LEMLQYQ .

bastianfeliz commented 4 years ago

Hola profesor,

Estaría permitido utilizar la función de matlab bwboundaries()? Esta entrega no entrega una imagen como tal, pero más arriba te vi mencionar:

Esto es parte de procesamiento de imágenes, puedes usar funciones que saquen el borde de la figura, luego estos puntos...

Entonces me entró la duda.

Saludos

domingomery commented 4 years ago

Hola profesor,

Estaría permitido utilizar la función de matlab bwboundaries()? Esta entrega no entrega una imagen como tal, pero más arriba te vi mencionar:

Esto es parte de procesamiento de imágenes, puedes usar funciones que saquen el borde de la figura, luego estos puntos...

No se puede usar bwboundaries porque el output no es una imagen (sino que las coordenadas de los pixeles de los bordes ordenados). En mi comentario anterior, con sacar bordes, me refiero a usar una función cuyo output sea una imagen binaria que muestre los bordes. En Matlab esta función se llama 'edge' o bien 'bwperim'.

Saludos

jmwielandt commented 4 years ago

Hola, ¿Hay límites respecto al tiempo que tarde en correr el programa? Iterar por toda la foto son unos 12 segundos en mi pc, hice algo para reducirlo pero igual después queda en 1 o 2 segundos por pasada, más o menos :c

Gracias :D

domingomery commented 4 years ago

Hola, ¿Hay límites respecto al tiempo que tarde en correr el programa? Iterar por toda la foto son unos 12 segundos en mi pc, hice algo para reducirlo pero igual después queda en 1 o 2 segundos por pasada, más o menos :c

En principio no hay límite de tiempo, pero les pido piedad con los ayudantes :)

Menos de 5 segundos por imagen me parece que está bien

Saludos

jmwielandt commented 4 years ago
c2v importado - 0.24335718154907227 s
matplotlib importado - 0.3498411178588867 s
numpy importado - 0.0 s
utils (módulo propio) importado - 0.0009119510650634766 s

imagen leída - 0.0709238052368164 s
Recorrer imagen - 2.34562349319458 s
Recorrer imagen por cuadrantes - 5.512441635131836 s

No es por maldad, pero estos son los tiempos que tardan algunas de las operaciones que tengo que hacer. Esos 2.3 segundos de recorrer la imagen es por recorrerla 1 sola vez :c Ojo que lo único que hago en esos tiempos de prueba en recorrer la imagen normal y por cuadrantes es acceder al pixel, nada más (img[row, col]).

Sube tanto cuando la recorro por cuadrantes porque no hay cómo hacer que la caché me ayude para eso :/

domingomery commented 4 years ago

como decia en el comentario anterior, no hay limite en el tiempo... solo espero que sea algo razonable para que los ayudantes puedan corregir 90 tareas. Gracias

domingomery commented 4 years ago

Se puede usar el método .load() de clase Image de PIL, que retorna una instancia de la clase PixelAccess, tambien de PIL, que permite acceder a cada pixel de la imagen, o debo hacer la separación de pixeles a mano iterando sobre la imagen?

Sí, esta función que lee una imagen, con la cual tienes acceso a cada uno de sus pixeles se puede usar. Saludos para ti también

ewaugh2 commented 4 years ago

Hola profe! Tengo tres preguntas.

  1. Para calcular los descriptores de fourier se necesita obtener las coordenadas de los pixeles del borde del objeto (característica de la imagen obtenida por funciones hechas por nosotros mismos), y luego aplicar la transformada discreta de fourier a los números complejos resultantes. Dado que la FFT no es una función que extrae características de imagenes (su input no es una imagen) y tan solo realiza operaciones matemáticas, ¿podemos utilizar las FFTs implementadas en librerías?¿La de numpy por ejemplo?

  2. ¿Cual es el input que debe recibir el programa para que los ayudantes lo prueben? Por lo que veo el input debe de ser una combinación de las siguientes opciones:

  1. ¿Cual es el output que se espera de nuestro programa? Imagino que dada una imagen con una letra debemos dar un label propuesto y para una imagen con muchas letras basta con una lista de dichos labels, pero, ¿debemos imprimirlos por consola? ¿retornar la estructura de datos mediante una función? ¿alguna otra preferencia?

Gracias de antemano.

ewaugh2 commented 4 years ago

Profe otra pregunta,

La función connectedComponentsWithStats de OpenCV mencionada mas arriba retorna, entre otras cosas, un numpy array del mismo tamaño que la imagen en donde cada pixel tiene valor cero si en la imágen original ese pixel tenía el valor de cero, y el valor del id de la componente a la que pertenece en el caso contrario. Esto se puede interpretar como una imágen en donde cada componente tiene un todo de gris distinto de las demas y tiene el mismo todo de gris para toda la componente. ¿Podemos usar esta información que ofrece dicha función si ignoramos las características que ofrece?

Gracias.

fprebolledo commented 4 years ago

Hola buenas tardes, la matriz de confusión se debe hacer con las imagenes de testing? o las de training?

bastianfeliz commented 4 years ago

Hola profesor, ¿se puede utilizar la función find() de matlab en una imagen? Según yo no entrega características de la imagen.

domingomery commented 4 years ago

Hola buenas tardes, la matriz de confusión se debe hacer con las imagenes de testing? o las de training?

en el informe se debe reportar la matriz de confusión del testing solamente, la del training también la puedes reportar, pero en esta tarea no es obligatorio, porque hay personas que están diseñando el sistema de reconocimiento sin hacer un entrenamiento.

domingomery commented 4 years ago

Hola profesor, ¿se puede utilizar la función find() de matlab en una imagen? Según yo no entrega características de la imagen.

sí, se puede usar find de Matlab.

domingomery commented 4 years ago

Profe otra pregunta,

La función connectedComponentsWithStats de OpenCV mencionada mas arriba retorna, entre otras cosas, un numpy array del mismo tamaño que la imagen en donde cada pixel tiene valor cero si en la imágen original ese pixel tenía el valor de cero, y el valor del id de la componente a la que pertenece en el caso contrario. Esto se puede interpretar como una imágen en donde cada componente tiene un todo de gris distinto de las demas y tiene el mismo todo de gris para toda la componente. ¿Podemos usar esta información que ofrece dicha función si ignoramos las características que ofrece?

Gracias.

ok, si el output es una imagen esta bien, se puede usar.

domingomery commented 4 years ago
  1. Para calcular los descriptores de fourier se necesita obtener las coordenadas de los pixeles del borde del objeto (característica de la imagen obtenida por funciones hechas por nosotros mismos), y luego aplicar la transformada discreta de fourier a los números complejos resultantes. Dado que la FFT no es una función que extrae características de imagenes (su input no es una imagen) y tan solo realiza operaciones matemáticas, ¿podemos utilizar las FFTs implementadas en librerías?¿La de numpy por ejemplo?

se puede usar FFT.

  1. ¿Cual es el input que debe recibir el programa para que los ayudantes lo prueben? Por lo que veo el input debe de ser una combinación de las siguientes opciones:

Se espera que desarrollen una función que tenga como input una imagen con un solo carácter, y como output un numero 1, 2, 3, 4, o 5, si es A, S, D, F, G o H respectivamente.

  1. ¿Cual es el output que se espera de nuestro programa? Imagino que dada una imagen con una letra debemos dar un label propuesto y para una imagen con muchas letras basta con una lista de dichos labels, pero, ¿debemos imprimirlos por consola? ¿retornar la estructura de datos mediante una función? ¿alguna otra preferencia?

ver respuesta anterior

jatrijori commented 4 years ago

Profesor, para asegurarme, ¿mi programa tiene que recibir de input una imagen con una letra o una imagen con al menos una letra (pueden ser más, ahí se tendría una función previa para segmentar las letras y luego llamaría por cada letra a la función que clasifica)?

ouhenio commented 4 years ago

Hola profe! Dado que estamos realizando aprendizaje supervisado, ¿puedo utilizar un json para guardar e informar a qué caracter corresponde cada letra en las imágenes de entrenamiento?

VicenteVicente commented 4 years ago

Si el clasificador tiene 100% de precisión, no sería útil poner la matriz de confusión, ¿cierto?

BFFV commented 4 years ago

Hola! ¿Las imágenes de las letras con las que probarán el programa se asume que tendrán el fondo negro en un 100% (0 en la escala de grises), tal como en las imágenes entregadas en el repositorio? ¿O podrían tener un fondo NO completamente negro?

¿Si es lo segundo entonces qué valores de escala de grises debería considerar como el fondo al momento de realizar la segmentación (al ojo encuentro que 30 hacia abajo se ve como fondo negro)?

domingomery commented 4 years ago

Profesor, para asegurarme, ¿mi programa tiene que recibir de input una imagen con una letra o una imagen con al menos una letra (pueden ser más, ahí se tendría una función previa para segmentar las letras y luego llamaría por cada letra a la función que clasifica)?

ver especificacion de codigo en el enunciado de la tarea.

domingomery commented 4 years ago

Si el clasificador tiene 100% de precisión, no sería útil poner la matriz de confusión, ¿cierto?

igual debes reportar la matriz de confusion.

domingomery commented 4 years ago

Hola profe! Dado que estamos realizando aprendizaje supervisado, ¿puedo utilizar un json para guardar e informar a qué caracter corresponde cada letra en las imágenes de entrenamiento?

se puede, pero por favor indica todo correctamente para que la correccion de tu tarea sea facil

domingomery commented 4 years ago

Hola! ¿Las imágenes de las letras con las que probarán el programa se asume que tendrán el fondo negro en un 100% (0 en la escala de grises), tal como en las imágenes entregadas en el repositorio? ¿O podrían tener un fondo NO completamente negro?

¿Si es lo segundo entonces qué valores de escala de grises debería considerar como el fondo al momento de realizar la segmentación (al ojo encuentro que 30 hacia abajo se ve como fondo negro)?

las imagenes son binarias, fondo = 0, letra = 1