【问题标题】:Loading images in unlabelled subfolders using Keras's ImageDataGenerator使用 Keras 的 ImageDataGenerator 将图像加载到未标记的子文件夹中
【发布时间】:2021-01-19 07:45:53
【问题描述】:

我在尝试使用 Keras 的 ImageDataGenerator 加载 Adience image dataset 时遇到问题。图像数据 (.jpg) 位于多个以用户 ID 命名的子文件夹中。

directory/
     7153718@N04/
           landmark_aligned_face.2282.11597961815_4916cbf003_o.jpg
           landmark_aligned_face.2282.11598013005_240c2bc9c7_o.jpg
           ...
     7285955@N06/
           landmark_aligned_face.2049.9486667267_73ac31c862_o.jpg
           landmark_aligned_face.2050.9486613949_909254ccf9_o.jpg
           ...

保存图片标签的label.txt文件格式如下:

data/30601258@N03/landmark_aligned_face.2.10424815813_e94629b1ec_o.jpg  1
data/30601258@N03/landmark_aligned_face.3.10437979845_5985be4b26_o.jpg  1
data/30601258@N03/landmark_aligned_face.2.11816644924_075c3d8d59_o.jpg  1
data/30601258@N03/landmark_aligned_face.4.10424595844_1009c687e4_o.jpg  0
...

我尝试过使用this,但发现目录参数必须包含一个文件夹中的所有图像,而不是多个子文件夹中的图像。

那么,问题是:如何列出子文件夹中图片的正确目录?

【问题讨论】:

    标签: image keras conv-neural-network


    【解决方案1】:

    Keras ImageDataGenerator.flow_from_directory() 方法在您根据标签将数据分为子文件夹时非常有用。

    例如,您尝试在猫和狗之间进行分类。您可以做的是将所有猫图像保存在cats 子目录中,将狗图像保存在dogs 子目录中。然后.flow_from_directory() 方法将从子文件夹中获取图像并相应地设置它们的类。

    从你所说的,你有一个文本文件中提到的标签,那么子目录并不重要。

    你可以做的是读取包含文件名和标签信息的文本文件。遍历文件名并手动将每个图像加载到您的数据中。查看Pillow library 读取图像数据。

    【讨论】:

      【解决方案2】:

      编辑:我调用了错误的函数。 .flow_from_directory() 用于标记文件夹。 .flow_from_dataframe() 方法适合这种情况。

      我使用 pandas pd.read_csv() 将 .txt 文件作为数据框导入

      # Import libraries
      import pandas as pd
      from sklearn.model_selection import train_test_split
      
      # Load dataset as dataframe
      df = pd.read_csv("aligned_gender.txt", sep='\t')
      # Train test split
      train_df, test_df = train_test_split(df, test_size=0.2)
      
      # Output of train_df.head()
      datadir label
      data/30601258@N03/landmark_aligned_face.2.10424815813_e94629b1ec_o.jpg  1
      data/30601258@N03/landmark_aligned_face.3.10437979845_5985be4b26_o.jpg  1
      data/30601258@N03/landmark_aligned_face.2.11816644924_075c3d8d59_o.jpg  1
      data/30601258@N03/landmark_aligned_face.4.10424595844_1009c687e4_o.jpg  0
      ...
      

      我遗漏了一个必须设置 class_mode='raw' 的参数。

      from tensorflow.keras.preprocessing.image import ImageDataGenerator
      
      # Load images using Keras ImageDataGenerator
      datagen_train = ImageDataGenerator(rescale=1./255)
      train_generator = datagen_train.flow_from_dataframe(
          dataframe=train_df,
          x_col='datadir',
          y_col='label',
          batch_size=128,
          seed=7,
          shuffle=True,
          class_mode='raw',
          target_size=(224,224),
      )
      # Output 
      >>> Found 9755 validated image filenames.
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-01-25
        • 2019-11-21
        • 2015-09-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-03
        • 2012-11-15
        相关资源
        最近更新 更多