En esta entrada aprenderás algunos conceptos básicos de deep learning, mediante un ejemplo práctico aplicado a imágenes de satélite utilizando Python y la librería Keras. El desarrollo de esta tecnología y la gran cantidad de datos disponibles hace posible que los ordenadores realicen tareas tradicionalmente reservadas para los humanos. Es en el campo de la visión artificial donde mejor se explota el potencial del deep learning, siendo las redes neuronales convolucionales (o CNN del inglés convolutional neural networks) las arquitecturas gracias a las cuales se han conseguido los mejores resultados. Se trata de una tecnología con un gran potencial para obtener información de imágenes aéreas de forma automática.

Sin entrar en demasiados detalles, las CNN son un tipo de red neuronal que aprenden filtros (matrices o kernels con las que se realizan convoluciones a la imagen) para extraer características de imágenes, apilandose en capas sucesivas, de modo que en las primeras capas se detectan detalles locales de la imagen y en las más profundas consiguen representar conocimiento abstracto de la imagen.

prediccion_suelo

Estructura típica de una CNN
(By Aphex34 – Own work, CC BY-SA 4.0, https://commons.wikimedia.org/w/index.php?curid=45679374)

Estas técnicas se engloban dentro del aprendizaje supervisado, es decir, para entrenar los modelos son necesarios una serie de ejemplos de la tarea que se quiere realizar. Hay que tener esto en cuenta, ya que es necesario etiquetar y preparar el conjunto de datos (o conseguir uno ya etiquetado), teniendo los datos de entrada y las salidas de la tarea que queremos que aprenda.

Durante el entrenamiento, lo que se hace realmente, es utilizar un algoritmo que optimiza los parámetros de la red neuronal, iterativamente, para minimizar el error que esta comete tomando como referencia las salidas de los ejemplos de entrenamiento. El error se cuantifica con lo que se conoce como función de pérdida.

Se pueden realizar diferentes tareas de detección y predicción con esta tecnología, el ejemplo que se muestra en esta entrada es un caso de clasificación, el objetivo es que el modelo que entrenemos sea capaz de decidir a qué categoría pertenece la imagen que le presentamos.

Datos utilizados

El dataset utilizado consta de 27.000 imágenes RGB de 64×64 bits del Sentinel 2, clasificadas en 10 categorías de diferentes de usos o tipos de suelo. La tarea que queremos que aprenda la CNN que entrenemos es que consiga predecir el uso de un suelo a partir de la imagen de este. Puedes descargarlo en el siguiente enlace, en el apartado ‘Datasets for Machine Learning’, buscando el enlace a ’EuroSAT (RGB color space images)’:

http://madm.dfki.de/downloads

Una muestra del dataset:

predicción_suelo2

Librerías necesarias

Keras es una librería muy utilizada para Python, simplifica la construcción de modelos de redes neuronales que posteriormente se ejecutan sobre librerías de más bajo nivel como Tensorflow (por defecto).

Es recomendable utilizar una GPU para acelerar el entrenamiento de tus modelos, para ello hay debes tener una GPU compatible con CUDA e instalar las versión de Tensorflow necesaria. No obstante en este ejemplo se puede conseguir un buen modelo usando sólo el procesador en aproximadamente 15 minutos.

Para realizar el programa necesitarás tener instaladas las librerías: Numpy, Scikit-learn, Keras y Tensorflow. Una vez te hayas asegurado de que las tienes comenzamos con la programación, importando las librerías y funciones que usaremos:

predicción_suelo3

Preprocesado de los datos

En primer lugar hay que revisar los datos de los que disponemos y adaptarlos al formato necesario, cuando descargamos el dataset podemos observar que las imágenes se agrupan en carpetas según la clase a la que pertenecen. Las imágenes serán los datos de entrada que utilizará nuestra red neuronal para aprender, la salida del modelo será la clase a la que pertenece cada imagen entrada.

Con el siguiente código leemos todas las imágenes, se genera un array que indica con un número entero la clase a la que pertenece cada una de ellas y un diccionario con la correspondencia entre el número y la clase:

predicción_suelo4

NOTA: asegurate de indicar la ruta donde hayas guardado el dataset en tu ordenador en la variable path_dataset.

La forma de representar las clases en Keras es mediante la codificación ‘one hot’: la clase de cada imagen se representa por un vector en el que cada posición se corresponde con una de las posibles clases que pueden darse, en el que todos sus elementos son cero excepto el que se corresponde con la clase a la que pertenece la imagen. Para crear la codificación one hot podemos usar la siguiente función:

predicción_suelo5

Además es conveniente normalizar las imágenes de modo que el rango de entrada a la CNN se encuentren entre 0 y 1:

predicción_suelo6

Cuando se entrena un modelo de machine learning se divide el conjunto de datos en dos subgrupos, uno de entrenamiento y otro de prueba. El modelo se entrena solo con el conjunto de entrenamiento y se evalúa con el de prueba para comprobar si ha aprendido correctamente. En nuestro caso escogemos una partición del 80% para datos de entrenamiento y 20% para datos de test (test_size=0.2). Por otra nos aseguraremos de ordenar los datos de forma aleatoria con shuffle=True:

predicción_suelo7

Diseño del modelo

A continuación creamos nuestro clasificador mediante un modelo ‘Sequential’, este es el modo más sencillo para crear redes neuronales con Keras. Para definir el modelo se pasa una lista donde se indican secuencialmente las capas que formarán dicho modelo.

En esta entrada no se explicará en detalle en qué consiste cada capa ni cómo procesan la información. No obstante cabe mencionar varios detalles:

  • En la primera capa se indica el tamaño de entrada (almacenado en la variable in_shape mediante el método shape en nuestro código).
  • Para cada capa de neuronas se define su tamaño. Para las capas convolucionales (Conv2D) se establece el número de filtros y el tamaño de la matriz que realiza cada convolución. Para las capas totalmente conectadas (Dense), se establece el número de neuronas de la capa.
  • Un elemento importante de las neuronas es la función de activación, en las CNN se suele utilizar la función ‘relu’.
  • La capa de salida debe tener tantas neuronas como clases, y su función de activación ser la función ‘softmax’. Esta función fuerza a que la suma de todas las neuronas de salida sea 1, gracias a ello se puede interpretar cada salida como la probabilidad de que la entrada pertenezca a la clase asociada a dicha salida.

predicción_suelo8

Una vez creado el modelo, este se compila. Aquí se elige el algoritmo que se usará para entrenarlo (‘adam’); la función de pérdida, que para problemas de clasificación normalmente utilizada es entropía cruzada categórica (‘categorical_crossentropy’) y la métrica para evaluar su rendimiento, en nuestro caso la exactitud (‘accuracy’).

predicción_suelo9

NOTA: La exactitud se define como los aciertos del clasificador divididos entre todos los casos examinados.

Entrenamiento y evaluación del modelo

En este momento tenemos todo listo para entrenar el modelo, tan solo falta indicar los datos de entrenamiento y de validación previamente preparados. Además se indica el número de épocas (epochs=10), una época es el número de veces que se le presentan todos los datos del conjunto de entrenamiento al algoritmo de entrenamiento.

predicción_suelo10

Tras esperar unos minutos se completa la fase de entrenamiento, consiguiendo una exactitud de 86,67 % en los datos de entrenamiento y de 83,07 % en el conjunto de prueba, ¡Nada mal para un modelo sencillo entrenado en unos minutos!:

predicción_suelo11

Finalmente se muestra el código para realizar predicciones, hay que recordar que la clase se obtiene seleccionando la salida con mayor probabilidad, dichas probabilidades se almacenan en la variable prob_pred_test:

predicción_suelo12

Se utiliza el diccionario que creamos el principio para obtener el nombre de la clase predicha y el nombre de la clase real:

predicción_suelo13

Podemos visualizar las predicciones de varias muestras de prueba y compararlas con las clases a las que realmente pertenecen.

Las clases verdaderas:

predicción_suelo14

Las predicciones:

predicción_suelo15

¡En estas 10 imágenes nuestro modelo predice los resultado correctamente!

1 estrella2 estrellas3 estrellas4 estrellas5 estrellas (9 votos, promedio: 4,56 de 5)

Cargando...

Formación de calidad impartida por profesionales