Diffusers 文档

使用 PIA(个性化图像动画器)生成图像到视频

Hugging Face's logo
加入 Hugging Face 社区

并获得增强版文档体验

入门

使用 PIA(个性化图像动画师)进行图像转视频生成

概述

PIA: 通过文本到图像模型中的即插即用模块实现您的个性化图像动画器 作者:张一鸣、邢振宁、曾艳红、方友庆、陈凯

个性化文本到图像(T2I)模型的最新进展彻底改变了内容创作,使非专业人士能够生成具有独特风格的惊艳图像。虽然很有前景,但通过文本将逼真的运动添加到这些个性化图像中,在保持独特风格、高保真细节以及实现文本可控运动方面提出了重大挑战。在本文中,我们介绍了 PIA,一个个性化图像动画器,它在与条件图像保持一致、实现文本可控运动以及与各种个性化 T2I 模型的兼容性方面表现出色,无需专门调整。为了实现这些目标,PIA 在一个经过良好训练的时间对齐层的基准 T2I 模型的基础上构建,允许将任何个性化 T2I 模型无缝转换为图像动画模型。PIA 的一个关键组成部分是引入条件模块,该模块利用条件帧和帧间亲和力作为输入,以亲和力提示为指导,将外观信息传递到潜在空间的单个帧合成中。这种设计减轻了外观相关图像在内部对齐的挑战,并允许更专注于与运动相关指导的对齐。

项目页面

可用管道

管道 任务 演示
PIAPipeline 使用 PIA 生成图像到视频

可用检查点

PIA 的运动适配器检查点可以在 OpenMMLab 组织 下找到。这些检查点旨在与基于 Stable Diffusion 1.5 的任何模型配合使用。

使用示例

PIA 与运动适配器检查点和 Stable Diffusion 1.5 模型检查点一起使用。运动适配器是一组运动模块,负责在图像帧之间添加连贯的运动。这些模块应用于 Stable Diffusion UNet 中的 Resnet 和 Attention 块之后。除了运动模块外,PIA 还用 9 通道输入卷积层替换了 SD 1.5 UNet 模型的输入卷积层。

以下示例演示了如何使用 PIA 从单个图像生成视频。

import torch
from diffusers import (
    EulerDiscreteScheduler,
    MotionAdapter,
    PIAPipeline,
)
from diffusers.utils import export_to_gif, load_image

adapter = MotionAdapter.from_pretrained("openmmlab/PIA-condition-adapter")
pipe = PIAPipeline.from_pretrained("SG161222/Realistic_Vision_V6.0_B1_noVAE", motion_adapter=adapter, torch_dtype=torch.float16)

pipe.scheduler = EulerDiscreteScheduler.from_config(pipe.scheduler.config)
pipe.enable_model_cpu_offload()
pipe.enable_vae_slicing()

image = load_image(
    "https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main/pix2pix/cat_6.png?download=true"
)
image = image.resize((512, 512))
prompt = "cat in a field"
negative_prompt = "wrong white balance, dark, sketches,worst quality,low quality"

generator = torch.Generator("cpu").manual_seed(0)
output = pipe(image=image, prompt=prompt, generator=generator)
frames = output.frames[0]
export_to_gif(frames, "pia-animation.gif")

以下是一些示例输出

田野里的猫。
cat in a field

如果您打算使用可以剪切样本的调度程序,请确保通过在调度程序中设置 clip_sample=False 来禁用它,因为这也会对生成的样本产生不利影响。此外,PIA 检查点可能对调度程序的 beta 时间表很敏感。我们建议将其设置为 linear

使用 FreeInit

FreeInit:弥合视频扩散模型中的初始化差距 作者:吴天星、司晨阳、姜玉明、黄子奇、刘子维。

FreeInit 是一种有效的方法,它可以提高视频扩散模型生成的视频的时间一致性和整体质量,而无需任何额外训练。它可以无缝地应用于 PIA、AnimateDiff、ModelScope、VideoCrafter 以及各种其他视频生成模型,并在推理时工作,通过迭代地细化潜在初始化噪声。更多细节可以在论文中找到。

