상세 컨텐츠

본문 제목

실시간 Style Transfer 프로젝트

IT/Toy-Project

by HarimKang 2020. 9. 25. 13:31

본문

Writer: Harim Kang

Real-Time Style-Transfer 만들기

Idea Concept

  • 노트북 또는 컴퓨터에 연결된 web-cam을 사용하여 실시간으로 사람(또는 배경)을 제외한 배경(또는 사람)에 style-transfer를 적용하여 보여주는 것을 프로젝트의 목표로 정하였습니다.
  • Style Transfer는 Pre-trained된 model을 사용하거나 직접 훈련시켜서 적용할 수 있습니다. 이미지를 변환하는 기능을 제공하는 소스나 사이트는 많지만, 실시간으로 쉽게 적용하는 소스는 적고, 사람을 제외한 배경에만 적용하는 간단한 아이디어를 실현하기 위해서는 직접 커스텀할 필요가 있어서 프로젝트를 시작하였습니다.

  • 위는 아이디어를 간단하게 구상하여 인공지능연구소의 연구원인 장다솜님이 작성한 구상도입니다.

Models

  • 아이디어를 다시 간단하게 요약하자면, 실시간 영상 프레임마다 사람을 segmentation하고, 사람외의 배경은 스타일 변환을 하여 생성된 두 이미지를 합쳐서 실시간으로 보여주는 프로젝트입니다.
  • 이를 위해서는 사람을 segmentation하는 model과 style transfer model이 필요합니다.

Style-Transfer Model

  • 실제 모델 훈련 코드를 구현하여 훈련을 시켜보았지만, 아래에 설명하는 model에 비해 속도나 정확도가 떨어지는 문제가 생겨서 아래의 public pretrained model을 사용하였습니다.
  • 사용 모델: magnta/arbitrary-image-stylization-v1-256
  • https://tfhub.dev/google/magenta/arbitrary-image-stylization-v1-256/2
  • 첫 구상때는 스타일을 선정하여 각각의 스타일 변환 모델을 생성하는 걸 목표로 하였습니다. 하지만, 여러 어려움으로 tensorflow에서 제공하는 pre-trained model을 사용하기로 하였습니다.
  • 해당 모델은 tensorflow style transfer tutorial에서도 사용되는 모델로 모바일에서도 사용할 수 있을 만큼 빠른 속도를 보여줍니다. (https://www.tensorflow.org/tutorials/generative/style_transfer)
  • 또한 스타일 피쳐로 사용할 그림을 직접 지정하여, 더 다양한 스타일을 적용하여 보여줄 수 있다는 점이 장점입니다.

  • 위와 같이 input을 두개 주어서 아래와 같이 변환시키는 모델입니다.

  • 모델을 시각화 해보려했지만, 층이 많아서 properties 위주로 살펴볼 수 있습니다.

Image-Segmentation Model

  • 사용 모델: U-Net

Design

Activity

  • 우선 목표하는 프로젝트의 flow를 코드 수준으로 Diagram을 그려보겠습니다.

  • Open-cv의 카메라 스트리밍 기능을 사용합니다.
  • 해당 라이브러리는 frame 단위로 이미지를 처리할 수 있도록 합니다.
  • scale 값에 따라 확대 기능을 사용할 수 있습니다.
  • style 값이 True가 되면 (Button을 이용한 Event 또는 Code 실행 시 임의 지정) Style Transfer model과 Image Segmentation Model이 각각 copy된 이미지를 사용하여 각각 스타일 변환, segmentation mask를 생성합니다.
  • 위에서 생성된 이미지 처리 결과들을 합쳐서 화면에 보여줍니다. 이때, UI도 함께 포합됩니다.

Class

  • Camera: 웹캠을 이용한 스트리밍을 하는 클래스입니다. open-cv 라이브러리를 바탕으로, 이미지를 받아와서 해당 이미지를 처리하는 중심적인 클래스입니다.
  • ButtonManager, Button: open-cv위에 버튼을 생성하여 화면에 출력합니다. 클릭이벤트로 이미지의 스타일을 변환하는 기능을 켜거나 끌 수 있습니다.
  • StyleTransfer: 이미지를 전달하면 선택한 스타일로 변환해주는 클래스입니다.
  • ImageSegmentation: 이미지를 전달하면 훈련된 모델이 사람을 찾아서 Segmentation하여 Mask를 전달합니다.

위와 같이 심플한 구조로 설계하였으며, 복잡하지 않습니다.

구현된 프로그램

Repository

 

harimkang/real-time-style-transfer-opencv

Convert background to style transfer in real time. Contribute to harimkang/real-time-style-transfer-opencv development by creating an account on GitHub.

github.com

Environment

  • python : 3.7.4 버전에서 작성되었으며, 3.7 이상의 버전에서 돌아갑니다.
  • tensorflow : 2.0.0 버전에서 동작을 확인하였습니다.
  • opencv-python : 4.1.2.30 버전에서 동작을 확인하였고, 최신의 버전을 사용하면 될 것 같습니다.
$ pip install opencv-python
$ pip intall tensorflow==2.0.0

$ mkdir project
$ cd project
$ git clone https://github.com/harimkang/real-time-style-transfer-opencv.git
$ cd real-time-style-transfer-opencv

Execution

  • 프로그램 실행

      $ python Camera.py
  • UI 구성 설명

    • 버튼: 현재는 6가지의 버튼을 확인할 수 있고, 각각 쓰여진 스타일로 변환할 수 있습니다. 클릭을 하면, 파란색으로 변하여 해당 스타일로 바뀝니다. 다시 누르면 Off가 됩니다.
    • Icon: 기존의 스타일 변환은 사람을 제외한 배경을 변환시킵니다. 얼굴 아이콘 클릭시, 배경이 아닌 사람을 변환시키도록 스위칭이 됩니다.
  • 새로운 스타일의 추가

    새로운 스타일을 추가하여 테스트해보고 싶다면, 해볼 수 있습니다.

    1. 새로 추가하고자하는 스타일의 사진을 이미지 폴더에 추가합니다.

    2. style_transfer.py 의 StyleTransfer 클래스에서 style_img 변수에 새로운 이미지를 추가해줍니다. (아래의 빨간 네모에 추가)

    3. 버튼도 추가해주어야합니다. Button.py의 ButtonManager 클래스에서 button_setting 함수를 수정해주면 됩니다. 기존의 코드처럼 새로운 버튼도 추가하여 btn_list에 추가해주시면 됩니다.

       # btn10을 추가하는 예제
       btn10 = Button("Button's Name")
       btn_list = [btn, btn2, btn3, btn4, btn5, btn6, btn7, btn10]
       self.add_button_list(btn_list)

결과물

TO-DO:

  • 현재는 여전히 FPS가 낮은 편이며, FPS를 향상할 필요가 있습니다.

  • FPS Improvement

함께한 팀

관련글 더보기