![見出し画像](https://assets.st-note.com/production/uploads/images/110787938/rectangle_large_type_2_40dc21e3359fa46fbbd0ae579dbb42be.jpeg?width=1200)
AnimateDiff(fork版、7/14時点)の導入と実行回りのメモ
こんばんは。
AnimateDiffについて、init画像を設定できるfork版が上がっていたこともあり、Windows/venv用いた形で導入してみたのでその導入と走行結果のメモとして共有します。
前提 参考にしたサイト
venvで導入するための情報として以下を参考にしました。ありがとうございます。
https://self-development.info/テキストからアニメーション生成が可能なanimatediffのイ/
環境の構築
まずはfork版をGitHubからcloneしてvenvを用いた環境を作ります。
git clone https://github.com/talesofai/AnimateDiff.git
cd AnimateDiff
py -m venv venv
.¥venv¥Scripts¥activate
venvをactivateしたら、必要なものをインストールしていきます。
なお元の状態ではEnvironment .yamlに必要なモジュールが記載されているため、この内容をrequirements.txtに書き換えてinstallします。
※記載の参考サイトの情報を参考にしました
とりあえずtorch関係をinstall
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
フォルダ直下に以下の内容でrequirements.txtを作成
iffusers[torch]==0.11.1
transformers==4.25.1
imageio==2.27.0
gdown
einops
omegaconf
safetensors
pip install -r requirements.txt
続いてモデル周りの導入。ここはDLに時間を要すようです。
導入先フォルダは既にあるので作成等は不要でした。
git lfs install
git clone https://huggingface.co/runwayml/stable-diffusion-v1-5 models/StableDiffusion/stable-diffusion-v1-5
サンプルを実行するためのモデルも導入します。
今回は正しく実行できることがわかればいいのでToonYouだけを、
models/DreamBooth_LoRA 配下に配置します。
サンプル生成までの準備はここまででした。
サンプル生成
以下のコマンドを実行してサンプル通りに生成されることを確認します。
python -m scripts.animate --config configs/prompts/1-ToonYou.yaml
出力結果
![](https://assets.st-note.com/production/uploads/images/110782899/picture_pc_f46dd919016653568d86baf669d4267c.gif)
応用編へ initイメージ&LoRAを使用した動画作成1 サンプル確認
こちらもfork版に既にサンプルが用意されているので、ひとまずこれを導入&実行してみましょう。
まずは必要なサンプルをDLして(シェルが用意してありますが、うまく動かなかったので直接DLした上でymlに合わせてリネームしました)、
以下のコマンドを実行します。
python -m scripts.animate --config configs/prompts/10-InitImageYoimiya.yml
拡張子がymlになっているので注意といえば注意ですね。
以下のような結果が出力されればOKでしょう。
出力結果
![](https://assets.st-note.com/production/uploads/images/110783738/picture_pc_91aed0ad6518e93e8f6a44b367e9e947.gif)
応用編へ initイメージ&LoRAを使用した動画作成2 自前実行指示に書き換え
ここからいよいよ自前で動かしたいものを動かす方向に進みます。
まずはconfigs/prompts 配下にある10-InitImageYoimiya.ymlをコピーしてリネームします。
今回は、「u1-xxxxxx.yaml」としました。
中身を書き換えていくのですが、その前にまずはinitで使用する画像をStableDiffusionで用意しておきましょう。
512*512サイズの画像を1枚生成します。
init画像の用意
生成結果
![](https://assets.st-note.com/img/1689336437462-gCjwRBPLzo.jpg)
yamlの修正
u1-xxxxxx.yamlの中身を以下のような形にザクザク修正します。
base: "models/DreamBooth_LoRA/【自作モデル】.safetensors"
path: "models/DreamBooth_LoRA/【LoRA】.safetensors"
init_image: "configs/prompts/【init画像】.png"
steps: 37
guidance_scale: 9
lora_alpha: 1
prompt:
- "(best quality),(masterpiece),(ultra detailed),(highres),production art,upper body of 【LoRAのトリガー】, small smile, adlut form,realistic, field full of colorful flowers, thunder storm, anime style"
- "(best quality),(masterpiece),(ultra detailed),(highres),production art,upper body of 【LoRAのトリガー】, small smile, adlut form,realistic, field full of colorful flowers, wink, anime style"
n_prompt:
- "worst quality, low quality, logo, text, watermark, username, inaccurate legs and hands and fingers, extra legs, extra arms, extra fingers,"
【】の中身は置換想定でざっくりです。
この状態で、以下のコマンドを投入して実行してみます。
ython -m scripts.animate --config configs/prompts/u1-xxxxxx.yaml
実行結果(エラー) エスケープ文字はエラーになる模様
以下のエラーを吐きました。
yaml.scanner.ScannerError: while scanning a double-quoted scalar
in "H:\Tool\AnimateDiff\configs\prompts\u1-xxxxxx.yaml", line 17, column 7
found unknown escape character '('
in "H:\Tool\AnimateDiff\configs\prompts\u1-xxxxxx.yaml", line 17, column 102
どうやら、プロンプト内でエスケープしている箇所が悪さをしているようです。
¥(xxxxx¥)となっているプロンプト部分から¥を外して再実行します。
実行結果(エラー2) LoConはまだ使えないらしい
以下のエラーを吐きました。
Traceback (most recent call last):
File "C:\Users\User\AppData\Local\Programs\Python\Python310\lib\runpy.py", line 196, in _run_module_as_main
return _run_code(code, main_globals, None,
File "C:\Users\User\AppData\Local\Programs\Python\Python310\lib\runpy.py", line 86, in _run_code
exec(code, run_globals)
File "H:\Tool\AnimateDiff\scripts\animate.py", line 176, in <module>
main(args)
File "H:\Tool\AnimateDiff\scripts\animate.py", line 104, in main
pipeline = convert_lora(pipeline, state_dict, alpha=model_config.lora_alpha)
File "H:\Tool\AnimateDiff\animatediff\utils\convert_lora_safetensor_to_diffusers.py", line 78, in convert_lora
curr_layer.weight.data += alpha * torch.mm(weight_up, weight_down).unsqueeze(2).unsqueeze(3).to(curr_layer.weight.data.device)
RuntimeError: mat2 must be a matrix
LoRA(safetensors)をdiffuser形式に変換しようとしている処理の中でエラーとなっているようです。今回指定していたのはkohyaさん形式のLoCon(C3lier)だったので、通常のLoRAを準備して再実行します。
動いた。が……
無事、正常動作しました。コマンド実行すると成否に関わらずタイムスタンプ入りのフォルダがsamplesフォルダ配下に生成されます。
なお2*2枚の動画を作成するにあたり、以下の環境で5分程度でした。
NVIDIA GeForce RTX 4090
ドライバーのバージョン: 31.0.15.3179
ドライバーの日付: 2023/04/25
DirectX バージョン: 12 (FL 12.1)
使用率 2%
専用 GPU メモリ 14.9/24.0 GB
共有 GPU メモリ 0.2/31.1 GB
GPU メモリ 15.1/55.1 GB
生成結果
![](https://assets.st-note.com/production/uploads/images/110785752/picture_pc_6921f628fa62dfa941d86b75d01581f3.gif)
動いてる、でもそうじゃない。
仮説としては、Animate Diff側の処理が効かないくらいLoRA側が強く適用されている可能性がありそうです。
LoRA _AlphaとLoRAの適用epochを下げてみる
LoRA _Alphaを0.1に、さらに使用するepochを手前のepochに変更して再実行してみます。
生成結果
![](https://assets.st-note.com/production/uploads/images/110786329/picture_pc_99f3966dd639cbee259b00a8e8206e44.gif)
おぼろげにそれっぽい何かは出ました。
が、もう少し流石にクリアにしたいところ。とはいえ今のLoRAだと厳しそうなので、Dim =32 、Alpha=16のLoRAを新たに用意して再実行します。
本日のゴール
生成結果
![](https://assets.st-note.com/production/uploads/images/110787000/picture_pc_7bf74461ba82f988289db6685546e5e6.gif)
PS1画質までは求めてなかったんですがだいぶんそれっぽくなりました。
init画像は服装補強には使ってくれていそうですが、画風含めて揃えるにはもう少しLoRAの調整が必要そうです。
(追記)ある程度モデルに依存するようです。主線表現強めなモデルなら普通に出ました。
個人的見解まとめ
AnimateDiffは矛盾少なめな動画を生成できるという点で確かに他より準備含めて手数が少なく、面白いツールのように感じました。
ただ色々試しているうちにいつの間にかWebuiの拡張になってそうですね……えらい勢いで進歩しますもんね……
(7/27追記)とか言ってたらもうWebUIの拡張も出てました。どうやらこのメモも不要になりそうです。
それでは。