0% encontró este documento útil (0 votos)
5 vistas39 páginas

Redes Neuronales en Visión Artificial

El documento presenta una práctica sobre la introducción a las redes neuronales aplicadas a la visión artificial utilizando Python y Raspberry Pi. Se abordan conceptos fundamentales como el aprendizaje automático, tipos de redes neuronales, funciones de activación y el proceso de entrenamiento de modelos. Además, se proporciona una guía sobre el material necesario y recursos para llevar a cabo la práctica, incluyendo el uso de Keras y TensorFlow.

Cargado por

rosana
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
5 vistas39 páginas

Redes Neuronales en Visión Artificial

El documento presenta una práctica sobre la introducción a las redes neuronales aplicadas a la visión artificial utilizando Python y Raspberry Pi. Se abordan conceptos fundamentales como el aprendizaje automático, tipos de redes neuronales, funciones de activación y el proceso de entrenamiento de modelos. Además, se proporciona una guía sobre el material necesario y recursos para llevar a cabo la práctica, incluyendo el uso de Keras y TensorFlow.

Cargado por

rosana
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

See discussions, stats, and author profiles for this publication at: [Link]

net/publication/350432235

INTRODUCCIÓN A LAS REDES NEURALES PARA VISIÓN ARTIFICIAL CON


PYTHON Y RASPBERRY PI

Preprint · March 2021


DOI: 10.13140/RG.2.2.20121.34409

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.

The user has requested enhancement of the downloaded file.


Diseño Electrónico e Instrumentación 2020
Industrial (DEII-2)

PRÁCTICA 5: INTRODUCCIÓN A LAS REDES NEURALES


PARA VISIÓN ARTIFICIAL CON PYTHON Y RASPBERRY PI
Objetivos:
El objetivo de esta práctica es la introducción a las redes neuronales para aplicación en
problemas de visión artificial con Raspberry Pi. En concreto, en esta práctica
abordaremos los siguientes puntos:

• Introducción a las redes neuronales (redes totalmente/densamente conectas y


redes convolucionales).
• Diseño y entrenamiento de redes neuronales en Python utilizando Keras y
tensorflow.
• Aplicación de visión artificial: clasificador de señales de tráfico.

Material necesario:
Para realizar la práctica se necesita el siguiente material:

• Tarjeta Raspberry Pi 3/4 con el cargador de alimentación (se proporciona).


• Cámara V2.0
• Ordenador portátil con sistema operativo Windows (lo debe proporcionar el
alumno). Para esta práctica es necesario que el alumno tenga instalado en su
portátil la distribución de Python Anaconda, la cual se puede descargar del
siguiente enlace:

[Link]

• Cable Ethernet (lo debe proporcionar el alumno).


• Los scripts necesarios para la práctica se pueden descargar del siguiente
repositorio (para descargar en el portátil):

[Link]

• Desde la Rpi se debe clonar el repositorio:

git clone [Link]


Diseño Electrónico e Instrumentación 2020
Industrial (DEII-2)

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. Machine learning y Deep learning


Antes de comenzar la parte práctica debemos realizar una introducción teórica sobre el
aprendizaje automático y el aprendizaje profundo.

1.1 Introducción

El aprendizaje automático o “machine learning” ha adquirido mucha importancia en los


últimos años. Varios son los motivos que han hecho posible esta nueva oleada de
modelos de aprendizaje automáticos:

• 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.

Además, en los últimos años ha irrumpido con fuerza el aprendizaje automático


profundo o Deep Learning. El aprendizaje profundo está considerado como una subclase
del aprendizaje automático (ver Figura 1). La principal característica del aprendizaje
profundo es la cantidad de datos de entrenamiento que requieren comparado con los
modelos de aprendizaje automático clásicos. No obstante, en líneas generales, los
resultados obtenidos por los modelos de aprendizaje profundo superan con creces los
resultados obtenidos por los modelos más clásicos de aprendizaje automáticos, sobre
todo en lo que se refiere a visión artificial, como veremos en esta práctica.
Diseño Electrónico e Instrumentación 2020
Industrial (DEII-2)

Figura 1. Aprendizaje automático y aprendizaje profundo

1.2 Aprendizaje supervisado y aprendizaje no supervisado

En el ámbito del aprendizaje automático o “Machine learning”, los problemas se


