I2VGen-XL
I2VGen-XL:基于级联扩散模型的高质量图像到视频合成 by 张世伟,王佳玉,张颖雅,赵康,袁航杰,秦志武,王翔,赵德利,和周敬仁。
论文的摘要是
视频合成最近凭借扩散模型的快速发展取得了显著进步。然而,它在语义准确性、清晰度和时空连续性方面仍然面临挑战。这些挑战主要源于良好对齐的文本-视频数据稀缺以及视频本身复杂的内在结构,使得模型难以同时保证语义和质量的卓越。在本报告中,我们提出了一种级联式 I2VGen-XL 方法,通过解耦这两个因素来提高模型性能,并利用静态图像作为关键指导来确保输入数据的对齐。I2VGen-XL 包含两个阶段:i)基础阶段通过使用两个分层编码器保证语义一致性并保留来自输入图像的内容,以及 ii)细化阶段通过结合额外的简短文本增强视频细节,并将分辨率提高到 1280×720。为了提高多样性,我们收集了大约 3500 万个单镜头文本-视频对和 60 亿个文本-图像对来优化模型。通过这种方式,I2VGen-XL 可以同时增强生成视频的语义准确性、细节连续性和清晰度。通过大量的实验,我们研究了 I2VGen-XL 的底层原理并将其与当前的顶级方法进行了比较,从而证明了它在各种数据上的有效性。源代码和模型将在 此链接 公开发布。
原始代码库可以在 这里 找到。模型检查点可以在 这里 找到。
请务必查看调度器 指南,了解如何探索调度器速度和质量之间的权衡,并查看 跨管道重用组件 部分,了解如何有效地将相同的组件加载到多个管道中。此外,要了解有关减少此管道的内存用量的更多信息,请参阅 此处的“[减少内存使用量]” 部分。
使用 I2VGenXL 的示例输出
注释
- I2VGenXL 始终使用
clip_skip
值为 1。这意味着它利用了 CLIP 文本编码器的倒数第二层表示。 - 它可以生成质量通常与 稳定视频扩散 (SVD) 相当的视频。
- 与 SVD 不同,它还可以接受文本提示作为输入。
- 它可以生成更高分辨率的视频。
- 当使用 DDIMScheduler(此管道的默认值)时,推理步骤少于 50 步会导致结果不佳。
- 此实现是 I2VGenXL 的单阶段变体。 I2VGen-XL 论文中的主要图显示了一个双阶段变体,但是,单阶段变体也能很好地工作。有关更多详细信息,请参阅 此讨论。
I2VGenXLPipeline
class diffusers.I2VGenXLPipeline
< 源代码 >( vae: AutoencoderKL text_encoder: CLIPTextModel tokenizer: CLIPTokenizer image_encoder: CLIPVisionModelWithProjection feature_extractor: CLIPImageProcessor unet: I2VGenXLUNet scheduler: DDIMScheduler )
参数
- vae (AutoencoderKL) — 用于将图像编码和解码到潜在表示的变分自动编码器 (VAE) 模型。
- text_encoder (
CLIPTextModel
) — 冻结的文本编码器 (clip-vit-large-patch14). - tokenizer (
CLIPTokenizer
) — 用于对文本进行标记化的 CLIPTokenizer。 - unet (
I2VGenXLUNet
) — 用于对编码的视频潜在变量进行去噪的I2VGenXLUNet
。 - 调度器 (DDIMScheduler) — 用于与
unet
结合,对编码图像潜在变量进行去噪的调度器。
如 I2VGenXL 中所提出的图像到视频生成管道。
此模型继承自 DiffusionPipeline。查看超类文档以了解为所有管道实现的通用方法(下载、保存、在特定设备上运行等)。
__call__
< 源代码 >( 提示词: Union = None 图像: Union = None 高度: Optional = 704 宽度: Optional = 1280 目标帧率: Optional = 16 帧数: int = 16 推理步数: int = 50 引导尺度: float = 9.0 负面提示词: Union = None eta: float = 0.0 每个提示词生成的视频数量: Optional = 1 解码块大小: Optional = 1 生成器: Union = None 潜在变量: Optional = None 提示词嵌入: Optional = None 负面提示词嵌入: Optional = None 输出类型: Optional = 'pil' 返回字典: bool = True 交叉注意力参数: Optional = None 剪辑跳过: Optional = 1 ) → pipelines.i2vgen_xl.pipeline_i2vgen_xl.I2VGenXLPipelineOutput 或 元组
参数
- 提示词 (
str
或List[str]
, 可选) — 指导图像生成的提示词或提示词列表。如果未定义,则需要传递prompt_embeds
。 - 图像 (
PIL.Image.Image
或List[PIL.Image.Image]
或torch.Tensor
) — 指导图像生成的图像或图像列表。如果提供张量,则它需要与CLIPImageProcessor
兼容。 - 高度 (
int
, 可选, 默认为self.unet.config.sample_size * self.vae_scale_factor
) — 生成的图像的高度(以像素为单位)。 - 宽度 (
int
, 可选, 默认为self.unet.config.sample_size * self.vae_scale_factor
) — 生成的图像的宽度(以像素为单位)。 - 目标帧率 (
int
, 可选) — 帧/秒。生成图像在生成后导出为视频的速率。这在生成过程中也用作“微条件”。 - 帧数 (
int
, 可选) — 要生成的视频帧数。 - num_inference_steps (
int
,可选) — 降噪步骤数。 - guidance_scale (
float
,可选,默认为 7.5) — 更高的引导尺度值鼓励模型生成与文本prompt
密切相关的图像,但会以降低图像质量为代价。当guidance_scale > 1
时启用引导尺度。 - negative_prompt (
str
或List[str]
,可选) — 指导图像生成中不包含什么的提示或提示。如果未定义,则需要改为传递negative_prompt_embeds
。在不使用引导(guidance_scale < 1
)时忽略。 - eta (
float
,可选) — 对应于DDIM论文中的参数 eta (η)。仅适用于DDIMScheduler,在其他调度器中被忽略。 - num_videos_per_prompt (
int
,可选) — 每个提示生成图像的数量。 - decode_chunk_size (
int
,可选) — 每次解码的帧数。分块大小越大,帧之间的时间一致性越高,但内存消耗也越高。默认情况下,解码器会一次解码所有帧以获得最大质量。减少decode_chunk_size
以减少内存使用。 - generator (
torch.Generator
或List[torch.Generator]
,可选) — 用于使生成确定性的torch.Generator
。 - latents (
torch.Tensor
,可选) — 从高斯分布中采样生成的预生成的噪声潜在变量,用作图像生成的输入。可用于使用不同的提示调整相同的生成。如果未提供,则通过使用提供的随机generator
采样生成潜在变量张量。 - prompt_embeds (
torch.Tensor
,可选) — 预生成的文本嵌入。可用于轻松调整文本输入(提示加权)。如果未提供,则从prompt
输入参数生成文本嵌入。 - negative_prompt_embeds (
torch.Tensor
,可选) — 预生成的负面文本嵌入。可用于轻松调整文本输入(提示加权)。如果未提供,则从negative_prompt
输入参数生成negative_prompt_embeds
。 - 输出类型 (
str
, 可选, 默认为"pil"
) — 生成的图像的输出格式。选择PIL.Image
或np.array
。 - 返回字典 (
bool
, 可选, 默认为True
) — 是否返回一个 StableDiffusionPipelineOutput 而不是一个普通元组。 - 交叉注意力参数 (
dict
, 可选) — 如果指定,则传递给self.processor
中定义的AttentionProcessor
的关键字参数字典。 - CLIP 跳过层数 (
int
, 可选) — 计算提示嵌入时要从 CLIP 跳过的层数。值为 1 表示将使用倒数第二层的输出计算提示嵌入。
如果 return_dict
为 True
,则返回 pipelines.i2vgen_xl.pipeline_i2vgen_xl.I2VGenXLPipelineOutput,否则返回一个 tuple
,其中第一个元素是一个包含生成帧的列表。
使用 I2VGenXLPipeline 进行图像到视频生成的管道调用函数。
示例
>>> import torch
>>> from diffusers import I2VGenXLPipeline
>>> from diffusers.utils import export_to_gif, load_image
>>> pipeline = I2VGenXLPipeline.from_pretrained(
... "ali-vilab/i2vgen-xl", torch_dtype=torch.float16, variant="fp16"
... )
>>> pipeline.enable_model_cpu_offload()
>>> image_url = (
... "https://huggingface.co/datasets/diffusers/docs-images/resolve/main/i2vgen_xl_images/img_0009.png"
... )
>>> image = load_image(image_url).convert("RGB")
>>> prompt = "Papers were floating in the air on a table in the library"
>>> negative_prompt = "Distorted, discontinuous, Ugly, blurry, low resolution, motionless, static, disfigured, disconnected limbs, Ugly faces, incomplete arms"
>>> generator = torch.manual_seed(8888)
>>> frames = pipeline(
... prompt=prompt,
... image=image,
... num_inference_steps=50,
... negative_prompt=negative_prompt,
... guidance_scale=9.0,
... generator=generator,
... ).frames[0]
>>> video_path = export_to_gif(frames, "i2v.gif")
编码提示
< source >( prompt device num_videos_per_prompt negative_prompt = None prompt_embeds: Optional = None negative_prompt_embeds: Optional = None clip_skip: Optional = None )
参数
- 提示 (
str
或List[str]
, 可选) — 要编码的提示 device — (torch.device
): torch 设备 - 每个提示生成的视频数量 (
int
) — 每个提示应生成的图像数量 - 是否使用分类器自由引导 (
bool
) — 是否使用分类器自由引导 - 负面提示 (
str
或List[str]
, 可选) — 不引导图像生成的提示或提示。如果未定义,则必须传递negative_prompt_embeds
。在不使用引导时忽略(即,如果guidance_scale
小于1
,则忽略)。 - prompt_embeds (
torch.Tensor
,可选) — 预生成的文本嵌入。可用于轻松调整文本输入,例如提示权重。如果未提供,则将从prompt
输入参数生成文本嵌入。 - negative_prompt_embeds (
torch.Tensor
,可选) — 预生成的负文本嵌入。可用于轻松调整文本输入,例如提示权重。如果未提供,则将从negative_prompt
输入参数生成negative_prompt_embeds。 - clip_skip (
int
,可选) — 计算提示嵌入时要从CLIP跳过的层数。值为1表示将使用倒数第二层的输出计算提示嵌入。
将提示编码为文本编码器隐藏状态。
I2VGenXLPipelineOutput
类 diffusers.pipelines.i2vgen_xl.pipeline_i2vgen_xl.I2VGenXLPipelineOutput
< 源代码 >( frames: Union )
图像到视频管道输出类。
长度为num_frames
的PIL图像序列。它也可以是形状为(batch_size, num_frames, channels, height, width)
的NumPy数组或Torch张量。