【AUTOMATIC1111 on Goolge Colab】Motion Diffusionで生成した動画を用いて,ControlNetとgif2gifで動画を生成する

はじめに

Motion Diffusionという,promptで動作を指定することで人間の動作を生成できる拡散modelがあったことを思い出したので,stable-diffusionを用いた動画生成の入力画像として使ってみた.

motion-diffusionのGithubリポジトリ:https://github.com/GuyTevet/motion-diffusion-model

環境

・Win10 PC
・Google Colab (motion-diffusionにはT4のGPU使用.AUTOMATIC1111はA100を使用)

Motion Diffusionで人間の動作を生成

基本的にはこのサイトを見ながら行った.

ただ,上記のサイトの方法は古いバージョンを参照しており,現在の環境では動かなかったので,以下に今回使用したコードを記述する.

コード

GPUの確認

!nvidia-smi

Google ドライブのマウント

# Googleドライブのマウント
from google.colab import drive
drive.mount('/content/drive')

Colabのデフォルトで入っているmatplotlib(3.5.1)だと,アニメーションの生成時にエラーが出るので,バージョン3.1.3をダウングレードする.
※なお,必要なモジュールのバージョンは,environment.ymlを見て確認すると良い.

# パッケージのインストール
!pip install git+https://github.com/openai/CLIP.git
!pip install smplx chumpy
!pip install matplotlib==3.1.3

リポジトリをクローンする.

# motion-diffusion-modelのクローン
!git clone https://github.com/GuyTevet/motion-diffusion-model
!mkdir motion-diffusion-model/save

HumanML3Dデータ(人間の動作と言語を対応させたモデル?詳細は,HumanML3Dのリポジトリを参照)を取得する.

# HumanML3Dデータの取得
!git clone https://github.com/EricGuo5513/HumanML3D.git
!unzip ./HumanML3D/HumanML3D/texts.zip -d ./HumanML3D/HumanML3D/
!cp -r HumanML3D/HumanML3D motion-diffusion-model/dataset/HumanML3D

その他,SMPLメッシュ(人間の外観のモデル)などのオプションをダウンロードするためのシェルスクリプト(prepre/download_smpl_files.shなど)が用意されているのだが,以下のようにセキュリティ関連のエラーがでて,ダウンロードできなかった.

そのため,直接ダウンロードして,Google Drive上の「/content/drive/MyDrive/model_data/」(このディレクトリは任意である)に各zipファイルを設置した.必要なファイルをダウンロードするためのURLは以下である.

SMPL https://drive.google.com/uc?id=1INYlGA76ak_cKGzvpOV2Pe6RkYTlXTW2
glove https://drive.google.com/file/d/1cmXKUT31pqd7_XpJAiWEo1K81TMYHA5n/view?usp=sharing
t2m https://drive.google.com/file/d/1DSaKqWX2HlwBtVH5l7DdW96jeYUIXsOP/view
kit https://drive.google.com/file/d/1tX79xk0fflp07EZ660Xz1RAFE33iEyJR/view

Googleドライブに置いた後,以下のコードを実行し,「body_models」フォルダにファイルをコピーした.

# SMPLモデルなどを「/content/motion-diffusion-model/body_models」に解凍
%cd /content/motion-diffusion-model
# !bash prepre/download_smpl_files.sh
%mkdir -p body_models
%cd body_models/

!echo -e "Start unzip\n"
%rm -rf smpl
%rm -rf glove
%rm -rf t2m
%rm -rf kit

!cp '/content/drive/MyDrive/model_data/smpl.zip' .
!cp '/content/drive/MyDrive/model_data/glove.zip' .
!cp '/content/drive/MyDrive/model_data/t2m.zip' .
!cp '/content/drive/MyDrive/model_data/kit.zip' .

!unzip smpl.zip
!unzip glove.zip
!unzip t2m.zip
!unzip kit.zip

!echo -e "Done\n"

また,デフォルトだとキャプションがつくので,コードを修正してキャプションを消しても良いかも.消すなら,sample/generate.pyの以下の箇所を修正する(変数titleを空白にする).

