본문 바로가기
Coursera 강의/Deep Learning

Neural Style Transfer

by 별준 2020. 12. 1.
해당 내용은 Coursera의 딥러닝 특화과정(Deep Learning Specialization)의 네 번째 강의 Convolutional Neural Networks를 듣고 정리한 내용입니다. (Week 4)

[What is neural style transfer?]

Neural Style Transfer는 Convnet으로 구현할 수 있는 흥미로운 어플리케이션 중의 하나이다. 이 네트워크를 통해서 자신만의 예술 작품을 만들 수 있다. 

이미지를 새로운 Style로 변형하는 것인데, 원본 이미지(Content)와 변형할 스타일(Style)을 가지고 새로운 Style의 이미지(Generated Image)를 합성하는 것이다.

 

Neural Style Transfer를 구현하려면 ConvNet의 다양한 layer들을 살펴보고 그 layer들에 의해서 추출된 feature들을 살펴보아야 한다.

 

[What are deep ConvNets learning?]

Neural Style Transfer에 대해서 알아보기 전에, Deep ConvNet이 무엇을 학습하는지에 대해서 이야기해보자.

우리가 위와 같은 ConvNet을 학습할 때, 각 layer에서 추출하는 feature들의 시각화를 통해서 각 layer의 unit들을 최대로 활성화하는 특징이 무엇인지 파악할 수 있다. 그리고, shallow layer에서는 명암과 같은 단순한 feature를 출력하고, deep layer로 갈수록 더욱 복잡한 패턴을 감지하기 시작한다.

 

'Visualizing and understanding convolutional networks' 논문에 ConvNet layer를 시각화하는 정교한 방법에 대해서 설명하고 있다.

 

[Cost Function]

Neural Style Transfer를 구현하기 위해서 생성된 이미지(Generated Image)에 대한 Cost Function을 정의해보자. 이 Cost Function을 최소화함으로써 우리는 원하는 이미지를 생성할 수 있게 된다.

비용함수는 다음과 같이 정의할 수 있다.

\[J(G) = \alpha J_{\text{content}}(C, G) + \beta J_{\text{style}}(S, G)\]

여기서 \(J_{\text{content}}(C, G)\)는 Content Cost라고 하며, \(J_{\text{style}}(S, G) \)는 Style Cost라고 하며, 두 이미지가 얼마나 비슷한지에 대한 Cost이다.

\(\alpha, \beta\)는 content cost와 style cost의 상대적인 가중치를 의미하고, 이것 또한 선택해야하는 하이퍼파라미터이다.(하나의 파라미터로 충분하지만, 논문에 따라 두개의 파라미터로 설명함)

 

그리고 최적화 알고리즘이 수행되는 방식은 다음과 같다.

처음에는 이미지 G를 무작위로 초기화해서 백색 노이즈의 이미지로 만들고, Cost Function을 통해 Gradient Descent를 수행해서 Cost Function을 최소화하고 G를 업데이트한다. 이 과정은 이미지 G의 픽셀 값을 업데이트하는 것이고, 학습이 진행될 수록 style로 렌더링된 content 이미지를 얻을 수 있을 것이다.

 

[Content Cost function]

우선 Content cost function에 대해서 알아보자.

만약 layer l을 사용해서 content cost를 계산한다고 했을 때, hidden layer 1을 선택한다면 생성된 이미지가 content image와 매우 비슷한 픽셀값을 가지도록 할 것이고, layer가 깊다면 content와 너무 동떨어진 이미지가 생성될 것이다. 따라서 layer l은 너무 얕지도, 깊지도 않은 layer로 선택해야 한다.

 

그리고 pre-trained ConvNet을 사용해서, content image와 generated image가 주어지면 이 두 이미지가 얼마나 유사한지 측정하면 된다.

즉, \(a^{[l](C)}\)와 \(a^{[l](G)}\)를 구해서, 두 activation이 유사하다면 두 이미지가 비슷하다라는 것을 의미한다.

그래서 Content Cost는 다음과 같이 구할 수 있고, 우리는 이 Cost를 최소화하도록 최적화하면 된다.

\[J_{\text{content}}(C, G) = \frac{1}{2}\| a^{[l](C)} - a^{[l](G)} \|^2\]

 

[Style Cost Function]

 

이미지의 style이 의미하는 것은 무엇일까? 

Style Image의 측정방법을 정의하기 위해서 우리고 한 layer L을 선택했다고 가정해보자. 

그렇다면 우리는 channel들 사이에서 분포하는 activation들의 상관 관계로 style을 정의할 수 있다.

한 layer L을 통해서 \(n_H, n_W, n_C =5\)의 block이 output으로 나왔을 때, 각 channel들의 쌍을 서루 비교해서 어떤 상관관계를 가지고 있는지 확인하는 것이다. 

따라서, 만약 빨간색 channel과 노란색 channel이 있을 때, 빨간색 채널은 수직 텍스쳐를 나타내고, 노란색 채널은 주황빛 계열의 색을 나타낸다고 하자. 만약 두 채널이 서로 상관관계가 높다면 수직 텍스쳐가 있을 때, 주황빛 계열을 가지게 된다는 뜻이고, 상관관계가 없다면 수직 텍스쳐가 있더라도 주황 계열이 아닐 수도 있다는 것이다. 

 

이렇게 상관관계의 정도로 생성된 이미지와 Input Style 이미지의 유사한 정도를 측정할 수 있다. 

위 아이디어를 공식으로 표현하면 다음과 같다.

\(G_{k{k}'}^{[l](G)}\)의 식에서 마지막 activation의 아래첨자 k에 '가 빠져있음

Style matrix로 모든 상관관계를 측정하는데, Style matrix는 위와 같이 계산된다. \(G_{k{k}'}^{[l]}\)는 \(k\)와 \({k}'\)의 상관관계 정도를 의미하며 k는 1 ~ \(n_c^{[l]}\)의 값이다. Gram matrix라고도 부른다. 이렇게 Style matrix를 정의하고, 이 행렬들을 사용해서 Style Cost function을 정의하면 다음과 같다.

여기서 \(\lambda\)(정규화 상수)는 어짜피 Cost Function에서 \(\beta\)를 곱하기 때문에 중요하지 않다.

댓글