视频生成框架EasyAnimate正式开源!
近期,Sora模型的热度持续上涨,社区中涌现了一些类Sora的开源项目,这些项目均基于Diffusion Transformer结构,使用Transformer结构取代了UNet作为扩散模型的基线,旨在生成更长、更高分辨率、且效果更好的视频。EasyAnimate是阿里云人工智能平台PAI自主研发的DiT-based视频生成框架,它提供了完整的高清长视频生成解决方案,包括视频数据预处理、VAE训练、DiT训练、模型推理和模型评测等。在预训练模型的基础上,EasyAnimate可通过少量图片的LoRA微调来改变生成视频的风格,相比已有方案具有更好的扩展性和完整性。EasyAnimate在人工智能平台PAI上进行了集成,供用户一键训练和部署,其支持以下功能:
-
最大分辨率768x768,最长144帧的视频推理 (512x512分辨率可在A10 24G上推理)
-
DiT 基线模型的训练
-
DiT LoRA模型的训练(512x512分辨率可在A10 24G上训练图片Lora)
-
VAE模型的训练和推理
-
视频预处理
用户可以使用EasyAnimate来进行任意风格视频模型的训练和推理。目前,EasyAnimate项目仍处在初期,并将持续优化来达到更好的生成效果,欢迎大家持续关注~开源地址:GitHub - aigc-apps/EasyAnimate: 📺 An End-to-End Solution for High-Resolution and Long Video Generation Based on Transformer Diffusion技术报告:https://arxiv.org/abs/2405.18991
效果展示
上图包含了EasyAnimate部分测试视频的第一帧图像。更多结果可以参考EasyAnimate/scripts/Result_Gallery.md at v2 · aigc-apps/EasyAnimate · GitHub。
数据预处理
a、视频分割
对于较长的视频分割,EasyAnimate使用PySceneDetect以识别视频内的场景变化并基于这些转换,根据一定的门限值来执行场景剪切,以确保视频片段的主题一致性。切割后,我们只保留长度在3到10秒之间的片段用于模型训练。
b、视频清洗与描述
参考SVD的数据准备流程,EasyAnimate提供了一条简单但有效的数据处理链路来进行高质量的数据筛选与打标。并且支持了分布式处理来提升数据预处理的速度,其整体流程如下:
-
时长过滤: 统计视频基本信息,来过滤时间短/分辨率低的低质量视频
-
美学过滤: 通过计算视频均匀4帧的美学得分均值,来过滤内容较差的视频(模糊、昏暗等)
-
文本过滤: 通过easyocr计算中间帧的文本占比,来过滤文本占比过大的视频
-
运动过滤: 计算帧间光流差异来过滤运动过慢或过快的视频。
-
文本描述: 通过videochat2和vila对视频帧进行recaption。PAI也在自研质量更高的视频recaption模型,将在第一时间放出供大家使用。
模型结构
EasyAnimate使用了PixArt-alpha作为基础模型进行开发,并在此基础上修改了VAE和DiT的模型结构来更好地支持视频的生成。EasyAnimate的整体结构如下:
为了引入特征点在时间轴上的特征信息,EasyAnimate引入了运动模块(Motion Module),以实现从2D图像到3D视频的扩展。为了更好的生成效果,其联合图片和视频将Backbone连同Motion Module一起Finetune。在一个Pipeline中即实现了图片的生成,也实现了视频的生成。另外,参考U-ViT,其将跳连接结构引入到EasyAnimate当中,通过引入浅层特征进一步优化深层特征,并且0初始化了一个全连接层给每一个跳连接结构,使其可以作为一个可插入模块应用到之前已经训练的还不错的DIT中。同时,其提出了Slice VAE,用于解决MagViT在面对长、大视频时编解码上的显存困难,同时相比于MagViT在视频编解码阶段进行了时间维度更大的压缩。我们将在下面的部分对所使用的视频VAE,视频Diffusuion Transformer进行简单介绍,更多算法细节可查看技术报告。
a、视频VAE
视频VAE的一个著名例子是MagViT,大家均认为其被用于Sora框架。EasyAnimateV2版本采用MagViT进行探索研究。MagViT采用Casual 3D Conv。在使用普通3D Conv之前,该块在时间轴前引入填充,从而确保每一帧可以利用它先前的信息来增强因果关系,同时不考虑到后帧的影响。另外MagViT还允许模型同时处理图像和视频。尽管它在视频编码和解码方面很优雅,但在超长视频序列上进行训练时,它仍面临挑战,这主要是GPU VRAM的限制。当视频增大时,MagViT所需的内存往往甚至超过A100 GPU的可用内存,这使得对大视频(例如1024x1024x40)进行一步解码变得不可行。这个挑战突出了分批处理的必要性,它有助于增量解码,而不是试图一步解码整个序列。对于分批处理,其首先在空间维度上(宽度和高度上)试验切片机制。然而,这可能导致一个视频不同块上有不一致的光照。因此,其转向沿时间维度(时间上)进行切片。通过这种方法,一组视频帧被分为几个部分,每个部分都被单独编码和解码,如图所示。但由于MagViT的独特机制,3D Conv前需要进行前向填充,对应的潜在latent中,每个部分的第一个latent由于填充特征仅包含较少的信息。这种不均匀的信息分布是一个可能阻碍模型优化的方面。此外,MagViT使用这种批处理策略还影响处理过程中视频的压缩率。总结上述的结果,MagViT在处理极长视频序列的训练过程中面临挑战,对于一些大且长的视频序列,直接对完整视频序列编解码的编解码显存开销极大,因此需要用到批处理来进行改善。基于此,EasyAnimate 引入了一种切片机制到MagViT中,提出了Slice VAE,该VAE在面临不同输入时使用不同的处理策略,当输入的是视频帧时,则在高宽与时间轴上进行压缩,当输入为512x512x8的视频帧时,将其压缩为64x64x2的潜在latent;当输入的是图片时,则仅仅在高宽上进行压缩,当输入为512x512的图片时,将其压缩为64x64x1的潜在latent。所提出的Slice VAE的架构如上图所示。为了进一步提高解码的性能,EasyAnimate 在时间维度进行切片并引入了特征共享机制,从而获得时空更一致的特征,并在时间维度实现更高的压缩率。通过这种方式,编码的特征封装了时间信息,从而节省了计算资源,并同时提高了生成结果的质量。参考Stable Diffusion,EasyAnimate分两阶段训练了所提出的VAE,在第一阶段共同训练视频的编码器和解码器,在第二阶段仅对解码器进行微调来更好地提升解码视频的效果。Slice VAE的与相关Diffusion Transformer权重会在近期开源。
b、视频Diffusion Transformer
在图像DiT的基础上,EasyAnimate首先引入了Motion Module 在时序维度上引入注意力机制来让模型学习时序信息,以进行连续视频帧的生成。同时,利用额外的网格计算(Grid Reshape),来扩大注意力机制的input token数目,从而更多地利用图像的空间信息以达到更好的生成效果。运动模块专门设计用于嵌入时间信息。通过在时间维度上集成注意力机制,该模型获得了时间轴上的先验知识,这对生成视频运动至关重要。另外,由于观察到深层DIT的训练经常是不稳定的,模型的损失有时候会从0.05急剧增加到0.2,最终增加到1.0。为了加强模型优化过程,避免DIT层反向传播过程中的梯度坍塌,EasyAnimate在训练过程中引入了U-VIT,在相应的Transform Block之间使用了跳连接,这种基于UNet的框架对于Stable Diffusion模型来说是有效的。为了将这种修改无缝集成到现有的扩散变换器架构中,而无需进行全面的再训练,EasyAnimate初始化了几个具有零填充权重的完全连接层,如上图(c)中的灰色块。
训练过程
EasyAnimate的DiT模型训练分为三阶段。
首先,在图像数据上训练DiT模型来快速适应新训练的VAE模型。其次,融合了大量的图像和视频数据集来训练motion module模块,将DiT模型从图像生成迁移到视频生成上来。仅训练motion module的条件下,模型能够生成微动的视频,但生成的画面质量和运动范围有限。因此,在最后一个阶段,用进一步筛选后的高质量数据集对整个DiT模型进行微调来达到更好的模型效果。首先训练256x256x144的视频模型,然后扩展到512x512x144的视频模型,最后扩展到768x768x144的视频模型。
可扩展性(微调训练)
EasyAnimate不仅支持整个模型的基线训练,同时支持Lora训练,具有良好的可扩展性。以Lora训练为例,其可以支持使用视频数据或者图片数据对Backbone进行Lora训练,以引入期望运动的信息。EasyAnimate提供了一个Minimalism极简主义图片数据集,其中的demo图像如下所示:
参考Training-Lora-Wiki,完成Lora模型的微调后,可以进入页面中选择对应的Lora模型进行预测。
联系我们
-
项目开源地址:GitHub - aigc-apps/EasyAnimate: 📺 An End-to-End Solution for High-Resolution and Long Video Generation Based on Transformer Diffusion
-
钉钉交流群号: 77450006752
-
微信交流群:
参考文档
-
GitHub - aigc-apps/EasyAnimate: 📺 An End-to-End Solution for High-Resolution and Long Video Generation Based on Transformer Diffusion
-
magvit: GitHub - google-research/magvit: Official JAX implementation of MAGVIT: Masked Generative Video Transformer
-
PixArt: GitHub - PixArt-alpha/PixArt-alpha: PixArt-α: Fast Training of Diffusion Transformer for Photorealistic Text-to-Image Synthesis
-
Open-Sora-Plan: GitHub - PKU-YuanGroup/Open-Sora-Plan: This project aim to reproduce Sora (Open AI T2V model), we wish the open source community contribute to this project.
-
Open-Sora: GitHub - hpcaitech/Open-Sora: Open-Sora: Democratizing Efficient Video Production for All
-
Animatediff: GitHub - guoyww/AnimateDiff: Official implementation of AnimateDiff.
-
https://huggingface.co/liuhaotian/llava-v1.6-vicuna-7b
-
GitHub - baofff/U-ViT: A PyTorch implementation of the paper "All are Worth Words: A ViT Backbone for Diffusion Models".
相关文章:

