jueves, 17 de octubre de 2019

Deep Learning - VGG CÓMO CARGAR Y UTILIZAR UN MODELO DE RECONOCIMIENTO DE OBJETOS PRECONFIGURADO

https://unipython.com/como-cargar-y-utilizar-un-modelo-de-reconocimiento-de-objetos-preconfigurado/


Las redes neuronales convolucionales son ahora capaces de superar a los humanos en algunas tareas de visión por computador, como la clasificación de imágenes. Es decir, si se le da una fotografía de un objeto, responda a la pregunta de cuál de los 1.000 objetos específicos que muestra la fotografía. Un modelo ganador de la competencia para esta tarea es el modelo VGG de los investigadores de Oxford. Lo importante de este modelo, además de su capacidad de clasificar objetos en fotografías, es que los pesos de los modelos están disponibles libremente y pueden ser cargados y utilizados en sus propios modelos y aplicaciones. En este tutorial, descubrirá los modelos de red neural convolucional VGG para la clasificación de imágenes. Después de completar este tutorial, usted sabrá:
Objetivo del 7º tutorial y clase 3/6 del Curso de Natural Language Processing con Deep Learning
  • Sobre el conjunto de datos de ImageNet y el concurso y los modelos ganadores de VGG.
  • Cómo cargar el modelo VGG en Keras y resumir su estructura.
  • Cómo utilizar el modelo VGG cargado para clasificar objetos en fotografías ad hoc.

Vamos a empezar.

Resumen del Tutorial

Este tutorial se divide en las siguientes partes:
  1. ImageNet
  2. Los modelos Oxford VGG
  3. Cargar el modelo VGG en Keras
  4. Desarrolle un clasificador fotográfico sencillo
📝 Nota
Keras utiliza la biblioteca de imágenes Python o la biblioteca PIL para manipular imágenes. La instalación en su sistema puede variar.

ImageNet

ImageNet es un proyecto de investigación para desarrollar una gran base de datos de imágenes con anotaciones, por ejemplo, imágenes y sus descripciones. Las imágenes y sus anotaciones han sido la base de un reto de clasificación de imágenes llamado ImageNet Large Scale Visual Recognition Challenge o ILSVRC desde 2010. El resultado es que las organizaciones de investigación luchan en cdatasets predefinidos para ver quién tiene el mejor modelo para clasificar los objetos en imágenes.
Para la tarea de clasificación, las imágenes deben clasificarse en una de las 1.000 categorías diferentes. Durante los últimos años se han utilizado modelos de redes neuronales convolucionales muy profundos para ganar estos desafíos y los resultados en las tareas han superado el rendimiento humano.


Ejemplo de imágenes del conjunto de datos de ImageNet utilizadas en el ILSVRC Challenge
Ejemplo de imágenes del conjunto de datos de ImageNet utilizadas en el ILSVRC Challenge

Los modelos Oxford VGG

Investigadores del Oxford Visual Geometry Group, o VGG para abreviar, participan en el desafío del ILSVRC. En 2014, los modelos de redes neurales convolucionales (CNN) desarrollados por la VGG ganaron las tareas de clasificación de imágenes.


ILSVRC Resultados en 2014 para la tarea de clasificación.
ILSVRC Resultados en 2014 para la tarea de clasificación.

Después de la competencia, los participantes escribieron sus hallazgos en el artículo Very Deep Convolutional Networks for Large-Scale Image Recognition, 2014. También hicieron sus modelos y pesas aprendidas disponibles en línea. Esto permitió a otros investigadores y desarrolladores utilizar un modelo de clasificación de imágenes de última generación en sus propios trabajos y programas. Esto ayudó a alimentar un aluvión de trabajo de aprendizaje de transferencia en el que se utilizan modelos pre-entrenados con modificaciones menores en tareas de modelado predictivo totalmente nuevas, aprovechando las capacidades de extracción de características de última generación de los modelos probados.
VGG lanzó dos modelos diferentes de CNN, específicamente un modelo de 16 capas y un modelo de 19 capas. Consulte el documento para obtener todos los detalles de estos modelos. Los modelos VGG ya no son de última generación en unos pocos puntos porcentuales. Sin embargo, son modelos muy potentes y útiles tanto como clasificadores de imágenes como base para nuevos modelos que utilizan entradas de imágenes. En la siguiente sección veremos cómo podemos usar el modelo VGG directamente en Keras.

