/show_and_tell_implementation

Show and Tell: A Neural Image Caption Generator implement using keras

Primary LanguageJupyter NotebookMIT LicenseMIT

Show and Tell: A Neural Image Caption Generator

I implemented the code using Keras.
Requirements: Python3, Keras 2.0(Tensorflow backend), NLTK, matplotlib, PIL, h5py, Jupyter

Training and testing

  1. Download the Flicker8k dataset and place it in the path that contains the notebook file.
    Maybe the directory names are Flicker8k_Dataset and Flickr8k_text.
    Flicker8k_Dataset contains image files, and Flickr8k_text contains caption and dataset split information.(train, dev, test)

  2. Data prepare Open data_processing.ipynb
    In most cases, the code have comments and can be followed in order.

  3. Train and test Open train_evaluate.ipynb
    In most cases, the code have comments and can be followed in order.

Demo

  1. Open Demo.ipynb
    In demo, custom data to be put, and we have prepared an example in ./examples/.
  2. If you want to only demo, final model is in the repository, so you just need to create a tokenizer in train_evaluate.ipynb.

Simple paper review

1. Introduction

Task: Automatically describing the content of an image

Visual understanding 분야는 기존의 Computer vision 문제들, Image classification 혹은 Object recognition 보다 어렵다.
이미지를 문장으로 설명해내는 Task는 이미지에 포함된 객체와 함께 특성과 행동까지 잡아내야 하며, 이를 자연어로 표현해야 하는데 이는 이미지 모델뿐 아니라 언어모델까지 필요하다.
저자들은 이 Task를 풀기 위해 Machine translation으로부터 영감을 얻었다.
문장 내의 단어들을 해석, 치환, 재배치 하는 기존의 방식에서, 최근 RNN을 이용한 Encoder-Decoder 방식이 훨씬 간단하고 좋은 성능으로 해결하고 있다.
Encoder-RNN이 문장을 적절한 Vector representation으로 변환하고, Decoder-RNNvector 로부터 번역한 문장을 생성한다.
저자들은 이 Nerual Image Caption(or NIC)라 불리는 Encoder-RNNEncoder-CNN으로 대체한 모델을 제안한다.

Figure 1. 제안한 NIC model의 개요
figure1

Proposed Model: CNN encoder and RNN decoder(like machine translation), NIC

CNN은 기존의 Computer vision 문제들에서 우수한 성능을 내고 있고, 이는 CNN이 이미지를 잘 embeddeing 한다고 볼 수 있다.
따라서 CNN을 이미지 encoder로 사용하는 것은 자연스러운 일이고, 저자들은 ImageNet으로 pre-trained 된 모델을 사용했다.
NIC는 다른 NN과 같이 SGD를 통해 학습된다.
NICPascal, Flicker8k, 30k, MSCOCO, SBU dataset에서 사람과 근접한 State of the art를 달성했다.

3. Model

Machine translation과 마찬가지로 Encoder는 고정된 차원의 vectorencoding 하고,
Decoder는 해당 vectordecoding하여 이미지를 설명하는 문장을 생성한다.
당시 연구들은 sequence model이 주어졌을 때 correct translation의 확률을 maximize하는 방향으로 학습하는 것이 좋다고 통계적으로 보여진다.
저자들은 아래와 같은 수식을 Maximizing하는 방식으로 모델을 학습시켰다.

Equation 1. Image I 가 주어졌을 때, Description S
equation1

문장 S 는 길이가 제한적이지 않고, 따라서 joint probability를 이용한 아래 수식처럼 표현할 수 있다.

Equation 2. Joint probability
equation2

문장을 생성하는 모델에 RNN을 사용하는것은 자연스럽고, 저자들은 RNN을 더 Concrete하게 만들기 위해 두 가지 Crucial한 선택을 했다.

1. 어떤 Non-linear function을 써야 학습이 잘 될 것인가.

이에 대한 문제를 LSTM을 사용하여 해결하였다.
LSTMVanishing or exploding gradient 문제를 잘 해결하기 때문에 당시 sequence task에서 State of the art를 달성하였고, 저자들도 이를 선택했다.

2. 어떻게 이미지와 단어를 동시에 입력으로 넣어줄 수 있을까.

2014 이미지넷에서 우승한 GoogLeNet을 사용하여 이미지를 embedding 했다.
기존의 Computer vision 문제를 잘 해결하는 모델이 이미지를 잘 표현하는 vector representation를 만들 것이라 생각했다.
또한 문장을 word 단위로 split 하여 Image vector와 같은 차원으로 embedding 했다.

3.1. LSTM based Sentence Generator

LSTMVanishing or exploding gradient 문제를 잘 해결하기 때문에 선택했고, LSTM의 전체적인 구조는 아래와 같다.

Figure 2. LSTM structure
figure2

