Introducción

Redes neuronales convolucionales (CNN) – el concepto que está detrás de los recientes avances y desarrollos en el aprendizaje profundo.

Las CNN han roto el molde y ascendido al trono para convertirse en la técnica de visión por ordenador más avanzada. Entre los diferentes tipos de redes neuronales (otros incluyen las redes neuronales recurrentes (RNN), la memoria a largo plazo (LSTM), las redes neuronales artificiales (ANN), etc.), las CNN son fácilmente las más populares.

Estos modelos de redes neuronales convolucionales son omnipresentes en el espacio de datos de imágenes. Funcionan fenomenalmente bien en tareas de visión por ordenador como la clasificación de imágenes, la detección de objetos, el reconocimiento de imágenes, etc.

Entonces, ¿dónde puedes practicar tus habilidades con las CNN? Bueno, has llegado al lugar correcto.

Hay varios conjuntos de datos que puedes aprovechar para aplicar las redes neuronales convolucionales. Aquí hay tres conjuntos de datos populares:

  • MNIST
  • CIFAR-10
  • ImageNet

En este artículo, vamos a construir modelos de clasificación de imágenes utilizando CNN en cada uno de estos conjuntos de datos. Así es. Exploraremos MNSIT, CIFAR-10 e ImageNet para entender, de manera práctica, cómo funcionan las CNN para la tarea de clasificación de imágenes.

Puedes aprender todo sobre las Redes Neuronales Convolucionales(CNN) en este curso gratuito: Redes Neuronales Convolucionales (CNN) desde cero

Mi inspiración para escribir este artículo es ayudar a la comunidad a aplicar los conocimientos teóricos de forma práctica. Este es un ejercicio muy importante, ya que no sólo le ayuda a construir una comprensión más profunda del concepto subyacente, sino que también le enseñará detalles prácticos que sólo se puede aprender a través de la implementación del concepto.

Si usted es nuevo en el mundo de las redes neuronales, CNNs, clasificación de imágenes, recomiendo ir a través de estos excelentes tutoriales en profundidad:

  • Introducción a las redes neuronales (¡Curso gratuito!)
  • Demistificando las Matemáticas detrás de las Redes Neuronales Convolucionales (CNNs)
  • Construye tu Primer Modelo de Clasificación de Imágenes en tan solo 10 Minutos

Y si lo que buscas es aprender en profundidad la visión por computador y el aprendizaje profundo, deberías echar un vistazo a nuestros populares cursos:

  • Visión por computador usando el aprendizaje profundo
  • Programa certificado AI & ML Blackbelt+

Tabla de contenidos

  1. Using CNNs to Classify Hand-written Digits on MNIST Dataset
  2. Identificar imágenes del CIFAR-10 Dataset usando CNNs
  3. Categorizar imágenes del ImageNet Dataset usando CNNs
  4. ¿A dónde ir desde aquí?

Nota: Voy a utilizar Keras para demostrar la clasificación de imágenes utilizando CNNs en este artículo. Keras es un excelente marco para aprender cuando se está empezando en el aprendizaje profundo.

Usando CNNs para clasificar dígitos escritos a mano en el conjunto de datos MNIST

MNIST (Instituto Nacional de Estándares y Tecnología modificado) es un conjunto de datos bien conocido utilizado en la visión por ordenador que fue construido por Yann Le Cun et. Se compone de imágenes que son dígitos escritos a mano (0-9), divididos en un conjunto de entrenamiento de 50.000 imágenes y un conjunto de prueba de 10.000 donde cada imagen es de 28 x 28 píxeles de ancho y alto.

Este conjunto de datos se utiliza a menudo para la práctica de cualquier algoritmo hecho para la clasificación de imágenes como el conjunto de datos es bastante fácil de conquistar. Por lo tanto, recomiendo que este sea su primer conjunto de datos si está incursionando en el campo.