Cargar el modelo VGG en Keras

El modelo VGG puede ser cargado y utilizado en la biblioteca de aprendizaje profundo de Keras. Keras proporciona una interfaz de aplicaciones para la carga y el uso de modelos ya entrenados. Usando esta interfaz, usted puede crear un modelo VGG usando los pesos pre-entrenados proporcionados por el grupo Oxford y usarlo como punto de partida en su propio modelo, o usarlo como modelo directamente para clasificar imágenes. En este tutorial, nos centraremos en el caso de uso de la clasificación de nuevas imágenes utilizando el modelo VGG. Keras proporciona las versiones de 16 y 19 capas a través de las clases VGG16 y VGG19. Centrémonos en el modelo VGG16. El modelo se puede crear como se indica a continuación:
from keras.applications.vgg16 import VGG16
model = VGG16()
Eso es todo. La primera vez que ejecute este ejemplo, Keras descargará los archivos de peso de Internet y los almacenará en el directorio/.keras/models.
📝 Nota
Los pesos son de unos 528 megabytes, por lo que la descarga puede tardar unos minutos dependiendo de la velocidad de su conexión a Internet.
Los pesos sólo se descargan una vez. La próxima vez que ejecute el ejemplo, las pesas se cargan localmente y el modelo debería estar listo para usar en segundos. Podemos utilizar las herramientas estándar de Keras para inspeccionar la estructura del modelo. Por ejemplo, puede imprimir un resumen de las capas de red como se indica a continuación:
from keras.applications.vgg16 import VGG16
model = VGG16()
model.summary()
Puedes ver que el modelo es enorme. También se puede ver que, por defecto, el modelo espera imágenes como entrada con un tamaño de 224 x 224 píxeles con 3 canales (por ejemplo, color).
____________________________________________________
Layer (type)              Output Shape           Param #
=================================================================
input_1 (InputLayer)      (None, 224, 224, 3)    0
_________________________________________________________________
block1_conv1 (Conv2D)     (None, 224, 224, 64)   1792
_________________________________________________________________
block1_conv2 (Conv2D)     (None, 224, 224, 64)   36928
_________________________________________________________________
block1_pool (MaxPooling2D) (None, 112, 112, 64)  0
_________________________________________________________________
block2_conv1 (Conv2D)     (None, 112, 112, 128)  73856
_________________________________________________________________
block2_conv2 (Conv2D)     (None, 112, 112, 128)  147584
_________________________________________________________________
block2_pool (MaxPooling2D) (None, 56, 56, 128)   0
_________________________________________________________________
block3_conv1 (Conv2D)     (None, 56, 56, 256)    295168
_________________________________________________________________
block3_conv2 (Conv2D)     (None, 56, 56, 256)    590080
_________________________________________________________________
block3_conv3 (Conv2D)     (None, 56, 56, 256)    590080
_________________________________________________________________
block3_pool (MaxPooling2D) (None, 28, 28, 256)   0
_________________________________________________________________
block4_conv1 (Conv2D)     (None, 28, 28, 512)    1180160
_________________________________________________________________
23.4. Load the VGG Model in Keras
260
block4_conv2 (Conv2D)     (None, 28, 28, 512)    2359808
_________________________________________________________________
block4_conv3 (Conv2D)     (None, 28, 28, 512)    2359808
_________________________________________________________________
block4_pool (MaxPooling2D) (None, 14, 14, 512)   0
_________________________________________________________________
block5_conv1 (Conv2D)     (None, 14, 14, 512)    2359808
_________________________________________________________________
block5_conv2 (Conv2D)     (None, 14, 14, 512)    2359808
_________________________________________________________________
block5_conv3 (Conv2D)     (None, 14, 14, 512)    2359808
_________________________________________________________________
block5_pool (MaxPooling2D) (None, 7, 7, 512)     0
_________________________________________________________________
flatten (Flatten)         (None, 25088)          0
_________________________________________________________________
fc1 (Dense)               (None, 4096)           102764544
_________________________________________________________________
fc2 (Dense)               (None, 4096)           16781312
_________________________________________________________________
predictions (Dense)       (None, 1000)           4097000
=================================================================
Total params: 138,357,544
Trainable params: 138,357,544
Non-trainable params: 0
_________________________________________________________________
También podemos crear un gráfico de las capas en el modelo VGG, de la siguiente manera:
from keras.applications.vgg16 import VGG16
from keras.utils.vis_utils import plot_model
model = VGG16()
plot_model(model, to_file='vgg.png')
Una vez más, debido a que el modelo es grande, la trama es un poco demasiado grande y tal vez ilegible.
La clase VGG() toma algunos argumentos que pueden interesarle sólo si está buscando utilizar el modelo en su propio proyecto, por ejemplo, para el aprendizaje transferido. Por ejemplo:
  • include_top(True): Si se deben incluir o no las capas de salida para el modelo. No los necesita si está ajustando el modelo a su propio problema.
  • weights(‘imagenet’): Qué pesos cargar. Puede especificar Ninguno para no cargar pesas preentrenadas si está interesado en entrenar el modelo usted mismo desde cero.
  • input_tensor(Ninguno): Una nueva capa de entrada si desea ajustar el modelo a nuevos datos de un tamaño diferente.
  • input_shape(None): El tamaño de las imágenes que se espera que tome el modelo si cambia la capa de entrada.
  • pooling (Ninguno): El tipo de pool a utilizar cuando entrena un nuevo conjunto de capas de salida.
  • class(1000): El número de clases (por ejemplo, tamaño del vector de salida) para el modelo.
