ジャコ Lab

プログラミング関連のメモ帳的ブログです

diffusers の AnimateDiff で Motion LoRA を使ってみる

zako-lab929.hatenablog.com

前回、LoRA で「PEFT backend is required for this method」なエラーにハマりましたが、無事にこの記事に進めるようになりました。

Motion LoRA (モーション LoRA) で何ができるかというと、 AnimateDiff にズームインやズームアウトなどの動きを加えることができます。

早速使ってみようと思います。

はじめに

huggingface.co

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 でズームアウトを付与した様子
モーション LoRA でズームアウトを付与して出力した画像

ちゃんとズームアウトしてますねぇ

モーション LoRA を付与していないものと比較

モーション LoRA 無しで出力した様子モーション LoRA 有りで出力した様子
(左) 前回のモーション LoRA 無しのやつ | (右) 今回のモーション 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 固定を外しました。

実行結果

MeinaMix を使って AnimateDiff とモーション LoRA で出力した様子
MeinaMix を使って AnimateDiff とモーション LoRA で出力した画像

モーション LoRA もしっかり適用されています

でも、もうちょっとdiffusers v0.15.0 の Text-to-Video Zero を Google Colab で使ってみる - ジャコ Labの時みたいに、おぉーー!!っていう感じのが出てほしいな。スケジューラの問題?GitHub 版も試してみようかな?

まとめ

無事に AnimateDiff にモーション LoRA を付与して出力することができました!