본문 바로가기

머신러닝/[논문으로 짚어보는 딥러닝의 맥]

이미지를 설명하는 문장을 만들어내는 Image Captioning

학습목표

이번 강의에서는 Image Captioning에 대해 살펴보도록 하겠습니다. Image Captionaing은 어떤 이미지를 설명하는 문장을 만들어 내는 것을 말합니다. 어떤 이미지를 잘 설명해주는 문장을 만들 수 있기 때문에 굉장히 중요하게 다뤄질 수 있습니다. 예컨데 앞을 못 보는 사람들에게 이 기술이 도입된다면 자신 앞의 화면을 설명해주어 도움을 주기 때문에 인류의 삶에 큰 변화를 가져다줄 수 있습니다.

핵심 키워드

  • Image Captioning
  • Show and Tell
  • Show, Attend and Tell
  • DenseCap

학습하기

 이번에는 Image Captioning에 대해 알아볼겁니다. Image Captioning이란 어떤 이미지가 들어왔을 때, 이것을 설명하는 문장을 만들어 내는겁니다. 이 문제도 굉장히 Multi-modal 하죠. 앞에서 봤던 VQA와 같이요. 그러나 차이는, VQA는 질문이 주어져있지만, IC는 질문이 아닌 문장을 만들어 낸다는 점이죠. 그럼 IC가 왜 필요하냐. 세상에는 정말 많은 이미지가 있지만, 여기서 내가 원하는 걸 뽑아내기는 참 어려워요. 정확히 내가 원하는 바를 뽑으려면 결국 이미지에 하나하나 라벨링을 해줘야하는데, 이건 불가능하겠죠. 그래서 IC가 필요합니다. 그렇다고 이게 쉬우냐 그러면 물론 어렵습니다. 이미지를 CNN으로 읽어내고, RNN으로 문장을 만들어내는 과정을 거쳐야하는데요. 이 컨셉은 조금 새롭죠. 

 자 이걸 이해하기 위해서, Machine Translation model을 이해할 필요가 있습니다. 번역하는 모델을 만들 때, RNN을 두개를 써요. Encoder RNN / Decoder RNN이라 하는데, VQA에서 한 번 말씀드렸기를, 어떤 시퀀스가 주어졌을 때 그 시퀀스를 잘 설명할 수 있는 어떤, Variable length vector를 찾기 위해서는, RNN에 시퀀스를 넣고 마지막에 나오는 Cell state를 쓰면 된다고 말씀드렸습니다. 

 여기서도 같습니다. 좌측이 Encoder RNN, 우측이 Decoder RNN인데, 어떤 문장을 RNN을 통과시켜 나온 마지막 Cell state를 Decoder RNN측에서 초기값으로 EOS(End Of Sentence)와 받고 w를 출력하고, w를 다시 Input으로 받아 x를 출력하고, ... 그러다가 마지막에 EOS 토큰이 나오면 단어 생성을 중지한다. 여기서 알 수 있는 건, Encoder RNN의 마지막 Cell state에 있는 Output이 앞의 모든 문장들을 설명하기에 충분하다는 겁니다. 그리고 그 Cell state만을 갖고, 어떤 영어 문장을 복원할 수 있다는 거죠. 이런 아이디어에 착안해서 IC를 만드는 겁니다. Encoder RNN의 역활을 CNN에게 맡기는거죠.

 그래서 Language Model이라는 건 별게아니라, 이전 단어 들이 주어졌을 때, 다음 단어의 확률 분포와 같습니다. 아래 예시를 보면, "cat sat on mat"이라는 문장에 대해서 LSTM이 출력하는 것들이 결국에는, 이전 단어들이 나왔을 때, 해당 단어가 나올 조건부 확률임을 확인할 수 있죠.

 이런 아이디어로, Pretrained CNN Model을 가져오고, Fully conn에 RNN을 이어붙여 만들었던 최초의 IC 논문이 Show and Tell인데요. 뭐 당연히 잘되는 것도 있고, 안되는 것도 있고 그랬죠.

 지금부터는 그 다음 논문인, Show, Attend and Tell을 보겠습니다. Attention이 추가된거죠. 

 여기서 어떻게 Attention을 한 거냐면, 내가 지금 주어진 이미지 안에서 어느 영역을 보고 지금 단어를 만들지에 대한겁니다. 위 자료처럼, 물 위를 나는 새 라는 이미지가 있으면, A bird라는 단어를 위해 사진 속 새에 집중하고, water라는 단어를 위해 사진 속 수면을 집중하는 겁니다.

 Show and tell과 Show, Attend and tell의 구조적인 차이는, 전자는 CNN의 Fully conn 출력을 LSTM에 넣었던 것에 비해, 후자는 CNN의 Conv feature map을 통해 Attention을 구현한 후 LSTM에 넣었다는 점이죠. Conv feature map을 사용함으로써 Spatial한 정보를 잃지 않았던 거죠. 그런데로 목적한 바가 잘 구현됬어요. 어떤 단어에 대해 이미지의 어떤 부분에 집중한다는걸 시각화할 수도 있었구요. 

 다음은 DenseCap입니다. 이게 뭔지 사진을 보시면 확 와닿을거에요.

 대단하죠. 단순한 분류에서, 벌써 여기까지 내용이 발전했습니다. 이런 굉장한 내용인 만큼, 모델도 굉장히 복잡합니다. 때문에 해당 내용은 관련 논문을 주의 깊게 읽어보시는 걸 추천드립니다. 이상입니다.