首页 > 解决方案 > 构建一个 tf.data.Dataset 对象,其中图像作为特征,.csv 文件作为标签

问题描述

我正在做一个深度学习项目,试图自动检测给定图像的人的关节,我被困在试图以正确格式将数据提供给我的神经网络。我的特征 (x) 是非常大的图像 (2000x900),我的标签 (y) 是 .csv 文件,其中有四列,每列 15 行:第一列包含字符串(关节名称),其他三列包含整数(每行每列一个整数)。.csv 文件如下所示:

左膝,可见,x,y

Right_knee, vis, x, y

...(这里的x和y代表图像坐标,不是特征和标签!vis为0或1,表示关节是否可见)

每个 .csv 文件对应一个特定的图像,.csv 文件和对应的图像名称相同但路径不同。现在,我想创建一个 tf.data.Dataset 对象,其中特征是图像,标签是从 .csv 文件构建的 Python 字典。例如,对应于图像 x(i) 的单个标签 y(i) 需要如下所示: {'Left_knee': [vis, x, y], 'Right_knee': [vis, x, y] , ...}。

我构建这样一个数据集的策略是将图像和标签加载到单独的 tf.data.Dataset 对象中,然后将它们融合在一起。为了加载图像,我编写了这个非常简单的代码(可能效率低下/错误?):

imgs_path = pathlib.Path('path/to/images')
list_imgs = tf.data.Dataset.list_files(str(imgs_path/'*'))

def imgs_to_dataset(file_path):
    return tf.io.read_file(file_path)

imgs_dataset = list_imgs.map(imgs_to_dataset)

老实说,我对 TensorFlow(和一般编程!)太陌生了,无法以任何方式对其进行测试以发现潜在问题,但它至少不会给我任何错误。

现在,我的问题是如何将 .csv 文件加载到 tf.data.Dataset 对象中,然后将其与 imgs_dataset 融合,以便正确的标签到达每个图像。我知道我必须使用 tf.data.experimental.make_csv_dataset 之类的东西,但我不太确定如何设置它,以便我的 y 采用我想要的格式。有没有办法做到这一点,还是我走错了路?我应该澄清一下,我对使用 tf.data.Dataset 对象的想法没有任何看法,但据我所知,这似乎是一种非常方便(如果你可以设置的话!)将数据提供给 tf 的方式.keras 模型通过 .fit()。另外,我希望标签以特定方式(即作为字典)构造,因为我的网络损失将需要访问标签的不同字段(例如,如果,损失会更低,对于给定的图像和给定的关节,关节的 vis 参数为 0)。但也许有一种更有效的方法来构建我的标签以实现这一目标?

任何帮助和建议将不胜感激!提前致谢。

标签: csvtensorflowdatasettf.data.dataset

解决方案


我认为tf.data.Dataset是一个很好的方法。您不需要创建两个数据集并将它们融合在一起,您可以首先使用例如加载数据集。from_tensor_slces, list_files, 或from_generator然后继续应用地图功能,如果需要,它会对您的图像进行后处理并加载一个后处理您的标签,即将它们从 pd.DataFrame 转换为 dict。然后,您的 map 函数会将图像元组作为张量返回,并将其标签作为 dicts。在映射之后,您也可以应用洗牌和批处理。

文档中的示例:

dataset = Dataset.range(5)
# `map_func` takes a single argument of type `tf.Tensor` with the same
# shape and dtype.
result = dataset.map(lambda x: x + 1) 

应该结构化的方式map高度取决于文件的结构和命名。您可能想用您自己的自定义函数替换 lambda 函数,


推荐阅读