Introducción
Redes neuronales convolucionales (CNN): el concepto detrás de los avances y desarrollos recientes en el aprendizaje profundo.
Las CNN rompieron el molde y ascendieron al trono para convertirse en lo último en tecnología. visión por computador técnica. Entre los diferentes tipos de Redes neuronales (otras incluyen redes neuronales recurrentes (RNN), memoria a corto plazo a largo plazo (LSTM), 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 computadora como clasificación de imágenes, detección de objetos, reconocimiento de imágenes, etc.
Entonces, ¿dónde puedes practicar tus habilidades de CNN? Bueno, ¡has venido al lugar correcto!
Hay varios conjuntos de datos que puede aprovechar para aplicar redes neuronales convolucionales. Aquí hay tres conjuntos de datos populares:
En este artículo, crearemos modelos de clasificación de imágenes utilizando CNN en cada uno de estos conjuntos de datos. ¡Eso es correcto! Exploraremos MNSIT, CIFAR-10 e ImageNet para comprender, de manera práctica, cómo funcionan las CNN para la tarea de clasificación de imágenes.
Puede 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 manera práctica. Este es un ejercicio muy importante, ya que no solo lo ayuda a desarrollar una comprensión más profunda del concepto subyacente, sino que también le enseñará detalles prácticos que solo se pueden aprender a través de la implementación del concepto.
Si eres nuevo en el mundo de las redes neuronales, las CNN, la clasificación de imágenes, te recomiendo que sigas estos excelentes tutoriales detallados:
Y si está buscando aprender visión por computadora y aprendizaje profundo en profundidad, debe consultar nuestros cursos populares:
Tabla de contenido
- Uso de CNN para clasificar dígitos escritos a mano en el conjunto de datos MNIST
- Identificación de imágenes del conjunto de datos CIFAR-10 mediante CNN
- Categorización de imágenes del conjunto de datos de ImageNet mediante CNN
- A dónde ir desde aquí?
Nota: Usaré Keras para demostrar la clasificación de imágenes usando CNN en este artículo. Keras es un marco excelente para aprender cuando se está iniciando en el aprendizaje profundo.
Uso de CNN para clasificar dígitos escritos a mano en el conjunto de datos MNIST
MNIST (Instituto Nacional Modificado de Estándares y Tecnología) es un conjunto de datos bien conocido que se utiliza en Visión por computador que fue construido por Yann Le Cun et. Alabama. Está compuesto por imágenes que son dígitos escritos a mano (0-9), dividido en un conjunto de entrenamiento de 50,000 imágenes y un conjunto de prueba de 10,000 donde cada imagen tiene 28 x 28 píxeles de ancho y alto.
Este conjunto de datos se usa a menudo para practicar cualquier algoritmo creado para la clasificación de imágenes, ya que el conjunto de datos es bastante fácil de conquistar. Por lo tanto, recomiendo que este sea su primer conjunto de datos si solo está incursionando en el campo.
MNIST viene con Keras por defecto y simplemente puede cargar el tren y los archivos de prueba usando unas pocas líneas de código:
from keras.datasets import mnist # loading the dataset (X_train, y_train), (X_test, y_test) = mnist.load_data() # let's print the shape of the dataset
print("X_train shape", X_train.shape) print("y_train shape", y_train.shape) print("X_test shape", X_test.shape) print("y_test shape", y_test.shape)
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 de CNN, construyamos un modelo básico Red neuronal completamente conectada para el conjunto de datos. Los pasos básicos para construir un modelo de clasificación de imágenes usando una red neuronal son:
- Aplane las dimensiones de la imagen de entrada a 1D (píxeles de ancho x píxeles de alto)
- Normalizar los valores de píxeles de la imagen (dividir por 255)
- One-Hot Encode la columna categórica
- Construya una arquitectura modelo (secuencial) con capas densas
- Entrene el modelo y haga predicciones
A continuación, le mostramos cómo puede crear 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, se dio 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 CNN modelo.
Una de las principales ventajas de utilizar CNN sobre NN es que no es necesario aplanar las imágenes de entrada a 1D, ya que pueden trabajar con datos de imagen en 2D. Esto ayuda a retener las propiedades «espaciales» de las imágenes.
Aquí está el código completo para el modelo de CNN:
A pesar de que nuestra precisión máxima de validación mediante el uso de un modelo de red neuronal simple fue de alrededor del 97%, el modelo de CNN es capaz de obtener más del 98% con una sola capa de convolución.
Puede continuar y agregar 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 mediante CNN
MNIST es un conjunto de datos amigable para principiantes en visión por computadora. Es fácil obtener una puntuación de más del 90% en la validación mediante el uso de un modelo de CNN. Pero, ¿qué pasa si está más allá de un principiante y necesita algo desafiante para poner en práctica sus conceptos?
Ahí es donde el Conjunto de datos CIFAR-10 entra en escena!
Así es como los desarrolladores detrás de CIFAR (Instituto Canadiense de Investigación Avanzada) 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 formación y 10.000 imágenes de prueba.
Los puntos importantes que distinguen este conjunto de datos del 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 formación y 10.000 imágenes de prueba
Ahora, estas imágenes se toman en diferentes condiciones de iluminación y en diferentes ángulos, y dado que se trata de imágenes coloreadas, verá que hay muchas variaciones en el color mismo de objetos similares (por ejemplo, el color del agua del océano). Si usa el simple CNN arquitectura que vimos en el ejemplo de MNIST anterior, obtendrá 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 sus habilidades de ajuste de hiperparámetros para CNN. Lo bueno es que, al igual que MNIST, CIFAR-10 también está fácilmente disponible en Keras.
Simplemente puede cargar el conjunto de datos usando el siguiente código:
from keras.datasets import cifar10 # loading the dataset (X_train, y_train), (X_test, y_test) = cifar10.load_data()
A continuación, le mostramos cómo puede construir un modelo CNN decente (alrededor del 78-80% en la validación) para CIFAR-10. Observe cómo los valores de las formas se han actualizado de (28, 28, 1) a (32, 32, 3) según el tamaño de las imágenes:
Esto es lo que cambié en el modelo:
- Aumentó la cantidad de capas Conv2D para construir un modelo más profundo
- Mayor número de filtros para conocer más funciones
- Abandono agregado para regularización
- Se agregaron más capas densas
Precisión de la formación y la validación en todas las épocas:
Puede eclipsar fácilmente este rendimiento ajustando el modelo anterior. Una vez que haya dominado CIFAR-10, también hay CIFAR-100 disponible en Keras que puede usar para practicar más. Dado que tiene 100 clases, ¡no será una tarea fácil de lograr!
Categorizar las imágenes de ImageNet utilizando CNN
Ahora que domina MNIST y CIFAR-10, llevemos este problema a un nivel superior. Aquí, echaremos un vistazo al famoso conjunto de datos de ImageNet.
ImageNet es la base de datos principal detrás del Desafío de reconocimiento a gran escala de ImageNet (ILSVRC). Esto es como las Olimpiadas de Visión por computador. Esta es la competencia que hizo CNN popular por primera vez y cada año, los mejores equipos de investigación de las industrias y el mundo académico compiten con sus mejores algoritmos en tareas de visión por computadora.
Acerca del conjunto de datos de ImageNet
El conjunto de datos de 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 que ya hemos discutido, las imágenes en ImageNet tienen una resolución decente (224 x 224) y eso es lo que nos plantea un desafío: 14 millones de imágenes, cada una de 224 por 224 píxeles. Procesar un conjunto de datos de este tamaño requiere una gran cantidad de potencia informática en términos de CPU, GPU y RAM.
La desventaja: eso podría ser demasiado para una computadora portátil de todos los días. Entonces, ¿cuál es la solución alternativa? ¿Cómo puede un entusiasta trabajar con el conjunto de datos de ImageNet?
Ahí es donde entra en juego el conjunto de datos Imagenette de Fast.ai
Imagenette es un conjunto de datos que se extrae de la gran colección de imágenes de ImageNet. La razón detrás del lanzamiento de Imagenette es que los investigadores y estudiantes pueden practicar con imágenes de nivel de ImageNet sin necesidad de tantos recursos informáticos.
En palabras del propio Jeremy Howard:
“Yo (Jeremy Howard, es decir) creé principalmente Imagenette porque quería un pequeño conjunto de datos de visión que pudiera usar para ver rápidamente si mis ideas de algoritmos podrían tener alguna posibilidad de funcionar. Normalmente no lo hacen, pero probarlos en Imagenet me lleva mucho tiempo descubrirlo, especialmente porque estoy interesado en algoritmos que funcionan particularmente bien en el fin de entrenamiento.
Pero creo que este también puede ser un conjunto de datos útil para otros «.
¡Y eso es lo que también usaremos para practicar!
1. Descargue el conjunto de datos de Imagenette
Así es como puede obtener el conjunto de datos (comandos para su terminal):
$ wget https://s3.amazonaws.com/fast-ai-imageclas/imagenette2.tgz $ tar -xf imagenette2.tgz
Una vez que haya descargado el conjunto de datos, notará que tiene dos carpetas: «train» y «val». Estos contienen el conjunto de entrenamiento y validación respectivamente. Dentro de cada carpeta, hay carpetas separadas para cada clase. Aquí está el mapeo de las clases:
Estas clases tienen el mismo ID en el conjunto de datos de ImageNet original. Cada una de las clases tiene aproximadamente 1000 imágenes, por lo que, en general, es un conjunto de datos equilibrado.
2. Carga de imágenes con ImageDataGenerator
Keras tiene esta útil funcionalidad para cargar imágenes grandes (como la que tenemos aquí) sin maximizar la RAM, haciéndolo en lotes pequeños. ImageDataGenerator en combinación con fit_generator proporciona esta funcionalidad:
El propio ImageDataGenerator deduce las etiquetas de clase y el número de clases de los nombres de las carpetas.
3. Creación de un modelo básico de CNN para clasificación de imágenes
Construyamos un modelo básico de CNN 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, se dará cuenta de que, aunque es una arquitectura más profunda que la que hemos utilizado hasta ahora, solo podemos 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 entre las clases.
Intensifique: transfiera el aprendizaje.
4. Uso de Transfer Learning (VGG16) para mejorar la precisión
VGG16 es una arquitectura de CNN que fue la primera finalista en el 2014 ImageNet Challenge. Está diseñado por Visual Graphics Group en Oxford y tiene 16 capas en total, con 13 capas convolucionales. Cargaremos los pesos previamente entrenados de este modelo para que podamos utilizar las características útiles que este modelo ha aprendido para nuestra tarea.
Descarga de pesos de VGG16
from keras.applications import VGG16 # include top should be False to remove the softmax layer pretrained_model = VGG16(include_top=False, weights="imagenet") pretrained_model.summary()
Aquí está la arquitectura del modelo:
Generar funciones a partir de VGG16
Extraigamos 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 features vgg_features_train = pretrained_model.predict(train) vgg_features_val = pretrained_model.predict(val)
# OHE target column train_target = to_categorical(train.labels) val_target = to_categorical(val.labels)
Observe la rapidez con la que su modelo comienza a converger. En solo 10 épocas, tiene una precisión de validación de más del 94%. ¿No es asombroso?
En caso de que haya dominado el conjunto de datos Imagenette, fastai también ha lanzado dos variantes que incluyen clases que encontrará difíciles de clasificar:
- Imagenwoof: 10 clases de razas de perros, un problema más difícil de clasificar
- Imagen 网 («wang»): Una combinación de Imagenette e Imagewoof y un par de trucos que hacen que el problema sea más complicado
A dónde ir desde aquí?
Además de los conjuntos de datos que hemos mencionado anteriormente, también puede utilizar los conjuntos de datos siguientes para crear visión por computador algoritmos. De hecho, considérelo un desafío. ¿Puede aplicar su conocimiento de CNN para superar el puntaje de referencia en estos conjuntos de datos?
- Moda MNIST – Conjunto de datos similar al MNIST de ropa y prendas de vestir. En lugar de dígitos, las imágenes muestran un tipo de prenda (camiseta, pantalón, bolso, etc.)
- Caltech 101 – Otro conjunto de datos desafiante que encontré para la clasificación de imágenes
También sugiero que antes de optar por el aprendizaje por transferencia, intente mejorar sus modelos básicos de CNN. Puede aprender de las arquitecturas de VGG16, ZFNet, etc. para obtener algunas pistas sobre el ajuste de hiperparámetros y puede usar el mismo ImageDataGenerator para aumentar sus imágenes y aumentar el tamaño del conjunto de datos.