【问题标题】:How to make a dataset from video datasets(tensorflow first)如何从视频数据集制作数据集(首先是tensorflow)
【发布时间】:2019-08-16 14:27:42
【问题描述】:

每个人。

现在我有一个对象分类任务,我有一个包含大量视频的数据集。在每个视频中,一些帧(不是每一帧,大约 16 万帧)都有它的标签,因为一个帧可能有多个对象。

我对创建数据集有些困惑。我的想法是首先将视频转换为帧,然后将每个仅带有标签的帧制作为 tfrecord 或 hdf5 格式。最后,我会将每一帧的路径写入 csv 文件(训练和验证),用于我的任务。

我的问题是: 1. 是否有足够的效率(tfrecord 或 hdf5)?在创建 tfrecord 或 hdf5 文件之前,我是否应该对每一帧进行预处理(例如压缩)以节省存储空间? 2.有没有办法直接在tensorflow或pytorch中处理视频数据集?

我想找到一种有效且传统的方式来处理视频数据集。真的很期待每一个答案。

【问题讨论】:

    标签: tensorflow dataset pytorch hdf5 tfrecord


    【解决方案1】:

    我不是 TensorFlow 人,所以我的回答不会涵盖这一点,抱歉。

    由于利用了数据中的时间相关性,视频格式通常会以更长的随机访问时间为代价来获得压缩。这是有道理的,因为人们通常按顺序访问视频帧,但如果您的访问完全是随机的,我建议您转换为 hdf5。否则,如果您访问视频的子序列,则保留视频格式可能是有意义的。

    PyTorch 对视频 AFAIK 没有任何“有福”的方法,但我使用 imageio 来读取视频并寻找特定帧。一个简短的包装器使其遵循 PyTorch Dataset API。该代码相当简单,但有一个警告,这是允许将其与多处理 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
    

    此代码可以调整为支持多个视频文件以及输出您想要的标签。

    【讨论】:

    • 谢谢。如果我使用 hdf5 格式存储,是否应该将所有训练图像转换为一个 hdf5 文件?是不是太大了?
    • 这取决于你的限制:你的视频有多大,你的硬盘等等。这是你的问题,不是我的问题
    【解决方案2】:

    为此,我一直在构建一个名为 Sieve 的简单 API。似乎没有很好的方法来处理原始视频数据和构建数据集,只有“有趣”的样本。必须处理数小时甚至数天的视频片段很昂贵,而且还需要很长时间。

    Sieve 基本上会为您处理所有这些问题。将视频从云存储桶或本地存储上传到 Sieve,并使用我们的网络应用导出和下载您想要的确切帧 - 取决于运动、对象等。

    要了解如何将本地视频上传到 Sieve,请查看此存储库:https://github.com/Sieve-Data/automatic-video-processing

    【讨论】:

      猜你喜欢
      • 2017-06-09
      • 1970-01-01
      • 2022-01-15
      • 2019-10-07
      • 1970-01-01
      • 2018-07-29
      • 2018-12-10
      • 1970-01-01
      • 2022-10-15
      相关资源
      最近更新 更多