Mostrando entradas con la etiqueta Redes Neuronales. Mostrar todas las entradas
Mostrando entradas con la etiqueta Redes Neuronales. Mostrar todas las entradas

lunes, 19 de noviembre de 2012

Reporte Final

Aportes:
  • Pre procesamiento para detección de caracteres
    • Binarización
    • Escalamiento
    • Segmentación de Caracteres
    • PCA para datos de entrada
  • Perceptrón simple con aprendizaje y clasificación en N capas.
  • Red Neuronal Multicapa(XOR)
  • Red Neuronal con Datos Reales (Error en aprendizaje)
Repositorio(Usuario - Synnick):
Reporte

Pre procesamiento (pre_caracter.py en el repositorio)

En el reporte de medio curso se trabajo en lo que era el pre procesamiento de las imágenes de automóviles para obtener datos de ellas y encontrar las placas. Lamentablemente ni yo ni mis compañeros pudimos encontrar la manera de obtener datos de la misma, por lo cual optamos por obtener los datos directamente de una placa ya encontrada.

Ahora mi aportación fue, teniendo una imágen de una placa, cortar su tamaño a una zona relevante (en donde viene la placa) y a partir de esa zona, localizar los caracteres y segmentarlos en diferentes imágenes del mismo tamaño.

Para realizar ésto utilicé una combinación de OpenCV y la librería PIL de Python. Los pasos son así:

Primero el programa toma una imágen de una placa, como la siguiente:


A esta imágen se le realiza una serie de preprocesamientos antes de buscar las letras, el primero es convertirlo a escala de grises:


Después le aplicamos un smooth para eliminar algunos ruidos aleatorios que pudiera tener:


Lo siguiente es binarizar la imágen, aplicando un threshold:



Para terminar el preprocesamiento de la placa completa, adelgazamos la imágen, haciendo los caracteres mucho más delgados y deshaciendonos de muchas partes innecesarias. Con todo esto queda así:


Esta es la imágen que se segmentará, pero antes se cortara para dejar solo la placa incluida.
El algoritmo para cortar la imágen es sencillo. Se colocan dos lineas imaginarias en el centro de la imágen, extendiendose a todo el largo de la misma, pero de solo 1 pixel de largo. Estas líneas después se recorreran, una hacia abajo y otra hacia arriba, deteniendose hasta que no haga contacto con ningun espacio en blanco(normalmente letras). 

La posición en la que se detengan las líneas será la parte de la imágen que cortaremos para obtener solo los caracteres de la placa. El resultado es el siguiente:


Ahora por último localizamos los caracteres dentro de la imágen. Para encontrar primero los caracteres, se utiliza OpenCV y findContours para encontrar todos los contornos de las letras y objetos visibles en la imágen. Esto por sí nos arroja más contornos que los que necesitamos, ya que detecta algunos caracteres en dos contornos separadamente además de completo, por lo que tenemos que agregar un filtro, conservando solo los contornos que sean similares al tamaño del alto de la imágen. Todo esto se ve a continuación:

Sin filtro:

Con filtro:


Ya localizados los caracteres en la imágen, debemos ordenarlos de izquierda a derecha(el orden de la matrícula de un automóvil), esto es sencillo y basta con ordenar una lista con las posiciones de los rectángulos de menor a mayor (de x menor a x mayor).
Con eso podemos proceder a cortarlos en diferentes imágenes, además normalizandolas a un mismo tamaño(30x70):


De cada imágen se obtendrían datos de entradas utilizando PCA.

PCA (pca.py en el repositorio)


El PCA(Principal Component Analysis) es es una técnica utilizada para reducir la dimensionalidad de un conjunto de datos. Intuitivamente la técnica sirve para hallar las causas de la variabilidad de un conjunto de datos y ordenarlas por importancia.

En nuestro caso se utiliza para obtener datos de entrada para la neurona de las imágenes de los caracteres previamente segmentados.

Para implementar PCA, hacemos uso de una librería llamada MDP (Modular kit for Data Processing), un framework con muchas funciones para implementar procesamiento de datos. Entonces podemos obtener datos de entrenamiento de, por ejemplo, los 7 caracteres anteriores corriendo el programa.


Estos datos son buenos porque, como se puede observar con los últimos dos datos (obtenidos de las dos imágenes con 8), el valor es prácticamente el mismo, pero con un diferente exponente, esto porque hay pequeñas variaciones entre los dos 8.

