Képfelirat-generátor építése a Deep Learning in Tensorflow segítségével

Az utolsó oktatóanyagomban megtanultad, hogyan hozhat létre arcfelismerési folyamatot a Tensorflow-ban konvolúciós ideghálózatokkal. Ebben az oktatóanyagban megtudhatja, hogyan lehet kombinálni a konvolúciós neuronhálózatot (CNN) és a hosszú rövid távú memóriát (LSTM) képaláírási generátor létrehozásához és a képfeliratok előállításához.

Áttekintés

  • Bevezetés a képfelvétel modell architektúrájába
  • Feliratok keresési problémaként
  • Feliratok létrehozása a Tensorflow-ban

Előfeltételek

  • A konvolúciós neurális hálózatok alapvető ismerete
  • Az LSTM alapvető ismerete
  • A Tensorflow alapvető megértése

Bevezetés a képfeliratos modell architektúrájába

CNN és ​​LSTM kombinálása

2014-ben a Google kutatói kiadtak egy cikket: Show And Tell: A Neural Image Caption Generator. Abban az időben ez az architektúra korszerű volt az MSCOCO adatkészletén. CNN + LSTM-et használt, hogy képet készítsen bemenetként, és feliratot adjon ki.

CNN használata kép beágyazásához

Konvolúciós idegháló segítségével sűrű jellemzővektor hozható létre. Ezt a sűrű vektort, amelyet beágyazásnak is neveznek, más algoritmusokba vagy hálózatokba is be lehet vonni.

A képaláírási modell esetében ez a beágyazás a kép sűrű ábrázolásává válik, és az LSTM kezdeti állapotaként fogja használni.

LSTM

Az LSTM egy visszatérő neurális hálózati architektúra, amelyet általában időbeli függőségekkel kapcsolatos problémák esetén használnak. Sikeresen képes információt rögzíteni a korábbi állapotokról, hogy az aktuális előrejelzést jobban tudja tájékoztatni a memória sejt állapotán keresztül.

Az LSTM három fő összetevőből áll: egy megfeledkezési kapu, egy bemeneti kapu és egy kimeneti kapu. Ezek a kapuk felelősek a cella memória állapotának frissítéséért.

Az LSTM-ek mélyebb megértéséhez látogasson el Chris Olah bejegyzésére.

Jóslás képpel kezdeti állapotként

A mondat nyelvi modelljében az LSTM megjósolja a mondat következő szavát. Hasonlóképpen, egy karakternyelvi modellben az LSTM megpróbálja megjósolni a következő karaktert, tekintettel a korábban látott karakterek kontextusára.

A képaláírási modellben létrehozza a kép beágyazását. Ez a beágyazás akkor kezdeti állapotként bekerül egy LSTM-be. Ez lesz a nyelvi modell első korábbi állapota, amely befolyásolja a következő előre jelzett szavakat.

Minden egyes lépésben az LSTM figyelembe veszi az előző cellaállapotot, és előrejelzést ad ki a szekvencia legvalószínűbb következő értékéről. Ezt a folyamatot addig ismételjük, amíg a végjelzőből mintát veszünk, jelezve a felirat végét.

Feliratok keresési problémaként

A felirat létrehozása grafikonkeresési problémaként tekinthető meg. Itt a csomópontok szavak. Az élek valószínűsége az egyik csomópontról a másikra való elmozdulás. Az optimális út megtalálása magában foglalja a mondat teljes valószínűségének maximalizálását.

A mintavétel és a legvalószínűbb következő érték kiválasztása mohó megközelítés a felirat előállításához. Számítási szempontból hatékony, de nem optimális eredményhez vezethet.

Az összes lehetséges szót figyelembe véve nem lenne számítási / térhatékony az összes lehetséges mondat kiszámítása és az optimális mondat meghatározása. Ez kizárja az optimális elérési út megtalálásához olyan keresési algoritmusokat, mint például a Mélység első keresése vagy a Szélesség első keresés.

Sugár keresés

A sugár keresés egy széleskörű keresési algoritmus, amely a legígéretesebb csomópontokat tárja fel. Ez generálja az összes lehetséges következő utat, minden egyes iterációnál csak a legjobb N legjobb jelöltet tartja meg.

Mivel a kibővíthető csomópontok száma rögzített, ez az algoritmus helytakarékos, és több potenciális jelöltet tesz lehetővé, mint a legjobb első keresés.

Felülvizsgálat

Eddig a pontig megtanulta, hogyan lehet modellarchitektúrát létrehozni egy mondat, egy kép előállításához. Ezt úgy végezzük, hogy CNN-t használunk egy sűrű beágyazás létrehozásához, és ezt kezdeti állapotként tápláljuk egy LSTM-be. Ezenkívül megtanulta, hogyan lehet jobb mondatokat létrehozni sugárkereséssel.

A következő szakaszban megtanulják, hogy készítsenek feliratokat egy előre betanított modellből a Tensorflow-ban.

Feliratok létrehozása a Tensorflow-ban

# 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

Környezet beállítása

Itt a Docker segítségével telepítheti a Tensorflow szoftvert .

A Docker egy konténerplatform, amely leegyszerűsíti a telepítést. Megoldja a szoftverfüggőségek különböző szerverkörnyezetekre történő telepítésének problémáját. Ha még nem ismeri a Dockert, itt olvashat bővebben. A Docker telepítéséhez futtassa:

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