A continuación, veamos el uso del modelo VGG cargado para clasificar fotografías ad hoc.

Desarrollar un clasificador fotográfico sencillo

Vamos a desarrollar un sencillo script de clasificación de imágenes.
Obtener una imagen de muestra
Primero, necesitamos una imagen que podamos clasificar. Puedes descargar una foto al azar de una taza de café de Flickr.


Taza de café
Taza de café

Descargue la imagen y guárdela en su directorio de trabajo actual con el nombre de archivo mug.jpg.

Cargar el modelo VGG

Cargue los pesos para el modelo VGG-16, como hicimos en la sección anterior.
from keras.applications.vgg16 import VGG16
# cargar el modelo
model = VGG16()

Cargar y preparar la imagen

A continuación, podemos cargar la imagen como datos de píxeles y prepararla para ser presentada a la red. Keras proporciona algunas herramientas para ayudar en este paso. Primero, podemos usar la función load_img() para cargar la imagen y redimensionarla al tamaño requerido de 224 x 224 píxeles.
from keras.preprocessing.image import load_img
# cargar una imagen desde un archivo
image = load_img('mug.jpg', target_size=(224, 224))
A continuación, podemos convertir los píxeles a una matriz NumPy para que podamos trabajar con ella en Keras. Podemos usar la función img_to_array() para esto
from keras.preprocessing.image import load_img
# cargar una imagen desde un archivo
image = load_img('mug.jpg', target_size=(224, 224))
La red espera una o más imágenes como entrada; esto significa que la matriz de entrada tendrá que ser de 4 dimensiones: muestras, filas, columnas y canales. Sólo tenemos una muestra (una imagen). Podemos remodelar el array llamando a reshape() y añadiendo la dimensión extra.
#remodelar los datos para el modelo
image = image.reshape((1, image.shape[0], image.shape[1], image.shape[2]))
A continuación, los píxeles de imagen deben prepararse de la misma manera que se prepararon los datos de formación de ImageNet. Específicamente, del periódico:
Keras proporciona una función llamada preprocess_input() para preparar nuevas entradas para la red.
from keras.applications.vgg16 import preprocess_input
# preparar la imagen para el modelo VGG
image = preprocess_input(image)
A continuación, podemos convertir los píxeles a una matriz NumPy para que podamos trabajar con ella en Keras. Podemos usar la función img_to_array() para esto.
from keras.preprocessing.image import img_to_array
# convierte los píxeles de la imagen en una matriz NumPy
image = img_to_array(image)
La red espera una o más imágenes como entrada; esto significa que la matriz de entrada tendrá que ser de 4 dimensiones: muestras, filas, columnas y canales. Sólo tenemos una muestra (una imagen). Podemos remodelar el array llamando a reshape() y añadiendo la dimensión extra.
# remodelar los datos para el modelo
image = image.reshape((1, image.shape[0], image.shape[1], image.shape[2]))
A continuación, los píxeles de imagen deben prepararse de la misma manera que se prepararon los datos de formación de ImageNet. Específicamente, del periódico:
Keras proporciona una función llamada preprocess_input() para preparar nuevas entradas para la red.
from keras.applications.vgg16 import preprocess_input
# preparar la imagen para el modelo VGG
image = preprocess_input(image)
Ahora estamos listos para hacer una predicción para nuestra imagen cargada y preparada.

