Как сделать набор данных из наборов видеоданных (сначала тензорный поток) - PullRequest
0 голосов
/ 26 марта 2019

каждый.

Теперь у меня есть задача классификации объектов, и у меня есть набор данных, содержащий большое количество видео. В каждом видео некоторые кадры (не каждый кадр, около 160 тысяч кадров) имеют свои метки, поскольку кадр может иметь несколько объектов.

У меня путаница при создании набора данных. Моя идея состоит в том, чтобы сначала конвертировать видео в кадры, затем каждый кадр только с метками будет выполнен в формате tfrecord или hdf5. Наконец, я бы записал путь каждого кадра в CSV-файлы (обучение и проверка), используя для своей задачи.

Мой вопрос: 1. Достаточно ли эффективен (tfrecord или hdf5)? Должен ли я предварительно обрабатывать каждый кадр, например сжатие, для экономии места перед созданием файлов tfrecord или hdf5? 2. Есть ли способ обработки набора видеоданных непосредственно в тензорном потоке или в pytorch?

Я хочу найти эффективный и традиционный способ обработки наборов видеоданных. Очень жду каждого ответа.

1 Ответ

1 голос
/ 27 марта 2019

Я не специалист по TensorFlow, поэтому мой ответ не охватит это, извините.

Форматы видео обычно получают сжатие за счет более длительного времени произвольного доступа благодаря использованию временных корреляций в данных.Это имеет смысл, потому что каждый обычно обращается к видеокадрам последовательно, но если ваш доступ совершенно случайный, я предлагаю вам перейти на hdf5.В противном случае, если вы получаете доступ к подпоследовательностям видео, возможно, имеет смысл остаться с видеоформатами.

PyTorch не имеет «благословенных» подходов к видео AFAIK, но я использую imageio для чтения видео и поиска определенных кадров.Короткая оболочка заставляет его следовать API PyTorch Dataset.Код довольно прост, но есть предостережение, которое необходимо для использования его с многопроцессорной обработкой 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

Этот код также может быть адаптирован для поддержки нескольких видеофайловчтобы выводить метки так, как вы хотите, чтобы они были.

...