Sistemas Conexionistas Curso 2011/2012 1 Objetivo El objetivo de esta práctica es usar un conjunto de redes de neuronas artificiales para abordar un problema de reconocimiento de figuras sencillas en imágenes a partir de información de bordes y orientaciones. 2 Metodología El procedimiento a desarrollar constará de tres pasos. En cada uno de ellos, el alumno deberá seleccionar la red neuronal más adecuada para resolver el problema concreto, justificando la elección del tipo de red y sus caracteristicas así como del conjunto de entrenamiento. En el siguiente esquema se resumen los pasos a seguir en el desarrollo de la metodología: 2.1 Obtención de una imagen de bordes El primer paso consiste en obtener una imagen de con la magnitud de los bordes de la imagen original. Para ello se utilizarán dos redes de neuronas artificiales, una para obtener los bordes verticales y otra para obtener los bordes horizontales. El aprendizaje de las redes se hará de forma supervisada. El número de patrones y su tamaño queda a elección del alumno. Imagen original Imagen de bordes horizontales (normalizada entre 0 y 1) Tanto la imagen original como las imágenes de bordes se cargarán a partir de fichero: • La imagen original se leerá con imread • Las imágenes de bordes están almacenadas en el fichero edges.mat. Para cargar este fichero se usará el siguiente comando load('edges.mat', 'Ev', 'Eh'); almacenándose la imagen de bordes verticales en la matriz Ev y la imagen de bordes horizontales en la matriz Eh. Una vez cargadas las imágenes, este apartado se desarrollará en dos fases: Fase de entrenamiento (para cada red) 1. Generar conjunto de entrenamiento (función getPatterns.m) • Los patrones de entrada serán ventanas de tamaño n x n centradas en la posición (x,y) en la imagen original • Las salidas deseadas será el valor del pixel en la posición (x,y) en la imagen de salida 2. Crear y entrenar la red con el conjunto de entrenamiento seleccionado Fase de procesado (para cada red) 1. Convertir la imagen a patrones (función imageToPatterns.m) 2. Procesar los patrones de la imagen con la red 3. Reconstruir la imagen de bordes Una vez que obtenemos las imágenes con los bordes horizontales y verticales, la imagen con la magnitud de los bordes se construye de la siguiente forma Bordes = sqrt(Bordes_hor .* Bordes_hor + Bordes_ver .* + Bordes_ver); Bordes = Bordes / max(max(Bordes)); La imagen Bordes resultante deberá ser similar a la mostrada en la siguiente figura: 2.2 Obtención de las orientaciones de los bordes En esta segunda fase se obtendrán las orientaciones de los bordes de las figuras. Se considerarán 8 orientaciones: • 0º → borde izquierdo de cuadrados y rectángulos • 45º → borde izquierdo de triángulos y borde superior izquierdo de pentágonos • 90º → borde superior de cuadrados y rectángulos • 135º → borde derecho de triángulos y borde superior derecho de pentágonos • 180º → borde izquierdo de cuadrados y rectángulos • 225º → borde inferior izquierdo de pentágonos • 270º → borde inferior de todas las figuras • 315º → borde inferior derecho de pentágonos Para ello, se utilizará una red de neuronas artificiales adecuada al problema. El alumno deberá seleccionar el tipo de aprendizaje más adecuado para este problema.Como patrones del conjunto de entrenamiento se utilizarán ventanas centradas en los distintos tipos de bordes de la imagen original. El tamaño de las ventanas y el tamaño del conjunto de entrenamiento se deja a elección del alumno. Este apartado se desarrollará en dos fases Fase de entrenamiento 1. Generar conjunto de entrenamiento (función getPatterns.m) 2. Crear y entrenar la red con el conjunto de entrenamiento seleccionado Fase de procesado 1. Convertir la imagen a patrones (función imageToPatterns.m) • Optimización: procesar sólo aquellos puntos de la imagen en los que la magnitud de borde supere un determinado umbral (modificar imageToPatterns.m) 2. Procesar los patrones de la imagen con la red 3. Reconstruir la imagen de orientaciones, representando cada orientación con un color diferente. Representar en negro los puntos en los que la magnitud del borde sea inferior a un umbral. El resultado de esta etapa debería ser una imagen como la siguiente: 2.3 Clasificación de figuras utilizando información de orientación En la tercera fase trabajaremos con cada figura de forma independiente. Para facilitar el trabajo, en el fichero coords-fig.mat encontraremos 4 variables que se corresponden con las coordenadas superior derecha (top, left) e inferior izquierda (bottom, right) de cada figura. El siguiente código carga las variables a partir del fichero y muestra por pantalla todas las figuras: I = double(imread('imagen.png') / 255; load('coords-figs.mat', 'top', 'left', 'bottom', 'right'); for i=1:13 figure; imshow(I(top(i):bottom(i), left(i):right(i))); end El alumno deberá utilizar una red de neuronas artificial para clasificar las figuras utilizando como base la distribución de orientaciones obtenida para cada figura. El tipo de red y sus características así como el modo de entrenamiento se dejan a elección del alumno. Esta tercera fase se desarrollará también en dos fases: Fase de entrenamiento 1. Generar conjunto de entrenamiento • Estará formado por la distribución de orientaciones de cada figura • La distribución de orientaciones de una figura se calculará de la siguiente forma 1. Obtener la magnitud de los bordes de la figura con las redes diseñadas a tal efecto 2. Obtener la orientación de los bordes de la figura con la red seleccionada en el paso anterior 3. Realizar un recuento del número de veces que aparece cada orientación en la figura. Almacenar los valores de este recuento en un vector. 4. Normalizar el vector entre 0 y 1. 2. Crear y entrenar una red con los vectores de distribución de orientaciones Fase de procesado 1. Generar el vector de distribución de orientaciones para una figura 2. Procesar el vector con la red y obtener la salida 3 Código proporcionado El alumno puede modificar el código de las funciones proporicionadas para ajustarlo a sus necesidades. getPatterns.m Permite seleccionar el conjunto de entrenamiento para un aprendizaje supervisado: • El conjunto de los patrones de entrada estará formado por un número n de ventanas de tamaño s x s de la imagen de entrada. Este conjuntos se almacenará en una matriz con el formato requerido por las funciones de la Neural Network Toolbox de Matlab (un patrón por columna) • Las salidas deseadas para cada patrón se almacenarán por columnas en una matriz. Éstas pueden ser de dos tipos: ◦ Si se pasa una imagen del mismo tamaño que la imagen original, devuelve un punto en dicha imagen que se corresponde con el valor central de la ventana en el patrón asociado a esta salida ◦ Si se pasa un vector de otro tamaño, la salida deseada de todos los patrones de entrada será igual a dicho vector. imageToPatterns.m Extrae todos los patrones de una imagen en el formato requerido por la Neural Network Toolbox de Matlab (un patrón por columna). Cada patrón será una ventana de tamaño s x s. 4 Requisitos • El código de la práctica no puede ser copiado • Se puede utilizar cualquier tipo de red incluida en la Neural Network Toolbox de Matlab o implementada por el alumno • Se deben utilizar, al menos, 2 tipos distintos de redes en el desarrollo de la práctica • La elección de cada red, sus características y el conjunto de entrenamiento seleccionado deberán ser debidamente justificados • Se debe mostrar el resultado intermedio de cada uno de los pasos de la metodología • El código de entrenamiento y el código de procesado deben estar claramente separados