見出し画像

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

出力結果

ToonYouでのサンプルそのままの出力。

応用編へ initイメージ&LoRAを使用した動画作成1 サンプル確認

こちらもfork版に既にサンプルが用意されているので、ひとまずこれを導入&実行してみましょう。

まずは必要なサンプルをDLして(シェルが用意してありますが、うまく動かなかったので直接DLした上でymlに合わせてリネームしました)、
以下のコマンドを実行します。

python -m scripts.animate --config configs/prompts/10-InitImageYoimiya.yml

拡張子がymlになっているので注意といえば注意ですね。
以下のような結果が出力されればOKでしょう。

出力結果

fork版で追加されたサンプルから、modelだけ自作モデルに置換したもの

応用編へ initイメージ&LoRAを使用した動画作成2 自前実行指示に書き換え

ここからいよいよ自前で動かしたいものを動かす方向に進みます。
まずはconfigs/prompts 配下にある10-InitImageYoimiya.ymlをコピーしてリネームします。
今回は、「u1-xxxxxx.yaml」としました。
中身を書き換えていくのですが、その前にまずはinitで使用する画像をStableDiffusionで用意しておきましょう。
512*512サイズの画像を1枚生成します。

init画像の用意

生成結果

initに使用することにした画像。

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

なお2本目以降はなぜか専有GPUメモリが更に消費されました

生成結果

あ……れ……?

動いてる、でもそうじゃない
仮説としては、Animate Diff側の処理が効かないくらいLoRA側が強く適用されている可能性がありそうです。

LoRA _AlphaとLoRAの適用epochを下げてみる

LoRA _Alphaを0.1に、さらに使用するepochを手前のepochに変更して再実行してみます。

生成結果

輪郭は…出ましたね

おぼろげにそれっぽい何かは出ました。
が、もう少し流石にクリアにしたいところ。とはいえ今のLoRAだと厳しそうなので、Dim =32 、Alpha=16のLoRAを新たに用意して再実行します。

本日のゴール

生成結果

見返り。

PS1画質までは求めてなかったんですがだいぶんそれっぽくなりました。
init画像は服装補強には使ってくれていそうですが、画風含めて揃えるにはもう少しLoRAの調整が必要そうです。
(追記)ある程度モデルに依存するようです。主線表現強めなモデルなら普通に出ました。

個人的見解まとめ

AnimateDiffは矛盾少なめな動画を生成できるという点で確かに他より準備含めて手数が少なく、面白いツールのように感じました。
ただ色々試しているうちにいつの間にかWebuiの拡張になってそうですね……えらい勢いで進歩しますもんね……
(7/27追記)とか言ってたらもうWebUIの拡張も出てました。どうやらこのメモも不要になりそうです。

それでは。

この記事が気に入ったらサポートをしてみませんか?