1. 引言
视频生成是人工智能领域最具挑战性的任务之一,要求模型同时理解和建模空间信息(图像内容)和时序动态(物体运动、光照变化等)。视频扩散模型(Video Diffusion Models)将扩散模型的强大生成能力从图像扩展到时间维度,成为当前视频生成的主流方法。
本专题将系统介绍视频扩散模型的基础知识、核心架构和评估方法。
2. 视频扩散模型概述
2.1 核心思想
视频扩散模型的核心思想与图像扩散模型一脉相承:将视频生成过程建模为从噪声逐步去噪的过程。区别在于,视频被视为时空维度上的三维信号 ,需要在去噪过程中同时考虑空间相关性和时序连贯性。
其中 表示从第1帧到第T帧的视频序列。
2.2 视频生成任务的分类
视频生成任务可根据条件类型分为以下几类:
| 任务类型 | 输入 | 输出 | 代表模型 |
|---|---|---|---|
| 文本到视频 (Text-to-Video) | 文本描述 | 对应视频 | Sora、Pika、Kling |
| 图像到视频 (Image-to-Video) | 初始帧 | 延续视频 | I2VGen-XL |
| 视频到视频 (Video-to-Video) | 视频+风格 | 风格化视频 | ControlVideo |
| 视频预测 (Video Prediction) | 初始帧序列 | 未来帧 | DMVFN |
2.3 时间维度的处理挑战
视频生成面临的核心挑战包括:
- 时序一致性:物体外观、背景、光照等需要在整个视频中保持一致
- 运动合理性:物体运动应符合物理规律
- 长程依赖:远距离帧之间需要保持逻辑连贯
- 计算效率:视频数据量远大于图像,显存和计算成本高
3. 3D扩散架构
3.1 3D U-Net结构
视频扩散模型通常采用扩展到三维的U-Net架构处理时空数据:
import torch
import torch.nn as nn
class Video3DUNet(nn.Module):
"""
视频3D U-Net核心结构
处理形状为 (B, C, T, H, W) 的视频张量
"""
def __init__(self, in_channels=4, out_channels=4, base_channels=64):
super().__init__()
# 时间维度下采样
self.time_down = nn.Conv3d(
in_channels, base_channels,
kernel_size=(3, 7, 7),
stride=(1, 2, 2),
padding=(1, 3, 3)
)
# 编码器阶段
self.enc1 = EncoderBlock(base_channels, base_channels) # T, H/2, W/2
self.enc2 = EncoderBlock(base_channels, base_channels * 2) # T, H/4, W/4
self.enc3 = EncoderBlock(base_channels * 2, base_channels * 4) # T, H/8, W/8
# Bottleneck
self.bottleneck = BottleneckBlock(base_channels * 4)
# 解码器阶段
self.dec3 = DecoderBlock(base_channels * 4, base_channels * 2)
self.dec2 = DecoderBlock(base_channels * 2, base_channels)
self.dec1 = DecoderBlock(base_channels, base_channels)
# 时间维度上采样
self.time_up = nn.ConvTranspose3d(
base_channels, out_channels,
kernel_size=(3, 4, 4),
stride=(1, 2, 2),
padding=(1, 1, 1)
)3.2 时空注意力机制
视频模型中的注意力机制需要同时建模空间和时间维度的依赖关系:
3.2.1 分离时空注意力 (Factorized Attention)
将3D注意力分解为空间注意力和时间注意力的组合:
class FactorizedAttention(nn.Module):
"""
分离时空注意力
先做空间注意力,再做时间注意力
"""
def __init__(self, dim, num_heads=8):
super().__init__()
self.spatial_attn = SpatialAttention(dim, num_heads)
self.temporal_attn = TemporalAttention(dim, num_heads)
def forward(self, x):
# x: (B, T, N, D) 其中 N = H*W
B, T, N, D = x.shape
# 空间注意力:建模同帧内像素关系
x = self.spatial_attn(x) # (B, T, N, D)
# 时间注意力:建模跨帧时序关系
x = self.temporal_attn(x) # (B, T, N, D)
return x3.2.2 3D全注意力
直接在时空维度上应用注意力,适合短视频:
class Full3DAttention(nn.Module):
"""
3D全注意力
考虑所有时空位置的依赖关系
"""
def __init__(self, dim, num_heads=8):
super().__init__()
self.num_heads = num_heads
self.head_dim = dim // num_heads
self.scale = self.head_dim ** -0.5
# QKV投影
self.qkv = nn.Linear(dim, dim * 3)
self.proj = nn.Linear(dim, dim)
def forward(self, x):
# x: (B, T, H, W, D)
B, T, H, W, D = x.shape
N = T * H * W
# 重塑为序列形式
x_flat = x.view(B, N, D)
# 计算QKV
qkv = self.qkv(x_flat).reshape(B, N, 3, self.num_heads, self.head_dim)
q, k, v = qkv.unbind(2) # 各 (B, N, num_heads, head_dim)
# 注意力计算:O(N²) 复杂度
attn = (q @ k.transpose(-2, -1)) * self.scale
attn = attn.softmax(dim=-1)
# 输出
out = (attn @ v).reshape(B, N, D)
out = self.proj(out)
# 恢复原始形状
return out.view(B, T, H, W, D)3.2.3 稀疏3D注意力
针对长视频,使用稀疏注意力模式降低计算复杂度:
class Sparse3DAttention(nn.Module):
"""
稀疏3D注意力
- 空间:局部窗口注意力(类似Swin)
- 时间:因果注意力或滑动窗口
"""
def __init__(self, dim, window_size=8, num_heads=8):
super().__init__()
self.spatial_attn = WindowAttention(dim, window_size, num_heads)
self.temporal_attn = TemporalSlidingAttention(dim, window_size, num_heads)
def forward(self, x):
# 局部空间注意力
x = self.spatial_attn(x) # 窗口化处理
# 因果时间注意力
x = self.temporal_attn(x) # 只关注过去帧
return x3.3 时间下采样策略
视频帧数众多,直接处理所有帧计算量大。常用的时间下采样策略:
| 策略 | 方法 | 优点 | 缺点 |
|---|---|---|---|
| 均匀下采样 | 每隔k帧取一帧 | 简单 | 可能丢失快速运动 |
| 可学习下采样 | 3D卷积学习下采样 | 自适应 | 增加参数 |
| 稀疏采样 | 关键帧+插值 | 高效 | 需要关键帧检测 |
| 分层时间建模 | 金字塔结构 | 多尺度 | 复杂 |
4. 视频条件生成
4.1 文本条件注入
文本条件通过交叉注意力机制注入到去噪过程中:
class CrossAttention(nn.Module):
"""
交叉注意力:视频特征关注文本特征
"""
def __init__(self, video_dim, text_dim, num_heads=8):
super().__init__()
self.num_heads = num_heads
self.head_dim = video_dim // num_heads
# 视频Query投影
self.q_proj = nn.Linear(video_dim, video_dim)
# 文本Key-Value投影
self.k_proj = nn.Linear(text_dim, video_dim)
self.v_proj = nn.Linear(text_dim, video_dim)
def forward(self, video_feat, text_feat):
# video_feat: (B, N_video, D)
# text_feat: (B, N_text, D)
B, N_v, D = video_feat.shape
N_t = text_feat.shape[1]
# Q来自视频,K,V来自文本
q = self.q_proj(video_feat).view(B, N_v, self.num_heads, self.head_dim)
k = self.k_proj(text_feat).view(B, N_t, self.num_heads, self.head_dim)
v = self.v_proj(text_feat).view(B, N_t, self.num_heads, self.head_dim)
# 注意力
attn = (q @ k.transpose(-2, -1)) * (self.head_dim ** -0.5)
attn = attn.softmax(dim=-1)
out = (attn @ v).view(B, N_v, D)
return out4.2 图像/视频条件
图像到视频生成(I2V)通常使用以下策略:
- 特征拼接:将条件图像的特征与噪声视频拼接
- ControlNet风格:使用额外的条件分支控制生成
- 注意力掩码:在注意力计算中强调条件帧
class ImageConditionedVideoDiffusion(nn.Module):
"""
图像条件视频生成
"""
def __init__(self, unet, image_encoder):
super().__init__()
self.unet = unet
self.image_encoder = image_encoder
def forward(self, noisy_video, timestep, cond_image):
# 编码条件图像
img_feat = self.image_encoder(cond_image)
# 在去噪过程中注入条件
# 方法1: 特征拼接
noisy_video = torch.cat([noisy_video, img_feat], dim=1)
# 方法2: 交叉注意力
return self.unet(noisy_video, timestep, image_hint=img_feat)5. 视频生成质量评估
5.1 自动化评估指标
| 指标 | 全称 | 评估内容 | 局限性 |
|---|---|---|---|
| FVD | Fréchet Video Distance | 视频整体质量(FID变体) | 需要预训练网络 |
| CS@N | Clip Score @ N | 文本-视频对齐 | 忽略时序 |
| FID | Fréchet Inception Distance | 帧质量 | 不评估时序 |
| SSIM | Structural Similarity | 帧间相似度 | 不评估内容 |
| PSNR | Peak Signal-to-Noise Ratio | 像素级保真度 | 不评估感知质量 |
5.2 FVD计算实现
import torch
import torch.nn.functional as F
def compute_fvd(real_videos, generated_videos, feature_dim=2048):
"""
计算Fréchet Video Distance
"""
# 提取真实视频和生成视频的特征
real_features = extract_video_features(real_videos) # (N, feature_dim)
gen_features = extract_video_features(generated_videos) # (N, feature_dim)
# 计算均值和协方差
mu_real = real_features.mean(dim=0)
mu_gen = gen_features.mean(dim=0)
sigma_real = torch.cov(real_features.T)
sigma_gen = torch.cov(gen_features.T)
# Fréchet距离
diff = mu_real - mu_gen
covmean = matrix_sqrt(sigma_real @ sigma_gen)
fvd = diff @ diff + torch.trace(sigma_real + sigma_gen - 2 * covmean)
return fvd.item()5.3 时序一致性评估
时序一致性是视频生成特有的评估维度:
def evaluate_temporal_consistency(video):
"""
评估视频的时序一致性
"""
# 帧间光流差异(运动平滑度)
flows = compute_optical_flow(video) # 计算光流
flow_diffs = flows[:, 1:] - flows[:, :-1]
motion_smoothness = flow_diffs.abs().mean()
# LPIPS(Perceptual loss)
perceptual_consistency = compute_lpips(video[:, :-1], video[:, 1:])
# FID-Vid(视频级特征一致性)
clip_features = extract_clip_features(video) # 每帧特征
feature_variance = clip_features.var(dim=0).mean() # 特征变化应平稳
return {
'motion_smoothness': motion_smoothness.item(),
'perceptual_consistency': perceptual_consistency.item(),
'feature_variance': feature_variance.item()
}6. 主流视频生成模型对比
6.1 闭源商业模型
| 模型 | 公司 | 特点 | 局限性 |
|---|---|---|---|
| Sora | OpenAI | 长视频、物理准确 | 仅限红队访问 |
| Sora 2 | OpenAI | 同步音频、更强物理 | 商业使用受限 |
| Kling | 快手 | 高质量短视频 | 需申请 |
| Veo 2 | 物理模拟能力 | 集成在Vertex AI | |
| Runway Gen-3 | Runway | 影视级质量 | 商用成本高 |
| Pika 2.0 | Pika | 实时编辑能力 | 视频长度限制 |
6.2 开源模型
| 模型 | 机构 | 特点 |
|---|---|---|
| Open-Sora | 潞晨科技 | 完全开源、类Sora架构 |
| Open-Sora 2.0 | 社区 | 低成本训练($200k) |
| LLaVA-Video | 港中文 | 多模态视频理解 |
| CogVideoX | 智谱 | 中文优化 |
| I2VGen-XL | 阿里 | 图像到视频 |
6.3 架构演进趋势
- 从2D到3D:早期模型将图像模型扩展到时间维度;新模型原生设计3D架构
- 注意力机制优化:从Full Attention到Window/Sparse Attention降低计算量
- 长视频能力:通过分层生成、异步解码等技术生成更长视频
- 多模态条件:支持文本、图像、音频、姿态等多种条件输入
7. 实践指南
7.1 视频扩散模型选择
根据应用场景选择合适的模型:
| 场景 | 推荐模型 | 理由 |
|---|---|---|
| 学术研究 | Open-Sora | 完全可控、开源 |
| 快速原型 | Runway API | 易用、质量高 |
| 长视频生成 | Sora 2 | 最强长视频能力 |
| 开源部署 | CogVideoX | 中文优化、社区活跃 |
| 图像动画化 | I2VGen-XL | I2V能力强 |
7.2 训练数据准备
高质量视频数据的处理流程:
def prepare_video_dataset(video_paths, target_fps=8, target_frames=16, resolution=256):
"""
视频数据预处理
"""
videos = []
for path in video_paths:
# 1. 加载视频
frames = load_video(path)
# 2. 时间采样:均匀采样指定帧数
total_frames = len(frames)
indices = torch.linspace(0, total_frames-1, target_frames).long()
frames = frames[indices]
# 3. 空间裁剪与缩放
frames = resize_and_crop(frames, resolution)
# 4. 帧率调整
frames = adjust_fps(frames, target_fps)
# 5. 归一化
frames = frames / 127.5 - 1.0
videos.append(frames)
return torch.stack(videos) # (N, T, H, W, C)7.3 常见问题与解决
-
显存不足:
- 降低批量大小和视频分辨率
- 使用梯度检查点(Gradient Checkpointing)
- 启用混合精度训练
-
时序抖动:
- 增加时间注意力的感受野
- 使用时序判别器
- 引入光流损失
-
运动模糊:
- 在数据预处理中增强时序锐度
- 使用视频恢复网络作为后处理
- 增加运动约束条件
8. 总结与展望
视频扩散模型在短短几年内取得了惊人进展,从最初的几十帧短视频发展到如今可生成分钟级、高物理一致性的视频内容。关键技术演进包括:
- 架构创新:3D U-Net → 原生3D Transformer → 混合架构
- 注意力优化:Full → Window/Sparse → Linear Attention
- 长视频能力:分层生成、异步解码、潜在空间插值
- 多模态融合:文本、图像、音频、姿态的统一建模
未来方向
- 更长的视频生成:突破分钟级限制,实现故事级视频
- 更强的物理理解:模型需要更好地理解物理规律
- 实时生成:降低延迟,支持交互式视频生成
- 可控生成:精细控制视频的各个维度(物体、动作、场景)
- 视频编辑:从生成到编辑的范式转变