视频生成框架EasyAnimate正式开源!
近期,Sora模型的热度持续上涨,社区中涌现了一些类Sora的开源项目,这些项目均基于Diffusion Transformer结构,使用Transformer结构取代了UNet作为扩散模型的基线,旨在生成更长、更高分辨率、且效果更好的视频。EasyAnim…...

【微机原理与汇编语言】并行接口8255实验
一、实验目的 掌握可编程并行接口芯片8255的工作原理及初始化方法掌握8255在实际应用中的硬件连接及编程应用 二、实验要求 根据实验室现有条件,针对实验任务,设计实验方案并进行实现。 三、实验内容 启动0#计数器,每计5个数(…...

Oracle表分区的基本使用
什么是表空间 是一个或多个数据文件的集合,所有的数据对象都存放在指定的表空间中,但主要存放的是表,所以称为表空间 什么是表分区 表分区就是把一张大数据的表,根据分区策略进行分区,分区设置完成之后,…...

6月5号作业
设计一个Per类,类中包含私有成员:姓名、年龄、指针成员身高、体重,再设计一个Stu类,类中包含私有成员:成绩、Per类对象p1,设计这两个类的构造函数、析构函数 #include <iostream>using namespace std; class Slu { priv…...

中继器、集线器、网桥、交换机、路由器和网关
目录 前言一、中继器、集线器1.1 中继器1.2 集线器 二、网桥、交换机2.1 网桥2.1.1 认识网桥2.1.2 网桥的工作原理2.1.3 生成树网桥 2.2 交换机2.2.1 交换机的特征2.2.2 交换机的交换模式2.2.3 交换机的功能 三、路由器、网关3.1 路由器的介绍3.2 路由器的工作过程3.2.1 前置知…...

