#contents
*概要 [#g730be93]
**概要 [#b4729a57]

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

**発展の経緯 [#s1176996]
- 技術自体は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の場合) [#m4abe60e]
-導入ガイド:https://github.com/continue-revolution/sd-webui-animatediff#how-to-use

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

** モーションモジュールについて[#te8caf1f]
動画生成に必要な「動作」を学習したファイルです。大きくv1モデル、v2モデル、v3モデル(23/12に公開)があります。以下に[[AnimateDiff for Stable Diffusion WebUI>https://github.com/continue-revolution/sd-webui-animatediff]]の【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

#shadowheader(3, mm_sd_v14.ckpt)
(基本モジュールv1.4:v1.5より動作が大きいと言われている)
&ref(./v14_small.gif,100%);

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

#shadowheader(3,mm-Stabiized_mid)
(安定モジュールMID:「基本モデルよりも少し安定しています」とのこと)
&ref(./mid_small.gif,100%);

#shadowheader(3,mm-Stabiized_high)
(安定モジュールHIGH:「基本モデルよりもはるかに安定していますが、動きは大幅に少なくなります」とのこと)
&ref(./high_small.gif,100%);

#shadowheader(3,TemporalDiff)
(「元のウェイトよりも高いレベルのビデオの一貫性が示されています」とのこと。不具合あり?)
&ref(./temp_small.gif,100%);

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

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

** 各パラメータについて [#y74a6c1f]
ここでは補足的に書きます。詳細は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を固定して変更してみると違いが判ると思います。
-- これらのパラメータについては以下のページに説明がされています。
--- https://github.com/ArtVentureX/comfyui-animatediff
--- https://www.reddit.com/r/StableDiffusion/comments/15dcam0/txt2mov_update_to_animatediff_colab_web_ui_init/
// ReverseをONにすると、反転したフレームが追加されます(やってみればわかります)
- Frame Interpolationはフレーム補完をします。詳細はWebUI拡張のREADMEを参照
- v2v(ビデオ入力→ビデオ出力)関係は編集者が試していないので省略します

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

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

#shadowheader(3,prompt Travelを使わない場合)
-- walking、racing、dancingなどの一般的な動作を表すプロンプトでその概念をもとにした動画が出力されます
-- 静止画として出せない構図は動画でも出ないものとして認識すると良いと思います
-- 流体の表現は得意なようです
|campfire|rain|soap bubble|h
|&ref(./campfire_small.gif,100%); |&ref(./rain_small.gif,100%); |&ref(./soapbubble_small.gif,100%); |

// -公開当初のAnimateDiffはプロンプトが76トークンを超えると不具合が起こると言われていました。挙動がおかしい場合はプロンプトを短くしてみましょう
// -動画が明確に2つに分割されてしまうという不具合もありました。サンプラーやプロンプトを変えることで直るかもしれません

#shadowheader(3,prompt Travelを使う場合)
-- Dynamic Prompts拡張の場合、{@}構文によりすべてのプロンプトを|で区切って指定します

 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}

&ref(./dp_small.gif,100%);

** Controlnetについて [#s10486e3]
- Controlnetにより各フレームを制御することで、2枚の静止画の中割を作成したり、指示したポーズに従った動作をさせたり、髪型や服装を統一することができます
- 23/10/02にWebUI拡張で実装されています。詳細はREADMEを参照。なおComfyUIを使った方が細かい制御などがしやすいです。
// - 23/08に、TDS氏によって初期フレームと最終フレームを静止画で与えて中割を作成する改良方法が公開されましたが、23/09/20時点の標準のControlnet-webUI拡張には採用されていません(おそらく)/
// - なお、その方法が採用された分岐版が以下に公開されています。ただ、この拡張はメモリ的にきれいな挙動をしていないようで、同じ条件でも急に遅くなったり動作しなくなったりします
// [[Animation & Inbetween frames using Animatediff & Controlnet (Workflow)>https://www.reddit.com/r/StableDiffusion/comments/16f6xjc/animation_inbetween_frames_using_animatediff/]]

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

** その他[#w363a4cf]
- 生成フレーム数が大きくなると背景が固定されにくくなります(comfyUIでmotion_scaleの設定をすることである程度の解決はできます)
//-- v2モデルを使うと軽減されるという報告もあります。
//- freeUを導入するとアニメーションが自然になるという報告があるようです
-【Always save all generated image grids】をONにすると、全フレームをまとめた画像がgridとして保存されます
// gridにもプロンプトなどがメタデータとして記録されるので、PNGを記録しない設定にしている場合に便利かもしれません
- Motion Lora が実装されました(23/09/25)。v2モデルでのみ利用できるようです。
- v3モデルが公開されました(23/12)
//- 新しいモーションモジュールが増えてきていますが、webUIでv2系を利用する場合はmm_zoo.jsonにハッシュとバージョンの記述が必要になります(記述がないと16枚バラバラの動画が生成されてしまいます)

* 使い方(ComfyUI)(随時加筆中) [#b7fa8d81]
- ComfyUIの基本的な使い方はここから → ComfyUI
- ここでは20フレーム程度のアニメーション動画をプロンプトから作る方法(t2v)を説明します
- AnimateDiff のカスタムノードは[[ArtVentureX版(無印):https://github.com/ArtVentureX/comfyui-animatediff]]と[[Kosinkadink版(Evolved):https://github.com/Kosinkadink/ComfyUI-AnimateDiff-Evolved]]の2種類がありますが、ここでは機能が充実しているKosinkadink版(Evolved)の利用を前提とします。
- ワークフローは24/02/10時点バージョンのものです。
- 必要なカスタムノード
|[[AnimeteDiff Kosinkadink版(Evolved):https://github.com/Kosinkadink/ComfyUI-AnimateDiff-Evolved]]||
|[[ComfyUI-VideoHelperSuite:https://github.com/Kosinkadink/ComfyUI-VideoHelperSuite]]|動画の読み込みと保存|
|[[FizzNodes:https://github.com/FizzleDorf/ComfyUI_FizzNodes]]|フレーム単位のプロンプト指定(Prompt Travel)|

** 動画生成ワークフロー(Prompt Travelなし) [#s92d9a6c]
&ref(./workflow1.png,40%);
&ref(./workflow1.json);

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

** 動画生成ワークフロー(Prompt Travelあり) [#z9b03b42]
&ref(./workflow2a.png,40%);
&ref(./workflow2.json);

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

プロンプトが長すぎる場合、次のようなエラーが表示されることがあります(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.


** アップスケール ワークフロー [#n786bc10]
&ref(./workflow3a.jpg,40%);
&ref(./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パラメータの設定 [#c4b5d39e]
- 生成動画におけるモーションの多様さと自然さは基本的にトレードオフの関係があります。利用するモーションモデルやcontext_overlapの他、scaleパラメータの設定によって調整できます
- また生成フレーム数が20を超えたあたりで背景の描画が安定しなくなります。scaleパラメータはマスク画像によって画像内の位置ごとに設定することでき、これを利用することで背景を安定させることができます

&ref(./workflow4.png,40%);
&ref(./workflow4.json);

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

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

&ref(./円状.png,20%);

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

&ref(./円状ボケ有.png,20%);

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

&ref(./半楕円.png,20%);

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

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

&ref(./freeinit.png,40%);

** カスタムノード色々 [#ab9c9849]

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

* prompt Travelの例 [#f2ac0bb2]
- 準備中
- Excelなどで記入して、それぞれ出力できるようにしておくと便利かも知れません

**スカートめくり例 [#rb23f8a5]
''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"