【AIGC系列】5:视频生成模型数据处理和预训练流程介绍(Sora、MovieGen、HunyuanVideo)

AIGC系列博文:
【AIGC系列】1:自编码器(AutoEncoder, AE)
【AIGC系列】2:DALL·E 2模型介绍(内含扩散模型介绍)
【AIGC系列】3:Stable Diffusion模型原理介绍
【AIGC系列】4:Stable Diffusion应用实践和代码分析
【AIGC系列】5:视频生成模型数据处理和预训练流程介绍(Sora、MovieGen、HunyuanVideo)

目录

  • 1 Sora介绍
    • 1.1 前言
    • 1.2 Feature
    • 1.3 Benchmarks
  • 2 Movie Gen
    • 2.1 预训练数据
      • 2.1.1 视觉过滤(Visual filtering)
      • 2.1.2 运动过滤
      • 2.1.3 内容过滤
      • 2.1.4 字幕生成
      • 2.1.5 多阶段数据整理
      • 2.1.6 分桶处理可变时长和尺寸
    • 2.2 预训练
    • 2.3 Finetuning
  • 3 HunyuanVideo
    • 3.1 Data Filtering
    • 3.2 Data Annotation

1 Sora介绍

1.1 前言

OpenAI做Sora的目的:

  1. 视觉有吸引力,OpenAI喜欢做这种带有创造力的生产力工具;
  2. 他们希望这个世界不仅仅只有文本,更应该像人一样,用更多的感官去感知这个世界,这样才能改变我们最终跟电脑或AI机器人交互的方式;
  3. 视频生成是通向AGI道路一个非常关键的部分。

1.2 Feature

  1. Remix:video editing,支持一些替换、移除或者想象出来的一些元素等操作。

  2. Recut:重新生成、重新剪辑,把选取想要的内容部分,删除不想要的部分,根据已有的好的部分,再去往前或者往后做扩展。

  3. Story board:给定一个视频的timeline,细化到每一帧去剪辑和生成新的视频。

  4. Loop:把一个视频的头和尾稍微剪辑一下,再把它拼起来变成一个无限循环的新视频。

  5. Blend:把两个视频合并成同一个视频,例如物体的合并或者style的合并。

  6. Style presets:先定义一个style,把你的视频都变成这个style。

1.3 Benchmarks

我们来看一下谷歌的Veo2 发布的视频生成模型之间的PK,如下图所示,x轴是不同的视频生成模型,包括Meta的 Movie Gen、快手的可灵、Minimax和Sora Turbo,y轴是用户整体的喜好度。

粉红色是指用户喜欢其他家生成的视频,不喜欢Veo 2;绿色是指用户非常喜欢Veo 2,但不喜欢其他家的生成结果;白色是平局。

benchmarks

整体上,快手的可灵效果还不错,仅次于谷歌的Veo 2,而Sora是最差的,起了个大早,赶了个晚集。

Sora没有发表论文,所以没法精度。

2 Movie Gen

Meta在2024年10月份的时候发表了Movie Gen论文,内容非常详实,总共有96页,效果也不错。

论文:MovieGen: ACastofMediaFoundationModels

Movie Gen是一系列基础模型,能够生成高质量、1080p高清视频,支持不同的宽高比和同步音频。此外,论文还展示了其他能力,例如基于精确指令的视频编辑以及根据用户提供的图像生成个性化视频。模型在多个任务上达到了新的技术水平,包括文本到视频合成、视频个性化、视频编辑、视频到音频生成以及文本到音频生成。Movie Gen最大的视频生成模型是一个拥有300亿参数的Transformer,训练时的最大上下文长度为73,000个视频tokens,这意味着可以以每秒16帧的速度生成长达16秒的视频。

论文在架构、潜在空间、训练目标与方法、数据管理、评估协议、并行化技术和推理优化方面做出了多项技术革新和简化,这些改进使我们能够充分利用扩展预训练数据、模型大小和训练计算的优势来训练大规模媒体生成模型。

2.1 预训练数据

