流沙河鎮

情報技術系のこと書きます。

MagicAnimateで人物の画像から動画を作る方法

Bytedanceが発表した、人物の画像を元に動画を生成するモデル「MagicAnimate」を試したので知見を記しておく。

showlab.github.io

基本的にはオフィシャルのGetting Startedに従っておけば動くのだが、進めていて一部詰まる箇所があったので、誰かしらの役に立つのではないかと思っている。

何ができるの?

人物が写った画像(以下動画左)と、動きを定義するシーケンス(以下動画中央)をインプットとして、人物が動いている動画(以下動画右)を生成できる。

どうやって使うの

方法1:Hugging FaceのSpace上のデモページを使う

すぐに試したい場合はBytedanceが公開しているデモページが使える。ただし、使えるマシンリソースや細かいチューニングには制限がある。 https://huggingface.co/spaces/zcxu-eric/magicanimate

方法2:任意の環境にモデルをセルフホストする

モデルはBSD-3-Clauseで配布されているので、任意の環境にホストして動かすことができる。以降、本記事ではこちらの方式について解説する。

環境

Amazon EC2を使用した。

インスタンスタイプ

g5.2xlarge(A10G Tensor Core GPU、VRAM24GB)

この環境で、Sampling steps 25、Guidance scale 7.5(推論時のパラメータ)の場合で推論時間は4分前後であった。

OS(AMI)

Amazon Linux 2ベースのDeep Learning OSS Nvidia Driver AMI GPU PyTorch 2.0.1(CUDA等の環境が整っており便利であるため)

手順

マシンにsshで繋ぎ込んだ状態からスタート。基本的にはオフィシャルのGetting Startedに沿って進める。 MagicAnimateを動かすprerequisitesはpython>=3.8CUDA>=11.3だが、これらはAMIにビルトインされている。

前準備
MagicAnimateをダウンロード
git clone https://github.com/magic-research/magic-animate
cd magic-animate
依存関係をインストール
python -v venv myenv
source myenv/bin/activate
pip install -r requirements.txt
pretrained_model, checkpointsをダウンロード
# mainでも動くかも
git clone -b fp16 https://huggingface.co/runwayml/stable-diffusion-v1-5 pretrained_models/stable-diffusion-v1-5/
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/

ディレクトリ構造は以下のようになる。

tree -L 1 pretrained_models/
pretrained_models/
|-- MagicAnimate
|-- sd-vae-ft-mse
|-- stable-diffusion-v1-5
ffmpeg, ffprobeのインストール
sudo mkdir /usr/local/ffmpeg
sudo wget -P /usr/local/ffmpeg https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz
cd /usr/local/ffmpeg
sudo tar -xf ffmpeg-release-amd64-static.tar.xz
sudo ln -sfn /usr/local/ffmpeg/ffmpeg-*-amd64-static/ffmpeg /usr/bin/ffmpeg
sudo ln -sfn /usr/local/ffmpeg/ffmpeg-*-amd64-static/ffprobe /usr/bin/ffprobe
sudo rm ffmpeg-release-amd64-static.tar.xz

ffmpeg -version

ffmpeg version 6.1-static https://johnvansickle.com/ffmpeg/  Copyright (c) 2000-2023 the FFmpeg developers
built with gcc 8 (Debian 8.3.0-6)

ffprobe -version

ffprobe version 6.1-static https://johnvansickle.com/ffmpeg/  Copyright (c) 2007-2023 the FFmpeg developers
built with gcc 8 (Debian 8.3.0-6)
デモアプリを立ち上げる

この時点でscripts/animate.shを実行すればCLIベースで生成することもできるが、ここでは操作の取り回しが良いGradioベースのwebアプリケーションを立ち上げる。
デモアプリはGradioで作られており、実体はdemo/gradio_animate.py, gradio_animate_dist.pyである。(後者のgradio_animate_distは複数のGPUを積んだマシン向けの並列推論用).

起動する前に、デモアプリのちょっとしたバグを修正しておこう。demo/gradio_animate.pyの95行目(末尾付近)にdemo.queue(1)を追記する。

 demo.queue(1) # この行を追記
 demo.launch(share=**True**)

これが必要な理由は、GradioのWeb UIからサーバーサイドに推論をリクエストした際のタイムアウト仕様が関係している。元のコードでは、Gradioの内部仕様上、リクエストから60秒が経過するとタイムアウトとなり504として処理されてしまう。しかし実際には、MagicAnimateの推論には60秒以上かかる可能性が高いため、常にタイムアウトになってしまう。queue(1)を挟むことでタイムアウトの制限がなくなるため、これをワークアラウンドとする。
参考:Gradio fn function errors right after 60 seconds

それではいよいよデモアプリを立ち上げよう。

python -m demo.gradio_animate
#中略
Initialization Done!
Running on local URL:  http://XXXXXX:7860
Running on public URL: https://XXXXXXXXXXXXX.gradio.live

URLにアクセスすると、以下のページが表示される。

Reference Image, Motion Sequence, Random Seed, Sampling Steps, Guidance scaleを指定して「Animate」をクリックすると推論が始まる。

推論が完了すると生成された動画が画面に出力され、demo/outputs/に格納される。Sampling Stepsを大きくすれば推論時間が増加する代わりに、品質が上がる可能性がある。

生成される動画の動きや、人物の体型はMotion Sequenceに左右されるため、これをいい感じに作れる人が求められていると思う。
以下は坂本アヒル先生のずんだもんを動かそうとして失敗した例。

また、顔の作りが写実的ではない画像や、体形が人間離れしていると上手く生成できないようだ。

Enjoy!