当前位置: 首页 > news >正文

Wan2.1 文生视频 Wan2.1-T2V-14B-Diffusers

Wan2.1 文生视频 Wan2.1-T2V-14B-Diffusers

flyfish

# 设置环境变量,禁用TOKENIZERS_PARALLELISM以避免并行性警告
os.environ["TOKENIZERS_PARALLELISM"] = "false"# 导入必要的库
import torch  
from diffusers import AutoencoderKLWan, WanPipeline  # Wan模型相关的类
from diffusers.utils import export_to_video  # 工具函数,用于导出视频# 定义模型路径
# Available models: Wan-AI/Wan2.1-T2V-14B-Diffusers, Wan-AI/Wan2.1-T2V-1.3B-Diffusers
model_id = "/home/models/Wan-AI/Wan2.1-T2V-14B-Diffusers/"# 加载VAE(变分自编码器)模型
# VAE的作用是将图像压缩到潜在空间(latent space),以及从潜在空间重建图像
vae = AutoencoderKLWan.from_pretrained(model_id, subfolder="vae",  # 指定子文件夹为"vae"torch_dtype=torch.float32  # 使用float32精度加载模型
)# 加载WanPipeline管道
# WanPipeline是一个完整的文本到视频生成管道,包含所有必要组件
pipe = WanPipeline.from_pretrained(model_id, vae=vae,  # 将加载的VAE模型传入管道torch_dtype=torch.bfloat16  # 使用bfloat16精度加载模型,节省显存
)# 将模型移动到GPU设备上以加速计算
pipe.to("cuda")# 定义生成视频的正向提示(prompt)
# 这个提示描述了希望生成的内容
prompt = "A cat walks on the grass, realistic"# 定义负向提示(negative prompt)
# 负向提示用于指定不希望在生成内容中出现的特征
negative_prompt = ("Bright tones, overexposed, static, blurred details, subtitles, style, works, paintings, images, ""static, overall gray, worst quality, low quality, JPEG compression residue, ugly, incomplete, ""extra fingers, poorly drawn hands, poorly drawn faces, deformed, disfigured, misshapen limbs, ""fused fingers, still picture, messy background, three legs, many people in the background, walking backwards"
)# 使用管道生成视频
output = pipe(prompt=prompt,  # 正向提示negative_prompt=negative_prompt,  # 负向提示height=480,  # 视频的高度width=832,  # 视频的宽度num_frames=81,  # 视频的帧数guidance_scale=5.0  # 引导比例,控制生成内容与提示的匹配程度
).frames[0]  # 提取生成的第一段视频帧序列# 将生成的视频帧导出为MP4格式文件
export_to_video(output,  # 视频帧数据"output.mp4",  # 输出文件名fps=15  # 视频帧率(每秒15帧)
)

1. 环境变量设置

import os
os.environ["TOKENIZERS_PARALLELISM"] = "false"

这部分代码的作用是设置环境变量 TOKENIZERS_PARALLELISM"false"。在使用 huggingface/tokenizers 库时,该设置可以避免在多进程环境下由于并行化和进程分叉导致的死锁问题,消除相应的警告信息。

2. 导入必要的库

import torch
from diffusers import AutoencoderKLWan, WanPipeline
from diffusers.utils import export_to_video
  • AutoencoderKLWanWanPipeline:这两个类来自 diffusers 库,AutoencoderKLWan 通常用于处理自动编码器,它可以将输入数据编码为低维表示,再解码回原始数据;WanPipeline 是一个预定义的管道,用于简化模型的推理过程。
  • export_to_video:是 diffusers 库中的一个实用函数,用于将生成的视频帧序列导出为视频文件。

3. 模型相关设置

# Available models: Wan-AI/Wan2.1-T2V-14B-Diffusers, Wan-AI/Wan2.1-T2V-1.3B-Diffusers
model_id = "/home/models/Wan-AI/Wan2.1-T2V-14B-Diffusers/"
vae = AutoencoderKLWan.from_pretrained(model_id, subfolder="vae", torch_dtype=torch.float32)
pipe = WanPipeline.from_pretrained(model_id, vae=vae, torch_dtype=torch.bfloat16)
pipe.to("cuda:1")
  • model_id:指定了要使用的模型的路径,这里使用的是 Wan-AI/Wan2.1-T2V-14B-Diffusers 模型。
  • AutoencoderKLWan.from_pretrained:从指定的模型路径加载自动编码器,subfolder="vae" 表示从模型目录下的 vae 子文件夹中加载相关文件,torch_dtype=torch.float32 表示使用单精度浮点数进行计算。
  • WanPipeline.from_pretrained:从指定的模型路径加载预训练的管道,同时传入之前加载的自动编码器 vaetorch_dtype=torch.bfloat16 表示使用 bfloat16 数据类型进行计算,这种数据类型在一些 GPU 上可以提高计算效率。

4. 定义提示词和负提示词

prompt = "A cat walks on the grass, realistic"
negative_prompt = "Bright tones, overexposed, static, blurred details, subtitles, style, works, paintings, images, static, overall gray, worst quality, low quality, JPEG compression residue, ugly, incomplete, extra fingers, poorly drawn hands, poorly drawn faces, deformed, disfigured, misshapen limbs, fused fingers, still picture, messy background, three legs, many people in the background, walking backwards"
  • prompt:是一个文本提示,用于描述用户希望生成的视频内容,这里描述的是一只猫在草地上行走的逼真场景。
  • negative_prompt:是一个负提示,用于指定不希望在生成的视频中出现的特征,例如明亮的色调、过度曝光、静态画面、模糊的细节等。

