Manduss life

[Deep Learning] Style Transfer 본문

전산/Deep Learning

[Deep Learning] Style Transfer

만두쓰 2023. 2. 26. 17:32

Style Transfer 

content 이미지, style 이미지가 주어졌을 때, 이미지의 형태는 content 이미지의 형태를 유지하면서, style 이미지의 domain(style)로 변형하는 것

 

실습

  • VGG19 모델의 앞 5개의 CNN layer를 사용한다.
  • 5개의 CNN layer 중에 특정 layer에서 content loss, style loss를 계산한다. 여기서는 최초 style tranfer 논문에서 제안한 5개 layer에서 style loss 계산, 4번째 layer에서 content loss 계산한 형태를 따른다.
    • Content loss : 합성곱의 기대값과 예측값의 MSE
    • Style loss : 합성곱의 기대값의 그람 행렬과 예측값의 그람행렬의 MSE (output은 상수 loss)
      • 그람 행렬 : feature map을 (batch size x 채널 수, width x height) 로 변환하여 이를 transpose한 행렬과의 곱으로 계산된다. 
        그람 행렬을 사용하는 이유는, style 은 서로 다른 특징 간의 상관관계로 정의되기 때문이다. 
        그람 행렬은 각 특징 맵 간의 곱의 합 값이다. 상관관계가 높다면, 하나의 feature에서 높은 값이 나올 경우 다른 feature에서 또한 높은 값이 나오기 때문에, 값이 크다는 것은 feature들간의 상관관계가 높다는 뜻이다. 
        그람 행렬을 구함으로써, 각 feature의 상관관계를 수치화할 수 있다. 

batch size가 1일 떄의 그람 행렬 계산에 사용되는 변환된 행렬


    • 여기서 특이한 점은 기대값에 해당하는 이미지가 순수 content/style 이미지가 아닌, 학습시키고 있는 style transfer 모델에 content/style 이미지를 입력시킨 출력 값이다. 
      정확하진 않지만, 내 생각으로는 새로운 style이 적용된 영상이 기존의 순수 content 영상과의 픽셀 차이를 계산한다면 새로운 style로 인해 차이값이 커 적절한 loss값을 계산하기 어렵다는 이유일 것 같다. (정확한 이유를 아신다면 댓글바랍니다..)
  • Pooling 기법은 Average Pooling 기법으로 변경한다. 픽셀들 간의 급격한 변화를 방지하기 위함이다. (VGG에서는 max pooling을 사용)

 

Content loss
Style loss
batch size가 1일 떄의 그람 행렬 계산에 사용되는 변환된 행렬

 

 

실습 결과 

  • style weight : 1e6
    content weight : 1

 

  • style weight : 1e7 (위 결과보다 style weight 10배 늘린 결과)
    content weight : 1
    앞선 결과보다 Style 이미지 input과 더 닮은 결과.

  • style weight : 1e5 (위 결과보다 style weight 1/10배한 결과)
    content weight : 1
    style weight가 더 큰 값의 결과에 비해 Content 이미지와 보다 더 닮은 결과.

실습 코드 참고는 https://github.com/Hyunmin-H/DeepLearningStudy/blob/main/Style%20Transfer/Style_Transfer.ipynb

출처 : 실전 ! 파이토치 딥러닝 프로젝트

Comments