Construyendo un generador de subtítulos de imágenes con Deep Learning en Tensorflow

En mi último tutorial, aprendiste cómo crear una canalización de reconocimiento facial en Tensorflow con redes neuronales convolucionales. En este tutorial, aprenderá cómo se pueden combinar una red neuronal convolucional (CNN) y Long Short Term Memory (LSTM) para crear un generador de subtítulos de imágenes y generar subtítulos para sus propias imágenes.

Visión general

  • Introducción a la arquitectura del modelo de subtítulos de imágenes
  • Los subtítulos como un problema de búsqueda
  • Crear subtítulos en Tensorflow

Prerrequisitos

  • Comprensión básica de las redes neuronales convolucionales
  • Comprensión básica de LSTM
  • Comprensión básica de Tensorflow

Introducción a la arquitectura del modelo de subtítulos de imágenes

Combinando CNN y LSTM

En 2014, investigadores de Google publicaron un artículo, Show And Tell: A Neural Image Caption Generator. En ese momento, esta arquitectura era de vanguardia en el conjunto de datos de MSCOCO. Utilizaba un CNN + LSTM para tomar una imagen como entrada y dar salida a un título.

Usar una CNN para incrustar imágenes

Se puede utilizar una red neuronal convolucional para crear un vector de características denso. Este vector denso, también llamado incrustación, se puede utilizar como entrada de características en otros algoritmos o redes.

Para un modelo de leyenda de imagen, esta incrustación se convierte en una representación densa de la imagen y se utilizará como el estado inicial del LSTM.

LSTM

Un LSTM es una arquitectura de red neuronal recurrente que se usa comúnmente en problemas con dependencias temporales. Tiene éxito al poder capturar información sobre estados anteriores para informar mejor la predicción actual a través de su estado de celda de memoria.

Un LSTM consta de tres componentes principales: una puerta de olvido, una puerta de entrada y una puerta de salida. Cada una de estas puertas es responsable de alterar las actualizaciones del estado de la memoria de la celda.

Para una comprensión más profunda de LSTM, visite la publicación de Chris Olah.

Predicción con imagen como estado inicial

En un modelo de lenguaje de oración, un LSTM predice la siguiente palabra en una oración. De manera similar, en un modelo de lenguaje de personajes, un LSTM está tratando de predecir el siguiente personaje, dado el contexto de los personajes vistos anteriormente.

En un modelo de leyenda de imagen, creará una incrustación de la imagen. Esta incrustación luego se alimentará como estado inicial en un LSTM. Este se convierte en el primer estado previo al modelo de lenguaje, que influye en las siguientes palabras predichas.

En cada paso de tiempo, el LSTM considera el estado anterior de la celda y genera una predicción para el siguiente valor más probable en la secuencia. Este proceso se repite hasta que se muestrea el token final, lo que indica el final del título.

Los subtítulos como problema de búsqueda

La generación de un título puede verse como un problema de búsqueda de gráficos. Aquí, los nodos son palabras. Los bordes son la probabilidad de pasar de un nodo a otro. Encontrar el camino óptimo implica maximizar la probabilidad total de una oración.

Muestrear y elegir el siguiente valor más probable es un enfoque codicioso para generar un título. Es computacionalmente eficiente, pero puede conducir a un resultado subóptimo.

Dadas todas las palabras posibles, no sería eficiente desde el punto de vista computacional / espacial calcular todas las oraciones posibles y determinar la oración óptima. Esto descarta el uso de un algoritmo de búsqueda como la búsqueda en profundidad primero o búsqueda primero en amplitud para encontrar la ruta óptima.

Búsqueda de haz

Beam search es un algoritmo de búsqueda que busca primero la amplitud y explora los nodos más prometedores. Genera todas las siguientes rutas posibles, manteniendo solo los N mejores candidatos en cada iteración.

Dado que la cantidad de nodos desde los que expandirse es fija, este algoritmo es eficiente en el espacio y permite más candidatos potenciales que una búsqueda en la que el primero sea el mejor.

revisión

Hasta este punto, ha aprendido a crear una arquitectura modelo para generar una oración, dada una imagen. Esto se hace utilizando un CNN para crear una incrustación densa y alimentando esto como estado inicial a un LSTM. Además, ha aprendido a generar mejores oraciones con la búsqueda de haces.

En la siguiente sección, aprenderá a generar subtítulos a partir de un modelo previamente entrenado en Tensorflow.

Creando subtítulos en Tensorflow

# Project Structure
├── Dockerfile├── bin│ └── download_model.py├── etc│ ├── show-and-tell-2M.zip│ ├── show-and-tell.pb│ └── word_counts.txt├── imgs│ └── trading_floor.jpg├── medium_show_and_tell_caption_generator│ ├── __init__.py│ ├── caption_generator.py│ ├── inference.py│ ├── model.py│ └── vocabulary.py└── requirements.txt

Configuración del entorno

Aquí, usará Docker para instalar Tensorflow .

Docker es una plataforma de contenedores que simplifica la implementación. Resuelve el problema de instalar dependencias de software en diferentes entornos de servidor. Si es nuevo en Docker, puede leer más aquí. Para instalar Docker, ejecute:

curl //get.docker.com | sh

After installing Docker, you’ll create two files. A requirements.txt for the Python dependencies and a Dockerfile to create your Docker environment.

To build this image, run:

$ docker build -t colemurray/medium-show-and-tell-caption-generator -f Dockerfile .
# On MBP, ~ 3mins# Image can be pulled from dockerhub below

If you would like to avoid building from source, the image can be pulled from dockerhub using:

docker pull colemurray/medium-show-and-tell-caption-generator # Recommended

Download the model

Below, you’ll download the model graph and pre-trained weights. These weights are from a training session on the MSCOCO dataset for 2MM iterations.

To download, run:

docker run -e PYTHONPATH=$PYTHONPATH:/opt/app -v $PWD:/opt/app \-it colemurray/medium-show-and-tell-caption-generator \python3 /opt/app/bin/download_model.py \--model-dir /opt/app/etc

Next, create a model class. This class is responsible for loading the graph, creating image embeddings, and running an inference step on the model.

Download the vocabulary

When training an LSTM, it is standard practice to tokenize the input. For a sentence model, this means mapping each unique word to a unique numeric id. This allows the model to utilize a softmax classifier for prediction.

Below, you’ll download the vocabulary used for the pre-trained model and create a class to load it into memory. Here, the line number represents the numeric id of the token.

# File structure# token num_of_occurrances
# on 213612# of 202290# the 196219# in 182598
curl -o etc/word_counts.txt //raw.githubusercontent.com/ColeMurray/medium-show-and-tell-caption-generator/master/etc/word_counts.txt

To store this vocabulary in memory, you’ll create a class responsible for mapping words to ids.

Creating a caption generator

To generate captions, first you’ll create a caption generator. This caption generator utilizes beam search to improve the quality of sentences generated.

At each iteration, the generator passes the previous state of the LSTM (initial state is the image embedding) and previous sequence to generate the next softmax vector.

The top N most probable candidates are kept and utilized in the next inference step. This process continues until either the max sentence length is reached or all sentences have generated the end-of-sentence token.

Next, you’ll load the show and tell model and use it with the above caption generator to create candidate sentences. These sentences will be printed along with their log probability.

Results

To generate captions, you’ll need to pass in one or more images to the script.

docker run -v $PWD:/opt/app \-e PYTHONPATH=$PYTHONPATH:/opt/app \-it colemurray/medium-show-and-tell-caption-generator \python3 /opt/app/medium_show_and_tell_caption_generator/inference.py \--model_path /opt/app/etc/show-and-tell.pb \--input_files /opt/app/imgs/trading_floor.jpg \--vocab_file /opt/app/etc/word_counts.txt

You should see output:

Captions for image trading_floor.jpg: 0) a group of people sitting at tables in a room . (p=0.000306) 1) a group of people sitting around a table with laptops . (p=0.000140) 2) a group of people sitting at a table with laptops . (p=0.000069)

Conclusion

In this tutorial, you learned:

  • how a convolutional neural network and LSTM can be combined to generate captions to an image
  • how to utilize the beam search algorithm to consider multiple captions and select the most probable sentence.

Complete code here.

Next Steps:

  • Try with your own images
  • Read the Show and Tell paper
  • Create an API to serve captions

Call to Action:

If you enjoyed this tutorial, follow and recommend!

Interested in learning more about Deep Learning / Machine Learning? Check out my other tutorials:

- Building a Facial Recognition Pipeline with Deep Learning in Tensorflow

- Deep Learning CNN’s in Tensorflow with GPUs

- Deep Learning with Keras on Google Compute Engine

- Recommendation Systems with Apache Spark on Google Compute Engine

Other places you can find me:

- Twitter: //twitter.com/_ColeMurray