预训练数据集包括O(100)M个视频-文本对和O(1)B个图像-文本对,遵循类似(Dai et al., 2023)的图像-文本数据整理策略,并专注于视频数据的整理。

原始数据池由长度为4秒至2分钟的视频组成,涵盖了来自不同领域如人类、自然、动物和物体的概念。数据整理流程最终生成了一个剪辑-提示对的预训练集,每个剪辑长度为4秒至16秒,这样能确保每个视频尽可能都是描述同一个概念(with single-shot camera and non-trivial motion)。

数据整理流程下图所示,它包括三个过滤阶段:1)视觉过滤,2)运动过滤,和3)内容过滤,以及一个字幕生成阶段。过滤后的剪辑被标注有平均包含100词的详细生成字幕。

数据整理流程

2.1.1 视觉过滤(Visual filtering)

应用6个过滤器去除低视觉质量的视频。

  1. 过滤掉分辨率小于720px的视频

  2. 数据集中60%的视频为横屏视频,40%为竖屏视频

  3. 删去文字特别多的视频

  4. 从长视频中抽取出单场景的4-16s的片段

  5. 保证视频美学品质

  6. 保证视频没有边框

2.1.2 运动过滤

自动过滤掉低运动的视频。

首先,我们使用内部静态视频检测模型移除没有运动的视频。接着,基于VMAF运动分数和运动向量(FFmpeg开发者),识别出具有“合理”运动的视频。此外,使用了PySceneDetect库中的Shot Boundary Detection移除频繁抖动的摄像机运动视频。最后,移除了带有特殊运动效果的视频,例如幻灯片视频。

2.1.3 内容过滤

删除重复的视频片段、对不同类型的数据进行重新采样,保证内容的均匀性。

首先是抽Embedding,因为数据量太大,需要先做一次聚类(clustering),把常见的concept全部抽出来,再根据每个cluster的大小和相似度,把cluster合并起来。最后再从每个cluster中均匀地(平方根倒数)抽取视频数据。

值得注意的是,LLaMa 3里Vision Model的训练数据的准备,也是使用这套流程。

2.1.4 字幕生成

通过使用LLaMa3-Video模型为视频创建准确而详细的文本提示。在底座模型基础之上,微调了该模型的8B和70B变体用于视频字幕任务,并用这些模型为整个训练集的视频添加字幕,最终的训练集包含了70%的8B字幕和30%的70B字幕。用两个模型来做,主要是模型的训练很贵,推理也不便宜,训练集有几个亿的视频的话,用70B的模型也是需要很多卡去跑好几周。另外可能还考虑了多样性,虽然70B模型很好,但是如果全用它来生成的话,会存在bias,换一个模型的话数据的多样性会好一点。

为了实现电影摄像机运动控制,训练了一个摄像机运动分类器,它可以预测16种摄像机运动类别之一,例如缩放、平移等。将高置信度的摄像机运动预测加入到之前生成的文本字幕中,在推理时,这允许用户指定视频生成时的具体摄像机控制。

2.1.5 多阶段数据整理

作者根据逐渐严格的视觉、运动和内容阈值整理出预训练数据的三个子集,以满足不同预训练阶段的需求。

  • 首先,整理了一组最低宽度和高度为720像素的视频用于低分辨率训练。
  • 接着,过滤该集合,提供最低宽度和高度为768像素的视频用于高分辨率训练。
  • 最后,整理了新的视频以扩充我们的高分辨率训练集。

高分辨率集包含80%的横屏视频和20%的竖屏视频,其中至少60%包含人类。在整理过程中,作者建立了一个包含600个人类动作和表情的分类法,并使用该分类法进行了零样本文本到视频检索,以选择包含人类的视频,在内容重新采样期间保留了这些人视频的频率。

经过最终的处理,数据越来越少,最终只保留了少于1%的数据。

剩余数据

2.1.6 分桶处理可变时长和尺寸

