AIGC专栏11——EasyAnimateV2结构详解与Lora训练 最大支持768x768 144帧视频生成

AIGC专栏11——EasyAnimateV2结构详解与Lora训练 最大支持768x768 144帧视频生成

  • 学习前言
  • 源码下载地址
  • EasyAnimate V2简介
    • 技术储备
      • Diffusion Transformer (DiT)
      • Motion Module
      • U-VIT
      • Lora
    • 算法细节
      • 算法组成
      • 视频VAE
      • 视频DIT
    • 数据处理
      • 视频分割
      • 视频筛选
      • 视频描述
    • 模型训练
      • 视频VAE
      • 视频DIT
  • EasyAnimate V2的Lora训练
    • 数据集准备
    • 训练sh文件修改
    • 开始训练
    • 训练结果预测

学习前言

研究了好长时间的文生视频,EasyAnimate到了V2版本,我们将vae修改成了magvit,同时支持图片和视频的训练与预测,另外还引入了U-vit提高训练的稳定性并加快收敛。

现在EasyAnimate最大支持768x768 144帧的视频生成,FPS为24,最长6秒。本文主要进行EasyAnimateV2的算法详解,并且介绍一下如何通过EasyAnimate训练自己的Lora
在这里插入图片描述

源码下载地址

https://github.com/aigc-apps/EasyAnimate

感谢大家的关注。

EasyAnimate V2简介

技术储备

Diffusion Transformer (DiT)

DiT基于扩散模型,所以不免包含不断去噪的过程,如果是图生图的话,还有不断加噪的过程,此时离不开DDPM那张老图,如下:
在这里插入图片描述
DiT相比于DDPM,使用了更快的采样器,也使用了更大的分辨率,与Stable Diffusion一样使用了隐空间的扩散,但可能更偏研究性质一些,没有使用非常大的数据集进行预训练,只使用了imagenet进行预训练。

与Stable Diffusion不同的是,DiT的网络结构完全由Transformer组成,没有Unet中大量的上下采样,结构更为简单清晰。

在EasyAnimate中,我们将Motion Module网格化后引入到DIT中,借助DIT的强大生成能力,生成视频效果也还不错。

Motion Module

在这里插入图片描述
AnimateDiff是一个可以对文生图模型进行动画处理的实用框架,其内部设计的Motion Module无需进行特定模型调整,即可一次性为大多数现有的个性化文本转图像模型提供动画化能力。

EasyAnimate参考AnimateDiff使用Motion Module保证视频的连续性。

Motion Module只关注特征点在时间轴上的特征信息,以提炼出合理的运动先验,在AnimateDiff中只更新了运动模块的参数,所以Motion Module是一个可插入的结构,可以用在不同的微调backbone中。

在EasyAnimate中,为了更好的生成效果,我们将backbone连同motion module一起finetune,同时联合图片和视频一起finetune。在一个pipeline中即实现了图片的生成,也实现了视频的生成。

U-VIT

在这里插入图片描述
在训练过程中,我们发现纯DIT结构在训练视频时不算稳定,经常存在损失突然上升的情况,并且由于视频的特征层较大,拟合速度较慢。

参考U-vit,我们将跳连接结构引入到EasyAnimate当中,通过引入浅层特征进一步优化深层特征,并且我们0初始化了一个全连接层给每一个跳连接结构,使其可以作为一个可插入模块应用到之前已经训练的还不错的DIT中。

Lora

由《LoRA: Low-Rank Adaptation of Large Language Models》 提出的一种基于低秩矩阵的对大参数模型进行少量参数微调训练的方法,广泛引用在各种大模型的下游使用中。

EasyAnimate有良好的拓展性,我们可以对文生图模型训练Lora后应用到文生视频模型中。

算法细节

算法组成

我们使用了PixArt-alpha作为基础模型,并在此基础上引入额外的运动模块(motion module)来将DiT模型从2D图像生成扩展到3D视频生成上来。其框架图如下:

下图概述了EasyAnimate的管道。它包括Text Encoder、Video VAE(视频编码器和视频解码器)和Diffusion Transformer(DiT)。T5 Encoder用作文本编码器。其他组件将在以下部分中详细说明。
在这里插入图片描述

视频VAE

