Skip to content

文本到视频

ModelScope 文本到视频技术报告 由 Jiuniu Wang、Hangjie Yuan、Dayou Chen、Yingya Zhang、Xiang Wang、Shiwei Zhang 撰写。

论文的摘要如下:

本文介绍了 ModelScopeT2V,一种从文本到图像合成模型(即 Stable Diffusion)演化而来的文本到视频合成模型。ModelScopeT2V 结合了时空块,以确保帧生成的连贯性和运动过渡的平滑性。该模型可以在训练和推理过程中适应不同的帧数,使其适用于图像-文本和视频-文本数据集。ModelScopeT2V 集成了三个组件(即 VQGAN、文本编码器和去噪 UNet),总共包含 17 亿个参数,其中 5 亿个参数专用于时间能力。该模型在三个评估指标上展示了优于现有最先进方法的性能。代码和在线演示可在 https://modelscope.cn/models/damo/text-to-video-synthesis/summary 获取。

你可以在 项目页面原始代码库 上找到有关文本到视频的更多信息,并在 演示 中尝试使用。官方检查点可在 damo-vilabcerspense 找到。

使用示例

text-to-video-ms-1.7b

让我们从生成一个默认长度为 16 帧(2 秒,8 fps)的短视频开始:

python
import torch
from diffusers import DiffusionPipeline
from diffusers.utils import export_to_video

pipe = DiffusionPipeline.from_pretrained("damo-vilab/text-to-video-ms-1.7b", torch_dtype=torch.float16, variant="fp16")
pipe = pipe.to("cuda")

prompt = "Spiderman is surfing"
video_frames = pipe(prompt).frames[0]
video_path = export_to_video(video_frames)
video_path

Diffusers 支持不同的优化技术来改善管道的延迟和内存占用。由于视频通常比图像更占用内存,我们可以启用 CPU 卸载和 VAE 切片来控制内存占用。

让我们使用 CPU 卸载和 VAE 切片在同一 GPU 上生成一个 8 秒(64 帧)的视频:

python
import torch
from diffusers import DiffusionPipeline
from diffusers.utils import export_to_video

pipe = DiffusionPipeline.from_pretrained("damo-vilab/text-to-video-ms-1.7b", torch_dtype=torch.float16, variant="fp16")
pipe.enable_model_cpu_offload()

# memory optimization
pipe.enable_vae_slicing()

prompt = "Darth Vader surfing a wave"
video_frames = pipe(prompt, num_frames=64).frames[0]
video_path = export_to_video(video_frames)
video_path

使用 PyTorch 2.0、"fp16" 精度和上述技术,生成 64 帧视频仅需 7 GB 的 GPU 内存

我们也可以轻松使用不同的调度器,使用与 Stable Diffusion 相同的方法:

python
import torch
from diffusers import DiffusionPipeline, DPMSolverMultistepScheduler
from diffusers.utils import export_to_video

pipe = DiffusionPipeline.from_pretrained("damo-vilab/text-to-video-ms-1.7b", torch_dtype=torch.float16, variant="fp16")
pipe.scheduler = DPMSolverMultistepScheduler.from_config(pipe.scheduler.config)
pipe.enable_model_cpu_offload()

prompt = "Spiderman is surfing"
video_frames = pipe(prompt, num_inference_steps=25).frames[0]
video_path = export_to_video(video_frames)
video_path

以下是一些示例输出:

cerspense/zeroscope_v2_576wcerspense/zeroscope_v2_XL

Zeroscope 是无水印模型,并且已经在特定尺寸上进行了训练,如 576x3201024x576。 首先应使用较低分辨率的检查点 cerspense/zeroscope_v2_576w 和 [TextToVideoSDPipeline] 生成视频, 然后可以使用 [VideoToVideoSDPipeline] 和 cerspense/zeroscope_v2_XL 进行放大。

py
import torch
from diffusers import DiffusionPipeline, DPMSolverMultistepScheduler
from diffusers.utils import export_to_video
from PIL import Image

pipe = DiffusionPipeline.from_pretrained("cerspense/zeroscope_v2_576w", torch_dtype=torch.float16)
pipe.enable_model_cpu_offload()

# memory optimization
pipe.unet.enable_forward_chunking(chunk_size=1, dim=1)
pipe.enable_vae_slicing()

prompt = "Darth Vader surfing a wave"
video_frames = pipe(prompt, num_frames=24).frames[0]
video_path = export_to_video(video_frames)
video_path

现在可以对视频进行放大:

py
pipe = DiffusionPipeline.from_pretrained("cerspense/zeroscope_v2_XL", torch_dtype=torch.float16)
pipe.scheduler = DPMSolverMultistepScheduler.from_config(pipe.scheduler.config)
pipe.enable_model_cpu_offload()

# memory optimization
pipe.unet.enable_forward_chunking(chunk_size=1, dim=1)
pipe.enable_vae_slicing()

video = [Image.fromarray(frame).resize((1024, 576)) for frame in video_frames]

video_frames = pipe(prompt, video=video, strength=0.6).frames[0]
video_path = export_to_video(video_frames)
video_path

以下是一些示例输出:

提示

视频生成是内存密集型的,减少内存使用的一种方法是设置管道中UNet的enable_forward_chunking,这样你就不必一次性运行整个前馈层。通过循环将其分解为块更高效。

查看文本或图像到视频指南,了解更多关于某些参数如何影响视频生成以及如何通过减少内存使用来优化推理的详细信息。

TextToVideoSDPipeline

[[autodoc]] TextToVideoSDPipeline - all - call

VideoToVideoSDPipeline

[[autodoc]] VideoToVideoSDPipeline - all - call

TextToVideoSDPipelineOutput

[[autodoc]] pipelines.text_to_video_synthesis.TextToVideoSDPipelineOutput