5. 生成视频帧并导出视频

output = pipe(prompt=prompt,negative_prompt=negative_prompt,height=480,width=832,num_frames=81,guidance_scale=5.0
).frames[0]
export_to_video(output, "output.mp4", fps=15)
  • pipe:调用加载的管道模型进行推理,传入提示词、负提示词、视频的高度和宽度、帧数以及引导系数等参数。
    • heightwidth:指定生成视频的分辨率。
    • num_frames:指定生成视频的帧数。
    • guidance_scale:引导系数,用于控制生成结果与提示词的匹配程度,值越大,生成结果越接近提示词描述的内容。
  • output:获取生成的视频帧序列,frames[0] 表示取第一个视频帧序列。
  • export_to_video:将生成的视频帧序列导出为名为 output.mp4 的视频文件,fps=15 表示视频的帧率为 15 帧每秒。

WanPipeline

WanPipeline 类为文本到视频的生成任务提供了一个统一的接口,集成了文本编码、去噪和视频编解码等多个组件

类定义

class WanPipeline(DiffusionPipeline, WanLoraLoaderMixin):
  • WanPipeline 是自定义的类,它继承自 DiffusionPipelineWanLoraLoaderMixin
    • DiffusionPipeline 是一个基础的扩散模型管道类,提供了诸如模型下载、保存、在特定设备上运行等通用方法。
    • WanLoraLoaderMixin 可能是自定义的混入类,用于处理低秩自适应(LoRA)相关的加载逻辑。

功能和构造函数所需的参数

    r"""Pipeline for text-to-video generation using Wan.This model inherits from [`DiffusionPipeline`]. Check the superclass documentation for the generic methodsimplemented for all pipelines (downloading, saving, running on a particular device, etc.).Args:tokenizer ([`T5Tokenizer`]):Tokenizer from [T5](https://huggingface.co/docs/transformers/en/model_doc/t5#transformers.T5Tokenizer),specifically the [google/umt5-xxl](https://huggingface.co/google/umt5-xxl) variant.text_encoder ([`T5EncoderModel`]):[T5](https://huggingface.co/docs/transformers/en/model_doc/t5#transformers.T5EncoderModel), specificallythe [google/umt5-xxl](https://huggingface.co/google/umt5-xxl) variant.transformer ([`WanTransformer3DModel`]):Conditional Transformer to denoise the input latents.scheduler ([`UniPCMultistepScheduler`]):A scheduler to be used in combination with `transformer` to denoise the encoded image latents.vae ([`AutoencoderKLWan`]):Variational Auto-Encoder (VAE) Model to encode and decode videos to and from latent representations."""
  • 功能概述WanPipeline 用于基于文本生成视频。由于继承自 DiffusionPipeline
  • 参数说明
    • tokenizer:采用的是来自 T5 的 T5Tokenizer,具体为 google/umt5 - xxl 变体。其作用是把输入的文本转换为模型能够处理的 token 序列。
    • text_encoder:使用的是 T5 的 T5EncoderModel,同样是 google/umt5 - xxl 变体。它的任务是对输入的文本进行编码,将文本转换为特征表示。
    • transformer:是 WanTransformer3DModel 类型的条件变换器,其功能是对输入的潜在表示(latents)进行去噪处理。
    • scheduler:为 UniPCMultistepScheduler 类型的调度器,它与 transformer 配合使用,对编码后的图像潜在表示进行去噪。
    • vae:是 AutoencoderKLWan 类型的变分自编码器(VAE),能够将视频编码为潜在表示,也可以将潜在表示解码为视频。

相关文章:

  • 深度学习--激活函数
  • 【Bluedroid】A2DP Sink播放流程源码分析(二)
  • 关于在Spring Boot + SpringSecurity工程中Sercurity上下文对象无法传递至新线程的问题解决
  • 高级语言调用C接口(二)回调函数(3)C#
  • 智慧生态评估体系构建与三维可视化实践——基于多源数据融合的内蒙古风电场生态效应研究
  • 杰理10k3950温度测量
  • 3.数组(随想录)
  • C语言学习之sizeof函数和strlen函数
  • 【Code】《代码整洁之道》笔记-Chapter17-味道与启发
  • 云服务器和物理服务器有什么区别
  • 2025年3月,再上中科院1区TOP,“等级熵+状态识别、故障诊断”
  • 制作一款打飞机游戏教程6:射击优化
  • 【嵌入式八股5】C++:多线程相关
  • Python基础语法——注释和输入输出
  • Go 语言的 map 在解决哈希冲突时,主要使用了链地址法同时参考了开放地址法的思想即每个桶的 8个 key val对是连续的
  • 如何利用游戏盾提升在线游戏的安全性?
  • 2025 年蓝桥杯 Java B 组真题解析分享
  • 大模型平台Dify工作流高效调用Ragflow知识库,解决其原生知识库解析和检索能力不足的问题
  • 基于ssm的航空售票系统
  • by组态适用领域
  • KZ队史首冠,透过春决看CF电竞张扬的生命力
  • 女子“伸腿阻拦高铁关门”被行拘,事件追踪:当时发生了什么?
  • 花卉引流+商场促销,上海浦东用“花经济”带动“消费热”
  • 上海明天有雷雨、大风,下周气温在春日舒适区间
  • 西藏艺术来到黄浦江畔,“隐秘之门”艺术展外滩三号开幕
  • 特朗普就防卫负担施压日本,石破茂:防卫费应由我们自主决定