★★★ 本文源自AlStudio社区精品项目,【点击此处】查看更多精品内容 >>>

一、项目介绍

该项目的趣味点在于可以根据用户输入的文本提示生成视频或对输入视频进行编辑。相比于先前的文本到视频生成模型,Text2Video-Zero不再需要高昂的训练成本和大量的视频数据, 可以直接基于现有文本-图像生成模型进行推理。同时,Text2Video-Zero 并不局限于文本-视频生成任务,还可以应用于特定条件或内容的视频生成、视频编辑(Video Instruct-Pix2Pix)等。这里,由于原始项目涉及到 InstructPix2Pix、ControlNet、Dreambooth、Lora 等诸多文本-图像生成大模型,全部实现工作量较大,本项目只实现了 Text-To-Video 和 Video Instruct-Pix2Pix 两部分,其他功能会在后续项目中进行更新。

该项目是对 Text2Video-Zero (pytorch)官方项目的 paddle 实现, 可以在 V100 16G 环境下运行,但是如果想要顺畅运行,建议使用 V100 32 G 环境, 由于stable diffusion 系列模型占用显存较大,使用 V100 16G 环境可能需要频繁重启内核。 该项目的主要工作是对 Text2Video-Zero 的核心代码 及依赖库 kornia 部分函数进行复现,并通过 PaddleNLP中 Instruct-Pix2Pix 图像编辑模型、stable-diffusion-v1-5 图像生成模型,完成 Text-To-Video 和 Video Instruct-Pix2Pix 两个子功能的实现。需要注意的是,官方项目的 Text-To-Video 部分采用 dreamlike-art/dreamlike-photoreal-2.0 ,但是 PaddleNLP中并没有该模型,因此使用 stable-diffusion-v1-5 替代。由于两种模型的提示词不同,有些提示词(如:panda、street)生成的视频可能效果极差。此外, 由于 paddle 的随机因子和 torch 不同,生成的视频可能与官方项目有所差异。

下面是 Text2Video-Zero 的一些有趣例子,左图为 Text-To-Video (文本-视频生成)结果,文本提示词为 A horse galloping on a stree(一匹马在街道上奔驰),右图为 Video Instruct-Pix2Pix (文本-视频编辑)结果,文本提示词为 make it Van Gogh Starry Night style (将其更改为梵高星空风格)

二、详细说明

创意来源 :现有的文本-视频生成方法需要极其高昂的计算资源和大量的文本-视频数据集(如: CogVideo、 Gen-1),对大多数用户来说并不友好。此外,很多时候,单纯使用文本提示生成视频,生成的内容较为抽象,不一定符合用户的需求。因此,在某些情况下,用户需要提供参考视频,并通过文本提示对视频内容进行编辑。综上所述,Text2Video-Zero 可以通过运动动力学、帧间注意力机制等技术手段对原始的文本-图像模型进行修改,使其可以完成文本-视频任务,且不需任何训练,在混合精度推理情况下可将显存大小降到16G之内,是一种十分理想的文本-视频生成方法。目前,ppdiffusers 中文本-图像生成模型较多,文本-视频生成模型很少,且市面上很多文本-视频模型不对外公开,因此实现 Text2Video-Zero 对丰富 paddle 的 AIGG 生态具有极其重要的意义。比如:Video Instruct-Pix2Pix 文本-视频编辑结果拼接在一起可以实现类似与 runaway 中的瞬息全宇宙的效果。

目前相关的项目: Text2Video-Zero 官方项目地址为:https://github.com/Picsart-AI-Research/Text2Video-Zero 。目前,由于官方项目涉及到太多文本-图像生成模型,本项目只实现了官方项目的 Text-To-Video 和 Video Instruct-Pix2Pix 两部分。此外,同类的 文本-视频生成项目还包括 Tune-A-Video,项目地址如下: https://github.com/showlab/Tune-A-Video。 如下图所示, Tune-A-Video 在编辑视频过程中会对视频原有的语义信息进行较大变动(左图文本提示为“将衣服颜色变为白色”, Tune-A-Video 连人的大小和背景都改变了),且训练单个视频需要15-20分钟,用户需要等待较长时间。Text2Video-Zero 只需要 2-3分钟左右。

