통계, IT, AI

딥러닝: 화풍을 모방하기 (13) - 논문 구현 본문

머신러닝

딥러닝: 화풍을 모방하기 (13) - 논문 구현

Harold_Finch 2019. 10. 10. 22:02

1. 개요

A Neural Algorithm of Artistic Style은 2015년에 발표된 논문으로, 신경망을 이용하여 특정 이미지를 다른 이미지의 화풍을 모방하여 재구성하는 내용을 담고 있다. 발표가 된 직후부터 상당히 화제가 된 논문으로 내가 신경망에 관심을 갖게 된 계기이기도 하다. 본 포스팅에서는 해당 논문에서 소개한 style transfer의 원리를 간략하게 설명하고 논문에 등장한 figure를 재현한다.

2. 원리와 재연

본 논문에서 제시하고 있는 방법은 한 이미지에서는 내용을, 다른 이미지에서는 스타일을 학습하고 결과를 적절하게 혼합하여 이미지를 생성하는 것이다. 먼저 내용을 학습하는 방법을 설명한다.

Convolution layer는 filter를 통해 이미지의 특징을 잡아내는 역할을 한다. 이미지가 filter를 통과하면서 '부호화(encoded)'되는데, 만약 두 이미지의 부호화 결과가 같다면 두 이미지는 비슷한 특징을 가질 수 있을 것이라고 생각할 수 있다. 먼저 학습의 대상이 되는 이미지 \(\vec{p}\)를 미리 학습된 filter에 통과시켜 부호화시킨다. 그리고 이 결과와 white noise \(\vec{x}\)를 같은 filter에 통과시켜 얻은 결과가 작은 차이를 갖도록 \(\vec{x}\)를 학습시키면 \(\vec{x}\)와 \(\vec{p}\)와 유사한 결과를 가질 것이다. 미리 학습된 filter는 VGG19를 사용하였다.

높이, 너비, 채널이 각각 \(H, W, C\)인 \(\vec{p}\)를 filter의 수가 \(N_l\)개인 \(l\)번째 Convolution layer에 넣어 \(OH * OW * N_l\)의 차원을 갖는 feature map을 얻는다. 이를 \(N_l \times M_l\)의 크기를 갖는 매트릭스 \(F^l\)로 바꾼다(단, \(M_l=OH \times OW\)). 마찬가지로 \(\vec{x}\)를 같은 Convolution layer에 넣어 얻은 결과를 \(P^l\)라고 하자. 이제 두 결과가 작아지도록 손실함수를 아래와 같이 설정하여 white noise를 학습한다.

$$ L_{content}(\vec{p}, \vec{x},l)=\frac{1}{2}\sum_{i,j}\left( F^l_{i,j}-P^l_{i,j} \right)^2 $$

논문의 Figure 1에서 Content Reconstruction을 다음과 같이 재연하였다. 층이 깊어질수록 원본보다 거칠게 보이는 것을 확인할 수 있다. 논문과 상이한 것은, (e) conv5_1에서는 이미지가 완전히 뭉게진다는 점이다. 그림의 특성인지 구현의 오류인지는 확인하지 않았다. 이제 스타일을 학습하는 방법을 소개한다.

아래의 그림처럼 Convolution layer의 각 filter는 이미지의 서로 다른 특징을 포착한다. 각 필터는 이미지의 전체적인 구조보다는 국소적인 구조와 색감 등을 잡아내는데, feature map 간 상관관계를 구함으로서 이미지의 분위기를 추론할 수 있다는 것이 논문의 아이디어이다. 

즉, 아래와 같이 feature map 간 상관관계를 Gram matrix라고 정의한다.

$$G^{l}_{ij}=\sum_{k}F^{l}_{ik}F^{l}_{jk}$$

그리고 스타일을 학습할 이미지\(\vec{a}\)의 Gram matrix \(G^{l}\)와 white noise \(\vec{x}\)의 Gram matrix \(A^{l}\)의 차이가 작아지도록 white noise를 변형해간다. 단, \(w_{l}\)은 스타일 학습에 사용된 convolution layer의 수의 역수이다.

$$L_{style}(\vec{a},\vec{x})=\sum_{l}w_l\frac{1}{4N^{2}_{l}M^{2}_{l}}\sum_{i,j}\left(G^{l}_{ij}-A^{l}_{ij}\right)^2$$

논문의 Figure 1에서 Style reconstruction을 다음과 같이 재연하였다. 논문의 figure와는 특히 (d)와 (e)에서 다른 모습을 보인다.

이제 최종적인 손실함수를 아래와 같이 정의한다. 이때 \(\alpha\)와 \(\beta\)는 content와 style 손실함수의 가중치이다.

$$L_{total}(\vec{p}, \vec{a}, \vec{x})=\alpha L_{content}(\vec{p}, \vec{x})+ \beta L_{style}(\vec{a},\vec{x})$$

위의 내용을 바탕으로 논문이 Figure 2를 다음과 같이 재연하였다.

논문의 구현은 github의 노트북을 실행하여 얻을 수 있다. keras로 구현하였는데, 알고보니 keras의 튜토리얼에 이 논문을 구현하는 것이 있었다. 시간이 되면 이 코드도 살펴보고 싶다.

3. 마치며

본 학습을 시작한 것이 2017년 1월 27일이었다. 시작할 때는 CNN 뿐만 아니라 신경망에 대해서도 몰랐지만, 결국 논문을 읽고 어느정도 구현할 수 있어 기쁘다.  

Comments