0
5

この記事を読むと何がわかる?

Magic Animateを使って、自分で用意した人物の静止画を、自分で用意した動画の動きで動かす方法が分かります。

用意するもの
・人物が写った画像1枚
・人物の動きを表現する動画1つ

出来上がるもの
・画像の人物が、動画の動きをする動画

時間のない方へ

いろいろやったらこんな感じでできました。
gird.gif
左の静止画と真ん中の動画を入れると、一番右の動画が出力されました。
これ以降の文章は、なるべく手短にこれをお手元のPCでこれを再現する手順をご説明いたします!

そもそもMagic Animateって何?

拡散モデルベースの人物画像のアニメ化のフレームワークです。
 ・時間的一貫性の向上
 ・参照画像の忠実な保持
 ・アニメーションの忠実度の向上
が特徴です。CVPR2024でこの技術の論文が採択されています。

用意した環境

環境
OS Ubuntu 22.04.4 LTS
GPU RTX 3060
GPUメモリ 12GB
anaconda 24.3.0

インストールされている前提のもの

環境 インストール方法
git lfs https://github.com/git-lfs/git-lfs/wiki/Installation
anaconda https://www.anaconda.com/download
ffmpeg sudo apt install ffmpeg
imagemagick sudo apt install imagemagick
aria2c sudo apt install aria2

まずはサンプルを動かしてみる

1.コード一式を取ってきて、magic-animateディレクトリに移動する。

git clone https://github.com/magic-research/magic-animate

2.モデルをダウンロードする。

cd magic-animate
mkdir pretrained_models/stable-diffusion-v1-5
cd pretrained_models/stable-diffusion-v1-5
aria2c -x5 --dir=. -o scheduler/scheduler_config.json https://huggingface.co/runwayml/stable-diffusion-v1-5/resolve/main/scheduler/scheduler_config.json
aria2c -x5 --dir=. -o v1-5-pruned-emaonly.safetensors https://huggingface.co/runwayml/stable-diffusion-v1-5/resolve/main/v1-5-pruned-emaonly.safetensors
aria2c -x5 --dir=. -o text_encoder/config.json https://huggingface.co/runwayml/stable-diffusion-v1-5/resolve/main/text_encoder/config.json
aria2c -x5 --dir=. -o text_encoder/pytorch_model.bin https://huggingface.co/runwayml/stable-diffusion-v1-5/resolve/main/text_encoder/pytorch_model.bin
aria2c -x5 --dir=. -o tokenizer/tokenizer_config.json https://huggingface.co/runwayml/stable-diffusion-v1-5/resolve/main/tokenizer/tokenizer_config.json
aria2c -x5 --dir=. -o tokenizer/merges.txt https://huggingface.co/runwayml/stable-diffusion-v1-5/resolve/main/tokenizer/merges.txt
aria2c -x5 --dir=. -o tokenizer/special_tokens_map.json https://huggingface.co/runwayml/stable-diffusion-v1-5/resolve/main/tokenizer/special_tokens_map.json
aria2c -x5 --dir=. -o tokenizer/vocab.json https://huggingface.co/runwayml/stable-diffusion-v1-5/resolve/main/tokenizer/vocab.json
aria2c -x5 --dir=. -o unet/config.json https://huggingface.co/runwayml/stable-diffusion-v1-5/resolve/main/unet/config.json
aria2c -x5 --dir=. -o unet/diffusion_pytorch_model.bin https://huggingface.co/runwayml/stable-diffusion-v1-5/resolve/main/unet/diffusion_pytorch_model.bin
cd ..
git clone https://huggingface.co/stabilityai/sd-vae-ft-mse ./pretrained_models/sd-vae-ft-mse/
git lfs clone https://huggingface.co/zcxu-eric/MagicAnimate ./pretrained_models/MagicAnimate/

3.仮想環境を作る

cd magic-animate
conda env create -f environment.yaml
conda activate manimate

4.とりあえずサンプルを動かす

cd magic-animate
bash scripts/animate.sh

5.結果を眺める。
以下の場所にmp4ファイルができているはずです。
(xxのところは実行日時が入ります。)

magic-animate/samples/animation2-20xx-xx-xxTxx-xx-xx/videos/monalisa_running.mp4
magic-animate/samples/animation2-20xx-xx-xxTxx-xx-xx/videos/monalisa_running/grid.mp4

output1.gif
おー、できてるできてる。

注意:GUIモードで動かすと、12GBメモリがあっても足りない。

自分の用意した画像と動画を使う

ここからが本題です。
自分で画像と動画を用意して、好きなものを作りたいですよね。

動画を変換するツールを用意する

そのためにまず、動画を変換するプログラムを用意します。
1. vid2denseposeのコード一式を取得する。

git clone https://github.com/Flode-Labs/vid2densepose

2. anacondaの仮想環境を作る。

# python3.9環境
conda create --name vid2densepose python=3.9
conda activate vid2densepose

# pytorchとかcuda toolkitをインストールする
conda install pytorch==1.10.1 torchvision==0.11.2 torchaudio==0.10.1 cudatoolkit=11.3 -c pytorch -c conda-forge