その後,事前学習モデルをGithubリポジトリからダウンロードする(以下の場所にリンクがある).

 ダウンロードしたモデル(例えば,humanml_trans_enc_512.zip)を「/content/motion-diffusion-model/save」ディレクトリにコピーする.
 以下の例では,google ドライブの「/content/drive/MyDrive/model_data/」にダウンロードしたモデルが置いてあり,そのディレクトリからColabのsaveディレクトリにコピーしている.

# 事前学習モデルをsaveにコピーして解凍
%cd /content/motion-diffusion-model/save
!cp '/content/drive/MyDrive/model_data/humanml_trans_enc_512.zip' .
!unzip ./humanml_trans_enc_512.zip

ディレクトリを移動する.

%cd /content/motion-diffusion-model

プロンプトを入力し,実行する.以下のコードでは”a person is skipping rope”の箇所がプロンプトである.

!python -m sample.generate --model_path ./save/humanml_trans_enc_512/model000200000.pt --text_prompt "a person is skipping rope"

#コマンドライン引数(ハイフン2つで指定してるやつ)はいくつかあり,例えば「--motion_length」では時間を指定できるらしい.

# 例)
# --device id.
# --seed to sample different prompts.
# --motion_length (text-to-motion only) in seconds (maximum is 9.8[sec]).

mp4データは,「/content/motion-diffusion-model/save/humanml_trans_enc_512/samples_humanml_trans_enc_512_000200000_seed10_a_person_is_skipping_rope」に保存されるので,ダウンロードする.

デフォルトでは動画内で3つの動作が生成されているかもしれないが,1つ1つの動作が別々の動画になっているので,好きなものをダウンロードすること.

得られた動画

生成された結果(.mp4)は以下である(上記のようにgenerate.pyを修正したので,キャプションが無いが,デフォルトだと上の方にキャプションが表示される).

「a person is skipping rope」で生成された動画

SMPLメッシュの付与

上記の動画をControlNetで読み込めば動画が生成できると思ったら,ConrolNetのopenposeでボーンが抽出できなかった.そのため,SMPLメッシュを付与した.

方法

以下のコードをセルに追記し,コマンドを実行する.

!pip install trimesh
!python -m visualize.render_mesh --input_path /content/motion-diffusion-model/save/humanml_trans_enc_512/samples_humanml_trans_enc_512_000200000_seed10_a_person_is_skipping_rope/sample00_rep00.mp4

「/content/motion-diffusion-model/save/humanml_trans_enc_512/samples_humanml_trans_enc_512_000200000_seed10_a_person_is_skipping_rope/sample00_rep00_obj」フォルダに,連番のobjファイルが生成されるので,Blenderのアドオンを使ってアニメーションに変換する.

なお,Blenderを使ってobjファイルから動画を作成する方法は,別記事に記載するので,そちらを参照すること⇒こちら

結果として,ボーンが抽出できるモデルが得られた.

画像右上のように骨格が抽出できている

得られた動画

ちなみにBlenderで処理した結果,以下のような動画が得られた.

上記のボーンの動画にSMPLメッシュを付与した結果

ControlNetとgif2gifで動画を生成

ここは,以前やった方法と同じである.この記事を参照すること.

結果(得られた動画)

・・・なんか謎の動画が生まれた.モデルはChilloutMixとLoRAを適当に使った.Frame数は1000枚近くで,A100で1時間ぐらいかかった.ちなみに画質が悪いのは,250MBあったファイルを18.7MBまで落としたから.

ChilloutMixとLoRAをテキトーに使って生成

まとめ

Motion Diffusionを用いてpromptから動作の動画を生成し,その動画からアニメーションを作成した.Motion Diffusionで生成したボーンのモーション動画を直接読み込めるのかと思ったら,それはできなかった.骨格の作り方が違うのかな(色とか)?

SMPLメッシュを付与したら,ControlNetのopenposeで認識してくれた.

得られた動画は,いつも通り設定はテキトーなので,良く分からない動画ができた.

コメント

タイトルとURLをコピーしました