私的AI研究会 > PAMA

画像に別の画像のスタイルを転送:PAMA

pama_000m.jpg

 PAMAで、スタイル転送をやってみる

※ 最終更新:2023/12/09 

サイト『PAMAで、スタイル転送をやってみる』 の検証

概要

機械学習で画像に別の画像のスタイルを転送するのを、上記サイトの手順に従って検証してみる。
現在の「Google Colaboratory」環境で動作する。

Progressive Attentional Manifold Alignment(PAMA) 概念図

Google Colaboratory に実行環境を作成

  1. 上記サイト作者の デモサイト を開き「Open in Colab」① ボタンを押す

  2. 『PAMA』の Google Colab が開くので「ファイル」メニューから「ドライブにコピーを保存」を選択

  3. 『pama のコピー』のタイトルで開いた Google Colab のページで以降の操作を行う

  4. データファイルをダウンロードして解凍する(解凍した「update/work/PAMA/」を使用する
     update_20231209.zip (115MB) <アップデート・データ>

環境設定

pama_010m.jpg
  1. 以下のセルを実行する ①(実行時間 42秒)
    #@title セットアップ
    %%capture
    # githubからコードをコピー
    ! git clone https://github.com/cedro3/PAMA.git
    %cd PAMA
    
    # 学習パラメータのダウンロード
    ! pip install --upgrade gdown
    import gdown
    # original
    gdown.download('https://drive.google.com/uc?id=1rPB_qnelVVSad6CtadmhRFi0PMI_RKdy', 'original_PAMA.zip', quiet=False)
    ! unzip original_PAMA.zip
    # consistency
    gdown.download('https://drive.google.com/uc?id=1IrggOiutiZceJCrEb24cLnBjeA5I3N1D', 'PAMA_without_color.zip', quiet=False)
    ! unzip PAMA_without_color.zip
    # color
    gdown.download('https://drive.google.com/uc?id=1HXet2u_zk2QCVM_z5Llg2bcfvvndabtt', 'PAMA_1.5_color.zip', quiet=False)
    ! unzip PAMA_1.5_color.zip
    # content
    gdown.download('https://drive.google.com/uc?id=13m7Lb9xwfG_DVOesuG9PyxDHG4SwqlNt', 'PAMA_1.5_content.zip', quiet=False)
    ! unzip PAMA_1.5_content.zip
    
    
    import os
    import shutil
    
    # downloadフォルダ作成
    os.makedirs('download', exist_ok=True)
    
    #学習済みパラメータの設定関数
    def select_param(select):
    
        # checkpointsフォルダーリセット
        if os.path.isdir('checkpoints'):
            shutil.rmtree('checkpoints')
    
        if select == 'original':
          shutil.copytree('original_PAMA', 'checkpoints')
    
        if select == 'consistency':
          shutil.copytree('PAMA_without_color', 'checkpoints')
          shutil.copy('original_PAMA/encoder.pth', 'checkpoints/encoder.pth')
    
        if select == 'color':
          shutil.copytree('PAMA_1.5_color', 'checkpoints')
          shutil.copy('original_PAMA/encoder.pth', 'checkpoints/encoder.pth')
    
        if select == 'content':
          shutil.copytree('PAMA_1.5_content', 'checkpoints')
          shutil.copy('original_PAMA/encoder.pth', 'checkpoints/encoder.pth')
    
        print('checkpoint is '+select)
    
    
    # 画像連結関数
    from PIL import Image
    def get_concat_h(im1, im2):
        dst = Image.new('RGB', (im1.width + im2.width, im1.height))
        dst.paste(im1, (0, 0))
        dst.paste(im2, (im1.width, 0))
        return dst
    
    def edit_pic(file1, file2):
        f1 = Image.open(file1)
        f2 = Image.open(file2)
        f1_resize = f1.resize((f2.width, f2.height))
        get_concat_h(f1_resize, f2).save('disp.jpg')

  2. セルの実行終了② 後、左サイドバーの「ファイルボタン」を押す
    「PAMA」③ の下に「content」」④ フォルダがあることを確認する

画像のスタイル転送

  1. 画像のスタイル転送
    ・用意した画像を使用する場合は、元画像は「content」フォルダへ、スタイル画像は「style」フォルダへアップロードする
    ・学習済みモデル(checkpoint)/ 元画像(content)/スタイル(style)を指定する
    ・以下のセルを実行する(実行時間 数秒)
    #@title 画像のスタイル転送
    
    # 設定
    checkpoint = 'consistency' #@param ["original", "consistency", "color", "content"] {allow-input: true}
    content = '11.jpg'#@param {type:"string"}
    style = '03.jpg'#@param {type:"string"}
    
    # 学習済みパラメータの選択
    select_param(checkpoint)
    
    # スタイル転送
    ! python main.py eval --content content/$content --style style/$style
    
    # 変換前後の画像連結
    edit_pic('content/'+content, 'ics.jpg')
    
    # 連結画像表示
    from google.colab.patches import cv2_imshow
    import cv2
    img_cv=cv2.imread('disp.jpg')
    cv2_imshow(img_cv)

  2. 画像のダウンロード
    ・以下のセルを実行する(実行時間 数秒)
    #@title 画像のダウンロード
    import os
    import shutil
    from google.colab import files
    
    content_name = os.path.splitext(content)
    style_name = os.path.splitext(style)
    file_name = 'download/'+content_name[0]+'_'+style_name[0]+'_'+checkpoint+'.jpg'
    shutil.copy('disp.jpg', file_name)
    files.download(file_name)

  3. スタイル転送の例1

  4. スタイル転送の例2

  5. スタイル転送の例3

動画のスタイル転送

  1. 動画のスタイル転送
    ・用意した動画を使用する場合は、元動画は「video」フォルダへ、スタイル画像は「style」フォルダへアップロードする
    ・学習済みモデル(checkpoint)/ 元動画(content)/スタイル(style)を指定する
    ・以下のセルを実行する(実行時間 数秒)
    #@title 動画のスタイル転送
    #@markdown ・videoは音声付きとして下さい
    
    # 学習済みパラメータの選択
    checkpoint = 'consistency' #@param ["original", "consistency", "color", "content"] {allow-input: true}
    select_param(checkpoint)
    
    # --- 動画を静止画にバラす ---
    video = 'open_house.mp4' #@param {type:"string"}
    video_file = 'video/'+video
    
    import os
    import shutil
    import cv2
    
    # flamesフォルダーリセット
    if os.path.isdir('images'):
        shutil.rmtree('images')
    os.makedirs('images', exist_ok=True)
    
    def video_2_images(video_file= video_file,   # ビデオの指定
                       image_dir='images/',
                       image_file='%s.jpg'):
    
        # Initial setting
        i = 0
        interval = 1
        length = 3000  # 最大フレーム数
    
        cap = cv2.VideoCapture(video_file)
        fps = cap.get(cv2.CAP_PROP_FPS)  # fps取得
    
        while(cap.isOpened()):
            flag, frame = cap.read()
            if flag == False:
                    break
            if i == length*interval:
                    break
            if i % interval == 0:
               cv2.imwrite(image_dir+image_file % str(int(i/interval)).zfill(6), frame)
            i += 1
        cap.release()
        return fps, i, interval
    
    fps, i, interval = video_2_images()
    #print('fps = ', fps)
    #print('flames = ', i)
    #print('interval = ', interval)
    
    
    # --- 動画のスタイル転送 ---
    # style_movieフォルダーリセット
    if os.path.isdir('style_movie'):
        shutil.rmtree('style_movie')
    os.makedirs('style_movie', exist_ok=True)
    
    # 指定したstyleをstyle_movieフォルダへコピー
    import shutil
    style = 'ani_004.jpg'#@param {type:"string"}
    shutil.copy('style/'+style, 'style_movie/'+style)
    
    # icsフォルダーリセット
    if os.path.isdir('ics'):
        shutil.rmtree('ics')
    os.makedirs('ics', exist_ok=True)

  2. 動画の再生
    ・以下のセルを実行する
    #@title 動画の再生
    from IPython.display import HTML
    from base64 import b64encode
    
    mp4 = open('./output.mp4', 'rb').read()
    data_url = 'data:video/mp4;base64,' + b64encode(mp4).decode()
    HTML(f"""
    <video width="70%" height="70%" controls>
          <source src="{data_url}" type="video/mp4">
    </video>""")


  3. 動画のダウンロード
    ・以下のセルを実行する(実行時間 数秒)
    #@title 動画のダウンロード
    import os
    import shutil
    from google.colab import files
    
    content_name = os.path.splitext(video)
    style_name = os.path.splitext(style)
    file_name = 'download/'+content_name[0]+'_'+style_name[0]+'_'+checkpoint+'.mp4'
    shutil.copy('output.mp4', file_name)
    files.download(file_name)

編集の終了・再接続後の実行

  1. 編集を終えるときは Colab「ランタイム」→「ランタイムを接続解除して削除」を選択する
    ・GPU 占有時間を少なくするためすべての実行作業が終了した場合は接続解除しておくことが望ましい
    ・接続解除して削除を実行しても、ノートブック上の実行結果はそのまま残る

  2. 再接続の場合は上記の 環境設定 からもう一度実行同じ手順をする

更新履歴

参考資料