Haga una predicción

Podemos llamar a la función predict() en el modelo para obtener una predicción de la probabilidad de que la imagen pertenezca a cada uno de los 1.000 tipos de objetos conocidos.
# predecir la probabilidad en todas las clases de salida
yhat = model.predict(image)

Interpretar Predicción

Keras proporciona una función para interpretar las probabilidades llamada decodificar predicciones(). Puede devolver una lista de clases y sus probabilidades en caso de que desee presentar los 3 objetos principales que pueden estar en la foto. Sólo reportaremos el primer objeto más probable.
from keras.applications.vgg16 import decode_predictions
# convertir las probabilidades en etiquetas de clase
label = decode_predictions(yhat)
# recuperar el resultado más probable, por ejemplo, la probabilidad más alta
label = label[0][0]
# imprimir la clasificación
print('%s (%.2f%%)'% (label[1], label[2]*100))

Ejemplo completo

Enlazando todo esto, el ejemplo completo se muestra a continuación:
from keras.preprocessing.image import load_img
from keras.preprocessing.image import img_to_array
from keras.applications.vgg16 import preprocess_input
from keras.applications.vgg16 import decode_predictions
from keras.applications.vgg16 import VGG16
# cargar el modelo
model = VGG16()
# cargar imagen desde el archivo
image = load_img('mug.jpg', target_size=(224, 224))
# remodelar los datos para el modelo
image = img_to_array(image)
# preparar la imagen para el modelo VGG
image = image.reshape((1, image.shape[0], image.shape[1], image.shape[2]))
# predecir la probabilidad en todas las clases de salida
image = preprocess_input(image)
# convertir las probabilidades en etiquetas de clase
yhat = model.predict(image)
# convert the probabilities to class labels
label = decode_predictions(yhat)
# recuperar el resultado más probable, por ejemplo, el más alto 
label = label[0][0]
# imprimir la clasificación
print('%s (%.2f%%)'% (label[1], label[2]*100))
Al ejecutar el ejemplo, podemos ver que la imagen está correctamente clasificada como una taza de café con un 75% de probabilidad.
📝 Nota
Dada la naturaleza estocástica de las redes neuronales, sus resultados específicos pueden variar. Considere la posibilidad de ejecutar el ejemplo unas cuantas veces.
coffee_mug (75.27%)
 Aprende mucho mas con nuestro curso:

No hay comentarios:

Publicar un comentario