为了适应不同的视频长度和宽高比,作者根据宽高比和长度对训练数据进行分桶处理,每个分桶中的视频具有完全相同的latent shape,从而便于训练数据的批量处理。图像和视频数据集都使用了五个宽高比分桶,因此,我们的模型可以生成不同宽高比的图像和视频,例如,横屏为1024×576,竖屏为576×1024。作者定义了五个时长分桶(4秒至16秒),并根据视频长度调整潜在帧的数量,如下表所示。通过向文本字幕添加FPS tokens引入了FPS控制,这样可以以不同的帧率(16至32 FPS)采样视频。

fps

2.2 预训练

这些训练细节都是针对30B模型的。

为了使训练更快更稳定,作者采取了多阶段训练的策略。主要是以下三个步骤,如下表所示:

  1. 首先使用text-to-image的数据对模型进行warm up热身训练,随后使用text-to-image和text-tovideo的数据进行联合训练。

  2. 视频数据分辨率首先由256px提升至768px。

  3. 不断用更好的数据集和优化后的超参数对模型进行训练。

作者保持一个验证集,里面是数据是模型从来没有见过的,可以拿来测试模型的性能,validation loss和人类评估结果是耦合得很好的。

stage

2.3 Finetuning

为了保证生成结果的质量,finetuning的数据集规模可以较小,但是数据质量一定要有保障。因此finetuning的数据均由人为标注,所以这个阶段就是SFT。

高质量的定义:良好的运镜、真实性、美学性、内容丰富、文本描述详细。

为了筛选高质量的数据集,Movie Gen使用连续的四个步骤对数据进行筛选:

  1. 创建一个候选子集,这一步是自动化完成的,作者设置了一个严格的阈值,从美观、运动和场景切换上对每个视频进行严格的限制。此外,使用目标检测模型移除了只有小物体的视频。

  2. 与Content Filtering一样,对第一阶段筛选后的视频进行重新采样,保证各个类别的视频均匀分布。具体做法是,沿用分词表(human verbs and expressions),再做一次视频检索,从而把相关概念的视频抽出来。作者既做了文本k-NN,也做了视频k-NN。对于视频k-NN,做法是每个概念里人工选了几个非常好的视频作为种子视频,再去做视频k-NN,从而拿到concept-balanced的子集。这一步也是自动化完成。

  3. 这一步是人工做的,人为找出具有电影质感的、适合做视频生成训练样本的视频。此外,标注人员还需要把视频中最好看的那一个片段挑出来。

  4. 人为对模型生成的提示词进行润色修改,同时加入详细的原数据:运镜、人物表情、物体和背景信息、具体的运动描述和光线信息。

SFT数据集长度都在10.6s到16s之间,其中50%是16s,剩下50%是10.6s到16s之间。

最后,再做一个Model Averaging操作:不同数据子集、不同超参数训练出来的模型各有所长,为了利用不同checkpoint模型的优势、提升模型泛化性Movie Gen对SFT阶段不同的模型参数进行了平均操作,类似于Llama 3。

3 HunyuanVideo

论文:HunyuanVideo: A Systematic Framework For Large Video Generation Model

GitHub:HunyuanVideo

HuggingFace:HunyuanVideo

与Movie Gen一样,Hunyuan Viedoe使用了图像-视频联合训练的策略,将视频分为五类、图像分为两类,以满足不同训练需求。原始数据涵盖人物、动物、风景等多个领域,筛选时设定了最低时长、画质、构图、色彩等严格标准,优先选用高质量数据,显著提升了模型性能。

3.1 Data Filtering

  1. 使用PySceneDetect把原始视频分割为单镜头拍摄的视频片段。

  2. 使用OpenCV中的拉普拉斯算子找出视频中最“干净”的一帧作为视频开头。

  3. 使用内部的VideoCLIP模型计算每个视频的embeddings,使用embeddings计算余弦距离,删去重复数据。使用K-Means算法对数据进行重新采样以保持各种类型数据的多样性。

  4. 使用Dover模型筛选更为美观的视频片段。单独训练了一个用于筛选清晰度的视频。

  5. 删去了完全禁止和动作幅度较小的视频。(estimated optical flow)

  6. 使用PySceneDetect和Transnet v2获得场景边界信息

  7. 使用OCR模型移除文字过多的视频片段

  8. 使用目标检测模型移除敏感信息

