加载视频数据集(Keras)

时间:2019-01-02 10:27:49

标签: python tensorflow video keras

我正在尝试实施LRCN / C(LSTM)RNN对视频中的情绪进行分类。我的数据集结构分为两个文件夹-“ train_set”和“ valid_set”。 当您打开其中一个文件夹时,可以找到3个文件夹,“正”,“负”和“惊奇”。最后,这3个文件夹中的每个文件夹都有视频文件夹,每个文件夹都是.jpg中视频帧的集合。视频的长度不同,因此,一个视频文件夹可以有200帧,旁边是1200、700 ...!要加载数据集,我正在使用flow_from_directory。在这里,我需要一些澄清:

  1. 在我的情况下,flow_from_directory将按顺序逐个加载视频吗?他们的框架?
  2. 如果我分批加载,flow_from_directory是否根据视频中图像的顺序排序进行批量处理?
  3. 如果我有5个图像的video_1文件夹和3个视频的video_2文件夹,并且批处理大小为7,flow_from_directory最终将选择两批5和3个视频,否则它将与这些视频重叠,将全部来自第一个文件夹的5张图片+第二个文件夹的2张图片?会混合我的视频吗?
  4. 数据集加载线程安全吗?工作人员一个从文件夹1依次获取视频帧,工作人员2从文件夹2依次获取...等等,还是每个工作人员都可以从任何位置和任何文件夹获取帧,这会破坏我的顺序读取?
  5. 如果我启用shuffle,它会改组它读取视频文件夹的顺序还是会开始从随机文件夹中随机提取帧?
  6. 根据我无法想象的文档,TimeDisributed层的作用是什么?如果我将其应用于CNN的密集层或CNN的每一层怎么办?

1 个答案:

答案 0 :(得分:2)

  1. flow_from_directory用于图像而不是电影。它不会理解您的目录结构,也不会创建“框架”维度。您需要自己的生成器(通常最好实现keras.utils.Sequence

  2. 您只能在以下情况下分批加载:

    • 由于电影长度不同,您一一加载电影
    • 您用空帧填充视频以使它们的长度相同
  3. 与1相同。

  4. 如果您使自己的生成器实现keras.utils.Sequence(),则只要实现知道每部电影是什么,安全性就将得到保持。

  5. 如果您正在加载图像,它将随机播放图像

  6. TimeDistributed允许数据在索引1处具有额外的维数。例如:通常使用(batch_size, ...other dims...)的图层将使用(batch_size, extra_dim, ...other dims...)。这个额外的维度可能意味着任何东西,不一定是时间,它将保持不变。

    • 递归层不需要此(除非出于特殊原因您确实希望在那里有一个额外的维度),它们已经将索引1视为时间。
    • 对于每张图像,CNN都将完全相同,但是您可以采用(batch_size, video_frames, height, width, channels)
    • 的格式组织数据