AnimateDiff

Last-modified: 2025-02-16 (日) 10:46:27

概要

概要

  • GIFなどの短時間の動画を作成するツール(標準は16フレーム/2秒)。Stable Diffusionをベースに生成できるのが特徴
  • AnimateDiffについての公式ページはこちら
  • AnimateDiffをStable Diffusion web UI向けにExtension化したのが下記。
  • ビデオカードのVRAMが12GBあれば動作可能です(xformers未使用の場合)
  • v2v(動画から動画を生成)もできますが、ここでは主にt2v(プロンプトから動画を生成)について説明します

発展の経緯

  • 技術自体は23/07に公開されましたが23/08頃から盛んになったみたいです。ControlNetとの連携が実現されたことが理由と思われます
  • WebUIに上記Extensionを導入すると使えます
    • なお、v1.5.0より前は不具合が多くありました(特定のモーションモデルでしか正しく生成できなかったり、色味がおかしかったり)。v1.5.0はwebUI v1.6以降対応なので、正しく動作しない場合はwebUIのバージョンが原因かもしれません
    • 静止画と同様にControlNetと組み合わせることで様々な制御が可能ですが、異なるExtensionであり、バージョンによってはうまく動作しないことがありえます
  • ComfyUIの方が設定可能なパラメータが多く、拡張機能同士の連携がとりやすいことなどから、ComfyUIの導入もお勧めします

導入方法(Stable Diffusion web UIの場合)

  • 以下は簡易説明です。
  1. web UIのExtensionsから、下記をインストールする。
    AnimateDiff for Stable Diffusion WebUI
  2. モーションモジュール(いくつか種類があります)をダウンロードして指定フォルダにいれる。指定フォルダは、
    stable-diffusion-webui/extensions/sd-webui-animatediff/model/
  3. 設定を変更する(特定状況下の生成失敗を回避するためのようです)

モーションモジュールについて

動画生成に必要な「動作」を学習したファイルです。大きくv1モデル、v2モデル、v3モデル(23/12に公開)があります。以下にAnimateDiff for Stable Diffusion WebUIの【Motion Module Model Zoo】にリンクが貼られているものを挙げます(23/09/19時点)。動作の大きさや安定性が異なるほか絵柄にも影響があります。

  • Wikiのファイルサイズ制限回避のため、512x512で生成したGIFファイルを256x256に縮小しています
  • プロンプトなどの設定は以下の通りです
    1girl,hatsune miku,light smile,dancing,onstage,heart
    Negative prompt: easynegative
    Steps: 25, Sampler: DPM++ 2M SDE Karras, CFG scale: 7, Seed: 0,Size: 512x512, Model hash: 5534a38029, Model: beelmix_v10, VAE hash: 500ea30284
    VAE: ClearVAE_V2.3.safetensors, Clip skip: 2, Version: v1.6.0

mm_sd_v14.ckpt

(基本モジュールv1.4:v1.5より動作が大きいと言われている)
v14_small.gif

mm_sd_v15_v2.ckpt

(基本モジュールv1.5_ver2:文字が表示されるなどの不具合があったv1.5の改良版。絵柄への影響が大きい?)
v15-2_small.gif

mm-Stabiized_mid

(安定モジュールMID:「基本モデルよりも少し安定しています」とのこと)
mid_small.gif

mm-Stabiized_high

(安定モジュールHIGH:「基本モデルよりもはるかに安定していますが、動きは大幅に少なくなります」とのこと)
high_small.gif

TemporalDiff

(「元のウェイトよりも高いレベルのビデオの一貫性が示されています」とのこと。不具合あり?)
temp_small.gif

どれを使えばいいの?

イラスト動画の場合は mm-Stabiized_high をお勧めします。大きな動きが欲しい場合は mm-Stabiized_mid を使うと良いかもしれません。いずれもv1モデルで絵柄への影響が少ないです。またリアル系の場合は Improved Humans Motion Module(v2モデル)もお勧めします(civitaiにあります。イラスト系には絵柄の影響が大きいです)。v3モデルについては未検証です。