Encoder-CNN과 결합한 LSTM의 모습은 아래와 같고, 모든 LSTM의 parameter는 공유된다.

Figure 3. LSTM model combined with a CNN image embedder
figure3

이미지는 맨 처음 입력 단 한번만 들어가고, 이미지 벡터로부터 LSTM이 출력한 결과를 다음 LSTM의 입력으로 넣으면서 학습, 추론한다.
저자들은 매 step마다 이미지를 넣어주는 시도를 했으나 이는 오히려 더 쉽게 Overfit 되는 결과를 보였다.

Inference

저자들은 NIC에서 Inference하는 두 가지 방법을 제시했다.

Sampling

Sampling 방식은 아주 단순하다.
최대 문장의 길이가 될 때 혹은 끝나는 신호가 나올 때까지 LSTM에서 Softmax를 거쳐 출력된 최대 값의 단어를 이어붙여, 이를 다음 LSTM의 입력으로 넣어주는 방식이다.

BeamSearch

BeamSearch는 매 t번째까지의 입력으로 만들어진 문장 k개를 유지하며, k개의 문장들로부터 t+1번째까지의 문장 중 다시 k개를 반환하는 방식이다.
k=1 일 때는 굉장히 Greedy하며 BLEU score는 k=20일 때의 BLEU score보다 평균적으로 2점 정도 하락했다.

4. Experiments

4.1 Evaluation Metrics

Image description에서 가장 많이 사용되는 MetricBLEU score이고, n-gram을 통해 평가된다.
n-gram이란 다음에 나올 단어를 예측할 때 은 앞선 n-1개의 단어에 의존하는 방식이다.
주로 1-gram을 많이 이용하고 저자들 또한 BLEU-1을 주로 이용하였고, 추가적으로 ME-TEOR, Cider score도 제시하였다.

4.2. Datasets

다음과 같은 Dataset을 이용하였다.

Table 1. Datasets.
table1

SBU를 제외하고는 모두 5개의 문장Labeling 되어 있다.
저자들은 SBUFlikcr에서 사용자들이 올린 Description이기 때문에 Noise가 있다고 보았다.
또한 Pascal은 Test를 위해서만 사용하였고, 나머지 4개의 Data로 학습한 모델을 이용했다.

4.3. Result

4.3.1. Training Details

논문에서 저자들은 아래와 같은 사항들을 이용하여 실험했다.

  1. 학습 시 CNNImagnet을 통해 pre-trainedweight를 그대로 이용하였고, fine tuning은 하지 않았다.
  2. Word embedding vectorpre-trained 된 모델을 써 보았으나 효과가 없었다.
  3. SGD로 학습했고 fixed learning rate를 사용, decay는 사용하지 않았다.
  4. Word embedding size와 LSTM의 크기는 512로 셋팅했다.
  5. Overfitting을 피하기 위해 Dropoutensemble을 사용했다. - BLEU score 향상은 거의 없었다.
  6. Hidden layer의 개수와 깊이를 다양하게 설정했다.

4.3.2. Generation Results

Table 2. BLEU-1 score.
table2

사용한 4가지 Datasets 전부에서 SOTA BLEU-1 score를 갱신했다.

4.3.3. Transfer Learning, Data Size and Label Quality

어떤 datasets로부터 학습된 모델은 다른 datasets에도 적용될 수 있는지 실험했다.
같은 유저 집단이 만든 Flickr dataset에서는 Transfer learning이 효과가 있었다.
Flickr30k로 학습된 모델을 이용하면 Flickr8k에서 BLEU score가 4점 정도 상승한다.
MSCOCOFlickr30k 보다 5배 크지만, **dataset 간 miss-match가 많았고 BLEU score가 10점 정도 내려갔다.

4.3.4. Generation Diversity Discussion

저자들은 Generate model 관점에서, 얼마나 다양한 문장들을 생성할 수 있는지, 얼마나 수준이 높은지를 확인하였다.
k=20BeamSearch에서 상위 15개 정도는 BLEU-1 score 기준으로 사람과 견줄만한 58점 정도를 달성했다.

Table 3. MSCOCO test set의 생성된 몇가지 예시.
table3

4.3.7. Analysis of Embeddings

one-hot encoding과 다르게 EmbeddingWord dictionary의 크기에 제한되지 않는다.
저자들은 Embedding space에서 KNN을 이용한 몇 가지 예시를 제시했는데 아래와 같다.

Table 6. KNN을 이용한 Word embedding space analysis.
table6

Embedding Vector는 다른 Vision component에도 도움을 줄 수 있는데,
horsepony, donkey는 근접하기 때문에 CNNhorse-looking 동물의 특징을 추출하는 것이 더 수월해질 것이다.
아주 심한 경우에 Unicorn 같은 몇몇 예시들도 horse와 근접하기 때문에, 기존의 bag of word 방식보다 더 많은 정보를 줄 수 있다.