技术细节:Text2Video-Zero 的项目架构图如下:该方法以随机采样潜在编码 x T 1 x_T^1 xT1 为起点,使用预训练的 Stable Diffusion 模型(SD),通过 DDIM 反向传播 Δ t \Delta t Δt 步来获得 x T ′ 1 x_{T^{\prime}}^1 xT1 。对于每一帧 k k k,作者使用变形函数将 x T ′ 1 x_{T^{\prime}}^1 xT1 变换为 x T ′ k x_{T^{\prime}}^k xTk ,从而获得特定的运动场结果。通过使用运动动力学对潜在编码进行增强,模型可以确定全局场景和相机运动,从而实现背景和全局场景的时间一致性。之后,作者使用 DDPM 前向传播对潜在编码 x T k x_T^k xTk k = 1 , … , m k=1, \ldots, m k=1,,m 进行传递。这里。概率 DDPM方法可以实现更大自由度的物体运动。再然后,作者将潜在编码传递到使用帧间注意力机制修改后的 SD 模型中。帧间注意力机制使用第一帧的 key 和 value 来生成整个视频序列的图像。通过帧间注意力机制,前景物体的身份和外观可以在视频序列中保留。不仅如此,作者还对生成的视频序列使用了背景平滑技术。具体来说,作者使用显著目标检测来获得每一帧 k k k 中暗示了前景像素的掩模 M k M^k Mk ,并对掩模 M k M^k Mk 中的背景部分,使用第一帧变换到第 k k k 帧的潜在编码 x t 1 x_t^1 xt1 和潜在编码 x t k x_t^k xtk 来进一步提高背景的时间一致性。

下面将对项目的具体实现步骤进行阐述。由于代码块不会自动释放显存,项目模型显存占用率又比较高,必要时需要重启内核,释放显存。

项目演示视频https://www.bilibili.com/video/BV1BX4y1h7fA/?vd_source=57923d6572c5d874eb0a513ed8ca9b3d

AI Studio 有部分GPU 会出现上述问题。如果刚好被分配到这种 GPU,建议关闭项目后,等待一段时间,重新启动GPU,最好选择V100 32G 显存,16G显存出现该问题的可能性较大

2.1 环境配置

由于该项目需要调用 PaddleNLP 的 stable_diffusion_inpaint模型,因此需要安装 ppdiffusers 等相关库。此外,由于模型文件过大,两个模型加在一起约 10 G 左右,每次启动项目都要下载十分耗时,因此,这里将 stable-diffusion-v1-5 、 Instruct-Pix2Pix 权重文件 保存在 AI studio 数据集中,第一次运行项目,需要将上述权重文件解压到 AI Studio 本地路径,之后,可以直接从本地加载 stable-diffusion-v1-5 和 Instruct-Pix2Pix 文本-图像生成模型。

# 安装 pddiffuser及相关包,以便调用其中的paddlenlp 模型
!pip install --user ftfy regex
!pip install --user --upgrade ppdiffusers
# 安装decode,以便进行视频读取
!pip install  decord 
# 安装 omegaconf,以便读取配置文件
!pip install omegaconf
# 解压文本-图像生成模型 stable-diffusion-v1-5,该过程耗时2-3分钟左右,由于文本-图像类模型文件过大,这里使用AI Studio本地目录加载模型
# 该过程只需解压一次即可
%cd /home/aistudio/
!unzip /home/aistudio/data/data219562/instructpix2pix.zip
# 解压文本-图像编辑模型 instructpix2pix,该过程耗时2-3分钟左右,由于文本-图像类模型文件过大,这里使用AI Studio本地目录加载模型
# 该过程只需解压一次即可
%cd /home/aistudio/
!unzip /home/aistudio/data/data219562/stable-diffusion-v1-5.zip

由于新安装的依赖库不会同步更新到 notebook 中,此处需要先重启内核,再运行 2.2 之后的代码,否则会报错“找不到 ppdiffusers 环境”,其他找不到环境问题一般可以通过加入 --user 重新安装或者重启内核解决

2.2 使用 Text-To-Video 模型,进行文本-视频生成

# 切换到Text2Video-Zero_paddle目录下
%cd /home/aistudio/work/Text2Video-Zero_paddle/
# 导入相关包
from model import Model
import paddle
import warnings
warnings.filterwarnings("ignore")
import logging
import os
import argparse
# 屏蔽ppdiffusers运行过程中所产生的日志
logging.disable(logging.WARNING)
os.environ["TF_CPP_MIN_LOG_LEVEL"] = '0' 
# 进行模型初始化
model = Model(device = "cuda", dtype = paddle.float16)
# 设置随机种子
paddle.seed(1234)
# 设置文本提示词
prompt = "An astronaut dancing in Antarctica"
# 设置生成视频的长度
video_length = 2
# 设置模型参数
params = {"t0": 44, "t1": 47 , "motion_field_strength_x" : 12, "motion_field_strength_y" : 12, "video_length": video_length }
# 设置生成视频输出目录
output_dir = "/home/aistudio/work/Text2Video-Zero_paddle/output/text_to_video"
# 设置视频的保存格式,包含:gif 和 mp4 两种
save_format = "gif"
out_path = '{}/{}.{}'.format(output_dir,prompt,save_format)
# 设置帧数
fps = 4
# 定义模型一次处理的帧数量,数值越大,推理速度越快,显存占用越高,设置太大,需要A100 32G环境,需要在[2,视频长度之间]
chunk_size = 4
# 设置 stable-diffusion-v1-5 在AI Studio中的本地路径
model_path = "/home/aistudio/stable-diffusion-v1-5/runwayml/stable-diffusion-v1-5"
# 使用  Text-To-Video 模型进行文本-视频生成, 需要显存 15 G,耗时2-3分钟
model.process_text2video(prompt, model_name = model_path, fps = fps,save_path = out_path,save_format=save_format,\
 chunk_size= chunk_size ,is_gradio = False, **params)
