파이썬 인공지능AI 라이브러리 사용 - 사진 변환 (3/5)

목차

    2018. 8. 24. 06:00

    AI와 관련된 뉴스를 보면서 인공지능을 활용한 다양한 작업들이 소개된다. 그 중에 어떤 것이 가장 흥미로웠는가? 필자는 고흐나 피카소 같은 유명 화가의 스타일로 그림을 그리는 것이 가장 인상적이었다. 내가 찍은 사진으로 유명 화가의 그림을 만들어낼 수 있다는 것이 재밌고 유용해 보였다.

    오늘은 zAI를 이용하여 사진을 유명 화가의 그림으로 변환하는 작업을 해 보고자 한다.


    제목


    zAI에는 사진을 특정 확가의 스타일로 변환하는 작업을 할 수 있다. 이미지는 이전 포스팅에서 작업한 트럼프의 얼굴을 가지고 작업하기로 하였다.
    (참조: 파이썬 AI 라이브러리 zAI 사용기 -AI이미지 추출 (2/5) )


    작업을 하기 위해 어떤 화가의 스타일로 사진을 변환할 지 정해야 한다. 라이브러리에서 sample로 제공된 피카소의 그림을 먼저 이용해보자.

    1
    2
    picasso = zImage('./zAI/samples/Picasso_ Pablo_ Autorretrato_ 1907.jpg')
    cs


    고흐

    (피카소의 그림)


    그림에는 약간 문외한이라 어떤 그림인지는 잘 모르겠다. 이제 이전에 작업한 트럼프의 얼굴을 피카소의 그림 스타일로 변환하면 된다.

    1
    myCustomProfilePhoto = myCloseup.style(picasso)
    cs


    zImage로 생성한 변수에 .style을 적용하면 된다. 위 함수를 실행시키면 이미지 변환을 하기 위한 파일을 다운로드 받기 시작하는데 이게 꽤 시간이 오래 걸린다.
    중간에 다운로드를 중지시키면 이후에 에러가 난다. 중간까지 다운로드 받은 파일로 작업을 하기 때문이다. 이 때에는 다운로드 받던 파일을 지워줘야 한다. 맥에서는 'User/open/.zAI/models'에 저장을 하기 때문에 해당 폴더로 가서 삭제하면 된다. 윈도우 PC를 사용한다면 아래 코드를 실행하면 어느 폴더에 저장하고 있는지 알 수 있다. 

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    # -*- coding: utf-8 -*-
    import os
     
    def get_zai_dir():
        '''
        Work out where to store configuration and model files locally
        '''
        _zAI_base_dir = os.path.expanduser('~')
     
        if not os.access(_zAI_base_dir, os.W_OK):
            _zAI_base_dir = '/temp'
     
        _zAI_dir = os.path.join(_zAI_base_dir,'.zAI')
        
        return _zAI_dir
     
    print(get_zai_dir())
    cs


    라이브러리의 downloads에 있는 소스인데, 해당 코드를 실행해서 나오는 경로에 /models를 붙이면 파일이 다운로드 되는 경로를 알 수 있다. 다운로드 받는 파일이 어떤 파일인지 궁금해서 다운 받는 주소를 따라가 보았다.


    vlfeat

    (www.vlfeat.org)


    필자는 잘 모르지만, 관련 업계 종사자에게는 유명한 싸이트일 수 있다는생각이 든다. VLFeat오픈 소스 라이브러리이다. 이미지를 이해하고 특성을 추출하고 매칭시키데 특화된 컴퓨터 비전 알고리즘 구현하는 라이브러리라고 한다. 여기서 imagenet-vgg-verydeep-19.mat 이라는 파일을 다운로드 하는데 파일용량이 510mb이다. 직접 다운 받아서 폴더에 넣어주어도 프로그램은 잘 작동한다.


    위와 같은 우여곡절(?)을 겪어 변환된 이미지는 아래와 같다.

    변환된_이미지

    (변환된 이미지)


    어떤가? 피카소의 스타일로 잘 변환됐지만 조금 아쉽다. 오른쪽 눈이 약간 이상해다. 스타일뿐만 아니라 그림도 피카소와 트럼프의 중간이 된 듯하다. 피카소의 그림과 유사한 포즈로 찍어야 변환이 잘 될 것 같은 생각이 든다.


    추천포스트


    필자의 얼굴도 한 번 변환해 보았다.


    변환이미지


    ........ 필자의 사진을 공개할 수는 없지만, 이렇게 괴물같이 생기지는 않았다. 트럼프 사진보다 변환이 잘 된 것 같다. 여전히 눈은 좀 변환이 잘 안 되는 듯 하다.


    고흐의 그림을 이용해서 변환하는 작업을 해 보았다.


    고흐

    (고흐의 그림)


    풍경 사진이 잘 될 것 같은데, 풍경사진을 찾아서 변환해 보았다.

    이미지_변환

    (변환된 이미지)


    꽤 괜찮은 품질로 변환된 듯 하다. 하지만 역시 변환하고자 하는 이미지와 구도와 스타일이 비슷한 이미지가 더 잘 변환될 듯 하다.


    트럼프의 사진을 변환한 코드를 올리면 아래와 같다. 겨우 10줄 남짓한 코드로 이런 재미있는(?) 이미지변환을 할 수 있다니 놀랍다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    # coding=utf-8
     
    import zAI
    from zAI import zImage
     
    picasso = zImage('./zAI/samples/Picasso_ Pablo_ Autorretrato_ 1907.jpg')
    picasso.display()
     
    myPhoto = zImage('./zAI/samples/Donald_Trump_8566730507.jpg')
    myPhoto.find_faces(backend='local')
    myCloseup = myPhoto.extract_face(margin=15)
    myCloseup.display()
     
    myCustomProfilePhoto = myCloseup.style(picasso) 
    myCustomProfilePhoto.display()
     
    cs


    오늘은 파이썬 인공지능AI 라이브러리 zAI를 이용하여 사진을 변환하는 작업을 해 보았다. 개인마다 차이는 있지만 꽤 괜찮은 품질로 사진이 변환됐다. 그리고 단 몇 줄의 코드로 변환이 가능하다는 것이 참 편리했다. 다음에는 텍스트를 번역하고 음성으로 읽어주는 작업을 해 보고자 한다.


    오픈API를 사용하면 다양한 재미있는 일들을 해 볼 수 있다. 파이썬을 활용한 오픈API 사용이 궁금하다면 아래 글을 참조해보자.

    (참조: 오픈API를 활용한 사례는 어떤 것들이 있을까?)