在早期的研究中,基于图像的VAE已被广泛用于视频帧的编码和解码,如AnimateDiff、ModelScope2V和OpenSora。在Stable Dif fusion使用VAE实现将每个视频帧编码为单独的潜在特征,从而将帧的空间维度显著缩小到宽度和高度的八分之一。但这种编码技术忽略了时间信息,将视频降级为静态图像表示。

传统的基于图像的VAE的一个显著问题是它无法在时间维度上进行压缩,这不仅无法关注到细微的帧间信息,并且导致潜在的latent的shape很大,进一步导致GPU VRAM的激增。这些挑战严重阻碍了这种方法在长视频创作中的实用性。因此,视频VAE的挑战在于如何有效地压缩时间维度。

此外,我们的同时需要使用图像和视频对VAE进行训练。先前的研究表明,将图像集成到视频训练Pipeline中可以更有效地优化模型架构,从而改进其文本对齐并提高输出质量。

视频VAE的一个著名例子是MagViT,大家均认为其被用于Sora框架。我们最初在EasyAnimate中采用MagViT。它采用Casual 3D Conv。在使用普通3D Conv之前,该块在时间轴前引入填充,从而确保每一帧可以利用它先前的信息来增强因果关系,同时不考虑到后帧的影响。另外MagViT还允许模型同时处理图像和视频。尽管它在视频编码和解码方面很优雅,但在超长视频序列上进行训练时,它仍面临挑战,这主要是GPU VRAM的限制。当视频增大时,MagViT所需的内存往往甚至超过A100 GPU的可用内存,这使得对大视频(例如1024x1024x40)进行一步解码变得不可行。这个挑战突出了分批处理的必要性,它有助于增量解码,而不是试图一步解码整个序列。

对于分批处理,我们首先在空间维度上(宽度和高度上)试验切片机制。然而,这可能导致一个视频不同块上有不一致的光照。随后,我们转向沿时间维度(时间上)进行切片。通过这种方法,一组视频帧被分为几个部分,每个部分都被单独编码和解码,如图所示。但由于MagViT的独特机制,3D Conv前需要进行前向填充,对应的潜在latent中,每个部分的第一个latent由于填充特征仅包含较少的信息。这种不均匀的信息分布是一个可能阻碍模型优化的方面此外,MagViT使用这种批处理策略还影响处理过程中视频的压缩率。
在这里插入图片描述
在这个基础上,我们提出了Slice VAE,该VAE在面临不同输入时使用不同的处理策略,当输入的是视频帧时,则在高宽与时间轴上进行压缩当输入为512x512x8的视频帧时,将其压缩为64x64x2的潜在latent当输入的是图片时,则仅仅在高宽上进行压缩,当输入为512x512的图片时,将其压缩为64x64x1的潜在latent。

为了进一步提高解码的性能,我们在不同的时间轴批次之间实现特征共享,如图(b)所示。在解码过程中,特征与它们的前一个和后一个特征相连,从而产生更一致的特征并实现比MagViT更高的压缩率。通过这种方式,编码的特征封装了时间信息,这反过来又节省了计算资源,同时提高了生成结果的质量

视频DIT

在这里插入图片描述
参考AnimateDiff,我们设计了Motion Module运动模块,运动模块专门设计用于嵌入时间信息。通过在时间维度上集成注意力机制,该模型获得了时间轴上的先验知识,这对生成视频运动至关重要。

另外,我们在EasyAnimateV2中引入了U-VIT,在训练过程中,我们观察到深层DIT的训练经常是不稳定的,模型的损失有时候会从0.05急剧增加到0.2,最终增加到1.0。为了加强模型优化过程,避免DIT层反向传播过程中的梯度坍塌,我们在相应的Transform Block之间使用了跳连接,这种基于UNet的框架对于Stable Diffusion模型来说是有效的。为了将这种修改无缝集成到现有的扩散变换器架构中,而无需进行全面的再训练,我们初始化了几个具有零填充权重的完全连接层,如上图(c)中的灰色块。

数据处理

对于大模型而言,数据准备很多时候比模型本身更加重要,EasyAnimate的训练包括图像数据和视频数据。下文详细介绍了视频数据处理方法,包括三个主要阶段:视频分割、视频过滤和视频描述。

这些步骤对于挑选具有详细描述的高质量视频数据至关重要。

视频分割