Pero como necesitamos 7 entradas para la neurona para poder separar entre todos los caracteres (es necesario 7 bits para poder separar todas las clases diferentes), usando la misma función del PCA solicitando que nos de vectores de 7 de largo. Esto nos produce un nuevo problema ya que aunque nos genera vectores de 7 de largo, genera 30 vectores por lo cual para arreglarlo simplemente aplicamos la transpuesta, y obtenemos 7 vectores de largo 30.

 Estos vectores los sumamos por separado, y obtenemos  7 valores por imágen.


Estos se escriben en un archivo para que la neurona pueda usarlos.

Neurona - Perceptrón Simple ( neurona.py [versión anterior] )

Debido a que no contabamos con una neurona que pudiera aprender, me di a la tarea de leer acerca de las neuronas para poder implementar alguna que fuera útil para el proyecto. Dicho eso mi primer paso fue realizar un perceptrón simple que pudiera clasificar en varias clases como fuera necesario. El resultado fue exitoso, logré implementar el perceptrón simple, siendo capaz de clasificar datos en rangos de números aprendiendo rápidamente para dejar de tener errores alrededor de las 400s iteraciones. El funcionamiento de la neurona con 400 iteraciones y separando en 5 clases:

                                                                      ...


Mi idea para la aplicación de esta neurona en el proyecto era que, siendo capaz de clasificar en n clases, podríamos obtener diferentes datos de entrada de cada caracter con pocas variaciones entre los mismos, siendo entonces la red neuronal capaz de determinar cuál letra es con los datos de entrada, y entrenandose a sí mismo a modo que los recibe. 

Red Neuronal con datos reales ( neurona.py más nueva)

Para que la neurona que hicé tuviera una aplicación hacia el proyecto la adapté hacia los datos generados por el PCA. Lo que hace es simplemente solicitar el número de iteraciones y neuronas a usar (7 neuronas para los caracteres de la placa) y un archivo con las muestras de entrada que se usarán.

Del archivo recoge las muestras y hace las operaciones, entrenando cada neurona cuando se equivoca individualmente. El problema es que solo algunas clases parecen entrenarse y funcionar correctamente, mientras las demás siguen equivocandose sin aprender. 

martes, 13 de noviembre de 2012

Resumen - Short-term electricity prices forecasting in a competitive market: A neural network approach

Short-term electricity prices forecasting in a competitive market: A neural network approach
J.P.S. Catalao, S.J.P.S. Mariano, V.M.F. Mendes, L.A.F.M. Ferreira

El artículo trata, como el título dice sobre una propuesta para una red neuronal que pueda predecir los cambios en los precios de los recibos de la electricidad en cortos plazos.

Una red neuronal de tres capas, entrenada por el algoritmo Levenbeg-Marquardt es usada para predecir los precios de los recibos de la electricidad para la siguiente semana. Se evalúa también la precisión de la predicción de los precios, reportando los resultados de los mercados en España y California.

Introducción

Los precios de la electricidad son de extrema importancia en un mercado de energía electrica competitivo a todos los participantes, y en particular a los productores y consumidores. Por esto es que un conocimiento previo del precio de la electricidad es importante para manejar los riesgos y puede representar una ventaja para un participante en el mercado que tiene competencia.

En sí, para una compañia en el área de la energía eléctrica, la habilidad para predecir precios futuros significa que la compañia puede estratégicamente establecer ofertas para el mercado en poco tiempo.

Una buena herramienta que prediga los precios debe poder capturar la incertidumbre asociada con los precios. Estas incertidumbres suelen ser el precio de la gasolina, adiciones futuras de generación y transmisión de la energía eléctrica, reglas y regulaciones, crecimiento en la demanda, operaciones de planta y cambios climáticos.

Los precios de la electricidad son influenciados por diversos factores:
  • Precios históricos y demanda
  • Estrategias de Ofertas
  • Reservas de Operación
  • Importación
  • Efecto de la Temperatura
  • Predicción de cortes en los generadores.
Red Neuronal para predecir precios de la electricidad

Una red neuronal de tres capas entrenada por el algoirtmo Levenberg-Marquardt es propuesta para predecir los precios de la electricidad. Utilizan la herramienta de redes neuronales de Matlab, por su sencillez y flexibilidad. 
Las funciones de transferencia utilizadas para la capa oculta y de salida son funciones no lineares y lineares respectivamente
  • Capa Oculta: Utiliza la función tansing, una función de transferencia tangente sigmoidal hiperbólica con salidas entre -1 y 1.
  • Capa de Salida: Utiliza la función purelin, una función de transferencia linealmente pura.
En la fase de entrenamiento, probaron con cuantas unidades trabajar en la capa oculta. El resultado fue que utilizar 5 unidades en la capa oculta daba los mejores resultados. La capa de salida tiene una unidad, encargada de dar de salida los precios de la electricidad de la siguiente semana. 

