如何从视频数据集制作数据集(首先是tensorflow)
How to make a dataset from video datasets(tensorflow first)
大家。
现在我有一个对象分类任务,我有一个包含大量视频的数据集。在每个视频中,某些帧(不是每一帧,大约 16 万帧)都有其标签,因为一帧可能有多个对象。
我对创建数据集有些困惑。我的想法是先将视频转换为帧,然后将每个只有标签的帧制作为 tfrecord 或 hdf5 格式。最后,我会将每一帧的路径写入 csv 文件(训练和验证)以用于我的任务。
我的问题是:
1. 是否足够高效(tfrecord 或 hdf5)?在创建 tfrecord 或 hdf5 文件之前,我是否应该预处理每一帧,例如压缩以保存存储 space?
2.有没有办法直接在tensorflow或pytorch中处理视频数据集?
我想找到一种高效且传统的方式来处理视频数据集。真的很期待每一个答案。
我不是 TensorFlow 专家,所以我的回答不会涵盖这一点,抱歉。
由于利用数据中的时间相关性,视频格式通常以更长的随机访问时间为代价获得压缩。这是有道理的,因为人们通常按顺序访问视频帧,但如果您的访问完全是随机的,我建议您转换为 hdf5。否则,如果您访问视频的子序列,则保留视频格式可能有意义。
PyTorch 没有任何 "blessed" 视频 AFAIK 方法,但我使用 imageio
to read videos and seek particular frames. A short wrapper makes it follow the PyTorch Dataset
API. The code is rather simple but has a caveat, which is necessary to allow using it with multiprocessing DataLoader
。
import imageio, torch
class VideoDataset:
def __init__(self, path):
self.path = path
# explained in __getitem__
self._reader = None
reader = imageio.get_reader(self.path, 'ffmpeg')
self._length = reader.get_length()
def __getitem__(self, ix):
# Below is a workaround to allow using `VideoDataset` with
# `torch.utils.data.DataLoader` in multiprocessing mode.
# `DataLoader` sends copies of the `VideoDataset` object across
# processes, which sometimes leads to bugs, as `imageio.Reader`
# does not support being serialized. Since our `__init__` set
# `self._reader` to None, it is safe to serialize a
# freshly-initialized `VideoDataset` and then, thanks to the if
# below, `self._reader` gets initialized independently in each
# worker thread.
if self._reader is None:
self._reader = imageio.get_reader(self.path, 'ffmpeg')
# this is a numpy ndarray in [h, w, channel] format
frame = self._reader.get_data(ix)
# PyTorch standard layout [channel, h, w]
return torch.from_numpy(frame.transpose(2, 0, 1))
def __len__(self):
return self.length
可以修改此代码以支持多个视频文件以及输出您想要的标签。
我一直在为此构建一个名为 Sieve 的简单 API。似乎没有处理原始视频数据和构建数据集的好方法,只有“有趣”的样本。必须处理数小时甚至数天的视频素材非常昂贵,而且需要很长时间。
Sieve 基本上会为您处理所有这一切。将视频从云存储桶或本地存储上传到 Sieve,并使用我们的网络应用导出和下载您想要的确切帧 - 具体取决于运动、对象等。
要了解如何将本地视频上传到 Sieve,请查看此存储库:https://github.com/Sieve-Data/automatic-video-processing
大家。
现在我有一个对象分类任务,我有一个包含大量视频的数据集。在每个视频中,某些帧(不是每一帧,大约 16 万帧)都有其标签,因为一帧可能有多个对象。
我对创建数据集有些困惑。我的想法是先将视频转换为帧,然后将每个只有标签的帧制作为 tfrecord 或 hdf5 格式。最后,我会将每一帧的路径写入 csv 文件(训练和验证)以用于我的任务。
我的问题是: 1. 是否足够高效(tfrecord 或 hdf5)?在创建 tfrecord 或 hdf5 文件之前,我是否应该预处理每一帧,例如压缩以保存存储 space? 2.有没有办法直接在tensorflow或pytorch中处理视频数据集?
我想找到一种高效且传统的方式来处理视频数据集。真的很期待每一个答案。
我不是 TensorFlow 专家,所以我的回答不会涵盖这一点,抱歉。
由于利用数据中的时间相关性,视频格式通常以更长的随机访问时间为代价获得压缩。这是有道理的,因为人们通常按顺序访问视频帧,但如果您的访问完全是随机的,我建议您转换为 hdf5。否则,如果您访问视频的子序列,则保留视频格式可能有意义。
PyTorch 没有任何 "blessed" 视频 AFAIK 方法,但我使用 imageio
to read videos and seek particular frames. A short wrapper makes it follow the PyTorch Dataset
API. The code is rather simple but has a caveat, which is necessary to allow using it with multiprocessing DataLoader
。
import imageio, torch
class VideoDataset:
def __init__(self, path):
self.path = path
# explained in __getitem__
self._reader = None
reader = imageio.get_reader(self.path, 'ffmpeg')
self._length = reader.get_length()
def __getitem__(self, ix):
# Below is a workaround to allow using `VideoDataset` with
# `torch.utils.data.DataLoader` in multiprocessing mode.
# `DataLoader` sends copies of the `VideoDataset` object across
# processes, which sometimes leads to bugs, as `imageio.Reader`
# does not support being serialized. Since our `__init__` set
# `self._reader` to None, it is safe to serialize a
# freshly-initialized `VideoDataset` and then, thanks to the if
# below, `self._reader` gets initialized independently in each
# worker thread.
if self._reader is None:
self._reader = imageio.get_reader(self.path, 'ffmpeg')
# this is a numpy ndarray in [h, w, channel] format
frame = self._reader.get_data(ix)
# PyTorch standard layout [channel, h, w]
return torch.from_numpy(frame.transpose(2, 0, 1))
def __len__(self):
return self.length
可以修改此代码以支持多个视频文件以及输出您想要的标签。
我一直在为此构建一个名为 Sieve 的简单 API。似乎没有处理原始视频数据和构建数据集的好方法,只有“有趣”的样本。必须处理数小时甚至数天的视频素材非常昂贵,而且需要很长时间。
Sieve 基本上会为您处理所有这一切。将视频从云存储桶或本地存储上传到 Sieve,并使用我们的网络应用导出和下载您想要的确切帧 - 具体取决于运动、对象等。
要了解如何将本地视频上传到 Sieve,请查看此存储库:https://github.com/Sieve-Data/automatic-video-processing