今回の記事では 画像を動かすることができるmagic-animateの実装方法を紹介します。
Google Colabを使用して簡単に実装できますので、ぜひ最後までご覧ください。
magic-animateとは
magic-animateは特定の参照アイデンティティの動画を、ある特定の動作シーケンスに従って生成することを目的としています。既存のアニメーション手法は、参照イメージを目標の動作にアニメートするためにフレームワーピング技術を使用することが一般的です。これらの手法は合理的な結果を達成していますが、時間的モデリングの欠如と参照アイデンティティの保持が不十分であるため、アニメーション全体の時間的な一貫性を維持する上で課題があります。本研究では、MagicAnimateと呼ばれる拡散ベースのフレームワークを導入しています。これは、時間的な一貫性を高め、参照画像を忠実に保存し、アニメーションの忠実度を向上させることを目指しています。これを実現するために、まず時間情報を符号化するビデオ拡散モデルを開発しました。さらに、フレーム間の外観の一貫性を維持するために、参照イメージの複雑なディテールを保持する新しい外観エンコーダーを導入しました。これらの革新を活用して、長いビデオアニメーションのためのスムーズな遷移を促進する簡単なビデオ融合技術をさらに採用しています。実証的な結果は、当社の方法がベースラインアプローチに対して優れていることを示しています。特に、挑戦的なTikTokダンスデータセットにおいて、最も強力なベースラインをビデオ忠実度において38%以上上回る成果を達成しています。詳細は以下のリンクからご確認ください。
magic-animateの基本実装
ここからはGoogle colabを使用して実装していきましょう。
Google colabの使い方はこちら
まずはGPUを使用できるように設定をします。
「ランタイムのタイプを変更」→「ハードウェアアクセラレータ」をGPUに変更
モデルの準備
from google.colab import drive
drive.mount('/content/drive')
%cd ./drive/MyDrive
公式リポジトリをクローンします。
!git clone https://github.com/magic-research/magic-animate
%cd magic-animate
必要なライブラリをインストールします。
!pip install -r requirements.txt
必要なモデルをダウンロードします。
!git clone -b fp16 https://huggingface.co/runwayml/stable-diffusion-v1-5 /content/drive/MyDrive/magic-animate/pretrained_models/stable-diffusion-v1-5/
!git clone https://huggingface.co/stabilityai/sd-vae-ft-mse /content/drive/MyDrive/magic-animate/pretrained_models/sd-vae-ft-mse/
!git lfs clone https://huggingface.co/zcxu-eric/MagicAnimate /content/drive/MyDrive/magic-animate/pretrained_models/MagicAnimate/
以上で準備が完了しました。
yamlファイルの確認
まずは設定条件を記述するためのyamlファイルを表示してみます。
import yaml
with open('configs/prompts/animation.yaml', 'r') as file:
data = []
data.append(yaml.safe_load(file))
data
実行結果:
[{'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': None,
'fusion_blocks': 'midup',
'seed': [1],
'steps': 25,
'guidance_scale': 7.5,
'source_image': ['inputs/applications/source_image/monalisa.png',
'inputs/applications/source_image/0002.png',
'inputs/applications/source_image/demo4.png',
'inputs/applications/source_image/dalle2.jpeg',
'inputs/applications/source_image/dalle8.jpeg',
'inputs/applications/source_image/multi1_source.png'],
'video_path': ['inputs/applications/driving/densepose/running.mp4',
'inputs/applications/driving/densepose/demo4.mp4',
'inputs/applications/driving/densepose/demo4.mp4',
'inputs/applications/driving/densepose/running2.mp4',
'inputs/applications/driving/densepose/dancing2.mp4',
'inputs/applications/driving/densepose/multi_dancing.mp4'],
'inference_config': 'configs/inference/inference.yaml',
'size': 512,
'L': 16,
'S': 1,
'I': 0,
'clip': 0,
'offset': 0,
'max_length': None,
'video_type': 'condition',
'invert_video': False,
'save_individual_videos': False}]
このファイルを変更することで、様々な条件で生成できるようになります。
入力画像は変更する場合は、「source_image」の部分を変更すればよいことになります。
yamlファイルの修正(※)
本記事の執筆時点においては「inputs/applications/source_image/0002.png」が存在しないため、yamalファイルの修正が必要となります。(公式リポジトリの方が修正されれば、この作業は不要となります)
以下のコードを実行して、yamlファイルを修正することができます。
import yaml
# YAMLファイルを読み込む
with open('configs/prompts/animation.yaml', 'r') as file:
data = yaml.safe_load(file)
# 'inputs/applications/source_image/0002.png' をリストから削除する
if 'source_image' in data and 'inputs/applications/source_image/0002.png' in data['source_image']:
data['source_image'].remove('inputs/applications/source_image/0002.png')
# 変更をファイルに保存する
with open('configs/prompts/animation.yaml', 'w') as file:
yaml.dump(data, file, sort_keys=False)
サンプルデータで実行
まずはサンプルデータを使用します。
再度修正したyamlファイルを確認します。
[{'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': None,
'fusion_blocks': 'midup',
'seed': [1],
'steps': 25,
'guidance_scale': 7.5,
'source_image': ['inputs/applications/source_image/monalisa.png',
'inputs/applications/source_image/demo4.png',
'inputs/applications/source_image/dalle2.jpeg',
'inputs/applications/source_image/dalle8.jpeg',
'inputs/applications/source_image/multi1_source.png'],
'video_path': ['inputs/applications/driving/densepose/running.mp4',
'inputs/applications/driving/densepose/demo4.mp4',
'inputs/applications/driving/densepose/demo4.mp4',
'inputs/applications/driving/densepose/running2.mp4',
'inputs/applications/driving/densepose/dancing2.mp4',
'inputs/applications/driving/densepose/multi_dancing.mp4'],
'inference_config': 'configs/inference/inference.yaml',
'size': 512,
'L': 16,
'S': 1,
'I': 0,
'clip': 0,
'offset': 0,
'max_length': None,
'video_type': 'condition',
'invert_video': False,
'save_individual_videos': False}]
このファイルを実行すると「source_image」にある5枚の画像に対して、それぞれ動画を作成することになります。
以下の通り実行します。
!python -m magicanimate.pipelines.animation --config configs/prompts/animation.yaml
これで動画として保存されます。
実行結果「monalisa.png」の場合
実行結果「monalisa.png」の場合
まとめ
最後までご覧いただきありがとうございました。