前回、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 を付与して出力することができました!