clasifican de forma genérica en dos tipos: aprendizaje supervisado o aprendizaje no
supervisado. Con respecto al aprendizaje supervisado tenemos dos tipos de tareas:
clasificación y regresión. En la clasificación el objetivo es predecir la clase a la que
pertenece un dato de entrada de entre un número finito de clases. Por ejemplo, si
queremos clasificar fotos de perros y gatos la tarea de la red será, una vez entrenada, la
de identificar si la foto que le pasamos (una foto que no ha visto nunca el modelo) es de
un perro o de un gato (es decir, que realice una predicción). Con respecto a la regresión,
el objetivo es predecir un valor numérico continuo para un dato de entrada. Por
ejemplo, si queremos predecir el valor de una vivienda en función de sus características
(metros cuadrados, número de cuartos, etc.), podemos entrenar una red neuronal con
un conjunto de datos de viviendas. Una vez entrenada la red, el objetivo es que ante una
nueva vivienda la red realice una predicción su valor. La Figura 2 muestra la estructura
general de un modelo de aprendizaje supervisado. Una característica importante del
aprendizaje supervisado es que debemos tener los datos de entrenamiento y testeo
etiquetados. Esto significa que, si estamos en el problema de clasificación de perros y
gatos, debemos tener todas las fotos etiquetadas como perros o gatos. El proceso de
etiquetado puede ser tedioso ya que las redes neuronales necesitan muchos datos para
ser entrenadas correctamente. De manera genérica el modelo de aprendizaje
supervisado se divide en dos etapas (Figura 1): i) etapa de entrenamiento y ii) etapa de
inferencia. Durante la etapa de entrenamiento el modelo se ajusta mediante un proceso
Diseño Electrónico e Instrumentación 2020
Industrial (DEII-2)
de optimización. En la fase de inferencia, el modelo hace predicciones con datos que
nunca habido visto (no se han utilizado durante el entrenamiento).

Figura 2. Estructura del aprendizaje supervisado

En el caso de regresión, el etiquetado consistiría en tener el valor de todas las viviendas


utilizadas para el entrenamiento y testeo de la red.

En cuanto al aprendizaje no supervisado, la tarea principal se denomina “clustering“ o


agrupamiento. En este caso no se tienen los datos etiquetados y el objetivo es agrupar
los datos de entrada en función de las características de los datos, de forma que datos
que tengan características parecidas puedan ser agrupados en el mismo grupo. Los
problemas de aprendizaje no supervisados son en general más complejos que los
supervisados y quedan fuera del alcance de esta práctica.

En esta práctica nos centraremos en el aprendizaje supervisado, en concreto en los


problemas de clasificación, ya que son un núcleo importante dentro de la visión artificial.
Por lo tanto, el objetivo será entrenar una red neuronal para que clasifique un dato de
entrada como una clase dentro de un rango finito de clases disponibles.

2. Introducción a las redes neuronales


A continuación, realizaremos una introducción sobre los distintos tipos de redes
neuronales que se utilizan en la actualidad.
Diseño Electrónico e Instrumentación 2020
Industrial (DEII-2)
2.1. Perceptrón

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.

Figura 3. Modelo del perceptrón (imagen tomada de Wikipedia:


[Link]

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.

2.2. Redes multicapa o redes densamente conectadas

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.

Figura 4. Estructura red multi capa

Normalmente, el número de neuronas que componen cada capa se va reduciendo


conforme avanzamos de izquierda a derecha en la red. La idea es que las primeras capas
capturan características más generales de los datos y las siguientes redes utilizan los
resultados de las primeras capas para obtener características de más alto nivel.

2.3. Funciones de activación.

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.

Figura 5. Función de activación sigmoide.

Figura [Link]ón de activación ReLu

Una función de activación básica en los problemas de clasificación es la función


“softmax” que, normalmente, se utiliza en la capa de salida de la red. La función
“softmax” se puede ver como una generalización de la función sigmoide para más de
dos clases. Mientras que una sigmoide nos devuelve un valor de 0 o 1 (clasificamos entre
dos clases), la función de activación “softmax” nos devolverá la probabilidad de
pertenencia a cierta clase. Una característica importante de estas probabilidades es que
son excluyentes. Es decir, todas las probabilidades de pertenencia a las clases
disponibles deben sumar uno. Por lo tanto, en todo problema de clasificación la última
Diseño Electrónico e Instrumentación 2020
Industrial (DEII-2)
capa debe utilizar la función de activación “softmax” (salvo que sea un problema de
clasificación binario, donde también se podría usar la función sigmoidal).

2.4. Entrenamiento de una red neuronal.

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

Entrenamiento: el entrenamiento de una red neuronal se puede dividir de forma


genérica en varios pasos:

1) En primer lugar, los pesos de la red se inicializan de manera aleatoria. No


