티스토리 뷰

[업데이트 2018.07.11 12:21] 


열네번째 요약할 논문은 "A Neural Algorithm of Artistic Style"(https://arxiv.org/pdf/1508.06576.pdf) 입니다. 본 논문은 deep neural network를 이용하여 입력으로 주어진 content image와 style image를 통해 generated image를 생성하는 방법을 제안하고 있습니다. 즉, 윤곽, 형태는 content image와 유사하게 만들면서, 텍스쳐나 스타일은 style image와 유사하게 조합하는 것을 의미합니다. 아래의 그림에서 볼 수 있듯이 content image와 style image가 적절히 조합되어 최종적으로 generated image를 만들게 됩니다.



또한 아래의 Figure 1과 같이 CNN의 convolution layer별로 이미지가 어떻게 변화되어 가는지를 시각화하고 있습니다. content image의 경우 layer가 깊어 질수록 원본 대비 detail한 픽셀 정보는 점점 사라지지만, high-level image(전체적인 윤곽, 아래의 경우 건물의 모습)는 유지됩니다. style image의 경우 layer가 깊어 질수록 style image 원본에 가까워지는데, 이러한 현상이 발생하는 이유는 같은 layer의 feature map의 channel간 correlation(아래의 Gram Matrix)으로 정의하였기 때문이라고 합니다.   


같은 CNN 모델을 사용하지만, 아래와 같이 content, style에 대한 표현이 분리되어 있습니다. 

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


cost 함수를 minimize할 때, content, style 두가지에 대해 gradient descent를 수행하기 때문에 최종적으로 generated image에 content와 style image가 조합되어 나오게 됩니다.



1. Content Cost 

CNN의 경우 pre-trained 된 VGG Net을 사용하며, 입력 이미지로 C(content image,) S(style image)를 사용하게 됩니다. G(generated image)를 만들기 위해 cost함수를 정의하게 되는데, 다음과 같습니다. 여기서 a는 hidden layer activation tensor 값이며, C와 G image에 대해 구해진 값입니다.

$$J_{content}(C,G) =  \frac{1}{4 \times n_H \times n_W \times n_C}\sum _{ \text{all entries}} (a^{(C)} - a^{(G)})^2\tag{1} $$


2.1 Style Cost

Style cost의 경우 layer l에 대한 cost 계산을 수행하며, 2.2 Style Weights에서 볼 수 있듯이 각 layer별로 구해진 Style cost에 특정 상수값(lambda)을 곱하고, 모든 layer의 cost 값을 더하여 최종 Style cost 값을 계산하게 됩니다.


아래의 Style cost에서 G값의 경우 "Gram Matrix"라 부르며, 아래와 같이 입력된 tensor에 대해 dot product한 결과와 같습니다. 따라서 입력된 C와 G의 hidden layer activation tenser 값에 Gram Matrix를 적용 후, Style Cost 값을 계산합니다. vi, vj간의 유사도(correlation)가 높을 수록 dot product값이 커지게 되고, 유사도가 낮아질수록 작아지게 됩니다.


${\displaystyle G_{ij} = v_{i}^T v_{j} = np.dot(v_{i}, v_{j})  }$


$$J_{style}^{[l]}(S,G) = \frac{1}{4 \times {n_C}^2 \times (n_H \times n_W)^2} \sum _{i=1}^{n_C}\sum_{j=1}^{n_C}(G^{(S)}_{ij} - G^{(G)}_{ij})^2\tag{2} $$


2.2 Style Weights

각각의 convolution layer별로 위에서 구한 Style Cost에 weight를 곱하고, 모두 더 하여 최종 Style cost를 계산합니다.


$$J_{style}(S,G) = \sum_{l} \lambda^{[l]} J^{[l]}_{style}(S,G)$$


3. Total Cost
Total Cost는 아래와 같습니다. 기존에 구한 content, style cost에 특정 상수값(alpha, beta)을 곱한 후 더하여 계산합니다.

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

이제 아래와 같은 과정을 거쳐 최종적으로 generated image를 얻게 됩니다.


1. Content image를 로드합니다.

2. Style image를 로드합니다.

3. Generated image를 random 값으로 초기화합니다.

4. pre-trained된 VGG model을 로드합니다.

5. VGG model에 입력 이미지로 content image를 입력 및 실행 후(forward-propagation), content cost를 계산합니다.

6. VGG model에 입력 이미지로 style image를 입력 및 실행 후(forward-propagation), stye cost를 계산합니다.

7. total cost를 계산 합니다.

8. total cost를 minimize하기 위해 optimizer를 정의합니다.

9. 학습을 최대 iteration만큼 수행하며, 각 iteration별로 generated image를 저장합니다.

10. 마지막 iteration때 생성된 generated image 최종 결과를 확인합니다.


>> 다양한 테스트 결과

* 참고 

[1] https://arxiv.org/pdf/1508.06576.pdf

[2] https://www.coursera.org/learn/convolutional-neural-networks/home/week/4


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함