开放视频数据集稀缺,因此减缓了开源视频 AI 的发展。为此,我们构建了
FineVideo
,这是一个包含 43,000 个视频的数据集,总时长为 3,400 小时,并带有丰富的描述、叙事细节、场景分割和问答对。
FineVideo
https://hf.co/spaces/HuggingFaceFV/FineVideo-Explorer
FineVideo 包含高度多样化的视频和元数据集合,使其成为训练模型理解视频内容、训练扩散模型从文本描述生成视频或使用其结构化数据作为输入训练计算机视觉模型的良好素材。
等等,你还没有看过 FineVideo 吗?通过
数据集探索页面
查看它。
https://hf.co/spaces/HuggingFaceFV/FineVideo-Explorer
关于这篇博客文章
在这篇博客文章中,我们分享了开发 FineVideo 的技术细节和代码: 从
YouTube-Commons
中的 190 万个视频开始,到最终获得 44,000 个带有详细标注的视频。
YouTube-Commons
https://hf.co/datasets/PleIAs/YouTube-Commons
一个好的开始方式是查看我们旅程的不同步骤。这些步骤涉及内容过滤、标注和输出结构化。
FineVideo 视频过滤和标注管道
在接下来的部分中,我们将讨论每个步骤,并提供相关代码部分的参考。如果你更喜欢直接浏览代码,请查看我们在
Github
上的 FineVideo 仓库。
Github 仓库
https://github.com/mfarre/fineVideo
首先,让我们看看我们是如何获得初始的 YouTube 视频列表并应用一些初步过滤的。
构建原始数据集
我们的旅程从
YouTube-Commons
开始: 这是一个包含在 YouTube 上共享的 CC-By 许可下的视频音频转录的集合。该项目由
PleIAs
创建并维护,作为其语料库收集项目的一部分。
-
YouTube-Commons
https://hf.co/datasets/PleIAs/YouTube-Commons
-
PleIAs
https://pleias.fr/
过滤 YouTube-Commons
YouTube Commons 包含多种语言的视频和转录,我们的初始任务是将其内容缩小到同一种语言。
我们过滤 YouTube-Commons 中的英语视频,同时收集相关元数据。通过这种初步过滤,我们收集了 190 万个视频、它们的闭 captions 和元数据。
以下是一些过滤和保留的元数据字段的详细信息:
过滤
字段
|
过滤值
|
描述
|
original_language
|
en
|
英语视频
|
transcription_language
|
en
|
英语转录
|
元数据字段
字段
|
描述
|
acodec
|
音频编解码器
|
age_limit
|
YouTube 视频的年龄限制
|
categories
|
YouTube 视频类别
|
channel
|
YouTube 频道
|
channel_follower_count
|
频道订阅用户数量
|
channel_id
|
YouTube 频道标识符
|
character_count
|
闭 captions 中的字符数
|
comment_count
|
YouTube 评论数量
|
description
|
YouTube 视频描述
|
duration_string
|
视频时长,格式为 hh:mm:ss
|
license
|
视频许可证
|
like_count
|
YouTube 视频点赞数量
|
resolution
|
视频分辨率,格式为宽度 x 高度
|
tags
|
YouTube 视频的自由文本标签
|
text
|
闭 captions
|
title
|
YouTube 视频标题
|
upload_date
|
YouTube 上传日期
|
vcodec
|
视频编解码器
|
video_id
|
YouTube 视频标识符
|
view_count
|
YouTube 观看次数
|
word_count
|
闭 captions 中的单词数
|
内容过滤和元数据收集的代码可在此处找到 [
链接
]
https://github.com/mfarre/fineVideo/blob/main/rawdataset/filter-yt-commons.py
下载视频
一旦我们有了 190 万个目标视频列表,我们成功下载了 180 万个视频 (一些视频被频道所有者删除,一些视频更改了权限)。
我们探索了两种不同的分布式下载方法。
选项 1: Video2dataset
video2dataset 是一个开源项目 [
链接
],专注于分布式视频下载、转换和打包为不同的数据集格式。该项目原生支持 Slurm 工作负载管理器,因此我们可以在我们的 CPU 集群上运行它。
https://github.com/iejMac/video2dataset
来源: Video2Dataset GitHub 页面
由于我们所有集群实例都通过相同的公共 IP 访问互联网,我们为项目贡献了指定代理的可能性,以方便视频下载。虽然该功能尚未合并,但你可以通过我们的 PR [
链接
] 修补 video2dataset 以使用代理功能。
https://github.com/iejMac/video2dataset/pull/350
选项 2: 云批处理作业
大多数云提供商都有通过简单定义执行每项作业的实例类型、定义队列并提供包含将执行的代码的容器来运行作业的可能性。
https://github.com/iejMac/video2dataset/pull/350
我们使用 Google Cloud 和 AWS 运行一个自制的 Docker 容器,使用
ytdlp
下载视频和元数据,并将结果推送到 S3。
https://github.com/yt-dlp/yt-dlp
构建 Docker 容器的文件可在此处找到 [
代码
]。
https://github.com/mfarre/fineVideo/tree/main/rawdataset/ytdlps3
我们的结论
虽然 Video2Dataset 在有代理的情况下是可行的,并允许我们进行额外的处理步骤,但我们能够对代理进行的每秒请求数成为了瓶颈。这使我们转向云批处理作业。
保留动态内容
在我们的最佳视频搜索中,我们将选择范围缩小到既有视觉动作又有中等快速语速的内容。我们通过词密度过滤和视觉动态性过滤来实现这一点。
词密度过滤
我们以视频中的词密度作为音频动态性的代理。词密度的定义为:
词密度 = 闭 captions 中的单词数 / 视频总时长 (秒)
通过在不同密度阈值下采样并视觉评估内容质量,我们决定删除词密度低于 0.5 词/秒的所有视频。
示例:
词密度 0.25 示例
https://www.youtube.com/embed/mqAeYCSP1wA
词密度 0.5 示例
https://www.youtube.com/embed/eLtOfmzdU_o
词密度 0.75 示例
https://www.youtube.com/embed/nx9yfGgXK6s
词密度 1.0 示例
https://www.youtube.com/embed/7xMDfivSrkg
词密度过滤和探索示例的代码可在此处找到 [
链接
]
https://github.com/mfarre/fineVideo/blob/main/dynamicfilters/worddensityfiltering.py
视觉动态性过滤
我们重新利用 FFMPEG 的
Freezedetect 过滤器
来判断视频的动态性。虽然此过滤器旨在识别视频中的冻结部分 (多个相同帧连续放置),但我们可以通过将
noise
参数设置为非常高的值来识别低运动块。
-
Freezedetect 过滤器
https://ffmpeg.org/ffmpeg-filters.html#freezedetect
我们不是在整个视频上运行 freezedetect,而是通过时间片段分析视频,并根据被分类为静态的片段数量来投票视频是否静态。通过手动评估,我们设置了一个阈值,如果分析的片段中有 40%是低运动的,则丢弃该视频。
经过此过滤后丢弃的一些内容类型:
静态图像配音乐示例
https://www.youtube.com/embed/-3PjwEGxu9w
演示屏幕录制示例
https://www.youtube.com/embed/-72DqMfjtF8
高度静态的人对着摄像头说话示例
https://www.youtube.com/embed/0-KRYKbg_T8
分类视频动态性的 DockerFile 和代码可在此处找到 [
链接
]
https://github.com/mfarre/fineVideo/tree/main/dynamicfilters/videodynamismfiltering
从分析的 180 万个视频中,经过此步骤后我们保留了 60 万个动态视频。在这一阶段,我们深入研究视频内容,这对于确保数据集的多样性至关重要。
视频分类
为了实现最多样化的内容选择,我们使用闭 captions 和 YouTube 元数据对 60 万个过滤后的资产进行分类。为了在分类过程中获得控制,我们创建了一个分类法,并指导标注过程以遵循该分类法。
自定义构建的分类法
我们使用 GPT4-o 引导自定义构建的分类法,并由信息科学家审查和调整。该分类法包含 126 个细分类别,分为多个层次。这种多层次的方法允许 FineVideo 的用户根据其特定用例对数据集进行切片。
分类法
分类法也可在 JSON 中找到 [
链接
]
https://github.com/mfarre/fineVideo/blob/main/videocategorization/content_taxonomy.json
通过初始版本的分类法,我们开始内容标注,并通过查看内容标注的结果,在信息科学家的帮助下,我们相应地调整了分类法。
内容标注
我们使用 Llama 3.1 70B 通过 Text Generation Inference
TGI
[
代码
] 对视频进行分类。
-
TGI
https://github.com/huggingface/text-generation-inference
-
代码
https://github.com/mfarre/fineVideo/tree/main/videocategorization
提示需要多次迭代以确保答案严格是我们分类法中的一个类别。在我们的提示评估过程中,我们发现通过从提示中删除现有的 YouTube 标签和类别,结果的质量显著提高: YouTube 元数据使 Llama 3.1 生成的文本偏向于 YouTube 提供的类别之一。
prompt_template = """
给定这些类别: {leaves}
根据其闭 captions 和一些元数据细节对 YouTube 视频进行分类。仅返回所选类别,不要返回其他内容!
标题: {title}
描述: {description}
频道: {channel}
闭 captions: {closed_caption}
"""
分类法反馈循环 - 内容标注
分类法调整在内容分类过程中的反馈循环
信息科学家的角色之一是随着时间的推移对分类法进行调整,以添加新类别或在需要时增加一些额外的区分度。
使用 LLMs 进行内容分类将分类法的调整时间从几个月/年缩短到几小时。此外,在某些情况下,我们创建了专门用于丢弃敏感视频的类别,例如属于
Firearms & Weapons
和
Substance Use & Drugs
的视频。
贡献描述性元数据
在这一阶段,我们有三个视频级别的元数据来源:
为了在视频理解领域做出贡献,我们决定深入到时间码级别的元数据,例如活动、对象、叙事和编辑方面。
虽然我们考虑过将人工标注作为主动学习设置的一部分,其中一个或多个模型提出标注,人工进行 QA 步骤,但我们发现 Gemini 是一个很好的解决方案,特别是在我们限制了输入视频长度和输出格式的情况下。
长视频 & Gemini 1.5 Pro
我们深入研究了 Gemini 1.5 Pro,迭代我们的提示并测试了不同内容长度。
由于其限制为 1M 个 token,这大约相当于~1 小时的视频,我们被迫丢弃超过 1 小时的视频。
为了克服这种情况,我们尝试加速超过 1 小时的视频,以便适应 Gemini 的上下文。
探索: 加速视频以适应 Gemini 的上下文
虽然在高层次上似乎有效,但当我们开始查看细节时,我们发现只有视频的前几分钟被准确标注。
发现质量在长视频上下降,我们想知道这是否会影响我们其余的视频?通过采样不同长度的视频并检查标注的视频覆盖率,我们发现超过 10 分钟的视频质量有所下降。
为了与我们的目标一致,即向社区提供高质量的数据,我们丢弃了超过 10 分钟的视频。
内容选择
由于每小时的视频使用 Gemini 标注成本超过 5 美元,我们不能标注所有经过过滤的视频。因此,我们希望确保在所有主题上都有良好的覆盖,并在内容多样性和预算之间找到一个良好的平衡。我们将此大小约束设置为 4,000 小时的视频。
为了从 60 万个视频中选择 4,000 小时的内容,我们准备了一个算法,该算法平衡了内容类别、用户参与度和频道代表性,以达到目标时长。
算法流程图
内容选择算法的一些关键部分:
-
活动评分
: 我们通过结合评论、观看和点赞数量计算每个视频的参与度指标,并赋予不同权重。此评分有助于优先考虑与观众产生共鸣的视频。
-
视频选择
: 此步骤迭代选择视频以达到目标时长,同时确保多样性。它在高参与度内容和各种类别及频道的代表性之间进行平衡,使用惩罚系统避免任何单一频道的过度代表。
-
最终调整
: 我们调整选择以尽可能接近目标时长,而不超过它。它按时长对选定的视频进行排序,并将它们添加到最终列表中,直到达到最接近目标总时长的可能。
代码可在此处找到 [链接]。
https://github.com/mfarre/fineVideo/blob/main/contentselection/oracle.py
使用 Gemini 1.5 Pro 和 GPT4o 进行结构化输出标注
为什么需要结构化数据?
我们构建 FineVideo 的目标之一是提供结构化数据,以赋能我们的社区: 如果你正在研究多模态 LLMs,你可以对数据进行切片,并决定哪些类别适合你的预训练或微调组合。如果你更关注计算机视觉,你可以直接使用数据集来训练基于 FineVideo 中包含的数值类别的分类器,例如动态性评分、场景边界或音视频相关性评分。