如何在Google Cloud ML Engine中处理大型视频数据集?

时间:2018-10-26 14:51:22

标签: keras google-cloud-storage large-data google-cloud-ml

我正在Cloud ML Engine中使用Keras进行视频分类的实验。我的数据集包含保存为单独图像(例如seq1_frame1.png,seq1.frame2.png ...)的视频序列,这些视频序列已上传到GCS存储桶。

我使用一个csv文件,该文件引用了不同子剪辑的结束帧的开始,并使用了一个生成器,该生成器将一批剪辑输入模型。生成器负责从存储桶中加载帧,将它们读取为图像,并将它们串联为numpy数组。

我的培训时间很长,并且由于大量的阅读操作,我怀疑发生器是我的瓶颈。

在我在线上找到的示例中,人们通常将预先格式化的剪辑作为tfrecords文件直接保存到GCS。我觉得这种解决方案不适用于非常大的数据集,因为它暗示着要重复数据,甚至在我们决定提取重叠的子片段时更是如此。

我的方法有问题吗?更重要的是,是否存在使用大型视频数据集进行机器学习的“黄金标准”?

PS:我解释了我的设置以供参考,但我的问题不限于Keras,Generators或Cloud ML。

1 个答案:

答案 0 :(得分:1)

在这种情况下,您几乎总是要花时间交换空间。您只需要计算出哪个更重要。

理论上,每一帧都有height * width * 3个字节。假设有3个颜色通道。节省空间的一种可能方法是仅使用一个通道(可能选择绿色,或者最好将整个数据集转换为灰度)。那会将您的全尺寸视频数据减小到三分之一。视频中的彩色数据的分辨率往往低于亮度数据,因此它可能不会影响您的训练,但是取决于您的源文件。

您可能知道,.png是无损图像压缩。每次加载一个时,生成器都必须先解压缩,然后再连接到片段。使用不同的压缩编解码器可以节省更多空间,但这意味着每个剪辑都需要完全解压缩,并且可能会增加您的时间。没错,反复减压需要时间。保存未压缩的视频将占用大量空间。不过,有些地方可以节省空间:

  • 缩小为灰度(或上述绿色)
  • 暂时对帧进行子采样(您是否需要每个连续帧,还是可以每秒采样一次?)
  • 您使用整个框架还是仅使用补丁?您可以裁剪或重新缩放视频序列吗?
  • 您正在使用光流吗?这非常耗费处理器资源,也将其视为预处理步骤,因此每个剪辑只需执行一次(同样,这是时间的交换空间)