# detectron2をインストールする
python -m pip install detectron2==0.6 -f https://dl.fbaipublicfiles.com/detectron2/wheels/cu113/torch1.10/index.html

# 関係するモジュールをインストールする
pip install opencv-python av scipy

# denseposeを含むコードをダウンロードする
git clone https://github.com/facebookresearch/detectron2/
ln -s detectron2/projects/DensePose/densepose densepose

動画を取ってくる

動きを表現する動画を作るために、Pexelsで配布している無料動画を使ってみます。

こちらの動画をvid2denseposeで、MagicAnimateで使用できる動画に変換してみます。
まず、4k動画を512x512に変換します。
ffmpegを使って変換します。

ffmpeg -i 2873755-uhd_3840_2160_25fps.mp4 -vf "scale=-1:512,crop=w=512:h=512:x=300:y=0" -b 2M -ss 11 -t 5 dance.mp4

引数の意味は以下です。
注意:GPUメモリが12GBだと、5秒を超える動画の変換時にGPUメモリ不足になることがあるようです。

オプション 引数 意味
-i 2873755-uhd_3840_2160_25fps.mp4 変換したい元動画のファイル名
-vf "scale=-1:512,crop=w=512:h=512:x=300:y=0" 高さを512にリサイズして、(300,0)-(300+512,0+512)でクリップします。
-b 2M 出力動画のビットレートは、2Mbpsとする。
-ss 11 11秒目を始点として切り出す。
-t 5 始点から5秒間の動画とする。

作成されたdance.mp4をvid2denseposeで動画にします。

conda activate vid2densepose
cd vid2densepose
python main.py -i dance.mp4 -o dense.mp4

ちゃんと変換されたのが出てきた!
dense.gif

これで、動作用の動画の準備は完了です!

人物の写真画像を用意する

動かしたい人物写真として、こちらの画像を選んでみました。

Imagemagicを使ってアスペクト比を保ったまま512x512にします。

convert 24497610_l.jpg -resize 512x512^ -gravity center -extent 512x512 input.png
オプション 引数 意味
-resize 512x512^ アスペクト比を保ったまま縦か横の小さい方が512になるようにリサイズする
-gravity center 切り取るときに画像の中心を切り取ることにする
-extent 512x512 512x512で切り取る

これで、人物の写真画像の準備は完了です!

yamlファイルの修正

まずオリジナルをコピーします。

cp configs/prompts/animation.yaml animation2.yaml

以下のように感じで修正します。
ファイル名は、ファイルがあるパスを書いてください。

名前 意味
source_image input.png 人物が写った画像のファイル名
video_path dense.mp4 人物の動きを表現する動画のファイル名
pretrained_model_path: "pretrained_models/stable-diffusion-v1-5"
pretrained_vae_path: "pretrained_models/sd-vae-ft-mse"
pretrained_controlnet_path: "pretrained_models/MagicAnimate/densepose_controlnet"
pretrained_appearance_encoder_path: "pretrained_models/MagicAnimate/appearance_encoder"
pretrained_unet_path: ""

motion_module: "pretrained_models/MagicAnimate/temporal_attention/temporal_attention.ckpt"

savename: null

fusion_blocks: "midup"

seed:           [1]
steps:          25
guidance_scale: 7.5

source_image:
  - "input.png" # ここを作成した人物写真のファイル名にします!
video_path:
  - "dense.mp4" # ここを作成した動画のファイル名にします!

inference_config: "configs/inference/inference.yaml"
size: 512
L:    16
S:    1 
I:    0
clip: 0
offset: 0
max_length: null
video_type: "condition"
invert_video: false
save_individual_videos: false

最後に変換するための処理を呼び出して、祈ります!

conda activate manimate
cd magic-animate
python3 -m magicanimate.pipelines.animation --config animation2.yaml

動画の完成

以下の位置にファイルが保存されます!
(xxのところは実行日時が入ります。)

magic-animate/samples/animation2-20xx-xx-xxTxx-xx-xx/videos/input_dense.mp4
magic-animate/samples/animation2-20xx-xx-xxTxx-xx-xx/videos/input_dense/grid.mp4

input_dense.gif

良い点
・後ろで縛っている髪が顔の向きに関わらず再現されている
・ある程度近づいたときの顔の崩れが許容できるレベル

悪い点
・顔が遠すぎると表現が雑
・スカートとズボンで迷っていて一貫誠意が壊れている
・背中を向いているときをうまく表現てきていない

気づいた点
・動画の人物の体格に近くなるので、静止画と動画の性別や体格は合わせといた方が再現度が高そう。

しかたない点
・表情は再現されない。だって入力に目鼻口の位置情報ないから。

おわりに

いろんな可能性を感じさせてくれる面白い技術でした。
もっと他の静止画や動画を試してみたいのですが、一回一回、結構時間かかります。
もっと速くてメモリの大きいGPUが格安で発売される日を夢見て待つことにします。

0
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
5