设置用于视频处理的数据管道

2024-04-24 05:25:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我是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(该npz适合内存),然后使用它。或者使用TFrecords,但这看起来比通常的示例更复杂

这里真正令人恼火的是,TF教程和一般都是关于如何直接加载就绪数据集,或如何加载np数组,或如何加载图像、文本、数据帧对象,但没有找到任何实际示例如何处理大块数据文件,例如从音频或视频文件提取特征

因此,任何建议或解决方案都将受到高度赞赏,我将非常非常感谢终于有了一个可行的解决方案!:)


Tags: 文件数据pathin文件夹tfnpds