MNIST viene con Keras de forma predeterminada y simplemente puede cargar los archivos de entrenamiento y prueba utilizando unas pocas líneas de código:

Aquí está la forma de X (características) e y (objetivo) para los datos de entrenamiento y validación:

X_train shape (60000, 28, 28) y_train shape (60000,) X_test shape (10000, 28, 28) y_test shape (10000,)

Antes de entrenar un modelo CNN, vamos a construir una red neuronal básica totalmente conectada para el conjunto de datos. Los pasos básicos para construir un modelo de clasificación de imágenes utilizando una red neuronal son:

  1. Aplanar las dimensiones de la imagen de entrada a 1D (píxeles de ancho x píxeles de alto)
  2. Normalizar los valores de los píxeles de la imagen (dividir por 255)
  3. Una.Codificar en caliente la columna categórica
  4. Construir una arquitectura del modelo (Secuencial) con capas densas
  5. Entrenar el modelo y hacer predicciones

Así es como se puede construir un modelo de red neuronal para MNIST. He comentado las partes relevantes del código para una mejor comprensión:

Después de ejecutar el código anterior, te habrás dado cuenta de que estamos obteniendo una buena precisión de validación de alrededor del 97% fácilmente.

Modifiquemos el código anterior para construir un modelo CNN.

Una de las principales ventajas de utilizar CNNs sobre NNs es que no es necesario aplanar las imágenes de entrada a 1D ya que son capaces de trabajar con datos de imágenes en 2D. Esto ayuda a conservar las propiedades «espaciales» de las imágenes.

Aquí está el código completo del modelo CNN:

Aunque nuestra máxima precisión de validación utilizando un modelo de red neuronal simple era de alrededor del 97%, ¡el modelo CNN es capaz de obtener un 98%+ con una sola capa de convolución!

Puedes seguir adelante y añadir más capas Conv2D, y también jugar con los hiperparámetros del modelo CNN.

Identificación de imágenes del conjunto de datos CIFAR-10 utilizando CNNs

MNIST es un conjunto de datos para principiantes en visión por ordenador. Es fácil obtener una puntuación superior al 90% en la validación utilizando un modelo CNN. Pero, ¿qué ocurre si no eres un principiante y necesitas algo que suponga un reto para poner en práctica tus conceptos?

Ahí es donde entra en escena el conjunto de datos CIFAR-10

Así es como los desarrolladores del CIFAR (Canadian Institute For Advanced Research) describen el conjunto de datos:

El conjunto de datos CIFAR-10 consta de 60.000 imágenes en color de 32 x 32 en 10 clases, con 6.000 imágenes por clase. Hay 50.000 imágenes de entrenamiento y 10.000 de prueba.

Los puntos importantes que distinguen este conjunto de datos de MNIST son:

  • Las imágenes están coloreadas en CIFAR-10 en comparación con la textura en blanco y negro de MNIST
  • Cada imagen es de 32 x 32 píxeles
  • 50.000 imágenes de entrenamiento y 10.000 de prueba

Ahora bien, estas imágenes están tomadas en diferentes condiciones de iluminación y en diferentes ángulos, y como son imágenes en color, verás que hay muchas variaciones en el color mismo de objetos similares (por ejemplo, el color del agua del océano). Si utilizas la arquitectura simple de la CNN que vimos en el ejemplo de MNIST anteriormente, obtendrás una precisión de validación baja de alrededor del 60%.

Esa es una razón clave por la que recomiendo CIFAR-10 como un buen conjunto de datos para practicar tus habilidades de ajuste de hiperparámetros para las CNN. Lo bueno es que al igual que MNIST, CIFAR-10 también está fácilmente disponible en Keras.

Simplemente puedes cargar el conjunto de datos utilizando el siguiente código:

from keras.datasets import cifar10# loading the dataset (X_train, y_train), (X_test, y_test) = cifar10.load_data()

