Autor: Jesús Emeterio Navarro Barrientos
Asesor: Prof. Dr. Raúl Rojas
Materia: Redes Neurales
Fecha: Enero 2001.
Objetivo: Realizar un programa en computadora que recibe como entrada una imagen que corresponderá a algún dígito del 0 al 9, esta imagen será procesada para obtener algunas características, estas características se introducen a una red neural que realizará el reconocimiento del dígito en la imagen. El proyecto consta en la realización de estas características, la red neural, el entrenamiento de esta y el reconocimiento final.
Las redes neuronales tienen sus orígenes en 1943 con el primer modelo de neuronas artificiales propuesto por Warren McCulloch y Walter Pitts. Las redes neuronales artificiales modelan el comportamiento que muestran las redes neuronales biológicas, con algunas limitantes en cuanto al numero de procesamiento masivo que comprenden las redes neurales biológicas. Comúnmente las redes neuronales son ajustadas o entrenadas para que una entrada particular a la red de como salida un valor especifico, es decir, uno introduce un valor de entrada y un valor de salida, entonces la red modifica sus valores de pesos en las conexiones entre los elementos o neuronas internas para ajustarlos a la salida deseada.
El problema a resolver consiste en la caracterización de los dígitos, esto nos dará el vector de entrada a la red neural, la determinación de la topología de la red neural y el algoritmo que seguirá para su entrenamiento.
La caracterización de las imágenes se realiza para el mejor entrenamiento de la red, además de que sería muy costoso si se planteara la idea de introducir a la red neural todos los pixeles que conforman a la imagen, ya que la dimensión de las imágenes puede ser grande, por ejemplo de 128 x 128 lo cual nos lleva a introducir un vector de dimensión 16384, lo cuál será muy caro en cuestión de procesamiento de la computadora y tiempo de entrenamiento.
Se utilizan 4 características principalmente, invariante entre el perímetro y el área, distribución Black Jump, Momentos de Zernicke e Histogramas.
La invariante área y perímetro simplemente determina el área y el perímetro de la imagen y calcula su proporción. Esto corresponde a una entrada para la red neural. El algoritmo que se utiliza calcula el área como el numero de pixeles negros dentro de la imagen, y el perímetro restando el área obtenida menos el área encontrada dentro de la imagen perteneciente al numero, es decir se realiza un barrido sobre los pixeles negros, encontrando solo aquellos que no tienen vecinos blancos, estos son tomados en cuenta como el área interior, sin el perímetro, de esta manera al realizar la resta se obtiene el perímetro del numero en la imagen.
La segunda característica consiste en la obtención de la distribución Black Jump, esta característica trata a la imagen como un solo vector en lugar de un objeto bidimensional. La transformación se realiza de 4 maneras separadas para representar las cuatro orientaciones en la imagen, de manera que se obtienen 4 vectores largos los cuales serán sub divididos en x subvectores cada uno con aproximadamente el mismo numero de pixeles. Para cada subvector se obtiene el numero de transiciones de pixeles blancos a negros y se divide entre el numero total de transiciones para el vector entero. El algoritmo para su implementación consta solo de 4 ciclos uno para cada dirección 0°, 45° 90° y 135°, que barren toda la imagen de entrada almacenando en el vector de salida la relación de transiciones en un subvector contra el numero de transiciones totales en la imagen.
La tercera característica corresponde a la obtención de los momentos de Zernicke. Los denominados momentos de Zernicke son la proyección de una imagen en una serie de polinomios complejos que forman un conjunto ortogonal completo sobre el interior del circulo unitario. Estos momentos tienen la propiedad de que su magnitud es invariante a rotación, por lo que se escogió utilizar la magnitud como característica discriminatoria.
La cuarta característica corresponde a la obtención de los histogramas de la imagen, se tienen dos histogramas donde cada uno muestra la distribución de los pixeles correspondientes para los renglones y las columnas, de tal manera que el numero de características que se introducirán a la red si se utiliza eta opción dentro del entrenamiento y el reconocimiento de dígitos, será del numero de renglones y el numero de columnas que tenga la imagen de entrada.
La red neural consiste en una red con 3 capas, la arquitectura es genérica, es decir todas las unidades de una capa están conectadas a las unidades de la siguiente capa. Las capas que contiene la red consisten en una capa de entrada, una capa intermedia y una capa de salida. En la capa de entrada se tienen los vectores de entrada, producto de la caracterización de la imagen, es decir, dependiendo de las características deseadas para el entrenamiento y el reconocimiento de los dígitos, será el numero de entradas que se tengan dentro de la red. La capa intermedia consiste de 100 neuronas como parámetro inicial pero pueden ser modificadas también por el usuario dentro de la interfaz del programa. La capa de salida consta de 10 neuronas donde cada una representa al dígito que se obtiene con un determinado vector de características en la capa de entrada. La siguiente figura muestra un ejemplo de la topología de la red [Smith]:
La manera en que se entrena a la red neural, es utilizando un método de aprendizaje llamado en ingles Backpropagation, en español denominado Retropropagación. El algoritmo de retropropagación es en general un algoritmo de descenso de gradiente que busca el mínimo de la función de error del espacio de los pesos, de esta manera la combinación de pesos que minimiza la función de error es tomada como la mejor solución hasta ese momento para el problema de aprendizaje. Ya que este método requiere que a cada paso se calcule el gradiente de la función de error, se debe garantizar continuidad y diferenciabilidad de la función de error, esto conlleva a la utilización de una función de activación, ya que la composición de funciones producto de la interconexión de neuronas es discontinua y por ende la función de error también. La función de activación que se utiliza comúnmente y que es utilizada por el algoritmo de retropropagación en nuestro programa es la función conocida como sigmoide.
El problema de aprendizaje consiste en encontrar la combinación optima de pesos que mapean un conjunto de entrenamiento de entrada a una salida deseada, estos son llamados los patrones de entrada y de salida. Cuando el patrón de entrada Xi, (donde i es de la dimensión del conjunto de entrenamiento) se le introduce a la red, esta produce una salida Oi diferente de la salida deseada ti. Lo que se desea es hacer Oi igual a ti, lo cual equivale a minimizar una función de error de la red.
Después de minimizada esta función para el conjunto de entrenamiento, se espera que la red hay aprendido y para un conjunto de entrada de datos, la red debe reconocer cuando es similar a algún patrón aprendido y producir una salida similar.
El algoritmo de Retropropagación es utilizado para encontrar un mínimo local de la función de error. La red neural es inicializada con pesos W´s aleatorios, entre -1 y 1. La forma de corregir los pesos gradualmente a los minimos locales encontrados es obteniendo el gradiente de la función de error para cada entrada en el entrenamiento de la red.
El primer paso del proceso de minimización es el método denominado Feed-Forward, el cuál consiste en el calculo de la función de error, en cada neurona es evaluada la función de error para este nodo y también es evaluada su derivada, la derivada es almacenada para su utilización posterior en el calculo del gradiente de la función de error.
El segundo paso es la aplicación del Backpropagtion, en este paso la constante 1 es alimentada en la unidad o unidades de salida y la red es recorrida hacia atrás. La información que entra a un nodo es agregada y el resultado es multiplicado por el valor almacenado en la parte izquierda de la neurona, es decir la derivada del error, el resultado es transmitido a la siguiente neurona a la izquierda, de esta manera el resultado obtenido en la neurona o neuronas de entrada es la correspondiente derivada de la función de la red con respecto a esa entrada.
La Backpropagation matricial es la forma mas fácil de implementar una red neural, aunque existen varias formas de realizar la implementación, una de ellas orientada a objetos, donde cada nodo o neurona, es un objeto de una clase, que es parte de una clase general llamada red neural, como se puede ver en el libro de Joey Rogers "Object Oriented Neural Networks in C++".
El programa que se ha desarrollado hasta ahora consta de la siguientes partes:
Modulo gráfico.- donde se introduce la imagen que se desea reconocer y se puede visualizar el reconocimiento realizado por la red una vez que fue entrenada.
Especificación del directorio de trabajo para el entrenamiento.- En esta opción el usuario especifica al programa donde se encuentran las imágenes con las que será entrenada la red, cabe destacar que en estos momentos no se ha realizado la parte robusto en la manera de accesar a las imágenes, así que en el directorio de especificación solo deben existir imágenes bmp y todas de dimensión 128x128, se eligió esta dimensión para la imagen, ya que el entrenamiento será realizado con la base de datos del NIST (National Institue of Standars and Technology). Por el momento solo se han generado imágenes de prueba, ya que estamos en el proceso de crear un programa que pueda extraer de esta base de datos las imágenes y realizar la conversión a formato bmp para su mejor manejo dentro del lenguaje C++.
Modulo de especificación de características.- En este modulo el usuario marcará las características con las cuales desea entrenar la red y con las que desea hacer el reconocimiento, cabe destacar que las características que se utilizan para el entrenamiento deben ser las mismas que se utilicen en el reconocimiento, ya que si no se realiza lo anterior, habría algún conflicto en la dimensión de datos que se introduce a la red.
Dentro de este modulo también se encuentran los parámetros para la red, las neuronas a utilizar en la capa oculta, el numero de épocas para el entrenamiento, el numero de niveles para la distribución Black Jump este numero debe ser multiplo de 4, siendo el minimo valor que se puede utilizar de 4, es recomendable utilizar un valor grande para obtener una mejor caracterízación pero esto tendría como consecuencia mayores entradas a la red y por ende mayor tiempo de procesamiento y el orden de los momentos de Zernicke, por ejemplo para orden 12 se tendrán 47 entradas en la red.
Modulo de botones de procesamiento.- En este modulo se tiene el botón de entrenamiento, antes de dar clic en este botón se tiene que haber especificado un directorio de trabajo valido, solo con imagenes bmp, el botón cargar imagen, muestra un cuadro de dialogo de abrir archivo este botón carga la imagen deseada en la imagen de entrada, este botón se utiliza para despues realizar un reconocimiento de dicha imagen, utilizando el botón de reconocer, este botón obtiene las características de la imagen de entrada y realiza un feed forward con los pesos Ws aprendidos en el proceso de entrenamiento y finalmente el botón salir cierra la aplicación.
Se entreno la red neural solamente con la distribución Black Jump para niveles de 128 obteniendo una buena caracterización inicial de los dígitos con los valores de entrada mostrados en la figura 5 se entreno con un conjunto de 10 imágenes y se probo en un conjunto de 100 imágenes obteniendo 68 aciertos y 32 fallos con lo que se puede decir que esa red entrenada tiene un 32% de error en la detección de dígitos.
Se entreno la red neural solamente con los momentos de Zernicke para orden 12 obteniendo una mala caracterización inicial de los dígitos. La red se entreno con un conjunto de 10 imágenes y se probo en un conjunto de 100 imágenes obteniendo 38 aciertos y 62 fallos con lo que se puede decir que esa red entrenada tiene un 62% de error en la detección de dígitos, lo que se vio benéfico de esta característica es que en los casos en los que la distribución Black Jump falló, los momentos de Zernicke caracterizaron bien.
Lo que se mostró anteriormente es lo que se ha hecho hasta el momento, dentro del trabajo futuro se tiene contemplado realizar la caracterización con histogramas, mostrar las gráficas de error, realizar la comprobación del porcentaje de error automáticamente, realizar los programas correspondientes para poder realizar el entrenamiento con las imágenes de la base de datos del Nist y con esas pruebas encontrar la caracterización adecuada para la red. Finalmente se tiene contemplado crear una mesa de expertos conjuntando los trabajos realizados por los compañeros, donde se tendrán que conjuntar las redes que se realizaron y crear una mega red que caracterizará mucho mejor los dígitos.
Demuth, Howard y Beale, Mark, "Neural Network Toolbox" The MathWorks Inc, 2001
Khotanzad, Alireza y LU, Jiin-Her, "Shape and Texture Recognition by a Neural Network", Machine Intelligence and Pattern Recognition Series, Volume 11, Capitulo 7, 1991
Rojas, Raul, "Neural Networks A systematic introduction", Ed. Springer-Verlag, 1996
Rogers, Joey, "Object Oriented Neural Networks in C++", Ed. Academic Press, 1997
Touretzky, Romero, y Thibadeau, "Optical chinese Character Recognition using Probabilistic Neural Networks", 1995, pp.16,17
Smith, L., An Introduction to Neural Networks, http://www.cs.stir.ac.uk/~lss/NNIntro/InvSlides.html, Center for Cognitive and Computational Neuroscience, Department of Computing and Mathematics, University of Stirling, (last accessed in July 2014)