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(这将适合内存)并使用它来代替。或者使用 TFrecords,但这看起来比通常的例子更复杂。
这里真正令人讨厌的是,TF 教程和一般来说都是关于如何直接加载现成的数据集,或者如何加载np
数组或如何加载图像、文本、数据框对象,但无法找到任何真实的如何处理大块数据文件的示例,例如从音频或视频文件中提取特征的情况。
因此,任何建议或解决方案都将受到高度赞赏,我将非常非常感谢最终能够奏效!:)
解决方案
推荐阅读
- python - 如何将 numpy 1D 与 ND 数组相乘?
- laravel - 如果 Laravel ImplicitRouteBinding 完成,是否可以缓存查询?
- django-admin - 在 django admin 中向添加页面添加过滤器
- qt - 如何创建像 QWidget 这样的矩阵?
- c - 将数据放入 .text 时带有 gcc 警告的汇编器警告
- python - ValueError:时间数据“2006–01–01”与格式“%Y-%m-%d”不匹配
- python - 使用 lxml 的 tostring() 从 xml/html 中删除根标签
- jolt - 在 jolt 规范中添加具有相同键的对象内的数组
- io - OCaml 程序的意外周期性、非连续输出
- javascript - 如果数组中的项目与另一个数组中的项目重合,则替换它们