obstante, está demostrado que algunas técnicas de inicialización de los pesos
producen mejores resultados [1].
2) A continuación, los datos de entrenamiento se van pasado por la red neuronal
divididos en lotes (batch). El tamaño del lote óptimo se debe elegir, pero
normalmente se utilizan valores de 32 y 64. Al pasar los datos por la red, se
producirán un conjunto salidas que se compararán con las etiquetas de dichos
datos para saber si el resultado es correcto o no. Seguidamente, se utiliza en una
función de coste que mide la calidad del resultado.
3) El siguiente paso es actualizar los pesos de las neuronas, este paso se denomina
“backprogration” en la literatura y consiste en actualizar los pesos de las
neuronas en función de su contribución en el resultado. La idea es que, si una
neurona ha contribuido en la predicción correcta del resultado, el peso de dicha
neurona aumente. La explicación en detalle de la técnica de “backpropagation”
está fuera del alcance de esta práctica, pero el mecanismo se basa en utilizar la
regla de la cadena de derivación, desde la función de coste hacia atrás hasta la
primera capa [2].
4) A continuación, el paso 2) y 3) se repiten hasta que todos los datos de
entrenamiento pasan por la red neuronal y contribuyen al ajuste de los pesos. El
parámetro epoch (lo veremos más adelante), determina el número de veces que
los datos de entramiento se utilizan para ajustar los pesos.

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.

2.5. Métricas de funcionamiento.

A continuación, debemos describir cómo vamos a medir la bondad de funcionamiento


de nuestra red neuronal. Como hemos dicho anteriormente, estamos centrados en
problemas de clasificación, por lo que las métricas de funcionamiento deben medir la
calidad del clasificador que estamos desarrollando. En primer lugar, debemos introducir
la matriz de confusión. La Figura 8 muestra la matriz de confusión desde el punto de
vista teórico, se puede observar que en las filas aparece el valor real de la observación.
En cuanto a las columnas representan la predicción realizada por el modelo.

Figura 8. Matriz de confusión

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:

“Accuracy”: Se define como la relación existente entre el número de predicciones que


el modelo ha hecho correctamente frente al número total de predicciones.

𝑉𝑃 + 𝑉𝑁
𝐴𝑐𝑐𝑢𝑟𝑎𝑐𝑦 =
𝑉𝑃 + 𝐹𝑃 + 𝑉𝑁 + 𝐹𝑁
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 =
𝑝𝑟𝑒𝑐𝑖𝑠𝑖𝑜𝑛 + 𝑟𝑒𝑐𝑎𝑙𝑙

2.6. Redes convolucionales.

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.

2.6.1. Capa convolucional:

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).

Por ejemplo, en la figura 12 se puede ver como la imagen de entrada es un espacio de


dos dimensiones (28 de altura, 28 de anchura y tan solo 1 de profundidad al ser una
imagen no en color).

Figura 9. Conexión entre la capa de entrada y la capa oculta.

Se puede pensar, por tanto, en un espacio de neuronas de 2D de 28x28 como entrada


de la red neuronal. A partir de aquí, una primera capa de neuronas ocultas conectada
con pequeñas zonas del espacio de esta capa de entrada se encargará de realizar las
operaciones convolucionales que se han descrito anteriormente. Siguiendo con el
ejemplo, cada neurona de la primera capa oculta será conectada a una pequeña región
de 5x5 neuronas de la capa de entrada de 28x28. Esta ventana de 5x5, se irá deslizando
hacia la derecha y de arriba abajo por toda la capa de entrada de forma sucesiva desde
la esquina superior izquierda hasta la esquina inferior derecha, de forma que por cada
posición de la ventana de 5x5 hay una neurona en la primera capa oculta que procesa
toda esa información de la ventana en esa posición específica. Para el caso concreto del
ejemplo, si se aplica una ventana de 5x5 a la capa de entrada de 28x28 se tendrá en la
primera capa oculta un espacio de 24x24. Esto es debido a que en un espacio de 28x28,
Diseño Electrónico e Instrumentación 2020
Industrial (DEII-2)
la ventana de 5x5 solo se puede mover 23 neuronas hacia la derecha y 23 neuronas hacia
abajo antes de llegar a los límites 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.