以下示例演示了 FreeInit 的用法。

import torch
from diffusers import (
    DDIMScheduler,
    MotionAdapter,
    PIAPipeline,
)
from diffusers.utils import export_to_gif, load_image

adapter = MotionAdapter.from_pretrained("openmmlab/PIA-condition-adapter")
pipe = PIAPipeline.from_pretrained("SG161222/Realistic_Vision_V6.0_B1_noVAE", motion_adapter=adapter)

# enable FreeInit
# Refer to the enable_free_init documentation for a full list of configurable parameters
pipe.enable_free_init(method="butterworth", use_fast_sampling=True)

# Memory saving options
pipe.enable_model_cpu_offload()
pipe.enable_vae_slicing()

pipe.scheduler = DDIMScheduler.from_config(pipe.scheduler.config)
image = load_image(
    "https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main/pix2pix/cat_6.png?download=true"
)
image = image.resize((512, 512))
prompt = "cat in a field"
negative_prompt = "wrong white balance, dark, sketches,worst quality,low quality"

generator = torch.Generator("cpu").manual_seed(0)

output = pipe(image=image, prompt=prompt, generator=generator)
frames = output.frames[0]
export_to_gif(frames, "pia-freeinit-animation.gif")
田野里的猫。
cat in a field

FreeInit 并不真正免费 - 提高的质量是以额外的计算为代价的。它需要根据启用时设置的 num_iters 参数进行几次额外采样。将 use_fast_sampling 参数设置为 True 可以提高整体性能(以牺牲与 use_fast_sampling=False 相比的质量为代价,但仍然比普通视频生成模型的结果更好)。

PIAPipeline

class diffusers.PIAPipeline

< >

( vae: AutoencoderKL text_encoder: CLIPTextModel tokenizer: CLIPTokenizer unet: Union scheduler: Union motion_adapter: Optional = None feature_extractor: CLIPImageProcessor = None image_encoder: CLIPVisionModelWithProjection = None )

参数

  • vae (AutoencoderKL) — 用于将图像编码和解码为潜在表示的变分自动编码器 (VAE) 模型。
  • text_encoder (CLIPTextModel) — 冻结的文本编码器 (clip-vit-large-patch14).
  • tokenizer (CLIPTokenizer) — 一个 CLIPTokenizer 用于对文本进行标记。
  • unet (UNet2DConditionModel) — 一个 UNet2DConditionModel 用于创建 UNetMotionModel 来对编码的视频潜在因素进行去噪。
  • motion_adapter (MotionAdapter) — 一个 MotionAdapter 用于与 unet 结合使用,对编码的视频潜在因素进行去噪。
  • scheduler (SchedulerMixin) — 一个与 unet 结合使用以对编码的图像潜在因素进行去噪的调度器。 可以是 DDIMSchedulerLMSDiscreteSchedulerPNDMScheduler 之一。

用于文本到视频生成的管道。

此模型继承自 DiffusionPipeline。 检查超类文档以了解为所有管道实现的通用方法(下载、保存、在特定设备上运行等)。

该管道还继承了以下加载方法

__call__

< >

( image: Union prompt: Union = None strength: float = 1.0 num_frames: Optional = 16 height: Optional = None width: Optional = None num_inference_steps: int = 50 guidance_scale: float = 7.5 negative_prompt: Union = None num_videos_per_prompt: Optional = 1 eta: float = 0.0 generator: Union = None latents: Optional = None prompt_embeds: Optional = None negative_prompt_embeds: Optional = None ip_adapter_image: Union = None ip_adapter_image_embeds: Optional = None motion_scale: int = 0 output_type: Optional = 'pil' return_dict: bool = True cross_attention_kwargs: Optional = None clip_skip: Optional = None callback_on_step_end: Optional = None callback_on_step_end_tensor_inputs: List = ['latents'] ) PIAPipelineOutput or tuple

