본문 바로가기

논문 리뷰

A Neural Algorithm of Artistic Style

사진(A)를 다양한 화풍으로 변환시킨 예제

   Image의 content와 style을 이용해서 unique visual experiences를 만들어내는 것은 인간에게는 쉬운 일이지만 기계에게는 어려운 일이다. 이 논문에서는 image를 content와 style로 분리할 수 있고, 어떤 이미지에서 content를 분리한 후 다른 이미지의 style과 융합하면 화풍을 바꿀 수도 있다는 것을 보여주었다.

 

Input image가 CNN 계층을 거치면서 결국에는 detailed pixel value 보다는 actual content를 인식하게 되는데, 이러한 특성을 이용하면 image에서 content를 분리해 낼 수 있다. CNN이 처음에는 부분적이고 단순한 feature를 인식하지만 깊게 들어갈 수록 더 복잡한 feature를 잡아내는 것을 이용한 것이다.

 

CNN 계층을 거치며 layer들의 output을 reconstruction 한 결과이다. 낮은 계층의 layer는 original image를 거의 완벽하게 복원하지만, 계층이 깊어질수록 exact pixel value는 잃어버리고 high level content만 남아 있다. 

 

Representation of style을 얻기 위해 각 레이어의 filter responses 위에 feature space를 만들 것이다. 이 feature space는 filter response간의 correlation으로 이루어져 있다. Style representation을 얻기 위해 correlation 연산을 하는건 시각 기관에서 complex-cell이 하는 일과 비슷하다고 한다.

 

내 생각은 이렇다. CNN의 여러 filter가 image의 여러 종류의 feature를 인식하는데, 이를 테면 어떤 filter는 색깔을 인식할 것이고 어떤 filter는 edge를 인식할 것이다. 그렇게 다양하게 추출된 feature끼리 서로가 가지는 correlation을 구한다면, 이런 그림에는 이런 색을 쓰고 이런 색에는 이런 방향의 edge를 그리더라 라는, 말하자면 style의 정보가 담기는 것이다.

 

Style을 각 layer마다 뽑으므로 어떤 layer의 style을 얼마나 사용할 지 가중치를 설정할 수 있다. 높은 layer의 style까지 모두 matching 했을 때 더 부드럽고 연속적인 결과물을 얻을 수 있다. 상대적으로 낮은 layer의 style만 사용하면 receptive field size가 작으므로 style이 locally defined 된다.

 

이 논문에서는 pre-trained 된 VGG-Network를 가져다 썼다. VGG-net은 ImageNet에서 에러율 7%를 기록한 CNN 기반 classifier이다. Image recognition을 잘 하기 위해서는 image의 variation in appearance와 variation in the content를 잘 구분해야 한다. 예를 들어, 고양이 이미지를 잘 분류한다는 것은 여러 각도와 환경에서 찍은 다양한 고양이 이미지에서 고양이라는 content를 잘 뽑아낸다는 것이다. 16개의 conv layer와 5개의 pooling layer를 19 layer VGG에서 가져왔고, FCN은 사용하지 않았다. Image synthesis를 위해 max pooling을 average pooling으로 바꿔서 gradient flow를 개선했고 좀 더 나은 결과를 얻었다.

 

 

l은 layer 번호이고 F는 l번째 layer의 output matrix이다. N은 filter 개수이고 M은 filter의 HxW이다. i번째 filter의 response matrix를 vector로 펼쳐서 F의 i행으로 넣는다. Conv를 거치면서 output size는 줄어들고 깊이는 늘어나기 때문에 각 layer의 output을 바로 visualize 할 수가 없다. 그래서 content를 뽑아내기 위해서는 white noise image인 x를 만들고 x를 넣어서 나온 layer의 output이 original image인 p의 output과 같도록 gradient descent를 돌린다. 만약 어떤 x를 넣었는데 layer가 뱉은 content가 original image의 그것과 같다면 x가 original image의 content를 가지고 있는 것이다.

 

P_l는 p의 layer output이고 F_l는 x의 layer output이다.

 

이것은 L content를 F에 대해 미분한 것이다. 이제 오차역전파로 x를 학습시켜 layer response를 p와 같게 할 수 있다.

 

 

 

이제 style reconstruction을 할 차례다. Gram matrix G는 위와 같이 정의한다. 이 논문에서 style을 feature response 간의 correlation으로 정의한다고 했으므로, G의 i,j번째 원소는 filter_i와 filter_j의 response의 내적이다. Content reconstruction에서는 original image를 p라 했다면, 여기서는 original image a를 정의하고 A_l을 a의 layer l에서의 style representation이라고 한다. White noise image x의 layer l에서의 style representation은 G_l이다.

 

l번째 layer에서 a와 x가 얼마나 style이 차이가 나는지를 보여주는 식이다.

 

최종적으로 모든 layer에 대해 E를 더해서 나온 것이 L style이다. 단, 각 layer의 E를 더할때 가중치 w_l을 곱해서, 어떤 layer의 E를 얼마나 반영할 것인지 w를 통해 조절할 수 있게 한 것이다.

 

E의 미분 결과는 위와 같고 오차역전파로 L style을 minimize 할 수 있다.

 

우리의 목표는 x가 p의 content를 닮음과 동시에 a의 style을 닮는 것이므로 L total에는 L content와 L style이 동시에 들어가고, 각각의 앞에 α와 β라는 계수를 붙여 어떤 것을 중시할 지 결정할 수 있게 하였다. α/β는 10^-3와 10^-4를 사용하였다.

 

이 사진을 다시 보면, α/β가 클 수록 content가 뚜렷해 지는 것을 알 수 있다.

 

그런데 훌륭한 image classifier일수록 content를 잘 뽑아내는 능력이 있다면, 굳이 VGG를 쓸 이유는 없지 않을까? 이 논문이 나왔을 당시에는 VGG가 SOTA였겠지만 지금 구현한다면 다른 걸 써보고 싶다.