Figura 10. Producto escalar entre la ventana imagen y el filtro convolucional

Volviendo al ejemplo anterior, el filtro servirá para buscar características y patrones


locales en pequeñas zonas de la imagen de la capa inicial. Pero un filtro definido por una
matriz y un sesgo solo es capaz de detectar una característica en concreto de la imagen.
Es por eso por lo que, normalmente, se suelen usar varios filtros a la vez en una capa
convolucional, de forma que cada uno de ellos corresponda con una característica que
se quiera detectar. De forma gráfica, esta capa convolucional con 32 filtros se puede
simbolizar tal y como se muestra en la Figura 11. Así, cada uno de los 32 filtros tendrá
su propia matriz de pesos 5x5 y su propio sesgo. En este ejemplo, la capa convolucional
recibe un tensor de entrada 28x28x1 y al final de la misma genera una salida de un tensor
3D con dimensiones 24x24x32 que contiene las 32 salidas de dimensiones 24x24 como
resultado de computar los 32 filtros sobre el tensor de entrada. Por último, al final de
cada capa de convolución se aplica una función de activación. Estos filtros componen los
Diseño Electrónico e Instrumentación 2020
Industrial (DEII-2)
pesos de la red que se ajustarán mediante el entrenamiento. Como los filtros son de dos
dimensiones, la red convolucional extraerá características o “features” de dos
dimensiones. Por ejemplo, un filtro puede encargarse de detectar líneas horizontales,
otro filtro, líneas verticales, y así cada filtro podrá detectar un tipo distinto de
característica de la imagen de entrada.

Figura 11. Capa convolucional con 32 filtros

2.6.2. Capa “pooling”:

Estas capas suelen acompañar a las capas de convolución inmediatamente después. Se


encargan de hacer una simplificación de la información recogida por la capa
convolucional, de forma que crean una versión condensada de toda la información
contenida en estas últimas. Se podría decir que estamos bajando la resolución de las
imágenes. En el ejemplo de la Figura 12 se elige una ventana de dimensiones 2x2 de la
capa convolucional para sintetizar esa información en un punto de la capa de “pooling”.

Figura 12. Ejemplo de capa "pooling"


Diseño Electrónico e Instrumentación 2020
Industrial (DEII-2)
Hay varias formas de condensar la información en esta capa, aunque la más habitual y
conocida es la técnica de “max-pooling”. Esta técnica da como resultado el valor máximo
de los que había en la ventana de 2x2 (en el caso del ejemplo). Al haber en este caso una
ventana de 2x2, las dimensiones de salida de la capa de “pooling” son de 12x12 tal y
como se puede ver en la Figura 12. En el caso del ejemplo, al ser la ventana de 2x2, ésta
se va a desplazar desde la esquina superior izquierda hacia la derecha y hacia abajo de
2 en 2 píxeles, hasta llegar a la esquina inferior derecha del filtro (el desplazamiento se
puede ajustar). Cabe destacar que con la transformación de “pooling” se mantiene la
relación espacial. Como se mencionó anteriormente, la capa convolucional tiene varios
filtros y, por tanto, al aplicar la técnica de “max-pooling” a cada uno de esos filtros, la
capa de “pooling” tendrá tantos filtros de “pooling” como filtros convolucionales había
en la capa anterior. Una característica importante de esta capa es que no tiene pesos
(no hay nada que ajustar durante el entrenamiento).

Capa densamente conectada:

Esta capa se encargará de realizar la parte de clasificación de la imagen de entrada y


proporcionarle una etiqueta u otra. En primer lugar, hace falta transformar el tensor de
3D proveniente de la capa de “pooling” para que se convierta en un tensor de una sola
dimensión y poder usar las redes densamente conectadas. Esto se hace de forma muy
fácil con una capa “flatten” que convierte en tensor a una dimensión. La capa “flatten”
tampoco tiene pesos que entrenar. La Figura 13 muestra la operación que realiza esta
capa de manera gráfica. La entrada de la capa proviene de las capas convolucionales y
pooling y representarán un conjunto de características o “features” que se han obtenido
de los datos de entrada (imágenes 2 D). Al realizar el aplanamiento es como si
tuviéramos un nuevo conjunto de entradas o nueva codificación de las mismas
(“coding”), las que utilizaremos para realizar la clasificación.
Diseño Electrónico e Instrumentación 2020
Industrial (DEII-2)