参数

  • image (PipelineImageInput) — 用于视频生成的输入图像。
  • 提示 (strList[str], 可选) — 指导图像生成的提示或提示。 如果未定义,则需要传递 prompt_embeds
  • 强度 (float, 可选, 默认值为 1.0) — 指示变换参考 image 的程度。 必须介于 0 和 1 之间。
  • 高度 (int, 可选, 默认值为 self.unet.config.sample_size * self.vae_scale_factor) — 生成的视频的高度(以像素为单位)。
  • 宽度 (int, 可选, 默认值为 self.unet.config.sample_size * self.vae_scale_factor) — 生成的视频的宽度(以像素为单位)。
  • 帧数 (int, 可选, 默认值为 16) — 生成的视频帧数。 默认值为 16 帧,以 8 帧/秒的速度计算,视频时长为 2 秒。
  • 推理步骤数 (int, 可选, 默认值为 50) — 降噪步骤数。 更多的降噪步骤通常会导致更高质量的视频,但推理速度会更慢。
  • 引导尺度 (float, 可选, 默认值为 7.5) — 更高的引导尺度值鼓励模型生成与文本 提示 密切相关的图像,但会导致图像质量降低。 当 guidance_scale > 1 时启用引导尺度。
  • 负面提示 (strList[str], 可选) — 指导图像生成中不包含内容的提示或提示。 如果未定义,则需要传递 negative_prompt_embeds。 当不使用引导 (guidance_scale < 1) 时忽略。
  • eta (float, 可选, 默认值为 0.0) — 对应于来自 DDIM 论文的参数 eta (η)。 仅适用于 DDIMScheduler,并在其他调度器中被忽略。
  • 生成器 (torch.GeneratorList[torch.Generator], 可选) — 用于使生成确定性的 torch.Generator
  • latents (torch.Tensor, 可选) — 预生成的噪声潜码,从高斯分布采样,用作视频生成的输入。 可用于使用不同的提示微调相同的生成。 如果未提供,则潜码张量是通过使用提供的随机 generator 采样生成的。 潜码应为 (batch_size, num_channel, num_frames, height, width) 形状。
  • prompt_embeds (torch.Tensor, 可选) — 预生成的文本嵌入。 可用于轻松调整文本输入(提示权重)。 如果未提供,则文本嵌入是从 prompt 输入参数生成的。
  • negative_prompt_embeds (torch.Tensor, 可选) — 预生成的负面文本嵌入。 可用于轻松调整文本输入(提示权重)。 如果未提供,则 negative_prompt_embeds 是从 negative_prompt 输入参数生成的。 ip_adapter_image — (PipelineImageInput, 可选): 可选图像输入,用于与 IP 适配器配合使用。
  • ip_adapter_image_embeds (List[torch.Tensor], 可选) — 预生成的 IP 适配器的图像嵌入。 它应该是一个与 IP 适配器数量相同的长度的列表。 每个元素应该是一个形状为 (batch_size, num_images, emb_dim) 的张量。 如果 do_classifier_free_guidance 设置为 True,它应该包含负图像嵌入。 如果未提供,则嵌入是从 ip_adapter_image 输入参数计算的。 motion_scale — (int, 可选, 默认值 0): 控制添加到图像的运动量和类型的参数。 提高值会增加运动量,而特定值的范围会控制添加的运动类型。 必须在 0 到 8 之间。 设置在 0-2 之间仅增加运动量。 设置在 3-5 之间以创建循环运动。 设置在 6-8 之间以使用图像风格迁移执行运动。
  • output_type (str, 可选, 默认值 "pil") — 生成的视频的输出格式。 在 torch.TensorPIL.Imagenp.array 之间选择。
  • return_dict (bool, 可选, 默认值 True) — 是否返回一个 TextToVideoSDPipelineOutput 而不是一个简单的元组。
  • cross_attention_kwargs (dict, 可选) — 如果指定,则传递给 AttentionProcessor 的 kwargs 字典,如 self.processor 中所定义。
  • clip_skip (int, 可选) — 从 CLIP 计算提示嵌入时要跳过的层数。 值为 1 表示将使用倒数第二层的输出计算提示嵌入。
  • callback_on_step_end (Callable, 可选) — 推理期间在每个去噪步骤结束时调用的函数。 该函数使用以下参数调用: callback_on_step_end(self: DiffusionPipeline, step: int, timestep: int, callback_kwargs: Dict)callback_kwargs 将包含 callback_on_step_end_tensor_inputs 指定的所有张量的列表。
  • callback_on_step_end_tensor_inputs (List, 可选) — callback_on_step_end 函数的张量输入列表。列表中指定的张量将作为 callback_kwargs 参数传递。您只能在管道类的 ._callback_tensor_inputs 属性中列出的变量。

