私的AI研究会 > GanFOMM2

静止画から動画を作る:First Order Motion Model(その2)

test2_anim.gif

 同じカテゴリの静止画と動画を使って、静止画を動画のように動かす「First Order Motion Model」技術を使って静止画を動画にする

※ 最終更新:2024/07/20 

First Order Motion Model

概要

実行環境の構築

  1. GitHub サイトからプロジェクトをダウンロード
    ・「workspace_2/」フォルダがない場合は作成しておく
    cd /anaconda_win/workspace_2                     ← Windows の場合
    cd ~/workspace_2                           ← Linux の場合
    
    git clone https://github.com/AliaksandrSiarohin/first-order-model
  2. プロジェクト・パッケージ update_20240711.zip (3.96GB) <アップデートファイル> をダウンロード
    ・解凍してできるフォルダ
    update
    ├─workspace_2
    │  ├─first-order-model                      ← GitHub からクローンしたプロジェクトに上書きする
    │  │  ├─result
    │  │  ├─result_save
    │  │  └─sample
    │  │      ├─images
    │  │      └─videos
    │  └─mylib2                            ← ローカル環境で実行するための汎用ライブラリ
    │      ├─mylib_test
    │      └─result
    └─workspace_py37
        └─mylib                            ← 私的汎用ライブラリ
    解凍してできる「update/」フォルダ以下を次のフォルダの下に上書きコピーする
     Windows の場合 →「anaconda_win/」 Linux の場合 → 「~/」

  3. 新しく仮想環境「py38_learn」を構築する
    『仮想環境 (py38_learn)』 の手順で仮想環境を作成

前準備

  Windows  の場合

  1. 「mylib2/」フォルダにパスが通っているか環境変数(PYTHONPATH)を確認する
    echo $env:PYTHONPATH
    ・パスが通っていない場合 → 環境変数を設定する

  2. カレントディレクトリを指定する
    cd /anaconda_win/workspace_2/first-order-model

  Linux  の場合

  1. 「mylib2/」フォルダにパスが通っているか環境変数(PYTHONPATH)を確認する
    printenv PYTHONPATH
    ・パスが通っていない場合 → 環境変数を設定する

  2. カレントディレクトリを指定する
    cd ~/workspace_2/first-order-model

入力となる 静止画と動画について

提供されているデモ「demo.py」を試す

カテゴリーを簡単に指定できるプログラム「fomm.py」を作成する

GUI で操作できるプログラム「fomm_test.py」を作成する

 

顔のカテゴリー

サンプル画像

生成される画像例

 

その他のカテゴリー

サンプル画像

全身のカテゴリー

アニメーション(Moving GIF) のカテゴリー

太極拳(Taichi) のカテゴリー

 

対処した問題点とエラー詳細

「demo.py」→「demo2.py」変更点

  1. 「imageio」パッケージに関するワーニングエラーを消す → 6行目から
    import imageio.v2 as imageio                            # 2024/06/14    warning error 対応
    
    import warnings
    warnings.simplefilter('ignore', UserWarning)
  2. 実行前にコマンドオプションを表示 / 入力ソースファイルの存在確認を追加 → 134行目から~
        display_info(opt)                                           # 2024/06/17 基本情報の表示
    
        # ファイルの存在確認
        if not os.path.isfile(opt.source_image):
            print(RED + f"File not found !! '{opt.source_image}' " + NOCOLOR)
            quit()
        if not os.path.isfile(opt.driving_video):
            print(RED + f"File not found !! '{opt.driving_video}' " + NOCOLOR)
            quit()
  3. 出力ファイルに対する処理変更 → 163行目から
        # 出力が GIFファイルの時はループする
        name, ext = splitext(opt.result_video)
        if ext == '.gif':
            imageio.mimsave(opt.result_video, [img_as_ubyte(frame) for frame in predictions], fps = fps, loop = 0)
        else:
            imageio.mimsave(opt.result_video, [img_as_ubyte(frame) for frame in predictions], fps = fps)
    
        if opt.audio:
            try:
                # 一時ファイル・エラー対応  2024/06/18
                with tempfile.TemporaryDirectory() as str_temp_dir:
                    tmpfile = f"{str_temp_dir}/temp.mp4"
                    ffmpeg.output(ffmpeg.input(opt.result_video).video, ffmpeg.input(opt.driving_video).audio, tmpfile, c='copy').run(quiet=True)
                    with open(opt.result_video, 'wb') as result:
                        with open(tmpfile, 'rb') as output:
                            copyfileobj(output, result)
            except ffmpeg.Error:
                print(RED + f"Failed to copy audio: the driving video may have no audio track or the audio format is invalid." + NOCOLOR)

RuntimeError: CUDA error: an illegal memory access was encountered

Cannot open shared library libasound_module_conf_pulse.so

 

First Order Motion Model ここまでのまとめ

installation(環境構築)

わかったこと

更新履歴

参考資料