Así es como puedes construir un modelo CNN decente (alrededor del 78-80% en la validación) para CIFAR-10. Observe cómo los valores de la forma se han actualizado de (28, 28, 1) a (32, 32, 3) de acuerdo con el tamaño de las imágenes:

Esto es lo que he cambiado en el modelo:

  • Aumenté el número de capas Conv2D para construir un modelo más profundo
  • Aumenté el número de filtros para aprender más características
  • Añadí Dropout para la regularización
  • Añadí más capas densas

Precisión de entrenamiento y validación a través de épocas:

Puedes eclipsar fácilmente este rendimiento ajustando el modelo anterior. Una vez que hayas dominado CIFAR-10, también hay CIFAR-100 disponible en Keras que puedes utilizar para seguir practicando. Dado que tiene 100 clases, ¡no será una tarea fácil de lograr!

Categorización de las imágenes de ImageNet usando CNNs

Ahora que has dominado MNIST y CIFAR-10, vamos a llevar este problema a un nivel superior. Aquí, vamos a echar un vistazo al famoso conjunto de datos ImageNet.

ImageNet es la base de datos principal detrás del ImageNet Large Scale Recognition Challenge (ILSVRC). Es como las Olimpiadas de la visión por ordenador. Es la competición que popularizó las CNN por primera vez y, cada año, los mejores equipos de investigación de la industria y el mundo académico compiten con sus mejores algoritmos en tareas de visión por ordenador.

Sobre el conjunto de datos ImageNet

El conjunto de datos ImageNet tiene más de 14 millones de imágenes, etiquetadas a mano en 20.000 categorías.

Además, a diferencia de los conjuntos de datos MNIST y CIFAR-10 de los que ya hemos hablado, las imágenes de ImageNet tienen una resolución decente (224 x 224) y eso es lo que nos plantea un reto: 14 millones de imágenes, cada una de ellas de 224 por 224 píxeles. Procesar un conjunto de datos de este tamaño requiere una gran cantidad de potencia de cálculo en términos de CPU, GPU y RAM.

El inconveniente es que podría ser demasiado para un ordenador portátil corriente. Entonces, ¿cuál es la solución alternativa? ¿Cómo puede un aficionado trabajar con el conjunto de datos de ImageNet?

Ahí es donde entra el conjunto de datos Imagenette de Fast.ai

Imagenette es un conjunto de datos extraído de la gran colección de imágenes ImageNet. El motivo de la publicación de Imagenette es que los investigadores y los estudiantes pueden practicar con imágenes del nivel de ImageNet sin necesitar tantos recursos informáticos.

En palabras del propio Jeremy Howard:

«Yo (es decir, Jeremy Howard) hice Imagenette principalmente porque quería un pequeño conjunto de datos de visión que pudiera utilizar para ver rápidamente si mis ideas de algoritmos podrían tener alguna posibilidad de funcionar. Normalmente no lo hacen, pero probarlas en Imagenet me lleva mucho tiempo para averiguarlo, sobre todo porque me interesan los algoritmos que funcionan especialmente bien al final del entrenamiento.

Pero creo que también puede ser un conjunto de datos útil para otros.»

¡Y eso es lo que también usaremos para practicar!

Descarga el conjunto de datos de Imagenette

Así es como puedes obtener el conjunto de datos (comandos para tu terminal):

$ wget https://s3.amazonaws.com/fast-ai-imageclas/imagenette2.tgz$ tar -xf imagenette2.tgz

Una vez que hayas descargado el conjunto de datos, notarás que tiene dos carpetas: «train» y «val». Éstas contienen el conjunto de entrenamiento y de validación, respectivamente. Dentro de cada carpeta, hay carpetas separadas para cada clase. Aquí está la asignación de las clases:

Estas clases tienen el mismo ID en el conjunto de datos original de ImageNet. Cada una de las clases tiene aproximadamente 1000 imágenes, así que en general, es un conjunto de datos equilibrado.

Carga de imágenes usando ImageDataGenerator