对于较长的视频分割,我们使用PySceneDetect以识别视频内的场景变化并基于这些转换,根据一定的门限值来执行场景剪切,以确保视频片段的主题一致性。切割后,我们只保留长度在3到10秒之间的片段用于模型训练。

视频筛选

我们从三个方面对视频数据进行过滤,即运动过滤、文本过滤和美学过滤

运动过滤:在视频生成模型的训练过程中,确保视频显示运动感,将其与静态图像区分开来,这一点至关重要。同时,保持动作的一致性至关重要,因为过于不稳定的动作会削弱视频的整体稳定性。为此,我们利用RAFT以指定的每秒帧数(FPS)计算帧之间的运动分数,并用合适的运动分数对视频进行滤波,以微调动态。

文本过滤:视频数据往往包含特定的文本信息(如字幕),这不利于视频模型的学习过程。为了解决这个问题,我们使用光学字符识别(OCR)来确定视频中文本区域的比例面积。对采样的帧进行OCR以表示视频的文本分数。然后,我们过滤掉文本所占区域超过视频帧1%的任何视频片段,确保剩余视频对模型训练保持最佳状态。

美学过滤:此外,互联网上有许多低质量的视频。这些视频可能缺乏主题焦点,或者过于模糊。为了提高我们训练数据集的质量,我们基于improved-aesthetic-predictor计算了美学分数并保存高分视频,为我们的视频生成获得视觉吸引力的训练集。

视频描述

视频字幕的质量直接影响生成视频的结果。我们对几种大型多式联运模型进行了全面比较,权衡了它们的性能和运营效率。经过仔细考虑和评估,我们选择VideoChat2和VILA作为视频数据字幕的任务,因为它们在我们的评估中表现出了卓越的性能,表明它们在实现具有细节和时间信息的视频字幕方面特别有前景。

模型训练

总共,我们使用大约1200万个图像和视频数据来训练视频VAE模型和DiT模型。我们首先训练视频VAE,然后使用三阶段粗到细训练策略将DiT模型适应于新的VAE。

视频VAE

MagViT:我们使用了β=(0.5,0.9)、学习率为1e-4的Adam优化器进行训练,总共训练了350k个步骤。我们的总批量是128。
Slice VAE:我们根据上述MagViT初始化Slice VAE的权重。然后分两个阶段训练切片VAE。首先,我们在200k步内使用Adam优化器,β=(0.5,0.9),批量大小=96,学习率为1e-4训练整个VAE。接下来,参考Stable Diffusion的程序,我们只在100k步的第二阶段训练解码器,以更好地提高解码视频的保真度。
在这里插入图片描述

视频DIT

在这里插入图片描述
如图所示,dit模型的训练分为三个阶段。

最初,在引入新的视频VAE时,我们开始将DiT参数与该VAE对齐,此时仅使用图像数据。

随后,我们使用大规模视频数据集和图像数据来预训练运动模块(Motion Module),从而引入DiT的视频生成能力。在此处,我们引入了数据集分桶策略用于以不同的视频分辨率进行训练。目前,虽然该模型能够生成具有基本运动的视频,但输出的质量往往不太理想。

最后,我们使用高质量的视频数据来完善整个DiT模型,以增强其生成性能。

该模型是从较低分辨率到较高分辨率逐步训练的,这是节省GPU内存和减少计算时间的有效策略。

EasyAnimate V2的Lora训练

数据集准备

我们提供了一个可供EasyAnimate V2进行Lora训练的图文数据集。

这是一个人像的Minimalism极简风数据集,共包含约20张图片,其中demo如下所示:
请添加图片描述
数据集中已经提供了标注信息。我们可以将其放置在datasets目录下,如下图所示。在这里插入图片描述
在这里我们即可使用相对路径也可以使用绝对路径,为了不同机器的使用方便,这里我使用了相对路径。

如果同学们期待使用自己的数据集进行训练,训练准备数据集json文件,数据集json文件的格式如下:

[
    {
      "file_path": "videos/00000001.mp4",
      "text": "A group of young men in suits and sunglasses are walking down a city street.",
      "type": "video"
    },
    {
      "file_path": "train/00000001.jpg",
      "text": "A group of young men in suits and sunglasses are walking down a city street.",
      "type": "image"
    },
    .....
]