Datos históricos sobre los precios de electricidad previos son la entrada principal para la red neuronal.

Entrenamiento

Para predecir eventos numéricos futuros, las redes neuronales utilizan dos pasos: entrenamiento y aprendizaje. Entrenar una red neuronal de este tipo es normalmente realizado de una manera supervisada. Uno asume que el set de datos de entrenamiento esta disponible, siendo este datos pasados, conteniendo tanto entradas y las correspondientes salidas deseadas, lo que es presentado a la red.

La selección adecuada de entradas para el entrenamiento es muy importante para el éxito del entrenamiento. En el proceso de aprendizaje una red neuronal construye un mapeado de salida-entrada, ajustando los pesos en cada iteración basado en la minimización de un error entre la salida producida y la deseada.

Sobreentrenar una red neuronal puede deteriorar las predicciones que se realizan, sin mencionar el dar información errónea a la red, lo que causará que la red se confunda y ajuste los pesos erróneamente.

Algoritmo de Entrenamiento

El algoritmo utilizado para está propuesta es el de Levenberg-Marquardt, que entrena una red neuronal de 10 a 100 veces más rapido que el backpropagation. El algoritmo consiste en econtrar la actualización, dada por:

Donde el parámetro u es modificado convenientemente durante las iteraciones del algoritmo.

Calculo del Error

Para evaluar la precisión de la red neuronal, se utilizan diferentes criterios. La precisión es calculada en función de los precios actuales del mercado que han ocurrido. El error absoluto porcentual promedio (MAPE), la suma cuadrada del error(SSE), y el error de desviación estándar (SDE), son definidos como sigue:



Donde ph y ph son usadas respectivamente para predecir los actuales precios de la electricidad a la hora h, p es el precio promedio en el periodo de predicción y N es el número de horas futuras predecidas.

Los precios de electricidad pueden incrementarse hasta 10 o cientos de veces su precio normal en horas particulares Puede bajar hasta cero o hasta ser negativo en otras horas. Por lo tanto, el precio promedio es usado para evitar el problema causado por los precios cercanos a cero.

Los criterios SSE y SDE están dados por:

Donde eh es el error en la predicción a una hora h, y e es el error promedio del periodo de predicción.

Casos de Estudio

Para construir el modelo de predicción para cada semana considerada, la información disponible incluye precios históricos por hora durante los 42 días previos al día de la semana cuyos precios se van a predecir. Datos de entrenamiento muy grandes no deben ser usados para evitar sobre entrenar la neurona.

Un ejemplo de una predicción de la red neuronal se ve en la siguiente gráfica:
Precios de Invierno para el mercado de España. Los precios actuales se muestran con una línea sólida, junto con los precios predecidos, mostrados por la línea punteada. Los datos son en euros por hora megawatt.



Análisis Estadístico del error en las predicciones semanales obtenidos por la red neuronal en un análisis de 5 semanas.

Conclusión

La red neuronal del artículo provee una buena manera para predecir los precios futuros del mercado de la electricidad. 

Además menciona metodos muy interesantes para entrenar una neurona de manera supervisada, y además proporciona funciones para calcular del error que podían ser de utilidad para la aplicación de nuestro proyecto. 

lunes, 8 de octubre de 2012

Reporte de Medio Curso - Reconocimiento de Placas

Mis aportaciones individuales hacia el proyecto del equipo fueron en las siguientes áreas:
Pre-Procesamiento de Imágenes y Datos de Entrenamiento

Investigando encontré un par de PDFs muy interesantes sobre proyectos similares al nuestro, reconocimiento de placas. Uno de ellos se enfocaba primordialmente al pre-procesamiento de las imágenes, es decir, prepararlas para poder obtener datos que la neurona puede usar tanto como para su entrenamiento, como para su uso.

Éste pre-procesamiento involucrá operaciones como las que se mencionan en el PDF de la clase, que son:
  • Reducción de colores.
  • Filtrado para reducir ruido.
  • Reducción de resolución.
  • Representación binaria.
Todo lo anterior se hace con el objetivo de poder tener nuestra región de interes(ROI) de la forma más clara posible, debido a que una imágen con múltiples colores y que en algunos casos tiene ruido, dificulta la detección de los carácteres.

Entonces una imágen podemos ir modificandola de la siguiente manera:

El código de esta parte:




Datos de entrenamiento