揭秘相似矩阵:机器学习算法中的隐形“纽带”
在机器学习领域,数据的处理和分析至关重要。如何有效地从复杂的数据集中提取有价值的信息,是每一个机器学习研究者都在努力探索的问题。相似矩阵,作为衡量数据之间相似性的数学工具,在机器学习算法中扮演着不可或缺的角色。 相似矩…...

攻防世界—webbaby详解
1.ssrf注入漏洞 ssrf(服务端请求伪造)是一种安全漏洞,攻击者通过该漏洞向受害服务器发出伪造的请求,从而访问并获取服务器上的资源,常见的ssrf攻击场景包括访问内部网络的服务,执行本地文件系统命令&#…...

MySQL中:cmd下输入命令mysql -uroot -p 连接数据库错误
目录 问题cmd下输入命令mysql -uroot -p错误 待续、更新中 问题 cmd下输入命令mysql -uroot -p错误 解决 配置环境变量:高级系统设置——环境变量——系统变量——path编辑——新建——MySQL.exe文件路径(如下图所示) phpstudy2018软件下&am…...

【开发利器】使用OpenCV算子工作流高效开发
学习《人工智能应用软件开发》,学会所有OpenCV技能就这么简单! 做真正的OpenCV开发者,从入门到入职,一步到位! OpenCV实验大师Python SDK 基于OpenCV实验大师v1.02版本提供的Python SDK 实现工作流导出与第三方应用集…...

