我正在Cloud ML Engine中使用Keras进行视频分类的实验。我的数据集包含保存为单独图像(例如seq1_frame1.png,seq1.frame2.png ...)的视频序列,这些视频序列已上传到GCS存储桶。
我使用一个csv文件,该文件引用了不同子剪辑的结束帧的开始,并使用了一个生成器,该生成器将一批剪辑输入模型。生成器负责从存储桶中加载帧,将它们读取为图像,并将它们串联为numpy数组。
我的培训时间很长,并且由于大量的阅读操作,我怀疑发生器是我的瓶颈。
在我在线上找到的示例中,人们通常将预先格式化的剪辑作为tfrecords文件直接保存到GCS。我觉得这种解决方案不适用于非常大的数据集,因为它暗示着要重复数据,甚至在我们决定提取重叠的子片段时更是如此。
我的方法有问题吗?更重要的是,是否存在使用大型视频数据集进行机器学习的“黄金标准”?
PS:我解释了我的设置以供参考,但我的问题不限于Keras,Generators或Cloud ML。
答案 0 :(得分:1)
在这种情况下,您几乎总是要花时间交换空间。您只需要计算出哪个更重要。
理论上,每一帧都有height * width * 3个字节。假设有3个颜色通道。节省空间的一种可能方法是仅使用一个通道(可能选择绿色,或者最好将整个数据集转换为灰度)。那会将您的全尺寸视频数据减小到三分之一。视频中的彩色数据的分辨率往往低于亮度数据,因此它可能不会影响您的训练,但是取决于您的源文件。
您可能知道,.png是无损图像压缩。每次加载一个时,生成器都必须先解压缩,然后再连接到片段。使用不同的压缩编解码器可以节省更多空间,但这意味着每个剪辑都需要完全解压缩,并且可能会增加您的时间。没错,反复减压需要时间。保存未压缩的视频将占用大量空间。不过,有些地方可以节省空间: