Erstellen eines Bildunterschriftengenerators mit Deep Learning in Tensorflow

In meinem letzten Tutorial haben Sie gelernt, wie Sie in Tensorflow eine Gesichtserkennungspipeline mit Faltungsnetzwerken erstellen. In diesem Tutorial erfahren Sie, wie ein Faltungs-Neuronales Netzwerk (CNN) und ein Langzeit-Kurzzeitgedächtnis (LSTM) kombiniert werden können, um einen Bildunterschriftengenerator zu erstellen und Untertitel für Ihre eigenen Bilder zu generieren.

Überblick

  • Einführung in die Bildbeschriftungsmodellarchitektur
  • Bildunterschriften als Suchproblem
  • Erstellen von Untertiteln in Tensorflow

Voraussetzungen

  • Grundlegendes Verständnis von Faltungs-Neuronalen Netzen
  • Grundlegendes Verständnis von LSTM
  • Grundlegendes Verständnis von Tensorflow

Einführung in die Modellarchitektur von Bildunterschriften

CNN und LSTM kombinieren

Im Jahr 2014 veröffentlichten Forscher von Google das Papier Show And Tell: Ein Generator für neuronale Bildunterschriften. Zu dieser Zeit war diese Architektur im MSCOCO-Datensatz auf dem neuesten Stand der Technik. Es wurde ein CNN + LSTM verwendet, um ein Bild als Eingabe und Ausgabe einer Beschriftung aufzunehmen.

Verwenden eines CNN zum Einbetten von Bildern

Ein Faltungs-Neuronales Netzwerk kann verwendet werden, um einen dichten Merkmalsvektor zu erzeugen. Dieser dichte Vektor, auch Einbettung genannt, kann als Merkmalseingabe in andere Algorithmen oder Netzwerke verwendet werden.

Bei einem Bildunterschriftenmodell wird diese Einbettung zu einer dichten Darstellung des Bildes und wird als Ausgangszustand des LSTM verwendet.

LSTM

Ein LSTM ist eine wiederkehrende neuronale Netzwerkarchitektur, die häufig bei Problemen mit zeitlichen Abhängigkeiten verwendet wird. Es gelingt ihm, Informationen über frühere Zustände zu erfassen, um die aktuelle Vorhersage durch seinen Speicherzellenzustand besser zu informieren.

Ein LSTM besteht aus drei Hauptkomponenten: einem Vergessensgatter, einem Eingangsgatter und einem Ausgangsgatter. Jedes dieser Gates ist dafür verantwortlich, Aktualisierungen des Speicherzustands der Zelle zu ändern.

Für ein tieferes Verständnis von LSTMs besuchen Sie Chris Olahs Beitrag.

Vorhersage mit Bild als Ausgangszustand

In einem Satzsprachenmodell sagt ein LSTM das nächste Wort in einem Satz voraus. In ähnlicher Weise versucht ein LSTM in einem Zeichensprachenmodell, das nächste Zeichen unter Berücksichtigung des Kontexts zuvor gesehener Zeichen vorherzusagen.

In einem Bildunterschriftenmodell erstellen Sie eine Einbettung des Bildes. Diese Einbettung wird dann als Ausgangszustand in ein LSTM eingespeist. Dies wird der erste vorherige Zustand des Sprachmodells, der die nächsten vorhergesagten Wörter beeinflusst.

Bei jedem Zeitschritt berücksichtigt der LSTM den vorherigen Zellenzustand und gibt eine Vorhersage für den wahrscheinlichsten nächsten Wert in der Sequenz aus. Dieser Vorgang wird wiederholt, bis das End-Token abgetastet ist, was das Ende der Beschriftung signalisiert.

Bildunterschriften als Suchproblem

Das Generieren einer Beschriftung kann als Problem bei der Diagrammsuche angesehen werden. Hier sind die Knoten Wörter. Die Kanten sind die Wahrscheinlichkeit, sich von einem Knoten zum anderen zu bewegen. Um den optimalen Pfad zu finden, muss die Gesamtwahrscheinlichkeit eines Satzes maximiert werden.

Das Abtasten und Auswählen des wahrscheinlichsten nächsten Werts ist ein gieriger Ansatz zum Generieren einer Beschriftung. Es ist rechnerisch effizient, kann jedoch zu einem suboptimalen Ergebnis führen.

Bei allen möglichen Wörtern wäre es nicht rechnerisch / platzsparend, alle möglichen Sätze zu berechnen und den optimalen Satz zu bestimmen. Dies schließt die Verwendung eines Suchalgorithmus wie Tiefen-Erste-Suche oder Breitensuche aus, um den optimalen Pfad zu finden.

Strahlensuche

Die Strahlensuche ist ein Breitensuchalgorithmus, der die vielversprechendsten Knoten untersucht. Es werden alle möglichen nächsten Pfade generiert, wobei bei jeder Iteration nur die besten N besten Kandidaten beibehalten werden.

Da die Anzahl der zu erweiternden Knoten festgelegt ist, ist dieser Algorithmus platzsparend und ermöglicht mehr potenzielle Kandidaten als eine Best-First-Suche.

Rezension

Bis zu diesem Punkt haben Sie gelernt, eine Modellarchitektur zu erstellen, um einen Satz anhand eines Bildes zu generieren. Dies erfolgt durch Verwendung eines CNN, um eine dichte Einbettung zu erzeugen und dies als Ausgangszustand einem LSTM zuzuführen. Außerdem haben Sie gelernt, wie Sie mit der Strahlensuche bessere Sätze erzeugen.

Im nächsten Abschnitt erfahren Sie, wie Sie Untertitel aus einem in Tensorflow vorab trainierten Modell generieren.

Erstellen von Untertiteln in 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

Umgebung einrichten

Hier verwenden Sie Docker , um Tensorflow zu installieren .

Docker ist eine Containerplattform, die die Bereitstellung vereinfacht. Es löst das Problem der Installation von Softwareabhängigkeiten auf verschiedenen Serverumgebungen. Wenn Sie Docker noch nicht kennen, können Sie hier mehr lesen. Führen Sie Folgendes aus, um Docker zu installieren:

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