基础数学-求平方根(easy)
一、问题描述 二、实现思路 1.题目不能直接调用Math.sqrt(x) 2.这个题目可以使用二分法来缩小返回值范围 所以我们在left<right时 使 mid (leftright)/21 当mid*mid>x时,说明right范围过大,rightright-1 当mid*mid<x时,说明left范…...

c语言项目-贪吃蛇项目2-游戏的设计与分析
文章目录 前言游戏的设计与分析地图:这里简述一下c语言的国际化特性相关的知识<locale.h> 本地化头文件类项setlocale函数 上面我们讲到需要打印★,●,□三个宽字符找到这三个字符打印的方式有两种: 控制台屏幕的长宽特性&a…...

力扣2831.找出最长等值子数组
力扣2831.找出最长等值子数组 思路:用二维数组存每个数字的出现下标 遍历所有数字求结果当前子数组大小:pos[i] - pos[j] 1;当前相同数个数:i - j 1;需要删去的数的个数:pos[i] - pos[j] - i j; class Solution {public:int…...

17K star,一款开源免费的手机电脑无缝同屏软件
导读:白茶清欢无别事,我在等风也等你。 作为程序员,在我们的工作中经常需要把手机投票到电脑进行调试工作,选择一款功能强大的投屏软件是一件很必要的事情。今天给大家介绍一款开源且免费的投屏软件,极限投屏ÿ…...

正则表达式二
修饰符 i:将匹配设置为不区分大小写,即A和a没有区别 var str"Google Runoob taobao runoob"; var n1str.match(/runoob/g); //runoob var n2str.match(/runoob/gi); //Runoob,runoobg:重找所有匹配项࿰…...

我的创作纪念日--我和CSDN一起走过的1825天
机缘 第一次在CSDN写文章,是自己在记录学习Java8新特性中Lambda表达式的内容过程中收获的学习心得。之前也有记录工作和生活中的心得体会、难点的解决办法、bug的排查处理过程等等。一直都用的有道笔记,没有去和大家区分享的想法,是一起的朋…...

递归书写树形图示例
大叫好,今天书写了一个扁型转换为树型的例子,使用的是递归,请大家食用,无毒 <!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8"><meta name"viewport" conte…...

【python】IndexError: Replacement index 1 out of range for positional args tuple
成功解决“IndexError: Replacement index 1 out of range for positional args tuple”错误的全面指南 一、引言 在Python编程中,IndexError: Replacement index 1 out of range for positional args tuple这个错误通常发生在使用str.format()方法或者f-string&am…...

Spring自带定时任务@Scheduled注解
文章目录 1. cron表达式生成器2. 简单定时任务代码示例:每隔两秒打印一次字符3. Scheduled注解的参数3.1 cron3.2 fixedDelay3.3 fixedRate3.4 initialDelay3.5 fixedDelayString、fixedRateString、initialDelayString等是String类型,支持占位符3.6 tim…...

代码随想录算法训练营第二十九天|LeetCode491 非递减子序列、LeetCode46 全排列、LeetCode47 全排列Ⅱ
题1: 指路:491. 非递减子序列 - 力扣(LeetCode) 思路与代码: 对于这个题我们应该想起我们做过的子集问题,就是在原来的问题上加一个去重操作。我们用unordered_set集合去重,集合中使用过的元…...

初识C++ · 优先级队列
目录 前言: 1 优先级队列的使用 2 优先级队列的实现 3 仿函数 前言: 栈和队列相对其他容器来说是比较简单的,在stl里面,有一种容器适配器是优先级队列(priority_queue),它也是个队列&#…...

php反序列化入门
一,php面向对象。 1.面向对象: 以“对象”伪中心的编程思想,把要解决的问题分解成对象,简单理解为套用模版,注重结果。 2.面向过程: 以“整体事件”为中心的编程思想,把解决问题的步骤分析出…...

嵌入式 Linux LED 驱动开发实验学习
I.MX6U-ALPHA 开发板上的 LED 连接到 I.MX6ULL 的 GPIO1_IO03 这个引脚上,进行这个驱动开发实验之前,需要了解下地址映射。 地址映射 MMU 全称叫做 MemoryManage Unit,也就是内存管理单元。在老版本的 Linux 中要求处理器必须有 MMU&#x…...

C++:多态
文章目录 多态的概念多态的定义及实现多态的构成条件虚函数虚函数的重写override 和 final重载、重写(覆盖)、重定义(隐藏)的对比 抽象类概念接口继承和实现继承 多态的原理虚函数表多态的原理 单继承和多继承关系的虚函数表单继承…...

Java事务入门:从基础概念到初步实践
Java事务入门:从基础概念到初步实践 引言1. Java事务基础概念1.1 什么是事务?1.2 为什么需要事务? 2. Java事务管理2.1 JDBC 的事务管理2.2 Spring 事务管理2.2.1 Spring JDBC2.2.1.1 添加 Spring 配置2.2.1.2 添加业务代码并测试验证 2.2.2…...

鸿蒙轻内核M核源码分析系列七 动态内存Dynamic Memory
内存管理模块管理系统的内存资源,它是操作系统的核心模块之一,主要包括内存的初始化、分配以及释放。 在系统运行过程中,内存管理模块通过对内存的申请/释放来管理用户和OS对内存的使用,使内存的利用率和使用效率达到最优&#x…...

从头搭hadoop集群--分布式hadoop集群搭建
模板虚拟机安装配置见博文:https://blog.csdn.net/weixin_66158110/article/details/139236148 配置文件信息如下:https://pan.baidu.com/s/1074eD5aNVugEPcjwVvi9jA?pwdl1xq(提取码:l1xq) hadoop版本:h…...

odoo10 权限控制用户只允许看到自己的字段
假设一个小区管理员用户,只想看到自己小区的信息。 首先添加一个用户信息选项卡界面,如下图的 用户 > 隶属信息: 我们在自己创建的user模块中,views文件夹下添加base_user.xml <?xml version"1.0" encoding&q…...

图解Mysql索引原理
概述 是什么 索引像是一本书的目录列表,能根据目录快速的找到具体的书本内容,也就是加快了数据库的查询速度索引本质是一个数据结构索引是在存储引擎层,而不是服务器层实现的,所以,并没有统一的索引标准,…...

Arduino网页服务器:如何将Arduino开发板用作Web服务器
大家好,我是咕噜铁蛋!今天,我将和大家分享一个有趣且实用的项目——如何使用Arduino开发板搭建一个简易的网页服务器。通过这个项目,你可以将Arduino连接到互联网,并通过网页控制或查询Arduino的状态。 一、项目背景与…...

大模型日报2024-06-05
大模型日报 2024-06-05 大模型资讯 AI气象预测取得重大进展:单台桌面电脑即可运行全球天气模型 摘要: 一项新的人工智能天气预测模型已经取得重大进展,该模型能够在一台普通的桌面电脑上运行,预测全球天气。这意味着即使没有复杂的物理计算&a…...