【问题标题】:image_dataset_from_directory label list appear to be assigned in a random orderimage_dataset_from_directory 标签列表似乎是按随机顺序分配的
【发布时间】:2021-01-31 16:45:30
【问题描述】:

我尝试执行以下操作:

  1. 我在 Google Colab 上有 2 个文件夹。第一个包含 PNG 图像,第二个包含描述每个图像的 CSV。对应的 CSV 文件与他们描述的 PNG 名称相同,唯一的区别是扩展名。

示例 PNG文件: dog_1.png、dog_2.png、dog_3.png

他们的 CSV 文件是:dog_1.csv、dog_2.csv、dog_3.csv。

每个文件的内容是: 品种、颜色、重量 7、22、15

我使用函数 get_class_label(SELECTED_FEATURE, label_file) 从 csv 中选择一个特征,然后根据该特定数据将数据拆分为类:

示例 SELECTED_FEATURE='品种' 因此,对于我在类标签上方显示的 csv 示例图像将是“7”。 标签基于每个图像的选定特征的值。

  1. 我浏览了所有 PNG 文件。对于它们中的每一个,我从匹配的 CSV 中获取标签并构建一个标签列表。
  2. 文档 (https://www.tensorflow.org/api_docs/python/tf/keras/preprocessing/image_dataset_from_directory) 指出:

标签应按字母数字顺序排列 图片文件路径(通过 Python 中的 os.walk(directory) 获取)。

所以我就是这样做的:

label_list = []
for path, directories, image_files in os.walk(images_directory):
  for image_file in image_files:
    label_file = replace_file_extension(image_file, 'png', 'csv')
    label_list.append(get_class_label(SELECTED_FEATURE, label_file))
  1. 我使用 image_dataset_from_directory 从带有自定义标签列表的目录创建数据集:
train_ds = tf.keras.preprocessing.image_dataset_from_directory(
    images_directory,
    image_size=(32,32),
    labels=label_list,
    label_mode="int"
    )

每次加载图像时,我都会以随机顺序分配给我的图像的标签?这个问题背后的原因是什么?如何确保以正确的顺序加载图像?

【问题讨论】:

  • 不清楚你在做什么。能否展示图片文件列表和对应的 cvs 标签示例?
  • 我为上下文的问题添加了一个示例。
  • 想我明白你在做什么。请看下面我的回答

标签: python tensorflow keras google-colaboratory


【解决方案1】:

我找到了问题的根源。

tf.keras.preprocessing.image_dataset_from_directory 以名称的字母数字顺序提供图像。

os.walk 做的事情以某种方式不同(它似乎提供按最后修改日期排序的图像),所以要修复它我不得不使用 sorted() os.walk 返回的文件列表。

【讨论】:

    【解决方案2】:

    我创建了一个文件夹 C:\Temp\forder,其中包含两个文件夹。文件夹 C:\Temp\forder\images 包含 10 张 jpg 图像,依次标记为 1.jpg、2.jpg、....10.jpg。文件夹 C:\Temp\forder\csv 包含 10 个 csv 文件,分别标记为 1.csc、2.csc、、、、、10.csc。每个 csv 文件夹包含 3 列“品种”、“年龄”、“颜色”,并且每列中只有一行具有整数值。对于品种列,每个 csv 文件的值都是连续编号的,所以 1.csv 的品种值 =1,2.csv 的品种值 =2 等等。然后我运行了下面的代码,与你的相似

    import os
    import pandas as pd
    def replace_file_extension(image_file, old_ext, new_ext):
        index=image_file.rfind('.')
        ext=image_file[index + 1:]
        fname=image_file[:index]
        if ext==old_ext:
            fnew=fname + '.' + new_ext
        return fnew
    def get_class_label(SELECTED_FEATURE, label_file_path):    
        df=pd.read_csv(label_file_path)    
        feature=df[SELECTED_FEATURE].iloc[0]    
        return feature
    
    SELECTED_FEATURE='breed'
    images_directory=r'c:\temp\forder\images'
    label_directory=r'c:\temp\forder\csv'
    label_list = []
    for path, directories, image_files in os.walk(images_directory):    
        for image_file in image_files:   
            label_file = replace_file_extension(image_file, 'jpg', 'csv')
            label_file_path=os.path.join(label_directory, label_file) 
            label=get_class_label(SELECTED_FEATURE, label_file_path)
            print (image_file, '  ', label)
            label_list.append(label)
    print (label_list)
    

    结果是预期的列表。请注意,图像文件 10.jpg 按预期在 2.jpg 之前,但标签 10 的值是正确的,因为预期的打印数据如下所示

    1.jpg    1
    10.jpg    10
    2.jpg    2
    3.jpg    3
    4.jpg    4
    5.jpg    5
    6.jpg    6
    7.jpg    7
    8.jpg    8
    9.jpg    9
    [1, 10, 2, 3, 4, 5, 6, 7, 8, 9]
    

    【讨论】:

    • 我有非常相似的代码,但你的回答并没有解决我的问题。我的问题是函数 tf.keras.preprocessing.image_dataset_from_directory 读取文件(并将它们分配给我的标签)的顺序与 os.walk 不同。
    • 哦,好的,让我看看
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多