Я не специалист по 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
Этот код также может быть адаптирован для поддержки нескольких видеофайловчтобы выводить метки так, как вы хотите, чтобы они были.