加载视频数据集(Keras)

4
我正在尝试实现一个LRCN/C(LSTM)RNN来对视频中的情绪进行分类。我的数据集结构分为两个文件夹 - "train_set"和"valid_set"。打开它们中的任何一个,您都可以找到3个文件夹,"positive"、"negative"和"surprise"。最后,这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. 数据集加载是否是线程安全的?Worker 1按顺序从文件夹1中获取视频帧,Worker 2从文件夹2中获取等等...或者每个Worker都可以从任何位置和任何文件夹中获取帧,这可能会破坏我的顺序读取吗?
  5. 如果我启用shuffle,它会打乱读取视频文件夹的顺序,还是会随机从随机文件夹中开始获取帧?
  6. TimeDistributed层是做什么的?从文档中我真的无法想象。如果我将其应用于CNN的密集层或CNN的每一层,会发生什么?
1个回答

4
  1. flow_from_directory 是用于图像,而不是视频的。它不会理解您的目录结构,并且不会创建“帧”维度。您需要自己编写生成器(通常最好实现一个keras.utils.Sequence)。

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

    • 由于视频长度不同,您逐个加载视频
    • 您使用空帧填充视频以使其具有相同的长度
  3. 与1相同

  4. 如果您制作自己的生成器并实现了keras.utils.Sequence(),则只要您的实现知道每个视频是什么,就可以保持安全性。

  5. 如果您正在加载图像,则会对图像进行洗牌

  6. TimeDistributed 允许在索引1处具有额外的维度。例如:通常需要(batch_size, ...其他维度...)的层将需要(batch_size, extra_dim, ...其他维度...)。这个额外的维度可能意味着任何东西,不一定是时间,并且它将保持不变。

    • 循环层不需要这个(除非您真的想为不寻常的原因添加一个额外的维度),它们已经将索引1视为时间。
    • CNN将完全相同地工作,对于每个图像,但您可以按照格式(batch_size, video_frames, height, width, channels)组织数据

谢谢!因此,如果我按顺序(暂时假设批量大小为1)读取视频帧,则每个帧都会通过CNN密集层进行分类。迭代1完成后,该帧被馈送到RNN中。在第2次迭代中,第二个视频帧通过CNN运行,并且TimeDistributed现在将输出张量在时间维度上扩展到2,使其指向时间步2?然后将其作为新步骤馈送到LSTM中? 每次迭代都是这样吗? 如果是这样,CNN的密集层是否将其累积的所有快照重新输入到(在本例中)RNN中,还是只传递最新的快照? - KDX2
1
一个批次应该是 (1, frames, height, width, channels)TimeDistributed(Conv2D(...)) 中,或者是 (1, frames, features)RNNDense 中。没有可见的迭代,每个层都会按照其应有的方式完成工作。(关于 frames,迭代在 RNN 内部不可见地发生)。 - Daniel Möller
1
您可以在RNN中选择return_sequences=True以保留帧直到结尾 - 最后一层将对每个帧进行分类。或者您可以在最后一个RNN层中不选择它,以消除帧维度并获得“视频分类”。 - Daniel Möller
1
正如答案中所说,对于TimeDistributed(Conv2D()),您的形状应为(batch, frames, height, width, channels),对于RNN和Dense,则应为(batch, frames, allTheRest) - Daniel Möller
1
batch = movies,每个电影都是一个样本/示例。不幸的是,没有自动文件夹读取功能。Keras没有标准的电影生成器。您必须在自定义生成器中控制文件夹结构和图像加载。因此,无论您的文件夹结构如何,只要您加载并分离哪些帧属于哪些电影即可。 - Daniel Möller
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接