使い方(Stable Diffusion web UI

動作確認(WebUI)

ver1.13.0での動作確認手順です(23/12/31時点)。
SS1.13.0.jpg

  1. AnimateDiff拡張機能から【Enable AnimateDiff】にチェックをいれます
  2. 【Motion module】にダウンロードしたファイルが表示されているので好きなものを選択します。【Number of frames】と【Context batch size】 は16のまま変更する必要はありません。他のパラメータも変えないでおきましょう
  3. 【Save】は保存するファイル形式です。各動画はコーデックが必要になります。PNGは各フレームが別ファイルとして保存されます(標準で16枚)。TXTはプロンプトなどがtxtファイルに出力されます。
  4. サイズは512x512から試してみましょう。Hires.fixはOFFにします(動作はしますがVRAM12GB環境だと生成速度はかなり遅くなります)。ADetailerなどの拡張機能も止めましょう
  5. モデルは好きなもので構いません。Sampling methodなども好きなもので構いませんが、生成速度に影響するのでまずは軽めの設定で
  6. プロンプトはまず1girlだけのような最低限のものから試してみましょう。ネガティブにeasynegativeなどを忘れずに
  7. 数十秒~数分で動画が生成されるはずです。速度が遅い場合はVRAM不足が考えられます。動作中のVRAMの使用率を確認するほか、xformersなどのメモリに関する設定をしなおしてみましょう。またHires.fixがONになっていないかを確認しましょう
  8. フレーム間に繋がりのないバラバラの動画が出力される場合は、モーションモジュールに問題があることが多いです。動作がおかしくなった場合はWebUIを再起動してみましょう。

各パラメータについて

ここでは補足的に書きます。詳細はWebUI拡張のREADMEを参照してください。

  • Context batch sizeは生成の基本となるサイズです。モーションモジュールの学習で利用されたフレーム数を指定します。v1モデルであれば16にしましょう
  • Number of frameは生成するフレーム数です。16~160程度であれば現実的な時間で生成できます(VRAM12GBの場合)。短いループ動画を作る場合は20程度が適切です。あまり大きいと背景が動きはじめます
  • FPSは出力される動画の1秒当たりのフレーム数です。Number of frameが16でFPSが8なら2秒の動画になります(フレーム補完なしの場合)
  • Display loop numberはGIF動画の繰り返し数です。0だと無限回になります
  • Closed loopはループ動画についての設定です。「Number of frameがContext batch sizeより大きい場合」に有効となります。詳細はWebUI拡張のREADMEを参照
  • Strideは1固定でよいです(context_stride)
  • Overlapは大きくするとモーションが滑らかになりますが、生成が遅くなります。-1だとContext batch size÷4に設定されます(context_overlap)。4~10程度が適切です。生成seedを固定して変更してみると違いが判ると思います。
  • Frame Interpolationはフレーム補完をします。詳細はWebUI拡張のREADMEを参照
  • v2v(ビデオ入力→ビデオ出力)関係は編集者が試していないので省略します

checkpointやloraについて

  • checkpointやloraは多くのものが問題なく利用できます
    • 一部のcheckpointやloraで出力がおかしくなるものがあります。理由は不明です
    • checkpointによって自然なモーションが出やすいものや、あまり動かないものなどがあります。実写系モデルをマージしているようなものの方が自然なモーションがでやすい気もします。
    • loraは静止画でポーズが固定しがちのもの(過学習気味のもの)を使うと、モーションが小さくなりがちです

プロンプトの書き方

  • 静止画と同じで、狙った動画を生成するにはプロンプトのコツとガチャが必要です
  • キャラクターのポーズを決めたいような場合はv2vやContolNetなどを利用できます
  • プロンプトは通常すべてのフレームに対して同じものが与えられますが、フレームごとに異なるプロンプトを与える方法があり、これはprompt Travelと呼ばれています
    • 23/10/08にPrompt travelが実装されました
    • Dynamic Prompts拡張を導入することでも実現できます。
    • ComfyUIの場合はFizzNodesカスタムノードのbatch prompt scheduleを使うことで実現できます

prompt Travelを使わない場合

  • walking、racing、dancingなどの一般的な動作を表すプロンプトでその概念をもとにした動画が出力されます
  • 静止画として出せない構図は動画でも出ないものとして認識すると良いと思います
  • 流体の表現は得意なようです
    campfirerainsoap bubble
    campfire_small.gifrain_small.gifsoapbubble_small.gif

prompt Travelを使う場合

1girl, hatsune miku,white dress,black skirt,standing,classroom,{@arms behind back|arms behind back|arms behind back|arms behind back|||crossed arms|crossed arms|crossed arms|crossed arms|||arms up,smile|arms up,smile|arms up,smile|arms up,smile}

dp_small.gif

Controlnetについて

  • Controlnetにより各フレームを制御することで、2枚の静止画の中割を作成したり、指示したポーズに従った動作をさせたり、髪型や服装を統一することができます
  • 23/10/02にWebUI拡張で実装されています。詳細はREADMEを参照。なおComfyUIを使った方が細かい制御などがしやすいです。

アップスケール(高解像度化)について

  • 動画の品質を上げるためにアップスケール(高解像度化)を行うことができます。静止画のHires.fixと同様です。
    • 出力した全フレームの静止画をimg2imgでそれぞれアップスケールしたものを動画化することもできますが、フレーム間の対応関係を考慮しないため不自然な動画になることが多いです(この処理でアップスケールする場合はDenoising strengthを極力小さくしましょう。Batchで行うと楽です)
    • webUIでは【Hires. fix】をONにして動画生成を行うことで動画生成後に連続してアップスケールを行います。ただOFFにした場合と比べて数倍の時間がかかるため、ガチャを行うことを踏まえるとあまり現実的ではありません
    • comfyUIは動画生成とアップスケールを切り分けて行えるため、選択した動画のみアップスケールを行うことができます

その他

  • 生成フレーム数が大きくなると背景が固定されにくくなります(comfyUIでmotion_scaleの設定をすることである程度の解決はできます)
  • 【Always save all generated image grids】をONにすると、全フレームをまとめた画像がgridとして保存されます
  • Motion Lora が実装されました(23/09/25)。v2モデルでのみ利用できるようです。
  • v3モデルが公開されました(23/12)

使い方(ComfyUI)(随時加筆中)

動画生成ワークフロー(Prompt Travelなし)

workflow1.png
workflow1.json

Load CheckpointCheckpointを選択。それ以外のパラメータの変更は不要です
Load VAECheckpoint内蔵VAEを使う場合はCheckpointのVAEをVAE Decodeにつなぎます
Empty Latent生成動画のサイズとフレーム数を設定
Load LoRACtrl+B(Bypass)で使用・不使用の選択ができます。strengthは同じ値で問題ないです
AnimeteDiffLoader(Gen①)モーションモジュールを選択。\ComfyUI\custom_nodes\ComfyUI-AnimateDiff-Evolved\models に置いたものが表示されます。beta_scheduleはautoselectで問題ないです
Context Optionsループ動画を作成する場合はLooped Uniform版、非ループ動画の場合はStandard Static版をつなぎます
- context_length16固定(SD-v1モデルの場合)
- context_stride1固定
- context_overlapフレーム画像の生成時に反映させる前後のフレーム数。2~10程度。大きくするとモーションが滑らかになりますが、生成が遅くなります。ダイナミックな動きをさせる場合は小さい値の方が良い場合もあります
- closed_looptrueにするとループが強調されるようになります。falseでもループ動画になります
- 上記以外変更する必要はありません
CLIP Set Last LayerWebUIのClip skipと同じです
CLIP Text Encode (Prompt)Positive promptとNegative promptをそれぞれ入力。easynegativeを使う場合は\ComfyUI\models\embeddings に置いて embedding:easynegative, と入力します(なおカンマの後にスペースを空けないとembeddingが正しく働かないことがあるようです)
KSamplerWebUIと同様に設定
Video Combine自明なパラメータは説明略
- frame_rate1秒当たりのフレーム数
- filename_prefix出力ファイル名の先頭文字。出力フォルダ名の入力も可。日付でフォルダを分けたい場合はカスタムノードを探してつなぎましょう
- crf動画出力の品質レベル。16が適切?

動画生成ワークフロー(Prompt Travelあり)

workflow2a.png
workflow2.json

Batch Prompt Schedule (Latent Input)
textフレームごとのプロンプトを入力。形式はサンプルなどを参照
pre_texttextの前に入力される全フレーム共通プロンプトを入力
app_texttextの後に入力される全フレーム共通プロンプトを入力
上記以外利用しません

プロンプトが長すぎる場合、次のようなエラーが表示されることがあります(FizzNodesのバグのようです)。

Error occurred when executing BatchPromptScheduleLatentInput:Sizes of tensors must match except in dimension 0. Expected size XXX but got size XXX for tensor number XX in the list.

アップスケール ワークフロー

workflow3a.jpg
workflow3.json

  • 動画生成ワークフローなどで生成した動画をRealESRGANx2を使って2倍アップスケールするワークフローです
  • 【Manager】【Install Models】からRealESRGANx2をインストールしてください
  • Load Video (Upload)ノードでアップスケールする動画を選択します
  • 基本的に生成時と同じ設定、同じプロンプトを指定します
    • アップスケール時にpixel-art LoRAをかけるなどしてレタッチすることもできます
  • KSamplerのdenoiseはWebUI-Hires.fixのDenoising strengthと同等です。0.3~0.7程度にします。0.5を超えると元動画から違いが目立つようになります
  • それなりに時間がかかります。画質が劣化しない程度にStep数を下げましょう
  • [Upscale Latent By]ノードのbypassを外すことで1.5倍に下げてアップスケールできます

scaleパラメータの設定

  • 生成動画におけるモーションの多様さと自然さは基本的にトレードオフの関係があります。利用するモーションモデルやcontext_overlapの他、scaleパラメータの設定によって調整できます
  • また生成フレーム数が20を超えたあたりで背景の描画が安定しなくなります。scaleパラメータはマスク画像によって画像内の位置ごとに設定することでき、これを利用することで背景を安定させることができます

workflow4.png
workflow4.json

Load Imageマスクとなる画像を選択します。白がmax_float_val(最大値)、黒がmin_float_val(最小値)に対応します
Upscale Image生成画像のサイズを入力します(Empty Latentのwidthとheightと同値に設定)
Multival Scaled Maskscaleの最大値(max_float_val)と最小値(min_float_val)を設定します。標準は1.0です

例えば次のようなマスク画像を利用し、max_float_valを1.0、min_float_valを0.4と設定すると、円の外側がほとんど動かなくなります。

円状.png

グラデーションにすることで、徐々に増減させることができます。

円状ボケ有.png

背景の描画を安定させるには楕円か半楕円のマスクをすると良いかもしれません。

半楕円.png

なお、マスクを使用せずscaleを画像全体に設定する場合は [Multival Dynamicノード] をscale_multivalにつないでください。

freeinitの利用

  • freeinitは動画の一貫性を向上させると言われている技術です。詳細はググってください
    • 利用することでモーションがスムーズになる場合がある、くらいの認識で良いかもしれません
  • freeinitを使うためにはAnimateDiff Loaderのsample_settingsに下図のようにノードをつなぎます
    • iterationsの数だけKsamplerが実行されます。例えば2の場合はKsamplerが2回繰り返されるため生成時間は2倍になります
    • その他のオプションはよくわからないです……

freeinit.png

カスタムノード色々

ComfyUI-Frame-Interpolation動画のフレーム補完ができます。アップスケールワークフローの[VAE Decode]と[Video Combine]の間に挟みましょう
ComfyUI's ControlNet Auxiliary PreprocessorsControlNetのカスタムノードです。ComfyUI-VideoHelperSuiteで動画ファイルを元にしたControlNetを掛けることができます
ComfyUI-Advanced-ControlNetControlNetをフレームごとに設定できるカスタムノードです。例えば動画の初期絵を設定することもできます(0フレーム目に静止画をTiledで設定し、1フレーム以降を徐々にウェイトを減衰させていく)

prompt Travelの例

  • 準備中
  • Excelなどで記入して、それぞれ出力できるようにしておくと便利かも知れません

スカートめくり例

WebUI Dynamic Prompt用

{@||(closed eyes:0.5)|closed eyes|closed eyes|(closed eyes:0.5)|skirt lift,panties|skirt lift,panties|skirt lift,groin,(panties:1.1),cameltoe|(skirt lift,groin:1.1),(closed eyes:0.5),(panties:1.1),cameltoe|(skirt lift,groin:1.1),closed eyes,(panties:1.1),cameltoe|skirt lift,groin,closed eyes,(panties:1.1),cameltoe|skirt lift,groin,(closed eyes:0.5),panties|skirt lift,panties||}

ComfyUI FizzNode用

"0":"",
"2":"(closed eyes:0.5)",
"3":"closed eyes",
"4":"closed eyes",
"5":"(closed eyes:0.5)",
"6":"skirt lift,panties",
"7":"skirt lift,panties",
"8":"skirt lift,groin,(panties:1.1),cameltoe",
"9":"(skirt lift,groin:1.1),(closed eyes:0.5),(panties:1.1),cameltoe",
"10":"(skirt lift,groin:1.1),closed eyes,(panties:1.1),cameltoe",
"11":"skirt lift,groin,closed eyes,(panties:1.1),cameltoe",
"12":"skirt lift,groin,(closed eyes:0.5),panties",
"13":"skirt lift,panties"