Image Style Transfer Using Convolutional Neural Networks

2020. 3. 17. 00:07Artificial Intelligence

Image Style Transfer Using Convolutional Neural Networks,  Gatys et al. 논문을 참조하여 정리한 글임을 서두에 밝힙니다.

 

Style Transfer의 가장 유명한 예시 (논문 출처)

 

Style Transfer

 

 

Abstract

신경망을 이용한 스타일 전이(Neural Style Transfer)는 2015년 이 논문('Image Style Transfer Using Convolutional Neural Networks')에 소개된 방법으로, 원본 이미지 (natural image)에서 Style과 Content를 분리해내고 이들을 재조합하여 새로운 이미지를 만들어내는 것에 대한 아이디어를 소개하고 있습니다.

 

위 사진에서 확인할 수 있는 것처럼 하나의 이미지(호숫가와 집이 있는 그림)에서 Content를 추출하고 또 다른 하나의 이미지 (고흐의 'Starry night')에서 Style을 추출하여 두 특성을 합성한 새로운 이미지를 생성해 내는 방법을 제시하는 것이 이 논문의 주된 내용이라고 할 수 있습니다.

 

 

Method

 

Style Transfer 알고리즘의 대략적인 진행 과정은 다음과 같습니다.

 

1. Pre-trained된 네트워크를 준비

2. random white noise image $x$ (노이즈 이미지 - 아래 사진참조)로부터 학습 시작

3. Style Loss & Content Loss를 이용하여  Total Loss 계산

4. Gradient Descent를 통해 Backpropagation 수행

5. Chain Rule을 통과하면서 얻은 Gradient를  Pre-trained Network가 아닌 input image에 적용

6. Loss의 Local Optima를 찾을 때까지 위 과정을 반복

 

Style Transfer 알고리즘에는 CNN(Convolutional Neural Network)에 대한 중요한 통찰이 담겨 있습니다. (개인적인 의견)

 

 

"CNN에서 Layer Level이 높을 수록, 디테일한 픽셀 정보들이 사라지고, 추상화된 이미지 정보들이 남는다"

 

 

 

CNN의 layer에 대한 통찰이 담긴 그림 (논문참조)

 

 

위 그림을 보면, input 이미지가 CNN Filter를 통과함에 따라 디테일한 픽셀정보들이 사라지고 그림의 외곽 등의 디테일한 부분들이 일그러지는 것을 확인하실 수 있습니다.  디테일한 픽셀정보들이 사라진 추상화 이미지는, 논문에 의하면,  generic feature(보다 일반적인 특징들)를 잘 추출할 수 있게 되어 style을 적용하는데 더 용이하기 때문에, Style Transfer에 사용됩니다.

 

Style Transfer알고리즘에서는 이 Generic한 이미지에서 Content Loss를 구하고, 다른 이미지에서 Style Loss를 구하여 이 둘을 각각 다른 가중치를 가지고 Linear Combination을 통해 Total Loss를 구하는 방법을 취합니다.

즉 노이즈 이미지가 Content Loss를 최소화하여 원본이미지의 Content를 최대한 근사하면서 Style Loss도 최소화하여 원본이미지의 Style을 동시에 최대한 근사하도록 학습시키는 것입니다.

 

 

 

Content Loss

 

content loss는 high level layer 하나에서만 이루어집니다. (뒤에 나오는 style loss의 경우, 모든 레이어의 에러를 더해가기 때문에 이 둘을 구분하는 것은 중요합니다.) 

생성해야 하는 이미지와, Content를 학습시켜야 하는 이미지의 해당 Layer에서 추출된 Feature map$(C*H*W)$ 를 각각 $F_i, P_i$ 라고 하면 Content Loss는 다음과 같이 계산됩니다.

 

$$L_c = w_c \times \sum_{i,j} (F_{ij}^{\ell} - P_{ij}^{\ell})^2$$

 

간단히 말해서 두개의 Feature map의 차이를 제곱한 후에 모두 더해주는 L2 Norm의 방식을 취한 것입니다.

이는 Feature Map을 직접 비교하는 방식으로 이해할 수 있습니다. 

 

 

Style Loss

 

Style Loss는 Content Loss보다는 구하는 방법이 조금 복잡한 편입니다. 우선 Style Loss는 Content Loss와는 다르게, Pre-trained Network의 모든 레이어에 대해서 그 계산이 이루어집니다. 

각각의 레이어에서 이루어지는 계산도 Feature map을 직접 비교하여 계산했던 방식과는 다르게, Feature map의 Gram matrix값을 이용해 Feature map의 channel간 Correlation정보를 근사적으로 계산하여 이를 더해주는 방식을 취합니다.

 

 

$$L_s^\ell = w_\ell \sum_{i, j} \left(G^\ell_{ij} - A^\ell_{ij}\right)^2$$

 

간단히 말해서 두개의 Feature map의 Correlation정보를 가지고 있는 Gram matrix를 구한 후, 이들의 차를 제곱하여 얻은 값을 각 레이어마다 적절한 가중치를 주어 더하는 방식인 것입니다.

참고로 Gram Matrix는 한 벡터의 모든 성분 간의 내적 정보가 모두 담겨 있어, 벡터 내의 상관관계를 구할 때 자주 사용되는 행렬입니다.

 

 

이렇게 각각의 Loss를 구한 후에, 둘을 적절한 가중치를 주어 더하게 되면, Total Loss가 완성되게 되며, 가중치를 어떻게 주느냐에 따라서 Generated Image가 Style쪽에 가까운지, Content쪽에 가까운지를 조정할 수 있습니다.

 

 

 

Style Transfer의 핵심 로직 (논문 출처)

 

위 그림이 논문에 제시되어 있는 Style Transfer Algorithm의 학습 과정을 나타낸 그림입니다.

 

- 생성해야하는 이미지에 맨처음에 Random noise image를 넣었다는 점

- Content Image는 High Level Layer의 Loss만 계산해서 넘겨주고 있다는 점

- Style Image는 각각의 Layer마다 Loss를 계산에서 넘겨주고 있다는 점

- Total Loss는 두 Loss의 Weighted Sum 이라는 점

 

을 확인하실 수 있습니다.

 

Code

 

제 Github Repository에 CS231n Assignment3/StyleTransfer를 구현해 놓은 코드가 있습니다.

자세한 내용은 코드를 참조하여 주시기 바랍니다.

https://github.com/sckimynwa/ComputerVision_CS231/tree/master/assignment3

반응형

'Artificial Intelligence' 카테고리의 다른 글

Probability For Deep Learning  (0) 2020.03.21
Generative Adversarial Network(GAN)  (0) 2020.03.20
Gradient Ascent  (0) 2020.03.15
Saliency Map  (3) 2020.03.15
Anomaly Detection  (0) 2019.02.21