我正在尝试实现 LRCN/C(LSTM)RNN 来对视频中的情绪进行分类。我的数据集结构分为两个文件夹——“train_set”和“valid_set”。 当你打开其中一个时,你会发现3个文件夹,“positive”,“negative”和“surprise”。最后,这 3 个文件夹中的每一个都有视频文件夹,每个文件夹都是 .jpg 格式的视频帧的集合。视频有不同的长度,因此一个视频文件夹可以有 200 帧,旁边的是 1200、700 帧......!要加载数据集,我正在使用 flow_from_directory。在这里,我需要澄清几点:
- 在我的例子中,
flow_from_directory
会按顺序逐一加载视频吗?他们的框架? - 如果我分批加载,
flow_from_directory
是否会根据视频中图像的顺序进行批处理? - 如果我有包含 5 个图像的 video_1 文件夹和包含 3 个视频的 video_2 文件夹,批量大小为 7,
flow_from_directory
最终会选择两批 5 个和 3 个视频,否则视频会重叠,从第一个文件夹中获取所有 5 张图片 + 第二个文件夹中的 2 张?它会混合我的视频吗? - 数据集加载是线程安全的吗?工作人员 1 从文件夹 1 中顺序获取视频帧,工作人员 2 从文件夹 2 中获取视频帧,依此类推...或者每个工作人员都可以从任何地方和任何文件夹中获取视频帧,这会破坏我的顺序阅读吗?
- 如果我启用
shuffle
,它会打乱读取视频文件夹的顺序,还是会开始以随机顺序从随机文件夹中获取帧? - 根据我无法想象的文档,
TimeDisributed
层做了什么?如果我将它应用于 CNN 的密集层或 CNN 的每一层会怎样?
最佳答案
flow_from_directory
是为图像而不是电影制作的。它不会理解您的目录结构,也不会创建“框架”维度。您需要自己的生成器(通常最好实现 keras.utils.Sequence )只有在以下情况下才能批量加载:
- 由于长度不同,你一个一个地加载电影
- 你用空帧填充你的视频,使它们都具有相同的长度
同1。
如果您让自己的生成器实现
keras.utils.Sequence()
,只要您的实现知道每部电影是什么,就会保持安全。如果您正在加载图片,它会随机播放图片
TimeDistributed
允许在索引 1 处具有额外维度的数据。示例:通常采用(batch_size, ...other dims...)
的层将采用(batch_size, extra_dim, ...other dims...)
。这个额外的维度可能意味着任何东西,不一定是时间,它会保持不变。- 循环层不需要这个(除非你真的因为不寻常的原因想要一个额外的维度),它们已经将索引 1 视为时间。
- 对于每张图像,CNN 的工作方式完全相同,但您可以按照格式组织数据
(batch_size, video_frames, height, width, channels)
关于python - 加载视频数据集(Keras),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54004682/