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:

1 comentario:

  1. El uso del control de versiones pudiera haber comenzado desde hace mucho ya... Van 9 pts por el código. El reporte vale 10.

    ResponderEliminar