Redes Neuronales en Visión Artificial
Redes Neuronales en Visión Artificial
net/publication/350432235
CITATIONS READS
0 1,930
2 authors, including:
Daniel Gutiérrez
University of Seville
182 PUBLICATIONS 2,897 CITATIONS
SEE PROFILE
All content following this page was uploaded by Daniel Gutiérrez on 27 March 2021.
Material necesario:
Para realizar la práctica se necesita el siguiente material:
[Link]
[Link]
Agradecimientos:
Parte del material incluido en esta práctica ha sido desarrollado durante el trabajo fin
de grado (TFG) de Eduardo Moscosio Navarro titulado “Clasificador de señales de tráfico
basado en redes neuronales convolucionales para robots móviles” del Grado en
Ingeniería Electrónica, Robótica y Mecatrónica y el trabajo fin de máster (TFM) de
Antonio José Toro Valderas titulado “Implementación de redes neuronales en Raspberry
Pi 3 con Movidius Neural Compute Stick” del Máster Universitario en Ingeniería
Electrónica, Robótica y Automática.
1.1 Introducción
• Gran cantidad de datos que tenemos disponibles, los cuales son el combustible
de los modelos de aprendizaje automático.
• Gran cantidad de recursos computacionales que tenemos disponibles, CPUs con
múltiples núcleos, GPUs, cluters, computación en la nube, etc.
• Lenguajes de programación de alto nivel como Python con un ecosistema de
librerías que facilitan la programación de los modelos.
El perceptrón es la red neuronal más simple que podemos encontrar en Deep Learning.
La aplicación más básica del perceptrón es la de separar un conjunto de datos en dos
clases realizando una clasificación de tipo binaria. La salida del perceptrón tomará el
valor ‘0’ o ‘1’ según sea una clase u otra. El modelo general de un perceptrón se observa
en la Figura 3, donde se multiplica el valor de cada entrada Xi por su peso, se suman
todos esos valores, y a esa cantidad se le suma el intercepto o sesgo b (no aparece en
Figura 3). A continuación, la señal resultante se pasa por una función de activación para
generar la salida de la neurona (valor entre 0 y 1). Desde el punto de vista matemático,
la unión sumadora de la Figura 3, es parecida a una regresión lineal (pesos w1-w5), nos
daría una salida continua. A continuación, se añade la función de activación que,
normalmente, es una función no lineal, convirtiendo la salida del perceptrón en una
salida discreta. Por lo tanto, el perceptrón es un clasificador o regresor logístico.
Aunque el perceptrón puede ser utilizado para problemas simples, hoy en día lo normal
es utilizar redes compuestas por múltiples neuronas y múltiples capas.
Este tipo de redes neuronales se caracteriza por el uso de más de una capa de neuronas
puestas, generalmente, una continuación de la otra, de manera que se conectan de
distintas formas. Si las conexiones entre las capas únicamente se dan hacia capas
posteriores a ella, se habla de redes con conexiones hacia delante o “feedforward”, ya
que las capas de este tipo de redes no tienen conexiones hacia capas anteriores. Un
Diseño Electrónico e Instrumentación 2020
Industrial (DEII-2)
ejemplo de estas redes podría ser el perceptrón multicapa. El perceptrón multicapa
(“Multi-Layer Perceptron” o MLP) es una red neuronal que utiliza un número N de
perceptrones en cada capa y se interconectan entre sí. Normalmente su estructura es
de 3 capas (ver Figura 4):
• Capa de entrada: primera capa de la red por la que se introducen las variables
de entrada del exterior. Es decir, la capa de entrada son simplemente los datos
de entrada no tienen ninguna neurona que entrenar.
• Capas ocultas: están entre la capa de entrada y la capa de salida. Cada una puede
tener un número distinto de neuronas. Además, las neuronas de una capa oculta
están conectadas con todas las de la capa siguiente.
• Capa de salida: es la que da la clasificación de la clase a la que pertenece la
variable de entrada introducida. Es decir, saca el resultado de las operaciones
que realiza la red en las capas ocultas.
La función de activación como su propio nombre indica es una función que se utiliza
para la activación de la señal de salida de la neurona. Como se observó en la Figura 3, la
función de activación se encuentra a continuación de relación lineal entre los
parámetros de entrada de la neurona. La función de activación escala el valor de salida
de la neurona a unos valores concretos, por ejemplo, entre 0 y 1 en el caso de utilizar
Diseño Electrónico e Instrumentación 2020
Industrial (DEII-2)
una sigmoide, ver Figura 5. Otra característica importante de la función de activación es
que debe ser derivable (aunque en algunos casos como en la Relu, la función no es
derivable en 0), ya que la derivada de dicha función se utilizará en el proceso de
entrenamiento de la red. Existen muchos tipos de funciones de activación y la selección
en cada caso depende del problema que se quiera resolver, pero en líneas generales la
función relu (ver Figura 6) o la función sigmoide son buenas opciones.
División de los datos: El primer paso que se debe dar a la hora de entrenar cualquier
modelo de aprendizaje automático o red neuronal es realizar una división de los datos
etiquetados que se tienen disponible (ver Figura 7). Este conjunto se denomina
“dataset” o conjunto de datos. Normalmente la división se realizar en tres partes, tal y
como se muestra en la Figura 7:
• Datos de entrenamiento: son los datos con los que se entrena el modelo. Suele
ser el 60% o 70% de los datos disponibles. Estos datos deben estar balanceados
entres las clases que se quiera clasificar. Por lo tanto, si queremos realizar un
clasificador entre perros y gatos, el 50% de los datos de entrenamiento deben
ser de perros y el 50% de gatos.
• Datos de validación: son los datos con los que se ajusta el modelo o que se
utilizan para comparar modelos. Como se verá en las siguientes secciones, las
redes neuronales tienen numerosos parámetros de funcionamiento. Si
queremos realizar un ajuste de dichos parámetros debemos utilizar los datos de
validación para ver cómo afecta cada uno de los parámetros de ajuste en el
resultado del modelo. Igualmente, si tenemos varias arquitecturas de red
neuronal que queremos comparar, dicha comparación la debemos realizar
utilizando los datos de validación. Nunca debemos utilizar los datos de
entrenamiento para esta operación de ajuste del modelo, ya que esos datos ya
han sido utilizados por la red durante el entrenamiento. Para la validación del
modelo se suelen utilizar el 20% o 30% de los datos disponibles.
• Datos de testeo: los datos de testeo se utilizan para mostrar los resultados
finales del modelo. Son datos que nunca ha visto la red neuronal en ninguno de
los pasos anteriores. Normalmente se utilizan el 15% o 20% de los datos
disponibles.
Diseño Electrónico e Instrumentación 2020
Industrial (DEII-2)
Figura 7. Procedimiento de visión de los datos para entrenamiento, validación y testeo del modelo
Hay que advertir que el entrenamiento de una red neuronal puede ser un procedimiento
lento ya que, dependiendo de la cantidad de datos que tengamos y la estructura de red
que utilicemos (número de capas y tipo de red), el número de pesos de la red neuronal
puede ser muy elevado. Se puede llegar fácilmente a arquitecturas de red con millones
de pesos. Es por ello por lo que en esta práctica el entrenamiento de la red se realizará
Diseño Electrónico e Instrumentación 2020
Industrial (DEII-2)
en el portátil y, una vez entrenada, se describirá el procedimiento para pasar la red
neuronal una vez entrenada a la Rasberry pi. Es decir, en la Raspberry pi solo se ejecutará
la red una vez entrenada. Esto es lo que se conoce como etapa de inferencia de la red y
la cantidad de recursos necesarios para esta etapa es mucho menor. No obstante, para
arquitecturas de red con muchas capas y neuronal, la etapa de inferencia también puede
ser un problema para la Raspberry pi.
En base a los resultados del modelo con respecto a la realidad, podemos tener cuatro
resultados:
• Verdaderos Positivos (VP): La red neuronal nos has devuelto un valor positivo y
la realidad es que la clase es positiva. En el ejemplo del clasificador de perros y
gatos, este caso representa la situación en la que la foto es de un perro y la red
neuronal nos ha dicho que es un perro. Es decir, la red ha clasificado
correctamente la foto.
• Falsos Positivos (FP): La red neuronal dice que la clase es positiva pero la realidad
es que la clase es negativa. Volviendo al ejemplo, sería la situación en la que la
red neuronal predice que la foto es de un perro, pero la realidad es que es un
gato. La red se ha equivocado.
• Falsos Negativos (FN): En este caso la red nos dice que un dato no es de una
clase, pero la realidad es que sí es de esa clase. La red neuronal nos dice que la
foto no es de un perro, pero sí es la foto de un perro. La red se ha equivocado.
Diseño Electrónico e Instrumentación 2020
Industrial (DEII-2)
• Verdadero Negativo (VN): La red nos dice que la clase es negativa y la realidad
nos dice lo mismo. La red nos ha dicho que no es un perro (es un gato) y la
realidad es que es la foto de un gato. La red ha acertado.
Se puede ver fácilmente que los casos VP y VN son en los que la red neuronal acierta
con su predicción y los casos FP y FN son los casos en los que la red falla. En función de
la cantidad de predicciones que tenemos en cada uno de los resultados anteriores se
pueden definir las siguientes métricas de funcionamiento:
𝑉𝑃 + 𝑉𝑁
𝐴𝑐𝑐𝑢𝑟𝑎𝑐𝑦 =
𝑉𝑃 + 𝐹𝑃 + 𝑉𝑁 + 𝐹𝑁
La métrica “accuracy” es la más utilizada si queremos saber si el clasificador funciona
correctamente con respecto a las clases que se desean clasificar. Sin embargo, el
“accuracy” no trata por igual los FP y FN. En algunas aplicaciones eso puede ser
problemático. Imaginemos ahora un clasificador de tumores, un FN negativo puede ser
catastrófico, la red neuronal estaría prediciendo que el paciente está sano (no tiene
cáncer) cuando reamente tiene un tumor. Para este tipo de aplicaciones se define la
métrica “recall”.
“Recall”: Se define como número de veces que la red detecta positivos reales respecto
a todos los positivos que hay realmente.
𝑉𝑃
𝑅𝑒𝑐𝑎𝑙𝑙 =
𝑉𝑃 + 𝐹𝑁
Por otra parte, hay casos donde queremos centrarnos en reducir los FP. Por ejemplo,
imagine un sistema clasificador de bueno clientes (fieles) a los que se les ofrecen
descuentos. En este caso, un FP significa que se le está ofreciendo un descuenta a una
persona que en realidad no es un buen cliente. En este caso nos interesa que los FP sean
bajos. Para considerar la relación de falsos positivos se utiliza la métrica “precision”.
“Precision”: Mide el cociente de los verdaderos positivos que registra el modelo frente
a todas las predicciones positivas de dicho modelo.
𝑉𝑃
𝑃𝑟𝑒𝑐𝑖𝑠𝑖𝑜𝑛 =
𝑉𝑃 + 𝐹𝑃
Finalmente, existe la métrica F1 que tiene considera tanto el “recall” como el “precisión”
y que se define como:
Diseño Electrónico e Instrumentación 2020
Industrial (DEII-2)
𝑟𝑒𝑐𝑎𝑙𝑙
𝐹1 =
𝑝𝑟𝑒𝑐𝑖𝑠𝑖𝑜𝑛 + 𝑟𝑒𝑐𝑎𝑙𝑙
Las redes neuronales convolucionales (“Convolutional Neural Network” o CNN) son unas
de las redes más usadas dentro del mundo del Deep learning. Son un tipo de red
neuronal diseñadas específicamente para visión artificial. Su nombre es debido a que
dentro de su estructura usan capas de convolución para recibir y procesar datos de
imágenes. En esta práctica nos centraremos en las redes convolucionales de dos
dimensiones que son las que se utilizan en los problemas de visión artificial.
Estas redes toman una imagen como entrada a la que se le normalizan los valores de los
píxeles. Los colores de los píxeles tienen valores que van de 0 a 255, por lo que antes de
alimentar la red se hace una transformación de cada píxel, dividiendo cada valor entre
255, de forma que el valor de todos los píxeles de la imagen quede normalizado entre 0
y 1. La red neuronal convolucional irá reconociendo cada vez formas más complejas a
medida que se llegue a capas más profundas dentro de su estructura, hasta que la capa
final sea capaz de clasificar y predecir la etiqueta de la imagen de entrada.
La estructura de una CNN suele tener dos partes claramente diferenciadas: en la primera
de ellas se produce la extracción de las características o ”features” de la imagen; y en la
segunda de ellas se produce la clasificación de la imagen. Se suelen usar principalmente
tres tipos diferentes de capas en una CNN: capas de convolución, capas de “pooling” y
capas densamente conectadas. Las dos primeras de ellas se encargan de la primera parte
(extracción de características). La última, en cambio, se suele encargar de la segunda
parte (clasificación). A continuación, se pasa a ver un poco más en profundidad cada una
de ellas.
Las capas convolucionales son el núcleo de las redes neuronales convolucionales. Estas
capas aprenden patrones locales de la imagen de entrada en pequeñas ventanas de dos
dimensiones. Su objetivo principal es, por tanto, detectar características y rasgos
visuales en las imágenes tales como aristas, bordes, etc. De esta forma, una vez una
característica sea detectada en un punto en concreto de la imagen, se puede reconocer
después automáticamente en cualquier parte de la misma.
Otra de las características de estas capas es que pueden aprender jerarquías espaciales
de patrones conservando relaciones especiales. Es decir, una primera capa
convolucional puede aprender elementos básicos como líneas, y posteriormente, una
Diseño Electrónico e Instrumentación 2020
Industrial (DEII-2)
segunda capa convolucional puede aprender patrones compuestos de los elementos
más básicos aprendidos en la primera capa, y así de forma sucesiva se pueden ir
aprendiendo patrones cada vez más complejos en capas convolucionales posteriores.
De forma general las capas convolucionales operan sobre tensores 3D llamados “feature
maps” o mapas de características. Estos mapas tienen tres ejes, dos para altura y
anchura, y un tercero de canal o profundidad. Para una imagen de color RGB la
dimensión del eje de canal es 3, puesto que la imagen tiene tres canales: rojo, verde y
azul. En cambio, para una imagen en blanco y negro, la dimensión de este canal es 1
(solo el nivel de gris de la imagen).
Para conectar cada neurona de la capa oculta con cada una de las 25 (5x5) píxeles de
entrada que le corresponden de la capa de entrada, se usa un valor de sesgo y una matriz
de pesos llamada filtro, con las mismas dimensiones que la ventana de la capa de
entrada, es decir, 5x5 en este caso. De esta forma, el valor de cada punto de la capa
oculta se corresponde con el producto escalar entre la matriz de pesos o filtro y el
puñado de 5x5 neuronas de la capa de entrada que corresponda para esa posición en
particular. Cabe destacar que mientras la ventana de 5x5 de la capa de entrada respecto
a la capa oculta va variando según se va desplazando, el valor de todo el filtro (matriz de
pesos y sesgo) es inalterable para todas las neuronas de la primera capa oculta.
En la figura 14 se puede ver un ejemplo de producto escalar entre un filtro y una ventana
de una imagen de otra capa. No corresponde con el ejemplo que se está explicando en
este apartado puesto que las dimensiones de las ventanas son diferentes, pero sirve
para captar la idea.
A partir de este punto, la red conectada actúa de la misma forma que hemos visto en la
sección anterior. En este caso las entradas no son los píxeles de las imágenes, sino las
“features” obtenidas por las capas convolucionales. La salida de la red densa es un
vector de valores de una sola dimensión representa con cada valor la probabilidad de
que ciertas características pertenezcan o no a cierta etiqueta (gracias a la función de
activación “softmax”). La siguiente Figura 14 muestra una red convolucional completa
en la que se pueden observar todas las capas descritas anteriormente.
Figura 15. Extracción de características en cada capa de una red neuronal convolucional 2D
[Link]
downloads
Diseño Electrónico e Instrumentación 2020
Industrial (DEII-2)
El “prompt” de Anaconda es el terminal de la distribución de Python que se instala con
Ananconda, está disponible desde el botón de inicio Window, buscando en la carpeta
donde ha instalado Anaconda.
Para esta práctica se han utilizado las siguientes versiones de tensorflow 2.3.0 y Keras
2.4.3.
El primer ejemplo que vamos a ver es la clasificación de dígitos escritos a mano (MNIST).
Este problema está considerado como el “¡hola mundo!” de los problemas de
aprendizaje automático profundo. Consiste en un problema de aprendizaje supervisado
cuyo objetivo es clasificar las fotografías de unos dígitos que han sido escritos a mano.
La siguiente Figura 16 muestra ejemplos de dígitos del “dataset”. El conjunto de datos
está compuesto por 70000 imágenes en blanco y negro con una resolución de 28 x 28
píxeles.
En primer lugar, debemos importar las librerías, cargar el “dataset” y dividir los datos en
entrenamiento y testeo (línea 7 en Figura 17). No se va a realizar validación del modelo
por lo que no es necesario realizar la división en tres partes. A continuación,
comprobamos el número de dimensiones de los datos, tenemos un tensor de tres
dimensiones con la forma (60000, 28, 28). Es decir, tenemos 60000 fotos de
Diseño Electrónico e Instrumentación 2020
Industrial (DEII-2)
entrenamiento que son 28x28. Los datos de testeo también tendrán la misma forma,
pero son solo 10000 imágenes. Se puede calcular que se ha considerado como un 15%
del total de datos como datos de testeo.
Figura 17. Importamos librerías, dividimos los datos y analizamos la cantidad de datos que tenemos y la forma
que tienen.
El siguiente paso es escalar los datos para que estén comprendidos entre 0 y 1. Este
procesado facilita el entrenamiento de la red. Se puede ver en la Figura 20 que se escalan
tanto los datos de entrenamiento como los de testeo. Hay que recordar que las
imágenes están en escala de grises por lo que el valor máximo de cada píxel es de 255.
Diseño Electrónico e Instrumentación 2020
Industrial (DEII-2)
• Tamaño del batch (bath size en la línea 56), define el número de muestras de
los datos de entrenamiento que se pasan a la red en cada actualización de los
pesos (actualización del gradiente).
• Número de clases que tiene el problema.
Diseño Electrónico e Instrumentación 2020
Industrial (DEII-2)
• Número de episodios o “epochs” (línea 58), define el número de veces que se
pasan los datos de entrenamiento por la red durante el entrenamiento.
• En el método compile debemos definir tres parámetros importantes:
o La función de pérdida o “loss” determina cómo se calcula el error de
predicción de la red. En este caso, la función de pérdida que se utiliza es
la función “categorical_crossentropy” [3]. Esta función es típica en los
problemas de clasificación.
o El optimizador que se utiliza para ajustar los parámetros del modelo
“optimizer”. En este caso se ha utilizado el algoritmo gradiente
estocástico descendente “sgd”.
o La métrica que se evalúa durante el entrenamiento de la red. En este
caso, se evalúa el “accuracy”.
• A continuación, el método fit es el que realiza el entrenamiento de la red.
Debemos indicar los siguientes parámetros:
o Datos de entrenamiento (x_train e y_train).
o El atributo validation_split (opcional) permite utilizar parte de los datos
de entrenamiento como datos de validación en cada paso del
entrenamiento. En este caso, se están utilizando un 33% de los datos para
dicha validación.
o Tamaño del batch que vamos a utilizar.
o Número de epochs.
o Verbose=1 permite observar el entrenamiento en terminal de Python.
El siguiente paso el salvar los pesos del modelo (ver Figura 29). Estos pesos del modelo
se cargarán en la red neuronal que se implementará en la Rpi.
Las siguientes partes del código no se muestran porque son largas y son aspectos de
visualización y representación de los resultados. No obstante, sí analizamos los
resultados. En la Figura 30 se muestra la evolución del “accuracy” durante el
entramiento de la red. Se puede observar cómo aumenta hasta converger a valor de 0.9.
Diseño Electrónico e Instrumentación 2020
Industrial (DEII-2)
Lo mismo ocurre con la función de perdida tal y como se muestra en la Figura 31. Se
puede observar que la red neuronal se está entrenando bien porque la función de
perdida se va minimizando en cada paso.
En primer lugar, cargamos los datos y los procesamos (ver Figura 33). En este caso los
tensores de entrada tienen que ser del tipo (28, 28, 1) (líneas 12 y 13). Es decir, cada
data un es una matriz de píxeles 28 x 28. De nuevo las etiquetas las debemos convertir
a vectores “one hot encoding” (líneas 15 y 16).
Diseño Electrónico e Instrumentación 2020
Industrial (DEII-2)
El siguiente paso es definir la red neuronal (ver Figura 34). Se han definido dos capas de
tipo convolucional (líneas 24 y 26). En la primera capa se definen 32 filtros con un
“kernel” 5 x 5 (tamaño del filtro o “kernel_size”). La función de activación es del tipo
“relu”, las cuales funcionan bastante bien en redes convolucionales (no tiene problemas
de desvanecimiento del gradiente que muestra la sigmoide). La segunda capa
convolucional se define con 64 filtros con el mismo “kernel” y la misma función de
activación. Después de cada convolucional se realiza una operación de “pooling” de tipo
”max” (líneas 25 y 27). Finalmente, se convierte la salida de la segunda capa
convolucional mediante un “flatten” (línea 28) para convertir a un tensor de una
dimensión para atacar a la capa densa (línea 29). Esta capa densa es la que realiza la
clasificación según las características o “features” obtenidas por las capas
convolucionales. Como en toda clasificación la última capa debe tener la función de
activación “softmax”.
Pasamos a continuación a evaluar el funcionamiento con los datos de testeo. Tal y como
muestra la Figura 38 se ha conseguido un “accuracy” del 98%. Es decir, hemos diseñado
un clasificador casi perfecto.
Por último, es interesante mostrar la matriz de confusión resultante para este caso. En
la Figura 39 se puede observar que apenas se comenten errores, mejorando
significativamente los resultados obtenidos por la red neuronal densamente conectada
diseñada en el apartado anterior.
Diseño Electrónico e Instrumentación 2020
Industrial (DEII-2)
Se ha podido ver que una red neuronal, independientemente del tipo, requiere la
selección de muchos parámetros, normalmente denominados hiper parámetros. A
modo resumen, para la definición de la red debemos elegir: números de capas, tipo de
capa, número de neuronas por capa y función de activación. Para el entrenamiento de
la red debemos seleccionar: optimizador, tamaño del lote, número de episodios, métrica
de funcionamiento, función de pérdida, etc. En definitiva, el número de opciones es muy
elevado. La elección óptima de dichos parámetros para cada problema es un tema de
investigación actual, por lo que se escapa de esta práctica introductoria. No obstante,
se recomienda partir de estructuras de redes que se hayan utilizado en problemas
parecidos al que queramos resolver. Partiendo de esos modelos y con pequeñas
modificaciones ad hoc se pueden conseguir buenos resultados.
Diseño Electrónico e Instrumentación 2020
Industrial (DEII-2)
3 Implementación en la Raspberry pi
En esta sección vamos a describir los pasos que se deben dar para cargar las redes
neuronales diseñadas en los pasos anteriores en la Rpi y comprobar su funcionamiento.
Para probar el funcionamiento de las redes en la Rpi debemos ejecutar dos pasos:
Para ejecutar los scripts de esta sección se ha utilizado la librería PIL 0, la cual se ha
instalado en la Rpi mediante el comando: pip3 install Pillow
Una vez cargados los pesos de la red, podemos realizar la predicción de un dígito. Para
ello se convierte la foto [Link] en un array (líneas 16 y 17 en Figura 41) y se pasa a
la red neuronal (línea 21). En la línea 16 se ha cargado la imagen en formato de la librería
Pillow, se ha convertido en escala de grises. En la línea 19 se convierte la imagen a un
tensor de tipo (1, 784). El tensor tiene que ser de dicho tipo debido a que el método
“predict” espera recibir un conjunto de muestras. Hay que recordar que la salida de la
red neuronal es vector de probabilidades, por lo tanto, se debe calcular la mayor
probabilidad para determinar la predicción de la red.
Diseño Electrónico e Instrumentación 2020
Industrial (DEII-2)
Hay que indicar que la predicción de la red es relativamente rápida y que el script tarda
más en ejecutarse debido a que deber realizar la carga de los pesos en la red neuronal.
Este paso solo se debe realizar una vez por lo que el resto de las predicciones serían
mucho más rápidas.
Al igual que en el caso anterior, primero definimos la red neuronal y cargamos los pesos
(ver Figura 42). En segundo lugar, realizamos la predicción de la foto (Figura 43). En este
caso, el procesamiento de la imagen es distinto ya que se debe convertir a un tensor del
tipo (1, 28, 28, 1). La primea dimensión se debe al método “predict” y el resto a la
entrada de la red convolucional 2D. El aumento de dimensiones del tensor se consigue
con el método “newaxis” de la librería “numpy”.
3.3 Ejercicio
Notas:
En el caso de la red densamente conectada las condiciones en las que se toman las fotos
deben ser muy similares a los datos de entrenamiento. Si las imágenes están rotadas o
desplazadas, la red tendrá muchos problemas para predecir correctamente los dígitos.
La Figura 44 muestra un conjunto de imágenes sacada del dataset para ilustrar el tipo de
señales que se clasifican. El dataset completo se puede consultar y descargar de [6]. Este
conjunto de datos contiene 50000 imágenes. Las imágenes se encuentran en formato
PPM (Portable Pixmap), varían su tamaño entre un mínimo de 15x15 y un máximo de
250x250 píxeles, sin necesidad de que la imagen sea cuadrada. En general, en estas
imágenes no aparece la señal de tráfico únicamente y con enfoque perfecto, sino que
se ve el entorno en el que se encuentran y desde orientaciones y enfoques diferentes,
Diseño Electrónico e Instrumentación 2020
Industrial (DEII-2)
pero la señal sí que está siempre centrada en la imagen. Antes de pasárselas a la red
será necesario aplicarles un procesado previo.
Figura 44. Señales de ejemplo del dataset para el clasificador de señales de tráfico
La red convolucional diseñada se muestra en la Figura 45. La red tiene una estructura
típica dentro de las redes convolucionales para visión artificial ya que combina
capas convolucionales con capas de “pooling”. Finalmente, incluye una serie de
capas densas para realizar la clasificación de imagen de entrada según las
características obtenidas por las capas convolucionales. La red tiene más de dos
millones de pesos que deben ser ajustado. El “accuracy” obtenido con la red es
del 98% con los datos de test, lo que demuestra que el funcionamiento del
clasificador desarrollado es el adecuado. Como optimizador se ha utilizado el
algoritmo Adams [8], demostrando durante la validación del modelo mejores
resultados que los algoritmos RMSProp [9] y SGD [10].
Diseño Electrónico e Instrumentación 2020
Industrial (DEII-2)
Los datos del dataset fueron procesados para el entrenamiento. Las imágenes se
convirtieron a blanco y negro, y se redimensionaron para tener un formato 64 x 64. La
Figura 46 muestra el resultado final del procesamiento sufrido por una imagen antes de
utilizarse para el entrenamiento, validación y testeo de la red neuronal.
Diseño Electrónico e Instrumentación 2020
Industrial (DEII-2)
1. Tomar una foto con la cámara de prueba para comprobar que la cámara funciona
correctamente.
2. Tomar una foto de una señal de tráfico. Una vez que se realiza la foto, se realiza
el procesamiento de la imagen para poder introducir la misma en la red
neuronal.
3. Realiza la predicción y nos pregunta si la predicción ha sido correcta (“y” para
indicar que sí, “n” para indicar que no).
4. Nos pregunta si queremos realizar más predicciones (“y” para indicar que sí, “n”
para indicar que no). Si queremos seguir, volvemos al punto 2.
5. Se muestra un resumen de las señales que se han clasificado correctamente.
Hay que tener en cuenta que el funcionamiento del clasificador va a depender mucho
de que las fotos que se tomen sean parecidas a las fotos que se han utilizado para el
entrenamiento.
4.5. Ejercicio
Se propone como ejercicio utilizar una foto de test del conjunto de datos y probar que
se reconocer correctamente desde la raspberry pi.
Diseño Electrónico e Instrumentación 2020
Industrial (DEII-2)
Bibliografía
[1] [Link]
[2] [Link]
[3] [Link]
[4] [Link]
ses/udacity_intro_to_tensorflow_for_deep_learning/l01c01_introduction_to_cola
b_and_python.ipynb
[5] [Link]
[6] Dataset señales de tráfico:
[Link]
[7] Stallkamp, J., Schlipsing, M., Salmen, J., & Igel, C. (2011, July). The German traffic sign
recognition benchmark: a multi-class classification competition. In The 2011
international joint conference on neural networks (pp. 1453-1460). IEEE.
[8] [Link]
[9] [Link]
[10] [Link]