Python 加载视频数据集(Keras)

Python 加载视频数据集(Keras),python,tensorflow,video,keras,Python,Tensorflow,Video,Keras,我正在尝试实现一个LRCN/C(LSTM)RNN来对视频中的情绪进行分类。我的数据集结构分为两个文件夹——“训练集”和“有效集”。 当你打开其中任何一个文件夹时,你都可以找到3个文件夹,“肯定”、“否定”和“惊喜”。最后,这3个文件夹中的每一个都有视频文件夹,每个文件夹都是.jpg中视频帧的集合。视频有不同的长度,因此一个视频文件夹可以有200帧,它旁边的一个有1200帧,700帧。。。!要加载数据集,我正在使用来自目录的flow\u。在这里,我需要一些澄清: 在我的例子中,flow\u fro

我正在尝试实现一个LRCN/C(LSTM)RNN来对视频中的情绪进行分类。我的数据集结构分为两个文件夹——“训练集”和“有效集”。 当你打开其中任何一个文件夹时,你都可以找到3个文件夹,“肯定”、“否定”和“惊喜”。最后,这3个文件夹中的每一个都有视频文件夹,每个文件夹都是.jpg中视频帧的集合。视频有不同的长度,因此一个视频文件夹可以有200帧,它旁边的一个有1200帧,700帧。。。!要加载数据集,我正在使用来自目录的flow\u。在这里,我需要一些澄清:

  • 在我的例子中,
    flow\u from\u directory
    会按顺序逐个加载视频吗?他们的框架
  • 如果我分批加载,
    flow\u from\u directory
    是否根据视频中图像的顺序进行分批
  • 如果我有包含5个图像的video_1文件夹和包含3个视频的video_2文件夹,并且批量大小为7,那么
    flow_from_directory
    是否会选择包含5个和3个视频的两个批次,或者它会重叠视频,从第一个文件夹+第二个文件夹中获取所有5个图像?它会混合我的视频吗
  • 数据集加载是线程安全的吗?工作者1从文件夹1依次获取视频帧,工作者2从文件夹2依次获取视频帧,等等。。。或者每个工作人员都可以从任何地方和任何文件夹获取帧,这会破坏我的顺序阅读
  • 如果我启用了shuffle,它将按照读取视频文件夹的顺序进行无序移动,还是开始从随机文件夹中随机提取帧
  • 从我无法想象的文档来看,
    timedistributed
    层做了什么?如果我把它应用到CNN的密集层或者CNN的每一层呢
  • flow\u from\u directory
    是为图像而不是电影制作的。它不会理解您的目录结构,也不会创建“框架”维度。您需要自己的生成器(通常更好地实现)

  • 只有在以下情况下,才能加载到批次:

    • 由于电影的长度不同,您可以逐个加载电影
    • 你用空帧填充视频,使它们的长度相同
  • 与1相同

  • 如果您让自己的生成器实现一个
    keras.utils.Sequence()
    ,那么只要您的实现知道每部电影是什么,就会保持安全性

  • 如果您正在加载图像,它将洗牌图像

  • TimeDistributed
    允许在索引1处使用额外维度的数据。示例:通常采用
    (批次大小,…其他dim…
    的图层将采用
    (批次大小,额外dim,…其他dim…
    )。这个额外的维度可能意味着任何东西,不一定是时间,它将保持不变

      重复层不需要这个(除非你真的需要额外的维度,因为异常的原因),他们已经把索引1看作是时间。李>
    • CNN对每幅图像的工作原理完全相同,但您可以按
      格式组织数据(批量大小、视频帧、高度、宽度、频道)

  • 非常感谢。因此,如果我按顺序读取视频帧ofc(现在假设批量大小为1),则每个帧都会按CNN密集层进行分类。迭代1完成,帧被送入RNN。在迭代2,第二个视频帧通过CNN,时间分布现在将时间维度上的输出张量扩展到2,使其指向时间步长2?那么这将作为LSTM的一个新步骤?每次迭代都是这样吗?如果是这样,CNN的密集型快照是将其所有累积的快照重新输入(在本例中)RNN,还是只传递最新的快照?一批快照应为
    (1,帧,高度,宽度,频道)
    中的
    时间分布(Conv2D(…)
    ,或
    RNN中的
    (1,帧,特征)
    密集型
    。并没有可见的迭代,每一层都会按它应该做的去做。(关于
    )的迭代在RNN内部不可见地发生。您可以在RNN中选择
    return\u sequences=True
    ,将帧保留到最后-最后一层将对每个帧进行分类。或者,您可能不会在最后一个RNN层中选择该层以消除帧维度并获得“视频分类”。如回答中所述,您的形状应为
    (批次、帧、高度、宽度、通道)
    (Conv2D())
    (批次、帧、allTheRest)
    对于RNN和
    稠密
    批处理=电影
    ,每部电影都是一个示例/示例。不幸的是,没有自动读取文件夹。Keras没有标准的电影发生器。您必须在自定义生成器中控制文件夹结构和图像加载。所以,不管你的文件夹结构是什么,只要你加载和分离哪些帧属于哪些电影。