使用 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")
以下是一些示例输出
如果您打算使用可以剪切样本的调度程序,请确保通过在调度程序中设置 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")
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
结合使用以对编码的图像潜在因素进行去噪的调度器。 可以是 DDIMScheduler、LMSDiscreteScheduler 或 PNDMScheduler 之一。
用于文本到视频生成的管道。
此模型继承自 DiffusionPipeline。 检查超类文档以了解为所有管道实现的通用方法(下载、保存、在特定设备上运行等)。
该管道还继承了以下加载方法
- load_textual_inversion() 用于加载文本反转嵌入
- load_lora_weights() 用于加载 LoRA 权重
- save_lora_weights() 用于保存 LoRA 权重
- load_ip_adapter() 用于加载 IP 适配器
__call__
< source >( 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
) — 用于视频生成的输入图像。 - 提示 (
str
或List[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
时启用引导尺度。 - 负面提示 (
str
或List[str]
, 可选) — 指导图像生成中不包含内容的提示或提示。 如果未定义,则需要传递negative_prompt_embeds
。 当不使用引导 (guidance_scale < 1
) 时忽略。 - eta (
float
, 可选, 默认值为 0.0) — 对应于来自 DDIM 论文的参数 eta (η)。 仅适用于 DDIMScheduler,并在其他调度器中被忽略。 - 生成器 (
torch.Generator
或List[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.Tensor
、PIL.Image
或np.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
属性中列出的变量。
返回值
PIAPipelineOutput 或 tuple
如果 return_dict
为 True
,则返回 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 (
str
或List[str]
, 可选) — 要编码的提示 device — (torch.device
): torch 设备 - num_images_per_prompt (
int
) — 每个提示应该生成的图像数量 - do_classifier_free_guidance (
bool
) — 是否使用分类器自由引导 - negative_prompt (
str
或List[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 )
PIAPipeline 的输出类。