首页 > 解决方案 > 为视频处理设置数据管道

问题描述

我是 Tensorflow 的新手,所以我将不胜感激任何建设性的帮助。

我正在尝试使用 Tensorflow 构建用于视频处理的特征提取和数据管道,其中多个文件夹保存具有多个类的视频文件(JHMDB 数据库),但有点卡住了。

我将功能提取到一个文件夹中,目前用于分隔 *.npz 压缩数组,在文件名中我也存储了类名。

第一次尝试

首先,我想我会使用 TF 教程网站上的这段代码,只需从文件夹方法中读取文件:

jhmdb_path = Path('...')


# Process files in folder
list_ds = tf.data.Dataset.list_files(str(jhmdb_path/'*.npz'))

for f in list_ds.take(5):
    print(f.numpy())

def process_path(file_path):
    labels = tf.strings.split(file_path, '_')[-1]
    features = np.load(file_path)

    return features, labels

labeled_ds = list_ds.map(process_path)

for a, b in labeled_ds.take(5):
    print(a, b)

TypeError: expected str, bytes or os.PathLike object, not Tensor

..但这不起作用。

第二次尝试

然后我想好吧,我会使用生成器:

# using generator
jhmdb_path = Path('...')

def generator():
    for item in jhmdb_path.glob("*.npz"):
        features = np.load(item)
        print(item.files)
        print(f['PAFs'].shape)
        features = features['PAFs']

        yield features

dataset = tf.data.Dataset.from_generator(generator, (tf.uint8))
iter(next(dataset))

TypeError: 'FlatMapDataset' object is not an iterator...not working.

在第一种情况下,不知何故路径是字节类型,我无法将其更改str为能够使用np.load(). (如果我将文件直接指向np.load(direct_path),那很奇怪,但它可以工作。)

在第二种情况下......我不确定出了什么问题。

我寻找了几个小时来找到一个解决方案,如何从相对较大和大量的“npz”或“npy”文件的列表中构建可迭代数据集,但似乎在任何地方都没有提到这一点(或者可能只是太微不足道了)。

另外,由于到目前为止我无法测试模型,我不确定这是否是一个好方法。即以这种方式为模型提供数百个文件,或者只是构建一个巨大的 3.5 GB npz(这将适合内存)并使用它来代替。或者使用 TFrecords,但这看起来比通常的例子更复杂。

这里真正令人讨厌的是,TF 教程和一般来说都是关于如何直接加载现成的数据集,或者如何加载np数组或如何加载图像、文本、数据框对象,但无法找到任何真实的如何处理大块数据文件的示例,例如从音频或视频文件中提取特征的情况。

因此,任何建议或解决方案都将受到高度赞赏,我将非常非常感谢最终能够奏效!:)

标签: pythontensorflowdata-sciencetensorflow-datasets

解决方案


推荐阅读