返回值

PIAPipelineOutputtuple

如果 return_dictTrue,则返回 PIAPipelineOutput,否则返回一个 tuple,其中第一个元素是包含生成帧的列表。

用于生成管道调用的函数。

示例

>>> import torch
>>> from diffusers import EulerDiscreteScheduler, MotionAdapter, PIAPipeline
>>> from diffusers.utils import export_to_gif, load_image

>>> adapter = MotionAdapter.from_pretrained("openmmlab/PIA-condition-adapter")
>>> pipe = PIAPipeline.from_pretrained(
...     "SG161222/Realistic_Vision_V6.0_B1_noVAE", motion_adapter=adapter, torch_dtype=torch.float16
... )

>>> pipe.scheduler = EulerDiscreteScheduler.from_config(pipe.scheduler.config)
>>> image = load_image(
...     "https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main/pix2pix/cat_6.png?download=true"
... )
>>> image = image.resize((512, 512))
>>> prompt = "cat in a hat"
>>> negative_prompt = "wrong white balance, dark, sketches, worst quality, low quality, deformed, distorted"
>>> generator = torch.Generator("cpu").manual_seed(0)
>>> output = pipe(image=image, prompt=prompt, negative_prompt=negative_prompt, generator=generator)
>>> frames = output.frames[0]
>>> export_to_gif(frames, "pia-animation.gif")

encode_prompt

< >

( prompt device num_images_per_prompt do_classifier_free_guidance negative_prompt = None prompt_embeds: Optional = None negative_prompt_embeds: Optional = None lora_scale: Optional = None clip_skip: Optional = None )

参数

  • prompt (strList[str], 可选) — 要编码的提示 device — (torch.device): torch 设备
  • num_images_per_prompt (int) — 每个提示应该生成的图像数量
  • do_classifier_free_guidance (bool) — 是否使用分类器自由引导
  • negative_prompt (strList[str], 可选) — 不引导图像生成的提示或提示。如果没有定义,则必须传递 negative_prompt_embeds 而不是它。在不使用引导的情况下会被忽略(即,如果 guidance_scale 小于 1,则会被忽略)。
  • prompt_embeds (torch.Tensor, 可选) — 预生成的文本嵌入。可用于轻松调整文本输入,例如提示加权。如果未提供,则会从 prompt 输入参数生成文本嵌入。
  • negative_prompt_embeds (torch.Tensor, 可选) — 预生成的负文本嵌入。可用于轻松调整文本输入,例如提示加权。如果未提供,则会从 negative_prompt 输入参数生成 negative_prompt_embeds。
  • lora_scale (float, 可选) — 如果加载了 LoRA 层,则将应用于文本编码器所有 LoRA 层的 LoRA 比例。
  • clip_skip (int, 可选) — 从 CLIP 计算提示嵌入时要跳过的层数。值为 1 表示将使用倒数第二层的输出计算提示嵌入。

将提示编码为文本编码器隐藏状态。

  • 启用 freeu
  • 禁用 freeu
  • 启用 free_init
  • 禁用 free_init
  • 启用 vae 切片
  • 禁用 vae 切片
  • 启用 vae 平铺
  • 禁用 vae 平铺

PIAPipelineOutput

class diffusers.pipelines.pia.PIAPipelineOutput

< >

( frames: Union )

参数

  • frames (torch.Tensor, np.ndarray, 或 List[List[PIL.Image.Image]]) — 长度为 batch_size 的嵌套列表,包含长度为 num_frames 的去噪 PIL 图像序列,形状为 (batch_size, num_frames, channels, height, width) 的 NumPy 数组,形状为 (batch_size, num_frames, channels, height, width) 的 Torch 张量。

PIAPipeline 的输出类。

< > 在 GitHub 上更新