Ahora, para crear el primer archivo necesario para el entrenamiento, seleccionamos dentro de la imágen un rectángulo donde se encuentra la placa. Las 4 coordenadas de las 4 esquinas del rectangulo se escribirán en un archivo, junto al id de la imágen. Entonces si la imagen anterior fuese "2.jpg", su correspondiente línea en el archivo sería algo así:
2 243 285 317 311
  • r1 Valor del píxel en la imagen de la coordenada y de la esquina superior izquierda del ROI
  • r2 Valor del píxel en la imagen de la coordenada y de la esquina inferior derecha del ROI
  • c1 Valor del píxel en la imagen de la coordenada x de la esquina superior izquierda del ROI
  • c2 Valor del píxel en la imagen de la coordenada x de la esquina inferior derecha del ROI
Esto es una parte de los datos de entrenamiento. La otra parte corresponde a crear un clasificador, que nos diga si en un área determinada de la imágen se encuentra nuesta región de interés o no. Para esto creamos una región de barrido de imágen (RBI) que debe tener un tamaño predefinido. En nuestra imágen anterior, hacemos un barrido a toda la imágen, dejandola de la siguiente manera:


A cada región de esta "tabla" se le debe etiquetar con un valor, dicho valor se obtendrá basandonos en lo siguiente:
  • Si el RBI no intersecciona absolutamente en ningún punto con el ROI de la matrícula calculado anteriormente, el RBI quedará etiquetado a ”-1”, indicando esto que es una muestra no válida en la que no se encuentra la matrícula.
Por el contrario si el RBI intersecciona con el ROI, tenemos dos posibles opciones:
  • Si el RBI intersecciona con el ROI como mucho en un valor ”min_disc”, que es el discriminante mínimo, el cual, por defecto, está establecido a un valor del 10 %, éste vector  quedará etiquetado a ”-1”, indicando que no es una muestra válida. No tenemos suficiente información con tan sólo un 10% de los píxeles que interseccionan para saber si es una zona de la posible placa o no
  • El otro caso es que el RBI interseccione en al menos un valor ”max_disc”, que es el discriminante máximo, el cual, por defecto, está establecido a un valor del 60 %, este vector de propiedades quedará etiquetado a ”1”, indicando que puede ser un posible candidato a una zona de la placa de la matrícula.
Los demás RBI que quedan entre ”min_disc” y ”max_disc” quedarían sin etiquetar, debido a que no tenemos suficiente información para saber si es o no un posible candidato a placa de matrícula en la imagen, pudiendo crear incongruencias en el clasificador y empeorar los resultados.

Pintando estas etiquetas de diferente color, podemos ver que efectivamente se marcaron dependiendo del discriminante:



Código de la Red Neuronal

Cada uno de nosotros teniamos nuestro código de la neurona con lo que avanzamos en las clases. El mío consistia en identificar entre 3 clases en las que podría caer un valor. Entonces teníamos por ejemplo, 2 valores A = 2  y  B = 7, podemos clasificar un valor x en cualquiera de 3 clases, 00 si el valor es menor a A (por lo tanto menor a B también), 01 si es mayor a A pero menor a B, y 11 si es mayor a B (igualmente mayor a A). 

A partir de estas clasificaciones, podemos generar muestras de entrenamiento, incluyendo lo siguiente:

x  clasificacion   ej.   4.03123128  01

Usando las muestras, cada neurona en base a unos pesos iniciales aleatorios irá calculando su bit que formara la clasificación. Si una neurona se esquivoca, se utiliza la función de aprendizaje definida en el curso para ajustar los pesos y minimizar el error. Graficando los resultados, se produce algo así:


Donde se puede ver la separación entre las 3 clases(00, 01, 11)

Ahora, la función de la red neuronal dentro del proyecto es diferente, primero tenemos que detectar la placa en la imagen, y después reconocer los caracteres individualmente.

  • Neurona para la Detección de la placa. Esta neurona debe identificar de entre 2 clases, que serían las del primer paso del entrenamiento, -1 si la placa no esta en un determinado pixel, 1 si lo esta. Por lo tanto esto es posible hacerlo con una sola neurona.
  • Neurona para el Reconocimiento de Caracteres. Esta es un tanto diferente, debido a la existencia de caracteres alfanuméricos en este caso necesitaremos una red más amplia para poder clasificar individualmente cada letra y número.
Referencias:

martes, 7 de agosto de 2012

Idea de Proyecto - Where's Wally?

Mi idea personal para proyecto de redes neuronales es una red neuronal que pueda detectar la presencia de el legendario Wally en una imágen.


Típicamente el objetivo de este juego es encontrar al personaje en una imágen. La dificultad difiere, puede ser tan simple como encontrarlo entre algunas personas con ropas diferentes a él, o encontrarlo en un lugar lleno de colores y ropas similares a las suyas.


Las características principales suelen ser, su camisa de rayas rojas con blancas, la gorra de invierno de los mismos colores, y su característica cara con gafas.

Referencias