Figura 13. Operación de "flatten" o aplanamiento en redes convolucionales.

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 14. Red convolucional completa.

El entrenamiento de una red convolucional es el mismo que estudiado para el caso de


las redes densamente conectadas.
Diseño Electrónico e Instrumentación 2020
Industrial (DEII-2)
Por último, para ilustrar el funcionamiento de una red neuronal convolucional, la Figura
15 muestra una red neuronal que se utiliza para el reconocimiento de caras, entre
hombres y mujeres. Se puede observar que las primeras capas de encargan de extraer
características de muy bajo nivel, tales como arcos, líneas, contornos. A continuación,
las siguientes capas se encargar de extraer características de las caras, ojos, orejas, nariz,
etc. Finalmente, las últimas capas son capaces de conformar caras completas para poder
realizar la clasificación.

Figura 15. Extracción de características en cada capa de una red neuronal convolucional 2D

2 Diseño, entrenamiento y test en Python con Keras

2.1 Instalación de Keras y tensorflow

Debemos instalar Keras y tensorflow en nuestro portátil (este procedimiento ya está


realizado en la Raspberry pi).

Desde el prompt de Anaconda se debe proceder de la siguiente forma:

pip install --upgrade tensorflow –user

pip install keras

En caso de obtener un “warning” asociado a la DLL al cargar tensorflow, instalar Visual


Studio del siguiente enlace:

[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.

2.2 Redes densas: Ejemplo clasificador de dígitos escritos a mano.

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.

Figura 16. Ejemplos de dígitos del MINIST

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.

A continuación, visualizamos una de las muestras de datos de entrenamiento como una


matriz de píxeles (ver Figura 18). El resultado se muestra en la Figura 19, se puede
observar que el dígito es un 4.

Figura 18. Visualizamos un dato de entrenamiento como una matriz de píxeles

Figura 19. Digito de prueba

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)

Figura 20. Escalado de los datos de entrenamiento y testeo

A continuación, como la red que se va a entrenar es una red densamente conectada, la


capa inicial requiere una neurona por cada píxel de entrada. Los datos de entrada tienen
una forma de 28x28, sin embargo, la capa de entrada no puede recibir un tensor de dos
dimensiones. Por lo tanto, se deben convertir los datos de entrada a tensores de una
dimensión. Esto se realiza con la operación de “reshape” (líneas 30 y 31 en la Figura 21).
Ahora los datos de entrada son un tensor de una dimensión de 784 valores entre 0 y 1.

Figura 21. Transformamos los datos de entrada a una dimensión

La siguiente operación de procesado consiste en realizar un “one hot encoding” de las


etiquetas de salida. Esta operación es típica cuando se tienen datos categóricos y esta
consiste en realizar una transformación de la etiqueta de salida a un formato vectorial
de ceros y unos. En este problema tenemos 10 clases por lo que el resultado va a ser un
vector de 10 posiciones en la que solo una de las posiciones contendrá un 1. Dicha
posición corresponde a la etiqueta que se quiere transformar. Por ejemplo, si la etiqueta
indica que el dígito es un 2, el resultado de la transformación será un vector de 10
posiciones todas a 0 menos la tercera posición del vector. El método to_categorical
realiza dicha operación en las líneas 40 y 41 de la Figura 22, debemos indicar el número
da clases que tienen los datos.

Figura 22. One hot econding de las etiquetas de salida


Diseño Electrónico e Instrumentación 2020
Industrial (DEII-2)
Ya hemos realizado todo el procesamiento de los datos necesario para alimentar la red
neuronal, podemos pasar a definir su estructura. Para ello vamos a utilizar el modelo
secuencial del Keras. Este modelo es el más básico y consiste en instanciar el modelo y
apilar de manera secuencial un conjunto de capas. En este caso todas las capas son del
mismo tipo (densas). En la línea 49 de la Figura 23 definimos una capa densa de 10
neuronas con la una función de activación sigmoide. En la línea 50 definimos la capa de
salida que tiene 10 neuronas y la función de activación es del tipo “softmax”. La capa de
salida devuelve el resultado del clasificador como la probabilidad de pertenencia a cierta
clase. En los problemas de clasificación siempre debemos utilizar un número neuronas
igual al número de clases en la capa de salida. En este ejemplo, como tenemos 10 clases
debemos utilizar 10 neuronas en la capa de salida. El método summary() nos permite
obtener un resumen de la estructura de red que ha diseñado. Tal y como muestra la
Figura 24, tenemos una red con 7960 parámetros que deberán ajustarse durante el
entrenamiento de la red.

