我正在尝试使用Cloud ML Engine中的Keras进行视频分类。我的数据集包含在另存为单独图像的视频序列中(例如,seq1_frame1.png,seq1.frame2.png...)我已经上传到了GCS存储桶中。
我使用了一个引用不同子剪辑结束帧开始的csv文件,以及一个向模型提供批量剪辑的生成器。生成器负责从存储桶中加载帧,将它们作为图像读取,并将它们连接为numpy数组。
我的训练是相当长的,我怀疑生成器是我的瓶颈,因为大量的读取操作。
在我在网上找到的例子中,人们通常将预先格式化的剪辑直接保存为tfrecords文件到GCS。我觉得这个解决方案对于非常大的数据集并不理想,因为它意味着复制数据,如果我们决定提取重叠的子剪辑,就更是如此。
我的方法有什么问题吗?更重要的是,对于使用大型视频数据集进行机器学习,是否有一个“黄金标准”?
PS :我解释了我的设置以供参考,但我的问题并不局限于Keras,generators或Cloud ML。
发布于 2018-10-26 15:12:42
在这种情况下,你几乎总是要用时间来换取空间。你只需要找出哪个更重要。
理论上,每一帧都有高度*宽度*3个字节。假设有3个颜色通道。节省空间的一种可能方法是只使用一个通道(可能选择绿色,或者更好地将整个数据集转换为灰度)。这将使您的全尺寸视频数据减少到三分之一。视频中的颜色数据往往比亮度数据的分辨率低,因此它可能不会影响您的训练,但这取决于源文件。
正如您可能知道的,.png是一种无损图像压缩。每次加载时,生成器都必须先解压缩,然后连接到剪辑。您可以使用不同的压缩编解码器来节省更多的空间,但这意味着每个剪辑都需要完全解压缩,并且可能会增加您的时间。你说得对,反复解压需要时间。并且保存未压缩的视频将占用相当多的空间。不过,也有一些地方可以节省空间:
https://stackoverflow.com/questions/53011315
复制