其中,file_path指的是文件的路径,type指的是文件的种类,有video和image两种,text指的是视频对应的描述。

训练sh文件修改

训练Lora权重需要使用到scripts/train_t2iv_lora.sh文件,我们主要修改其中的DATASET_NAME和DATASET_META_NAME。

DATASET_NAME指向了数据集相对路径的根目录,以本文的摆放路径为例,直接指定EasyAnimate的根目录即可,即"./"
DATASET_META_NAME指向了数据集对应的json文件,指向Minimalism下的json文件,即"datasets/Minimalism/metadata_add_width_height.json"即可。

为满足更低的显卡需求,在这里我们开启low_vram减少显存需求,当前最低显存要求为24G,对应A10、3090、4090、4090D显卡。
在这里插入图片描述

开始训练

开始训练的流程较为简单,在配置好的环境下直接sh scripts/train_t2iv_lora.sh即可。
在这里插入图片描述
开始训练后如下所示:
在这里插入图片描述

训练结果预测

我们首先将训练好的Lora移动到指定的文件夹。

然后python app.py启动webui,在页面上进行选择。
在这里插入图片描述
在这里插入图片描述
点击下方的生成即可获得结果。
生成结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/683162.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数智化CIO展】吉家宠物CIO张志伟:深度挖掘数据价值是数字化发展趋势,才能实现企业精细化运营...

张志伟 本文由吉家宠物CIO张志伟投递并参与由数据猿联合上海大数据联盟共同推出的《2024中国数智化转型升级优秀CIO》榜单/奖项评选。丨推荐企业:观远数据 大数据产业创新服务媒体 ——聚焦数据 改变商业 中国“宠物经济”热潮不断攀升,国内宠物市场的竞…

InnoDB存储引擎非常重要的一个机制--MVCC(多版本并发控制)

Mysql是如何实现隔离性的?(锁MVCC) 隔离性是指一个事务内部的操作以及操作的数据对正在进行的其他事务是隔离的,并发执行的各个事务之间不能相互干扰。隔离性可以防止多个事务并发执行时,可能存在交叉执行导致数据的不…

Android 如何保证开启debug模式之后再启动

很多时候会需要debug看Android启动时候的一些数据,但很多时候会存在自己开启debug后app已经过了自己要debug的那段代码的时机了。 那么怎么样可以保证一定能让启动后不会错过自己要debug的那段代码执行的时机呢? 可以用下面这行命令,其中co…

记忆化搜索汇总

记忆化搜索简介 记忆化搜索(Memoization Search):是一种通过存储已经遍历过的状态信息,从而避免对同一状态重复遍历的搜索算法。 记忆化搜索是动态规划的一种实现方式。在记忆化搜索中,当算法需要计算某个子问题的结果…

Nginx+Tomcat负载均衡、动静分离集群

目录 1.Nginx负载均衡 1.1 负载均衡概念 1.2 负载均衡原理 1.3 Nginx配置反向代理 1.3.1 反向代理概念 1.3.2 反向代理主要参数 2.Nginx动静分离 2.1 动静分离的概念 2.2 Nginx 静态处理优势 2.3 动静分离原理 3. NginxTomcat动静分离的实验设计 3.1 准备三台虚拟机…

Java速成要多久?这篇文章告诉你答案!

Java速成要多久?这篇文章告诉你答案! Java作为一门用途广泛且经久不衰的编程语言,吸引了无数学习者的目光。许多人希望能够快速掌握Java,以便进入软件开发行业或者提升自身的竞争力。那么,Java速成究竟要多久呢&#x…

【遗传算法】【机器学习】【Python】常见交叉方法(二)、多点交叉和均匀交叉

