我正在尝试实现 LRCN/C(LSTM)RNN 来对视频中的情绪进行分类。我的数据集结构分为两个文件夹 - “train_set”和“valid_set”。
当你打开其中任何一个时,你可以找到3个文件夹,“积极”、“消极”和“惊喜”。最后,这 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 中顺序获取视频帧,工作人员 2 从文件夹 2 等中获取视频帧……或者每个工作人员可以从任何地方和任何文件夹中获取帧,这会破坏我的顺序阅读?
- 如果我启用
shuffle
,它会打乱读取视频文件夹的顺序,还是会开始从随机文件夹中以随机顺序获取帧?
- 什么是
TimeDisributed
层按照我无法想象的文档进行操作?如果我将其应用于 CNN 的密集层或 CNN 的每一层会怎样?
flow_from_directory
是为图像而不是电影而制作的。它不会理解您的目录结构,也不会创建“框架”维度。您需要自己的生成器(通常最好实现一个keras.utils.序列 https://keras.io/utils/)
-
您只能在以下情况下批量加载:
- 由于电影的长度不同,您将逐一加载电影
- 您用空帧填充视频以使它们都具有相同的长度
与 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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)