공부는 하기 싫은데, 하염없이 놀자니 눈치보일 때가 있다.
그럴 때는 보통 전공과 연관성 있는 유튜브 영상 틀어놓고 시간을 보내곤 하는데,
아래 영상을 보다 재밌어보여서 코드만 살짝 가지고 놀아보기로 하였다.
https://www.youtube.com/watch?v=va3e2c4uKJk
유튜버 나동빈님의 'CNN을 활용한 스타일 전송(Style Transfer) | 꼼꼼한 딥러닝 논문 리뷰와 코드 실습' 영상이다.
위 논문은 CVPR에서 2016년에 발표되었고,
사실상 처음으로 딥러닝을 활용하여 style transfer를 가능하게 제안한 논문이라고 한다.
아직 영어로 된 논문을 읽는 것이 많이 부담인데, 덕분에 핵심 내용은 이해할 수 있었다.
원본 논문 링크: https://rn-unison.github.io/articulos/style_transfer.pdf
이해한 내용을 짧게 글로 풀어 써보자면
임의의 노이즈 이미지(x)를, 컨텐츠 이미지(p)와 스타일 이미지(a)와 유사한 방향으로 변화시켜 나가는 것인데
여기서 Content Loss와 Style Loss를 모두 감소시키는 방향으로 업데이트하는 것이다.
- Content Loss를 감소시키면 x와 p의 특징을 동일하도록 만들어주고,
- Style Loss를 감소시키면 두 이미지의 특징 상관관계를 유사하게 만들어준다.
보다 자세한 원리는 해당 논문이나 영상에서 확인하는 편이 효과적이다.
본 포스팅의 목적은 코드 깨작이며 놀기 위한 것이었으므로.
GitHub - ndb796/Deep-Learning-Paper-Review-and-Practice: 꼼꼼한 딥러닝 논문 리뷰와 코드 실습
꼼꼼한 딥러닝 논문 리뷰와 코드 실습. Contribute to ndb796/Deep-Learning-Paper-Review-and-Practice development by creating an account on GitHub.
github.com
실습 코드는 나동빈님의 깃허브에서 가져왔고,
실습에 사용되는 이미지를 변경한 것 외에는 동일한 코드를 사용하였다.
그런 이유로 코드는 생략하였고, 상세한 코드는 위 링크를 들어가서 확인하면 된다.
img1 = cv2.imread('/content/gdrive/My Drive/Colab Notebooks/yejoo.jpg')
img2 = cv2.imread('/content/gdrive/My Drive/Colab Notebooks/starrynight.jpg')
fig = plt.figure(figsize=(10,10))
rows = 1
cols = 2
ax1 = fig.add_subplot(rows, cols, 1)
ax1.imshow(cv2.cvtColor(img1, cv2.COLOR_BGR2RGB))
ax1.set_title('[ Content Image ]')
ax1.axis("off")
ax2 = fig.add_subplot(rows, cols, 2)
ax2.imshow(cv2.cvtColor(img2, cv2.COLOR_BGR2RGB))
ax2.set_title('[ Style Image ]')
ax2.axis("off")
plt.show()
위 코드를 활용하여 실습에 사용될 컨텐츠 이미지와 스타일 이미지를 matplotlib로 출력하였다.
배우 윤예주님의 사진을 고흐의 별이 빛나는 밤 화풍으로 바꿔보고자 한다.
사진의 출처는 여기: https://www.instagram.com/yj04.23/
특징 추출기로는 기존에 학습된 vgg19 네트워크를 사용하였고,
임의의 노이즈 이미지를 스타일 이미지와의 Style Loss를 줄이는 방향으로 학습시킨다.
이를 Style Reconstruction이라 한다.
코드를 실행하면 아래와 같이 노이즈 이미지가 변하는 것을 볼 수 있다.
노이즈 이미지와 컨텐츠 이미지 간의 Content Loss를 줄이는 코드도 실행해보았다.
이는 Content Reconstruction이다.
이를 통해 Style Reconstruction은 화풍을 학습시키는 것이고,
Content Reconstruction은 베이스가 되는 이미지와 동일하게 업데이트 시킨다는 것을 알 수 있었다.
이제 이를 동시에 적용해보고자 한다.
총 1600회 반복하였고, 돌아가는 과정을 보고 있으면 신기하고 재밌고 그랬다.
스타일 전송이 완료된 사진은 아래와 같다.
하나만 하면 아쉬우니까 고흐의 자화상 화풍으로도 바꿔보았다.
모든 일에는 동기부여가 중요하고
사실 딥러닝 공부보다 팬심에 초점이 맞춰진 실습이었다.
재밌었다.
'데이터사이언스 > 인공지능' 카테고리의 다른 글
PTB-XL ECG Dataset Description (0) | 2022.05.14 |
---|---|
텐서플로우 CPU 이용해서 학습하기 (GPU X) (0) | 2022.05.13 |
로컬에서 텐서플로우 gpu 사용 가능한 환경 설정 (CUDA, cuDNN 호환성 확인하기, MX450) (0) | 2022.02.15 |
기계번역 관련 참고자료 (1) | 2022.02.15 |
CNN(합성곱 신경망 네트워크) 기본 원리 (0) | 2021.11.15 |