from IPython.display import Image
# 文本-视频生成结果可视化
Image(filename=out_path)

2.3 使用 Video Instruct Pix2Pix 模型,进行文本-视频编辑

由于notebook 不会自动释放显存,之前 Text-To-Video 模型已经占用了15G左右显存,此处需要重启内核,再运行2.3 代码块

# 切换到Text2Video-Zero_paddle目录下
%cd /home/aistudio/work/Text2Video-Zero_paddle/
# 导入相关包
from model import Model
import paddle
import warnings
warnings.filterwarnings("ignore")
import logging
import os
import argparse
# 屏蔽ppdiffusers运行过程中所产生的日志
logging.disable(logging.WARNING)
os.environ["TF_CPP_MIN_LOG_LEVEL"] = '0' 
# 进行模型初始化
model = Model(device = "cuda", dtype = paddle.float16)
# 设置随机种子
paddle.seed(1234)
# 设置文本提示
prompt = "make it Van Gogh Starry Night style"
# 设置输入视频路径
video_path = '__assets__/pix2pix video/camel.mp4'
# 设置生成视频输出目录
output_dir = "/home/aistudio/work/Text2Video-Zero_paddle/output/video_instruct_pix2pix"
# 设置视频的保存格式,包含:gif 和 mp4 两种
save_format = "gif"
out_path = '{}/{}.{}'.format(output_dir,prompt,save_format)
# 定义模型一次处理的帧数量,数值越大,推理速度越快,显存占用越高,设置太大,需要A100 32G环境,需要在[2,视频长度之间]
chunk_size = 8
#  设置 Instruct Pix2Pix 在AI Studio中的本地路径
model_path = "/home/aistudio/instruct_Pix2Pix/timbrooks/instruct-pix2pix"
# 使用 Video Instruct Pix2Pix 模型进行文本-视频编辑, 需要显存 13.4G,耗时2-3分钟
model.process_pix2pix(video_path, prompt=prompt, resolution=384,model_path =  model_path,chunk_size= chunk_size ,\
  save_path=out_path,save_format=save_format,is_gradio = False)
from IPython.display import Image
# 文本-视频编辑结果可视化
Image(filename=out_path)

三、更多的结果展示

3.1 Text-To-Video

3.2 Video Instruct Pix2Pix

四、部署细节

在运行推理代码之前,请确保已经完成 2.1 环境配置中所有代码块的运行。如果运行了二、详细说明中的 2.2-2.3 代码块,请先重启内核,否则会导致显存崩溃。

4.1 Text-To-Video

根据用户输入的文本提示词生成相应视频。示例视频位于 /home/aistudio/work/Text2Video-Zero_paddle/assets/text_to_video 目录下,text_prompt.yaml 记录了视频生成的文本提示。使用模型推理时可选的一些参数如下:

  • text_prompt:(str)- -用于指导视频生成的文本提示。
  • model_path:(str)-文本生成图像模型在 AI studio 的本地路径,默认为 /home/aistudio/stable-diffusion-v1-5/runwayml/stable-diffusion-v1-5
  • output_dir:(str)-生成视频所在目录,默认输出结果保存在 /home/aistudio/work/Text2Video-Zero_paddle/output/text_to_video 目录下。
  • save_format:(str)-生成视频的保存格式,用户可保存为gifmp4 ,gif 格式可以在 AI studio 本地查看,mp4 格式需要下载后查看。
  • seed:(int)-用户固定生成结果的随机种子,默认为 1234 , 随机种子不同,生成的视频也不同。
  • resolution:(int)-生成视频的分辨率,默认为 384.
  • chunk_size:(int)-模型一次处理的帧数量,数值越大,推理速度越快,显存占用越高,设置太大,会导致显存崩溃,需要在 [2,视频长度] 之间,请确保该数值大于或等于视频长度的2倍, 否则,会导致生成视频的时序信息不一致。在 V100 32G环境下,可适当提高该数值,以提升推理速度。
  • video_length:(int)-输出视频的长度,请确保该数值小于或等于chunk_size的 1/2 倍, 否则,会导致生成视频的时序信息不一致