Keras tiene esta útil funcionalidad para cargar imágenes grandes (como las que tenemos aquí) sin agotar la RAM, haciéndolo en pequeños lotes. ImageDataGenerator en combinación con fit_generator proporciona esta funcionalidad:

El propio ImageDataGenerator infiere las etiquetas de clase y el número de clases a partir de los nombres de las carpetas.

Construir un modelo CNN básico para la clasificación de imágenes

Construyamos un modelo CNN básico para nuestro conjunto de datos Imagenette (con el propósito de clasificar imágenes):

Cuando comparamos la precisión de validación del modelo anterior, te darás cuenta de que aunque es una arquitectura más profunda que la que hemos utilizado hasta ahora, sólo somos capaces de obtener una precisión de validación de alrededor del 40-50%.

Puede haber muchas razones para esto, como que nuestro modelo no es lo suficientemente complejo para aprender los patrones subyacentes de las imágenes, o tal vez los datos de entrenamiento son demasiado pequeños para generalizar con precisión a través de las clases.

Sube de nivel – aprendizaje de transferencia.

Usando el aprendizaje de transferencia (VGG16) para mejorar la precisión

VGG16 es una arquitectura CNN que fue el primer subcampeón en el Desafío ImageNet 2014. Está diseñada por el Visual Graphics Group de Oxford y tiene 16 capas en total, con 13 capas convolucionales propias. Cargaremos los pesos preentrenados de este modelo para poder utilizar las características útiles que este modelo ha aprendido para nuestra tarea.

Cargar los pesos de VGG16

from keras.applications import VGG16# include top should be False to remove the softmax layerpretrained_model = VGG16(include_top=False, weights='imagenet')pretrained_model.summary()
Aquí está la arquitectura del modelo:

Generar características de VGG16

Extraigamos las características útiles que VGG16 ya conoce de las imágenes de nuestro conjunto de datos:

from keras.utils import to_categorical# extract train and val featuresvgg_features_train = pretrained_model.predict(train)vgg_features_val = pretrained_model.predict(val)
# OHE target columntrain_target = to_categorical(train.labels)val_target = to_categorical(val.labels)
Una vez que las características anteriores están listas, sólo tenemos que utilizarlas para entrenar una Red Neural Básica Totalmente Conectada en Keras:

Nota lo rápido que empieza a converger tu modelo. En sólo 10 épocas, tienes una precisión de validación de más del 94%. ¿No es asombroso?

En caso de que hayas dominado el conjunto de datos de Imagenette, fastai también ha publicado dos variantes que incluyen clases que te resultarán difíciles de clasificar:

  • Imagewoof: 10 clases de razas de perros, un problema más difícil de clasificar
  • Image网 («wang»): Una combinación de Imagenette e Imagewoof y un par de trucos que lo convierten en un problema más difícil

¿Dónde ir a partir de aquí?

Aparte de los conjuntos de datos que tenemos arriba, también puedes utilizar los siguientes conjuntos de datos para construir algoritmos de visión por ordenador. De hecho, considera esto como un reto. ¿Puedes aplicar tus conocimientos de CNN para superar la puntuación de referencia en estos conjuntos de datos?

  • Fashion MNIST – Conjunto de datos de ropa y prendas de vestir similar a MNIST. En lugar de dígitos, las imágenes muestran un tipo de ropa (camiseta, pantalones, bolso, etc.)
  • Caltech 101 – Otro conjunto de datos desafiante que encontré para la clasificación de imágenes

También sugiero que antes de ir para el aprendizaje de transferencia, trate de mejorar sus modelos CNN base. Puedes aprender de las arquitecturas de VGG16, ZFNet, etc. para obtener algunas pistas sobre el ajuste de hiperparámetros y puedes utilizar el mismo ImageDataGenerator para aumentar tus imágenes e incrementar el tamaño del conjunto de datos.

También puedes leer este artículo en nuestra APP móvil

Deja una respuesta

Tu dirección de correo electrónico no será publicada.