Figura 23. Modelo de la red completamente conectada

Figura 24. Parámetros de la red neuronal diseñada

Pasamos a continuación a realizar el entrenamiento de la red. Para el entrenamiento


de la red debemos definir algunos parámetros (ver Figura 24):

• 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.

Los resultados del entrenamiento se pueden observar en el terminal de Python, en cada


iteración se nos informa de evolución, incluyendo datos como el número de “epoch”, la
función de pérdida y el “accuracy” durante el entrenamiento y durante la validación.
Diseño Electrónico e Instrumentación 2020
Industrial (DEII-2)

Figura 25. Evolución del entrenamiento de la red.

Se puede observar en la Figura 25 que la red consigue un “accuracy” de entrenamiento


del 0.9015 y que utilizando los datos de validación se obtiene un 0.9005. Como es de
esperar la métrica baja un poco con los datos de validación, no obstante, los resultados
son muy buenos ya que se consigue clasificar correctamente más del 90% de los casos.
A continuación, evaluamos el modelo con los datos testeo. El método evaluate nos
permite obtener tanto la función de perdida como el “accuracy” para los datos de test.
La Figura 27 muestra los resultados, se puede observar que los resultados de test son
igualmente buenos, obteniendo más del 90% de “accuracy”.

Figura 26. Evaluación del modelo

Figura 27. Resultados de test para la red densamente conectada

Un aspecto importante del entrenamiento realizado es que no se ha producido sobre


entrenamiento u “overfitting”. El sobre entrenamiento ocurre cuando el modelo
utilizado es mucho más complejo de lo necesario o faltan datos (es el mismo problema).
Cuando esto ocurre los resultados de test bajan mucho con respecto a los datos de
entrenamiento. Lo que estaría ocurriendo es que el modelo se está ajustando mucho a
los datos de entrenamiento y no está generalizando bien. Por lo tanto, al probar con los
datos de testeo el error que se comete es más significativo. Para evitar sobre
entrenamiento no se debe utilizar un modelo más complejo del necesario o se deben
Diseño Electrónico e Instrumentación 2020
Industrial (DEII-2)
utilizar más datos durante el entrenamiento. Por ejemplo, en este problema no tendría
mucho sentido hacer más compleja la estructura de la red aumentando mucho el
número de neuronas por capa o aumentando el número de capaz. Quizás
conseguiríamos aumentar un poco el “accuracy” pero rápidamente aparecería el sobre
entrenamiento. A continuación, pasamos a realizar predicciones utilizando el modelo
entrenado. Para ello probamos con uno de los datos de test y utilizamos el método
“predict” del modelo. En la Figura 28 se realiza la predicción para un dato de test
concreto, se puede observar que el dato de test se debe ajustar a la forma que la red
neuronal ha sido entrenada, así en la línea 84 se ha realizado un “reshape” para que el
tensor de entrada tenga una forma (1, 784).

Figura 28. Predicción de la red neural

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.

Figura 29. Almacenamos los pesos modelo

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)

Figura 30. Evolución del accuracy durante el entramiento

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.

Figura 31. Evolución de la función de pérdida.

Por último, la Figura 32 muestra la matriz de confusión. La diagonal de dicha matriz


muestra las predicciones que se han realizado de forma correcta para cada uno de los
dígitos. Se puede observar que los resultados son bastante buenos en general. Además,
se puede analizar en qué situaciones la red tiene algunos problemas para predecir
Diseño Electrónico e Instrumentación 2020
Industrial (DEII-2)
correctamente. Por ejemplo, podemos ver que en los casos de 4 y del 9 existen ciertos
problemas de predicción. En 52 ocasiones la red predijo que era un 4 cuando en realidad
era un 9. Este resultado es esperable ya que ambos dígitos escritos a mano pueden ser
confundibles. Por lo tanto, la matriz de confusión es una buena herramienta para
detectar los problemas de diseño que tenga nuestra red neuronal e intentar corregirlos.

