[Paper Review] Image Style Transfer Using Convolutional Neural Networks

Date:     Updated:

카테고리:

태그:

Main Reference:
- Deep Learning for Computer Vision
- 꼼꼼한 딥러닝 논문 리뷰와 코드 실습

Paper:
- Image Style Transfer Using Convolutional Neural Networks


🚀 Introduction

3

Image Style Transfer란 Content 이미지 형상 위에 style 이미지의 style을 입히는 것이다. 그림과 같이 풍경 사진 위에 유명 화가들의 화풍을 적용하는 것이다. 논문에 나온 방식은 noise image에서 시작해 content와 style을 reconstruction 한다. 즉, cnn의 가중치들은 고정시키고 noise 이미지를 업데이트 하는 방식이다. 논문에서 사용한 cnn 모델은 pre-trained VGG19 이다.


4

논문의 핵심 내용은 다음과 같다.

  • 이미지의 style을 어떻게 정의할 것인가?
  • content와 style을 어떻게 reconstruction 할 것인가?


🚀 Content Reconstruction

content 이미지를 reconstruction하기 위해 content loss 함수를 정의한다. 이 함수는 L번째 convolution layer에 존재하는 i번째 필터에 대응하는 F matrix로 표현된다.

paper1-17

\[L_{content}(\vec{p},\vec{x},l) = \frac{1}{2}\sum_{i,j}^{}(F_{ij}^{l}-P_{ij}^{l})^{2}\] \[\frac{\partial L_{content}}{\partial F_{ij}^{l}} = (F^{l}-P^{l})_{ij}\]


  • p: content image
  • x: input image (noise)
  • l: l번째 layer
  • F: noise image x를 넣었을 때 활성화 값
  • P: content image p를 넣었을 때 활성화 값 (상수)


여기서 특이한 점은 모든 필터를 사용해 업데이트하지 않고 4번째 layer 필터만을 이용해 reconstruction 한다. 실제 코드를 돌려보면 업데이트 속도가 굉장히 느려서 필터의 개수를 제한하는 것은 이해가 간다. 그런데 왜 하필 conv4 필터를 사용하는 것일까?


7

Content Reconstructions부분을 살펴보자. a는 첫번 째 레이어에 존재하는 필터를 이용해 reconstruction 한 그림이고 그 중 특정 부분을 확대한 그림이 아래의 것이다. 오른쪽으로 갈수록 즉, 깊은 layer의 필터를 사용한 것일수록 해상도는 떨어진다. 이는 깊은 layer의 필터일수록 더 넓은 영역을 커버하고, 고차원의 특징을 표현하기 때문이다.


8

위 그림은 Content Image를 각각 Conv2_2 필터, Conv4_2 필터를 이용해 reconstruction한 것이다. Conv2_2 필터를 이용한 경우, 확대한 사진을 보면 content image의 저차원 특징이 너무 선명해서 단순히 색깔만 입혀놓은 듯 하다. 반면 Conv4_2 필터를 이용하니 해상도가 떨어지지만, 오히려 더 자연스럽게 스타일이 표현된 듯하다.


🚀 Style Reconstruction

본 논문에서는 ‘Style’을 Gram matrix G라는 행렬을 이용해 정의한다. Gram matrix가 무엇인지 살펴보자.

  • 필터의 개수: N+1 (0,1,…,N)
  • M: feature map의 가로*세로

paper1-26 paper1-27 paper1-28

  • 논문에서 제시한 스타일이란?
  • Correlations between the different filter responses


\[G_{ij}^{l} = \sum_{k}^{}F_{ik}^{l}F_{jk}^{l}\] \[E_{l} = \frac{1}{4N_{l}^{2}M_{l}^{2}}\sum_{i,j}^{}(G_{ij}^{l}-A_{ij}^{l})^{2}\] \[L_{style}(\vec{a}, \vec{x}) = \sum_{l=0}^{L}w_{l}E_{l}\] \[\frac{\partial E_{l}}{\partial F_{ij}^{l}} = \frac{1}{N_{l}^{2}M_{l}^{2}} {({(F^{l})}^{T}(G^{l} - A^{l}))}_{ji}\]


  • Gram matrix는 크기가 크기 때문에 4MN으로 나누는 정규화 텀을 거치는 듯 하다.
  • A는 style image의 Gram matrix (상수)
  • content reconstruction과 마찬가지로 모든 layer를 사용하지 않고 conv1, conv2, conv3, conv4, conv5 다섯 개의 layer만 사용한다.
    • 성능 이슈 때문인 듯
  • 이때 w는 1/5로 지정해준 하이퍼 파라미터 이다.
    • l = 0, 1, 2, 3, 4 (5개의 layer 사용)
  • Gradient를 computed analytically하면서 툭 던져주는데 아직 이해하지 못했다. 좀 더 고민해봐야겠다.


🚀 Style Transfer

10

이제 content loss와 style loss를 정의했으니 total loss를 정의할 수 있다. 이때 style loss의 정규화 텀 때문인지 알파가 1, 베타가 1000 이런 식이더라. 또 하나 특이한 점은 LBFGS 라는 처음 보는 optimizer를 쓰던데 tensorflow core에서는 adma써도 괜찮다고 한다. 아마 옛날에 쓰던 optimizer인가 보다.


🚀 Result

Trad-off between contentand style matching

13

\[L_{total} = \alpha L_{content} + \beta L_{style}\]


  • 알파/베타 비율을 조정하면서 content에 중점을 둘지 style에 중점을 둘지 선택할 수 있다. 다만 서로 trade-off 관계이다.


Initialization of gradient descent

12

  • 원래 noise image를 input으로 두고 업데이트 하는 방식이었는데, content image 또는 style image를 초기값으로 둬도 괜찮다고 한다.
  • A가 content image를 input으로 둔 결과
  • B가 style image를 input으로 둔 결과이다.


Photorealistic style transfer

14

  • Artistic style이 아닌 arbitrary image로도 style transfer가 가능할까?
  • 예외적인 경우가 아니면 힘들다고 한다.
  • style image의 해상도가 높으면 성능이 못 따라감
  • noise가 많이 낌
    • 경계가 애매한 art style에서는 괜찮았음
    • 하지만 photorealistic style에서는 문제가 됨


🚀 Discussion

저자들이 제시한 스타일(feature map들의 상관관계)의 정의는 완벽하지 않다. 고흐의 ‘별이 빛나는 밤’ style을 예로 들어보자. 사람이 보기에 그림의 ‘별’은 스타일이 아닌 object이다. 하지만 본 논문의 style transfer에서는 별을 스타일로 인식한다. 아직 개선해야할 점이 남아있다. 인간이 짱이다.


🚀 실습 코드

직접 돌려볼 수 있는 파이썬 노트북 입니다.
colab에서 실행 가능하고, 사진을 저장하는 repository 부분 코드만 수정하시면 됩니다!

Tutoral Code

일본 여행에 좋은 기억이 많아서 일본 풍경으로 tutoral 코드를 돌려봤다. tensorflow, pytorch 두 버전 모두 해봤는데 pytorch가 좀 더 직관적이었다. 그리고 gpu 많이 쓰니까 코랩에서 못쓰게 막더라.

paper1-23 paper1-24


맨 위로 이동하기

Paper 카테고리 내 다른 글 보러가기

댓글 남기기