一、遗传算法流程图 交叉过程即存在于上图的”交叉“(crossover)步骤中。 二、多点交叉 多点交叉的原理就是,随机地从父代两个基因型中,选择n个位点进行交换,其中n小于等于父代基因型长度(假设双亲基因长…

基于小波变换和峰值搜索的光谱检测matlab仿真,带GUI界面

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于小波变换和峰值搜索的光谱检测matlab仿真,带GUI界面.对光谱数据的成分进行提取,分析CO2,SO2,CO以及CH4四种成分比例。 2.…

【越界写null字节】ACTF2023 easy-netlink

前言 最近在矩阵杯遇到了一道 generic netlink 相关的内核题,然后就简单学习了一下 generic netlink 相关概念,然后又找了一到与 generic netlink 相关的题目。简单来说 generic netlink 相关的题目仅仅是将用户态与内核态的交互方式从传统的 ioctl 变成…

使用from…import语句导入模块

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在使用import语句导入模块时,每执行一条import语句都会创建一个新的命名空间(namespace),并且在该命名…

类的特殊成员函数

使用类的嵌套&#xff0c;并自定义析构函数 #include <iostream>using namespace std; class Per{ private:string name;int age;double hight;double weight; public:Per(string name,int age,double hight,double weight):name(name),age(age),hight(hight),weight(we…

当边缘计算用在定位设备

什么是边缘计算&#xff1f; 边缘计算是个比较高大上的概念&#xff0c;在这里就不提众多官方与非官方的定义了&#xff0c;只说说自己的理解。 边缘计算就是在最靠近物理设备的使用现场&#xff0c;利用有限的硬件资源&#xff0c;完成设备层数据采集、协议转换、数据上传、…

微信小程序开发的详细解读

目录 小程序的ID 小程序的项目结构 小程序调试基础库 小程序调试 小程序配置文件 Pages配置 Windows配置 tabbar配置 页面配置 项目配置文件 sitemap文件配置 样式与组件 小程序常用组件 轮播图组件 图片组件 Text组件 跳转方式 滚动方式 字体图表使用 背景…

用python写一个基于PyQt5和OpenAI的智能问答项目

摘要&#xff1a; 使用python写一个可以对话的智能问答机器人&#xff0c;界面是使用PyQt5写的&#xff0c;通过调用OpenAl的免费接口&#xff0c;实现实时聊天功能。 1.申请免费的API key 前往页面https://github.com/chatanywhere/GPT_API_free 点击下面链接&#xff1a; …

寻找 llvm v3.5 的目标代码生成模块

summ.c --(clang -emit-llvm -S)--> summ.ll --(llvm-as)----> summ.bc --(llc)---> summ.s opt -S -O2 实施机器无关优化&#xff0c;跟后端目标代码生成无关&#xff0c;故llc是llvm的后端。 1&#xff0c;示例代码 summ.c int adddd(int aaa, in…

Rethinking overlooked aspects in vision-language models

探讨多模态视觉语言模型的一些有趣结论欢迎关注 CVHub!https://mp.weixin.qq.com/s/zouNu-g-33_7JoX3Uscxtw1.Introduction 多模态模型架构上的变化不大,数据的差距比较大,输入分辨率和输入llm的视觉token大小是比较关键的,适配器,VIT和语言模型则不是那么关键。InternVL-…

【ArcGIS微课1000例】0017:ArcGIS中如何将kml(kmz)文件转json(geojson)?

文章目录 一、kml获取方式二、kml转图层三、图层转json一、kml获取方式 kml文件是一种很常用的数据格式,可以从谷歌地球(googleearth)获取某一个地区的kml范围文件,如青海湖(做好的kml文件可以从配套实验数据包0117.rar中获取)。 二、kml转图层 打开【KML转图层】工具,…

java判断对象是否还在被引用

1、代码取消强引用后&#xff0c;gc回收对象 public static void main(String[] args) {Object obj new Object();WeakReference<Object> weakRef new WeakReference<>(obj);System.out.println(weakRef.get());obj null; // 取消强引用,后续gc会被回收,如果不…

Web IDE 在线编辑器综合实践(Web IDE 技术探索 三)

前言 前面两篇文章&#xff0c;我们简单讲述了 WebContainer/api 、Terminal 的基本使用&#xff0c;离完备的在线代码编辑器就差一个代码编辑了。今天通过 monaco editor &#xff0c;来实现初级代码编辑功能&#xff0c;讲述的是整个应用的搭建&#xff0c;并不单独针对monac…

nginx --- 反向代理|负载均衡 | 动静分离

目录 反向代理如何配置 1、反向代理实例一 2、反向代理实例二 ocation 指令说明 Nginx 负载均衡 负载均衡常用算法 应用场景 总结 Nginx实现动静分离 一、什么是动静分离 二、实现方案 三、配置Nginx动静分离 四、验证测试 反向代理如何配置 1、反向代理实例一 实…