78 lines
2.2 KiB
Python
78 lines
2.2 KiB
Python
|
||
from __future__ import annotations
|
||
|
||
from pathlib import Path
|
||
import shutil
|
||
|
||
from model.Animation.animation_loader import (
|
||
build_animation_predictor,
|
||
UnifiedAnimationConfig,
|
||
AnimationBackend,
|
||
)
|
||
|
||
|
||
# -----------------------------
|
||
# 配置区(按需修改)
|
||
# -----------------------------
|
||
OUTPUT_DIR = "outputs/test_animation"
|
||
ANIMATION_BACKEND = AnimationBackend.ANIMATEDIFF
|
||
OUTPUT_FORMAT = "png_sequence" # "gif" | "png_sequence"
|
||
|
||
PROMPT = "a cinematic mountain landscape, camera slowly pans left"
|
||
NEGATIVE_PROMPT = "blurry, low quality"
|
||
NUM_INFERENCE_STEPS = 25
|
||
GUIDANCE_SCALE = 8.0
|
||
WIDTH = 512
|
||
HEIGHT = 512
|
||
VIDEO_LENGTH = 16
|
||
SEED = -1
|
||
CONTROL_IMAGE_PATH = "path/to/your_image.png"
|
||
|
||
|
||
def main() -> None:
|
||
base_dir = Path(__file__).resolve().parent
|
||
out_dir = base_dir / OUTPUT_DIR
|
||
out_dir.mkdir(parents=True, exist_ok=True)
|
||
|
||
predictor, used_backend = build_animation_predictor(
|
||
UnifiedAnimationConfig(backend=ANIMATION_BACKEND)
|
||
)
|
||
|
||
if CONTROL_IMAGE_PATH.strip() in {"", "path/to/your_image.png"}:
|
||
raise ValueError("请先设置 CONTROL_IMAGE_PATH 为你的输入图片路径(png/jpg)。")
|
||
|
||
control_image = (base_dir / CONTROL_IMAGE_PATH).resolve()
|
||
if not control_image.is_file():
|
||
raise FileNotFoundError(f"control image not found: {control_image}")
|
||
|
||
result_path = predictor(
|
||
prompt=PROMPT,
|
||
negative_prompt=NEGATIVE_PROMPT,
|
||
num_inference_steps=NUM_INFERENCE_STEPS,
|
||
guidance_scale=GUIDANCE_SCALE,
|
||
width=WIDTH,
|
||
height=HEIGHT,
|
||
video_length=VIDEO_LENGTH,
|
||
seed=SEED,
|
||
control_image_path=str(control_image),
|
||
output_format=OUTPUT_FORMAT,
|
||
)
|
||
|
||
source = Path(result_path)
|
||
if OUTPUT_FORMAT == "png_sequence":
|
||
out_seq_dir = out_dir / f"{used_backend.value}_frames"
|
||
if out_seq_dir.exists():
|
||
shutil.rmtree(out_seq_dir)
|
||
shutil.copytree(source, out_seq_dir)
|
||
print(f"[Animation] backend={used_backend.value}, saved={out_seq_dir}")
|
||
return
|
||
|
||
out_path = out_dir / f"{used_backend.value}.gif"
|
||
out_path.write_bytes(source.read_bytes())
|
||
print(f"[Animation] backend={used_backend.value}, saved={out_path}")
|
||
|
||
|
||
if __name__ == "__main__":
|
||
main()
|
||
|