Proyecto 2 Intro CS Reconocimiento de Numeros
EL siguiente informe explicara el codigo creado para resolver la problematica planteada para este proyecto. El proposito de este proyecto es predecir un numero dentro de una imagen, para este fin se solicito emplear la distancia euclidiana y metodos adicionales brindados por el alumno.
Clases y Metodos
Clase Digits
Constructor de la clase que inicializa las propiedades:
self.digits: almacena los datos del conjunto de dígitos. self.__mean_num_matrix: diccionario para almacenar la matriz promedio de cada dígito. self.indexes: listas de índices para cada dígito. self.mean_matrixes: lista de matrices promedio (no utilizada). self.sz_digits: tamaño del conjunto de dígitos.
Construye la matriz promedio para un dígito específico:
Filtra los índices correspondientes al dígito number. Calcula la matriz promedio utilizando __build_meaned_mtrx. Imprime la matriz promedio del dígito utilizando print_mean_number_matrix.
Calcula el promedio de dos matrices de 8x8:
Suma las matrices y divide cada elemento por 2.
Construye la matriz promedio para una lista de índices:
Inicializa matriz_final con la primera imagen de la lista de índices. Calcula el promedio acumulado con las demás imágenes.
Imprime la matriz en la terminal:
type puede ser "RGB" para imprimir en colores o "default" para imprimir en modo monocromático.
Imprime la matriz promedio de un dígito específico utilizando __print_matrix.
Calcula la distancia euclidiana entre dos matrices:
Calcula la diferencia, eleva al cuadrado, suma los valores y toma la raíz cuadrada.
Calcula las distancias euclidianas entre una imagen y todas las imágenes del conjunto:
Devuelve una lista de tuplas (target, distance) ordenadas por distancia.
Similar a __similar_targets, pero filtra por números posibles:
Devuelve una lista de tuplas (target, distance) ordenadas por distancia.
Calcula las distancias euclidianas entre una imagen y las matrices promedio de cada dígito:
Devuelve una lista de tuplas (target, distance) ordenadas por distancia.
Procesa una imagen para determinar el dígito utilizando distancias euclidianas:
Carga y procesa la imagen. Calcula las distancias euclidianas y determina los k dígitos más similares. Si los resultados son ambiguos, utiliza detección de círculos con cv2.HoughCircles como método alternativo. Imprime la imagen procesada y el resultado.
Similar a procesar_imagen_metodo1, pero utiliza las matrices promedio de los dígitos:
Carga y procesa la imagen. Calcula las distancias euclidianas con las matrices promedio. Si los resultados son ambiguos, utiliza detección de círculos con cv2.HoughCircles como método alternativo. Imprime la imagen procesada y el resultado.
Menu
Constructor de la clase que inicializa la propiedad self.digits con una instancia de la clase Digits.
Muestra un menú interactivo en la terminal para realizar diferentes acciones:
1: Generar imagen promedio de un número específico. 2: Generar imágenes promedio de todos los números. 3: Procesar un dígito utilizando la distancia euclidiana. 4: Procesar un dígito utilizando la distancia euclidiana con matrices promedio. 5: Salir del menú.
Codigo
Imports
Run to view results
Run to view results
Material de apoyo
Run to view results
Clase Digits
Run to view results
Clase Menu
Run to view results
Pruebas
Se adicionara funciones de prueba a la clase Menu con el fin de visualizar los posibles ouputs del app
Run to view results
Construccion de matriz promedio en base a numero
Run to view results
Construccion de todas las matrices promedio
Run to view results
Metodo 1 Distancia Euclidiana con todos los targets
Run to view results
Run to view results
Run to view results
Run to view results
Run to view results
Run to view results
Run to view results
Run to view results
Run to view results
Run to view results
Run to view results
Run to view results
Run to view results
Run to view results
Run to view results
Run to view results
Run to view results
Run to view results
Run to view results
Run to view results
Metodo 1 Distancia Euclidiana con matrices promedio
Run to view results
Run to view results
Run to view results
Run to view results
Run to view results
Run to view results
Run to view results
Run to view results
Run to view results
Run to view results
Run to view results
Run to view results
Run to view results
Run to view results
Run to view results
Run to view results
Run to view results
Run to view results
Run to view results
Run to view results
Run to view results
Pruebas adicionales
Conclusiones
El primer método posee más coincidencias sin embargo falla en predecir el número, en el caso del segundo método difícilmente acierta a la hora de encontrar coincidencias y predicciones, por lo que podemos decir que el primer método es más efectivo.
En ambos casos se usó algoritmos de apoyo para las situaciones en la que los k vecinos no coincidan, en el cual se analizaba la imagen en busca de círculos, este método resultó más efectivo en los casos donde los números poseen círculos aun así debe pulirse mejor debido a que el algoritmo no es muy efectivo a la hora de predecir la posición exacta del círculo por lo que es difícil diferenciar los números 6,9 y 0, pero efectivo al detectar el número 8 debido a que posee 2 círculos y pertenece a otra categoría, se podría implementar un detector de líneas, este método ayudaría mucho a identificar a los números con o sin círculos. Después de identificar si existen círculos se analiza nuevamente la distancia euclidiana pero con un filtro a las matrices pertenecientes a los números que nos interesan.
Si bien la distancia euclidiana resulta muy útil para estos casos la limitación del tamaño de las matrices es demasiado contraproducente a la hora de encontrar los patrones debido a que la reducción de tamaño de la imagen original eliminan detalles sustanciales que permiten identificar a las matrices, si las matrices del data frame Digits serían de 16x16 y no 8x8 la precisión aumentaría, sin embargo habría que evaluar si la efectividad alcanzada con este nuevo tamaño es mayor a la obtenida con el tamaño original.