【DeepFake】 마침내 우리 완코가 말하기 시작했습니다.

①소개



뭔가 아웃풋이 있으면 AI를 한 걱정이 되어 즐겁지요. 이번에는 히타마에서 화제의 DeepFake를 해보고 싶습니다.

②DeepFake란?



DeepFake란, 심층 학습과 가짜를 조합한 조어로, 인공 지능에 근거하는 인물 화상 합성 기술을 말합니다. 샘플 를 보면 즐거움을 알 수 있다고 생각합니다만, 이번은 「first-order-model」를 이용해, 정지화면의 완코를 말해 보고 싶습니다.

    

③TRY



그럼 빨리 해보자!
환경은, 프로그램을 동작시키는 것은 GPU를 사용할 수 있으므로 Google Colab, 데이터의 저장은 Google Drive로 합니다.

■ 사전 준비



Google Drive에서 실시하세요.
사전 준비로서 각종 데이터(체크포인트, 동영상, 정지영상)를 Google Drive에 저장합니다.

➊ 데이터 저장 폴더 생성



Google 드라이브의 내 드라이브 바로 아래에 "first-order-motion-model"폴더를 만듭니다.

➋ 체크포인트 DL



공유한 '트레이닝된 체크포인트'를 내 Google 드라이브에 저장합니다. 체크 포인트 링크를 열고 방금 만든 "first-order-motion-model"로 드래그 앤 드롭하면 됩니다. 이 방법이라면 실제로 바로 가기가 생성되지만 이것도 괜찮습니다.

다운로드는 여기 ▶ Google 드라이브 or Yandex Disk



바로 가기로 실행하는 경우 체크포인트를 로드하면 오류가 발생할 수 있습니다. 이는 공유 폴더에서 다운로드 제한이 걸려서 발생합니다. 이 경우 하루 정도 기다렸다가 다시 실시하십시오. 이런 일이 싫다면 로컬 PC에 다운로드하고 Google 드라이브에 실제 파일을 업로드하십시오. 실제 파일은 700MB 정도의 크기입니다.

➌ 동영상 데이터, 정지 영상 데이터 저장



촬영이나 트리밍은 휴대 전화 등으로 쉽게 할 수 있습니다.
  • 말하고 싶은 원고의 정지 화상을 촬영합니다.
  • 사람이 말하는 동영상을 촬영합니다. (눈을 파치크리거나 목을 종횡으로 흔들면 더 재미있게 됩니다)

  • 정사각형으로 자른 동영상과 정지영상을 "first-order-motion-model"폴더에 놓습니다. 파일명은 다음과 같이 하십시오.
  • 동영상: movie001.mp4
  • 정지화면:pic001.png

  • ■DeepFake 처리



    Google Colab에서 실시하세요.
    Google 드라이브에 저장된 데이터를 사용하여 DeepFake 처리를 수행합니다.

    ➊git clone



    우선은, 「 first-order-model 」를 git clone 합니다.
    !git clone https://github.com/AliaksandrSiarohin/first-order-model
    

    ➋ 현재 디렉토리 이동


    first-order-model 아래로 이동합니다.
    %cd first-order-model
    

    ➌ 리사이즈



    스틸 이미지와 동영상을 256x256으로 크기 조정하려면 다음을 수행합니다.
    import imageio
    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib.animation as animation
    from skimage.transform import resize
    from IPython.display import HTML
    import warnings
    warnings.filterwarnings("ignore")
    
    source_image = imageio.imread('/content/drive/My Drive/first-order-motion-model/pic001.png')
    reader = imageio.get_reader('/content/drive/My Drive/first-order-motion-model/movie001.mp4')
    
    
    #Resize image and video to 256x256
    
    source_image = resize(source_image, (256, 256))[..., :3]
    
    fps = reader.get_meta_data()['fps']
    driving_video = []
    try:
        for im in reader:
            driving_video.append(im)
    except RuntimeError:
        pass
    reader.close()
    
    driving_video = [resize(frame, (256, 256))[..., :3] for frame in driving_video]
    
    def display(source, driving, generated=None):
        fig = plt.figure(figsize=(8 + 4 * (generated is not None), 6))
    
        ims = []
        for i in range(len(driving)):
            cols = [source]
            cols.append(driving[i])
            if generated is not None:
                cols.append(generated[i])
            im = plt.imshow(np.concatenate(cols, axis=1), animated=True)
            plt.axis('off')
            ims.append([im])
    
        ani = animation.ArtistAnimation(fig, ims, interval=50, repeat_delay=1000)
        plt.close()
        return ani
    
    
    HTML(display(source_image, driving_video).to_html5_video())
    

    ➍ 체크포인트 로드



    사전 훈련된 체크포인트를 로드합니다.
    from demo import load_checkpoints
    generator, kp_detector = load_checkpoints(config_path='config/vox-256.yaml', 
                                checkpoint_path='/content/drive/My Drive/first-order-motion-model/vox-cpk.pth.tar')
    

    ➎DeepFake 만들기



    DeepFake를 만듭니다. 작성한 동영상은 「../generated.mp4」가 됩니다.
    from demo import make_animation
    from skimage import img_as_ubyte
    
    predictions = make_animation(source_image, driving_video, generator, kp_detector, relative=True)
    
    #save resulting video
    imageio.mimsave('../generated.mp4', [img_as_ubyte(frame) for frame in predictions], fps=fps)
    #video can be downloaded from /content folder
    
    HTML(display(source_image, driving_video, predictions).to_html5_video())
    

    ④이상



    수고하셨습니다.
    왠지 출력이 있으면 생긴 느낌이 있어서 매우 즐겁네요. 이렇게 간단하게 DeepFake를 할 수 있다니 놀랍습니다. 모두는 「first-order-model」님의 힘입니다만.

    좋은 웹페이지 즐겨찾기