diffusers の AnimateDiff で Motion LoRA を使ってみる
前回、LoRA で「PEFT backend is required for this method」なエラーにハマりましたが、無事にこの記事に進めるようになりました。
Motion LoRA (モーション LoRA) で何ができるかというと、 AnimateDiff にズームインやズームアウトなどの動きを加えることができます。
早速使ってみようと思います。
はじめに
diffusers から使える Motion LoRA はこちらにあります。
この記事では diffusers v0.22.0 の通り zoom-out を使用して試してみます。
早速やってみる
モデルのロード等 (MotionAdapter, AnimateDiffPipeline, LoRA, DDIMScheduler)
import torch
from diffusers import MotionAdapter, AnimateDiffPipeline, DDIMScheduler
from diffusers.utils import export_to_gif
# モーションアダプターのロード
adapter = MotionAdapter.from_pretrained(
"guoyww/animatediff-motion-adapter-v1-5-2"
)
# SD 1.5系のモデルを AnimateDiffPipeline でロード
pipe = AnimateDiffPipeline.from_pretrained(
"SG161222/Realistic_Vision_V5.1_noVAE",
motion_adapter=adapter
)
# モーション LoRA をロード
pipe.load_lora_weights(
"guoyww/animatediff-motion-lora-zoom-out",
adapter_name="zoom-out"
)
# スケジューラーを設定
pipe.scheduler = DDIMScheduler.from_config(
pipe.scheduler.config,
clip_sample=False,
timestep_spacing="linspace",
steps_offset=1
)
# enable memory savings
pipe.enable_vae_slicing()
pipe.enable_model_cpu_offload()
ここで、前回の記事の通りload_lora_weights()でハマったんですよねぇ...
パイプライン実行
import torch
# パイプラインの実行
prompt = "masterpiece, bestquality, highlydetailed, ultradetailed, sunset, orange sky, warm lighting, fishing boats, ocean waves seagulls, rippling water, wharf, silhouette, serene atmosphere, dusk, evening glow, golden hour, coastal landscape, seaside scenery"
negative_prompt = "bad quality, worse quality"
frames = pipe(
prompt,
negative_prompt=negative_prompt,
num_frames=16,
guidance_scale=7.5,
num_inference_steps=25,
generator=torch.manual_seed(42),
).frames[0]
実行結果
from diffusers.utils import export_to_gif
from datetime import datetime
from zoneinfo import ZoneInfo
# Asia/Tokyo タイムゾーンの現在時刻を YYYYMMDDhhmmss 形式で得る
formattedNow = datetime.now(tz=ZoneInfo("Asia/Tokyo")).strftime("%Y%m%d%H%M%S")
# 実行結果
export_to_gif(frames, f"animation_{formattedNow}.gif")

ちゃんとズームアウトしてますねぇ
モーション LoRA を付与していないものと比較


別のモデルでやってみる
今回は ToonYou ではなく、恒例の MeinaMix でやってみます。
パイプライン実行
# パイプライン実行
prompt="masterpiece, best quality, super fine illustration, anime style, 1girl, school uniform"
negative_prompt="bad quality, worse quality"
frames = pipe(
prompt,
negative_prompt=negative_prompt,
num_frames=16,
guidance_scale=7.5,
num_inference_steps=25
).frames[0]
ロードするモデルとプロンプト以外は特に弄りません。 強いて言うなら、seed 固定を外しました。
実行結果

モーション LoRA もしっかり適用されています
でも、もうちょっとdiffusers v0.15.0 の Text-to-Video Zero を Google Colab で使ってみる - ジャコ Labの時みたいに、おぉーー!!っていう感じのが出てほしいな。スケジューラの問題?GitHub 版も試してみようかな?
まとめ
無事に AnimateDiff にモーション LoRA を付与して出力することができました!