SFT阶段,约有100万条数据,同样采用人为标注的数据进行微调。

数据

3.2 Data Annotation

结构化说明文本:HunYuanVideo使用JSON来对图片信息进行说明。JSON数据包括:Short Description描述场景的主要内容、Dense Description详细、完整的描述、Background描述物体所在的背景、Style描述视频的风格、Shot Type描述视频的具体视角、Lighting描述视频的光线情况、Atmosphere描述视频氛围如Cozy、Tense等。

此外,HunYuanVideo扩展了JSON结构,以包含额外的元数据派生元素,包括源标签、质量标签以及来自图像和视频元信息的其他相关标签。

为了防止过拟合,HunYuanVideo通过精心设计的Dropout及排列和组合策略,根据这些多维度的描述信息来合成长度和模式各异的字幕,旨在提高生成模型的泛化能力。

HunYuanVideo训练了一个运镜分类器来预测14个不同的运镜类型,包括变焦放大、变焦缩小、向上平移、向下平移等。高置信度的分类结果将被添加至数据的JSON说明文本中。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法日记32:15届蓝桥C++B填空(握手问题+小球反弹)

握手问题 一、题解 1、通过观察我们可以发现,题目属于数论中的蜂巢问题,但是我们这里不使用结论,而是通过分析推出 2、假设我们不考虑特殊情况(也就是那 7 7 7个人的情况),那么问题的答案应该为 int res0; for(int i49;i>1;i…

【三维分割】LangSplat: 3D Language Gaussian Splatting(CVPR 2024 highlight)

论文:https://arxiv.org/pdf/2312.16084 代码:https://github.com/minghanqin/LangSplat 文章目录 一、3D language field二、回顾 Language Fields的挑战三、使用SAM学习层次结构语义四、Language Fields 的 3DGS五、开放词汇查询(Open-voca…

Windows安装sql server2017

看了下官网的文档,似乎只有ubuntu18.04可以安装,其他debian系的都不行,还有通过docker的方式安装的。 双击进入下载的ISO,点击执行可执行文件,并选择“是” 不要勾选 警告而已,不必理会 至少勾选这两…

LabVIEW图像识别抗干扰分析

问题描述 在基于LabVIEW的探针定位系统中,存在两个核心技术难点: 相机畸变导致初始定位误差:非线性畸变使探针无法通过坐标变换直接精确定位,需采用粗定位图像修正的两段式控制策略。 图像识别可靠性不足:复杂背景&a…

Leetcode1 两数之和 python两种方法实现

Leetcode1 两数之和 python两种方法实现 文章目录 Leetcode1 两数之和 python两种方法实现方法一:枚举法(暴力解法)方法二:用空间换时间。 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为…

总结前端常用数据结构 之 队列篇【JavaScript 】

推动你的事业,不要让你的事业推动你。——爱因斯坦 目录 队列是什么?JS异步、事件循环、任务队列:队列的实现方法:‌数组实现‌ - 封装队列:对象实现(优化性能)- 封装队列: 队列应用…

C# 数据转换

1. 文本框读取byte,ushort格式数据 byte addr; if (byte.TryParse(textBoxAddr.Text, out addr) true) {}2. 字节数组 (byte[]) 转换为 ASCII 字符串 byte[] bytes { 72, 101, 108, 108, 111 }; // "Hello" 的 ASCII 码 string s0 Encoding.ASCII.Ge…

golang部分语法介绍(range关键字,函数定义+特性,结构体初始化+结构体指针/方法)

目录 golang语法 range关键字 介绍 使用 原理 函数 介绍 定义 特性 结构体 介绍 初始化 结构体指针 结构体方法 方法接收者 golang语法 range关键字 介绍 用于遍历数组(array)、切片(slice)、映射(ma…

Linux与UDP应用1:翻译软件

UDP应用1:翻译软件 本篇介绍 本篇基于UDP编程接口基本使用中封装的服务器和客户端进行改写,基本功能如下: 从配置文件dict.txt读取到所有的单词和意思客户端向服务端发送英文服务端向客户端发送英文对应的中文意思 配置文件内容 下面的内…

【机器学习】逻辑回归(Logistic Regression)

逻辑回归 逻辑回归逻辑回归的流程Sigmoid函数Sigmoid函数的公式及图像 逻辑回归的损失函数与最优化求解逻辑回归使用梯度下降法求解 逻辑回归 逻辑回归与线性回归都是线性模型,其中线性回归使用线性式来预测数值,逻辑回归使用线性式来进行分类任务。 逻…

IDEA - 查看类的继承结构(通过快捷键查看、通过生成类图查看)

一、通过快捷键查看 在项目中定位到目标类(例如,Executor.java) 按下快捷键 【Ctrl H】 此时会弹出 Type Hierarchy 窗口,展示所有相关的父类、子类、接口 二、通过生成类图查看 在项目中定位到目标类(例如&#x…

Leetcode-1776. Car Fleet II [C++][Java]

目录 一、题目描述 二、解题思路 【C】 【Java】 Leetcode-1776. Car Fleet IIhttps://leetcode.com/problems/car-fleet-ii/description/ 一、题目描述 There are n cars traveling at different speeds in the same direction along a one-lane road. You are given an …

《Python实战进阶》No 9:使用 Celery 实现异步任务队列

第9集:使用 Celery 实现异步任务队列 引言 在现代 Web 应用中,许多操作(如发送邮件、处理文件上传、执行复杂计算等)可能需要耗费较长时间。如果这些操作直接在主线程中执行,会导致用户请求阻塞,降低用户体…

ue5 创建多列StreeView的方法与理解

创建StreeView的多列样式怎么就像是创建单行单列差不多?貌似就是在单行单列中加入了多列widget? 目录结构: 必备条件 StreeView的多列创建需要的必备条件: 数据基类 CustomItemBase #pragma once /* ---------------------------------- | Name | Value …

Spring的下载与配置

1. 下载spring开发包 下载地址:https://repo.spring.io/webapp/#/artifacts/browse/simple/General/libs-release-local/org/springframework/spring 打开之后可以看到有很多版本供选择,因为视频教程用的是4.2.4版本,于是我也选择这个 右键…

Python + requests实现接口自动化框架

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 为什么要做接口自动化框架 1、业务与配置的分离 2、数据与程序的分离;数据的变更不影响程序 3、有日志功能,实现无人值守 4、自动发送测…

Linux——基本指令

我们今天学习Linux最基础的指令 ls 指令 语法: ls [选项] [⽬录或⽂件] 功能:对于⽬录,该命令列出该⽬录下的所有⼦⽬录与⽂件。对于⽂件,将列出⽂件名以及其他信 息。 命令中的选项,一次可以传递多个 &#xff0c…

【Godot4.3】自定义简易菜单栏节点ETDMenuBar

概述 Godot中的菜单创建是一个复杂的灾难性工作,往往无从下手,我也是不止一次尝试简化菜单的创建。 从自己去年的发明“简易树形数据”用于简化Tree控件获得灵感,于是尝试编写了用于表示菜单数据的EasyMenuData类,以及对应的纯文…

esp32串口通信

1、查看esp32的引脚图,寻找对应的串口 根据原理图,芯片上有3个串口(UART0, UART1和UART2),但是UART1没有引出引脚。其中UART0(GPIO3用于U0RXD,GPIO1用于U0TXD)用作下载、调试串口,引脚不可改变&…

内部静态类和非内部静态类的区别

目录 问题: 原理: 外部类与非内部静态类 外部类与静态内部类 加载顺序 总结: 1.非静态内部类依赖于外部类的实例,而静态内部类不依赖于外部类的实例。 2.非静态内部类可以访问外部类的实例变量和方法,而静态内部…