#  15 GB 显存,耗时 2-3 分钟左右
%cd /home/aistudio/work/Text2Video-Zero_paddle/
!python text_to_video.py\
    --text_prompt "ironman is dancing" \
    --model_path /home/aistudio/stable-diffusion-v1-5/runwayml/stable-diffusion-v1-5\
    --output_dir /home/aistudio/work/Text2Video-Zero_paddle/output/text_to_video \
    --save_format "gif" \
    --seed 1234 \
    --resolution  384 \
    --chunk_size 16 \
    --video_length 8

4.2 Video Instruct Pix2Pix

根据用户输入的文本提示词对视频进行编辑。示例视频位于 /home/aistudio/work/Text2Video-Zero_paddle/assets/pix2pix video 目录下,text_prompt.yaml 记录了视频编辑的文本提示。使用模型推理时可选的一些参数如下:

  • input_video:(str)- -输入视频路径。
  • text_prompt:(str)- -用于指导视频编辑的文本提示。
  • model_path:(str)-文本生成图像模型在 AI studio 的本地路径,默认为 /home/aistudio/instruct_Pix2Pix/timbrooks/instruct-pix2pix
  • output_dir:(str)-生成视频所在目录,默认输出结果保存在 /home/aistudio/work/Text2Video-Zero_paddle/output/video_instruct_pix2pix 目录下。
  • save_format:(str)-生成视频的保存格式,用户可保存为gifmp4 ,gif 格式可以在 AI studio 本地查看,mp4 格式需要下载后查看。
  • seed:(int)-用户固定生成结果的随机种子,默认为 1234 , 随机种子不同,生成的视频也不同。
  • resolution:(int)-生成视频的分辨率,默认为 384.
  • chunk_size:(int)-模型一次处理的帧数量,数值越大,推理速度越快,显存占用越高,设置太大,需要在 A100 32G环境下运行,此处由于是进行视频编辑任务,chunk_size 大小不会对视频编辑结果产生较大影响,因此可以随意设置,但需要保证在 [2,视频长度] 之间。
#  14 GB 显存,耗时 2-3分钟左右
%cd /home/aistudio/work/Text2Video-Zero_paddle/
!python pix2pix_video.py \
    --input_video  "/home/aistudio/work/Text2Video-Zero_paddle/__assets__/pix2pix video/boat.mp4" \
    --text_prompt "add city skyline in the background" \
    --model_path /home/aistudio/instruct_Pix2Pix/timbrooks/instruct-pix2pix \
    --output_dir /home/aistudio/work/Text2Video-Zero_paddle/output/video_instruct_pix2pix \
    --save_format "gif" \
    --seed 1234 \
    --resolution  384\
    --chunk_size 16 

五、Gradio 界面

在启动 Gradio 页面时,请确保显存为0%,如果不为0%,需要重启内核。由于 Gradio 页面不会自动释放显存, 启动每一个Gradio 页面,均需要重启内核。Gradio 页面位于 /home/aistudio/work/gradio 目录下,演示视频如下:https://www.bilibili.com/video/BV1Gh4y1s7N1/?vd_source=57923d6572c5d874eb0a513ed8ca9b3d。 启动过程需要运行两次,第一次运行将文本-视频生成模型加载到显存中,输出框中不会显示视频。刷新页面,第二次运行后,Gradio方可正常使用。在使用前,请务必观看完演示视频。

六、总结

该项目对 Text2Video-Zero 的核心代码 及依赖库 kornia 部分函数进行复现,并通过 PaddleNLP中 Instruct-Pix2Pix 图像编辑模型、stable-diffusion-v1-5 图像生成模型,完成 Text-To-Video 和 Video Instruct-Pix2Pix 两个子功能的实现。用户可以通过 Text-To-Video 模型实现低成本的文本-视频生成,利用Video Instruct-Pix2Pix 进行视频编辑。下一步计划是实现 Text2Video-Zero 中的其他功能,如:Text-To-Video with Pose Guidance(姿态引导的文本-视频生成)、Text-To-Video with Edge Guidance(边缘引导的视频文本生成)、Text-To-Video with Edge Guidance and Dreambooth specialization(边缘引导和特定Dreambooth 模型的视频文本-生成)、Text-To-Video with Depth Control(深度图引导的视频文本生成等)

参考项目:

【1】 Text2Video-Zero

【2】 Tune-A-Video

【3】 PPDiffusers: Diffusers toolbox implemented based on PaddlePaddle

【4】 AI Video】体验文本生成视频的趣味创作

此文章为搬运
原项目链接

Logo

学大模型,用大模型上飞桨星河社区!每天8点V100G算力免费领!免费领取ERNIE 4.0 100w Token >>>

更多推荐