数据集文档
加载视频数据
并获得增强的文档体验
开始使用
加载视频数据
视频支持是实验性的,可能会发生变化。
视频数据集具有 Video 类型列,其中包含 torchvision
对象。
要使用视频数据集,你需要安装 torchvision
包。查看 安装 指南以了解如何安装它。
当你加载一个视频数据集并调用视频列时,视频将被解码为 torchvision
Videos
>>> from datasets import load_dataset, Video
>>> dataset = load_dataset("path/to/video/folder", split="train")
>>> dataset[0]["video"]
<torchvision.io.video_reader.VideoReader at 0x1652284c0>
首先使用行索引,然后使用 video
列 - dataset[0]["video"]
- 索引到视频数据集,以避免在数据集中创建所有视频对象。 否则,如果你有一个大型数据集,这可能是一个缓慢且耗时的过程。
有关如何加载任何类型数据集的指南,请查看通用加载指南。
读取帧
使用 VideoReader
和 next()
直接从视频访问帧
>>> video = dataset[0]["video"]
>>> first_frame = next(video)
>>> first_frame["data"].shape
(3, 240, 320)
>>> first_frame["pts"] # timestamp
0.0
要一次获取多个帧,你需要迭代 VideoReader
。这是获取长帧列表的有效方法
>>> import torch
>>> import itertools
>>> frames = torch.stack([frame["data"] for frame in islice(video, 5)])
>>> frames.shape
(5, 3, 240, 320)
如果你需要设置视频的当前时间戳,还可以使用 .seek()
>>> video.get_metadata()
{'video': {'fps': [10.0], 'duration': [16.1]}}
>>> video = video.seek(8.0, keyframes_only=True)
>>> frame = next(video)
>>> first_frame["data"].shape
(3, 240, 320)
本地文件
你可以从视频路径加载数据集。使用 cast_column() 函数接受视频文件路径列,并使用 Video 特性将其解码为 torchvision
视频
>>> from datasets import Dataset, Video
>>> dataset = Dataset.from_dict({"video": ["path/to/video_1", "path/to/video_2", ..., "path/to/video_n"]}).cast_column("video", Video())
>>> dataset[0]["video"]
<torchvision.io.video_reader.VideoReader at 0x1657d0280>
如果你只想加载视频数据集的底层路径而不解码视频对象,请在 Video 特性中设置 decode=False
>>> dataset = dataset.cast_column("video", Video(decode=False))
>>> dataset[0]["video"]
{'bytes': None,
'path': 'path/to/video/folder/video0.mp4'}
VideoFolder
你还可以使用 VideoFolder
数据集构建器加载数据集,而无需编写自定义数据加载器。 这使得 VideoFolder
非常适合快速创建和加载包含数千个视频的数据集,以用于不同的视觉任务。 你的视频数据集结构应如下所示
folder/train/dog/golden_retriever.mp4
folder/train/dog/german_shepherd.mp4
folder/train/dog/chihuahua.mp4
folder/train/cat/maine_coon.mp4
folder/train/cat/bengal.mp4
folder/train/cat/birman.mp4
如果数据集遵循 VideoFolder
结构,那么你可以使用 load_dataset() 直接加载它
>>> from datasets import load_dataset
>>> dataset = load_dataset("username/dataset_name")
>>> # OR locally:
>>> dataset = load_dataset("/path/to/folder")
对于本地数据集,这等同于在 load_dataset() 中手动传递 videofolder
,并在 data_dir
中传递目录
>>> dataset = load_dataset("videofolder", data_dir="/path/to/folder")
然后你可以将视频作为 torchvision.io.video_reader.VideoReader
对象访问
>>> dataset["train"][0]
{"video": <torchvision.io.video_reader.VideoReader at 0x161715e50>, "label": 0}
>>> dataset["train"][-1]
{"video": <torchvision.io.video_reader.VideoReader at 0x16170bd90>, "label": 1}
要忽略元数据文件中的信息,请在 load_dataset() 中设置 drop_metadata=True
>>> from datasets import load_dataset
>>> dataset = load_dataset("username/dataset_with_metadata", drop_metadata=True)
如果你没有元数据文件,VideoFolder
会自动从目录名称推断标签名称。 如果你想删除自动创建的标签,请设置 drop_labels=True
。 在这种情况下,你的数据集将仅包含一个视频列
>>> from datasets import load_dataset
>>> dataset = load_dataset("username/dataset_without_metadata", drop_labels=True)
最后,filters
参数允许你仅加载数据集的子集,基于标签或元数据的条件。 当元数据采用 Parquet 格式时,这尤其有用,因为这种格式支持快速过滤。 还建议将此参数与 streaming=True
一起使用,因为默认情况下数据集在过滤之前会被完全下载。
>>> filters = [("label", "=", 0)]
>>> dataset = load_dataset("username/dataset_name", streaming=True, filters=filters)
有关创建你自己的 VideoFolder
数据集的更多信息,请查看 创建视频数据集 指南。
WebDataset
WebDataset 格式基于 TAR 归档文件夹,适用于大型视频数据集。 由于其大小,WebDatasets 通常以流式模式加载(使用 streaming=True
)。
你可以像这样加载 WebDataset
>>> from datasets import load_dataset
>>> dataset = load_dataset("webdataset", data_dir="/path/to/folder", streaming=True)
视频解码
默认情况下,当你迭代数据集时,视频会按顺序解码为 torchvision VideoReaders
。 它按顺序解码视频的元数据,并且在你访问视频帧之前不会读取视频帧。
但是,可以使用多线程解码来显着加速数据集
>>> import os
>>> num_threads = num_threads = min(32, (os.cpu_count() or 1) + 4)
>>> dataset = dataset.decode(num_threads=num_threads)
>>> for example in dataset: # up to 20 times faster !
... ...
你可以使用 num_threads
启用多线程。 这对于加速远程数据流式传输尤其有用。 但是,对于快速磁盘上的本地数据,它可能比 num_threads=0
慢。
如果你对解码为 torchvision VideoReaders
的视频不感兴趣,并且想要访问路径/字节,则可以禁用解码
>>> dataset = dataset.decode(False)
注意:IterableDataset.decode() 目前仅适用于流式数据集。
< > 在 GitHub 上更新