Figura 32. Matriz de confusión

2.3 Redes convolucionales:

A continuación, se pasa a resolver el mismo problema de clasificación utilizando una red


convolucional. En este apartado solo detallarás las partes de código nuevas con respecto
al ejemplo anterior.

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)

Figura 33. Procesamiento de datos para la CNN

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”.

Figura 34. Red neuronal CNN


Diseño Electrónico e Instrumentación 2020
Industrial (DEII-2)
El número de pesos que se deben entrenar se muestran en la Figura 35. Se puede
observar que en este caso el número de pesos que se deben ajustar es mucho mayor
que en el caso de red una densamente conectada. Esto hará que el entrenamiento sea
mucho más intenso desde el punto de vista computacional.

Figura 35. Número de pesos a entrenar en la red CNN

El entrenamiento de la red se realiza tal y como se estudió en el apartado anterior. En


este caso se ha reducido el número de “epochs” (ver Figura 36). En este caso el
entrenamiento tomará más tiempo, es por ello por lo que se ha reducido el número de
episodios.

Figura 36. Entrenamiento red CNN

Los resultados de entrenamiento se muestran en la Figura 37, se pueden observar que


los resultados son mucho mejores que en la red densamente conectada. En este caso se
alcanza un “accuracy” del 99% durante el entrenamiento.
Diseño Electrónico e Instrumentación 2020
Industrial (DEII-2)

Figura 37. Resultados de entrenamiento de la CNN

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.

Figura 38. Resultados de test de la red CNN

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)

Figura 39. Matriz de confusión para el clasificador basado en CNN

Por último, indicar que si aumentamos mucho el número de capas convolucionales


podemos tener problemas para entrenar la red utilizando un portátil convencional. Para
casos más complejos se deben utilizar GPUs (“Graphical Processing Units). En esta línea
se puede utilizar Google Colab [4], esta herramienta desarrollado por Google permite
ejecutar los scripts de Python de forma remota utilizando recursos en la nube.
Desgraciadamente la versión gratuita está limitada en tiempo de uso.

2.4 Hiper parámetros

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:

1. Definir de nuevo la red neuronal en Keras con la misma arquitectura que se


entrenó y cargar los pesos de la red neuronal.
2. Cargar una foto de prueba con un dígito y comprobar el funcionamiento de la
red neuronal.

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

3.1 Red densamente conectada

En primer lugar, definimos el mismo modelo utilizado anteriormente en el


entrenamiento (líneas 8-10 en la Figura 40). A continuación, cargamos los pesos de la
red neuronal (línea 12).

Figura 40. Implementación red neuronal densamente conectada en la Rpi

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)

Figura 41. Predicción de la red neuronal densa en la Rpi

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.

3.2 Red convolucional

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”.

Figura 42. Implementación red CNN en Rpi


Diseño Electrónico e Instrumentación 2020
Industrial (DEII-2)

Figura 43. Predicción red CNN en Rpi

3.3 Ejercicio

Se plantea como ejercicio comprobar el funcionamiento de ambas redes con fotografías


de dígitos tomadas por la cámara. Para ello deberá realizar una fotografía de un digito
parecido a los utilizados en el dataset y adaptar la resolución para poder pasársela a la
red neuronal. Hay que recordar que la foto tiene que ser en escala de grises.

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.

En el caso de la red convolucional, esta es menos sensible a desplazamientos ya que las


características que extrae la red convolucional son invariantes a traslaciones. No
obstante, se debe intentar obtener imágenes parecidas a las utilizadas en el
entrenamiento de la red.

4 Clasificador de señales de tráfico


En esta sección se describe un clasificador de señales de tráfico. El clasificador es capaz
de clasificar 43 señales de tráfico distintas.

4.1 Conjunto de datos

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

Para más información sobre el conjunto de datos se recomienda leer [7].

4.2 Red convolucional diseñada

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)

Figura 45. Red convolucional diseñada para el clasificador de señales de tráfico

4.3 Preprocesamiento de los datos

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)

Figura 46. Procesamiento de las señales de tráfico

4.4 Funcionamiento en Rpi

Para probar el funcionamiento de la red convolucional diseñada se ha realizado un script


de aplicación. El script se llama [Link]. La aplicación consiste en:

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]

View publication stats

También podría gustarte