Opbygning af en billedtekstgenerator med Deep Learning i Tensorflow

I min sidste vejledning lærte du, hvordan du opretter en ansigtsgenkendelsesrørledning i Tensorflow med nedviklede neurale netværk. I denne vejledning lærer du, hvordan et sammenblandet neuralt netværk (CNN) og Long Short Term Memory (LSTM) kan kombineres for at oprette en billedtekstgenerator og generere billedtekster til dine egne billeder.

Oversigt

  • Introduktion til billedtekstmodelarkitektur
  • Billedtekster som et søgeproblem
  • Oprettelse af billedtekster i Tensorflow

Forudsætninger

  • Grundlæggende forståelse af Convolutional Neural Networks
  • Grundlæggende forståelse af LSTM
  • Grundlæggende forståelse af Tensorflow

Introduktion til billedtekstmodelarkitektur

Kombinerer en CNN og LSTM

I 2014 udgav forskere fra Google en artikel, Show And Tell: A Neural Image Caption Generator. På det tidspunkt var denne arkitektur avanceret i MSCOCO-datasættet. Det brugte en CNN + LSTM til at tage et billede som input og output en billedtekst.

Brug af et CNN til indlejring af billeder

Et sammenblandet neuralt netværk kan bruges til at skabe en tæt funktionsvektor. Denne tætte vektor, også kaldet en indlejring, kan bruges som input af funktioner i andre algoritmer eller netværk.

For en billedtekstmodel bliver denne indlejring en tæt gengivelse af billedet og vil blive brugt som den oprindelige tilstand for LSTM.

LSTM

En LSTM er en tilbagevendende neuralt netværksarkitektur, der ofte bruges i problemer med tidsmæssige afhængigheder. Det lykkes at være i stand til at fange information om tidligere tilstande for bedre at informere den aktuelle forudsigelse gennem dens hukommelsescelle-tilstand.

En LSTM består af tre hovedkomponenter: en glemport, inputport og outputport. Hver af disse porte er ansvarlige for at ændre opdateringer til cellens hukommelsestilstand.

For en dybere forståelse af LSTM'er, besøg Chris Olahs indlæg.

Forudsigelse med billede som starttilstand

I en sætningssprogmodel forudsiger en LSTM det næste ord i en sætning. På samme måde forsøger en LSTM i en tegnsprogsmodel at forudsige det næste tegn i betragtning af sammenhængen med tidligere set tegn.

I en billedtekstmodel opretter du en indlejring af billedet. Denne indlejring tilføres derefter som en oprindelig tilstand til en LSTM. Dette bliver den første tidligere tilstand til sprogmodellen og påvirker de næste forudsagte ord.

Ved hvert tidstrin overvejer LSTM den forrige celletilstand og udsender en forudsigelse for den mest sandsynlige næste værdi i sekvensen. Denne proces gentages, indtil endetokenet samples, hvilket signalerer slutningen af ​​billedteksten.

Billedtekster som et søgeproblem

Generering af en billedtekst kan ses som et grafsøgningsproblem. Her er knudepunkterne ord. Kanterne er sandsynligheden for at flytte fra en node til en anden. At finde den optimale vej indebærer at maksimere den samlede sandsynlighed for en sætning.

Prøveudtagning og valg af den mest sandsynlige næste værdi er en grådig tilgang til at generere en billedtekst. Det er beregningseffektivt, men kan føre til et suboptimalt resultat.

I betragtning af alle mulige ord ville det ikke være beregnings- / pladseffektivt at beregne alle mulige sætninger og bestemme den optimale sætning. Dette udelukker at bruge en søgealgoritme såsom Dybde første søgning eller Bredde første søgning for at finde den optimale sti.

Strålesøgning

Beam search er en bredeste-første søgealgoritme, der udforsker de mest lovende noder. Den genererer alle mulige næste veje og holder kun de bedste N-kandidater ved hver iteration.

Da antallet af noder, der skal udvides fra, er fast, er denne algoritme pladseffektiv og giver flere potentielle kandidater end en bedste-første søgning.

Anmeldelse

Indtil dette tidspunkt har du lært om at oprette en modelarkitektur til at generere en sætning, givet et billede. Dette gøres ved at bruge et CNN til at skabe en tæt indlejring og føde dette som en oprindelig tilstand til en LSTM. Derudover har du lært, hvordan man genererer bedre sætninger med strålesøgning.

I det næste afsnit lærer du at generere billedtekster fra en foruddannet model i Tensorflow.

Oprettelse af billedtekster i 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

Opsætning af miljø

Her bruger du Docker til at installere Tensorflow .

Docker er en containerplatform, der forenkler implementeringen. Det løser problemet med at installere softwareafhængigheder på forskellige servermiljøer. Hvis du er ny hos Docker, kan du læse mere her. For at installere Docker skal du køre:

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
  • Opret en API til at vise billedtekster

Opfordring til handling:

Hvis du nød denne vejledning, skal du følge og anbefale!

Er du interesseret i at lære mere om Deep Learning / Machine Learning? Tjek mine andre tutorials:

- Opbygning af en ansigtsgenkendelsesrørledning med dyb læring i Tensorflow

- Deep Learning CNN'er i Tensorflow med GPU'er

- Dyb læring med Keras på Google Compute Engine

- Anbefalingssystemer med Apache Spark på Google Compute Engine

Andre steder, du kan finde mig:

- Twitter: //twitter.com/_ColeMurray