【问题标题】:Load Image Dataset加载图像数据集
【发布时间】:2020-12-24 22:32:45
【问题描述】:

我正在尝试从包含超过 10M 图像和 10K 类的特定目录加载数据,但问题是我没有为所有类设置不同的目录,所有图像仅在一个目录中。我有一个包含 id 和标签的 CSV 文件标签。我正在尝试使用VGG16 模型。

CSV:
id,lable
abf20a,CAR
dsf8sd,BIKE

这里 abf20a 是图片名称"abf20a.jpg"

所以请在这里帮助我如何将图像和标签一起加载并使用 VGG16 训练模型

谢谢

维沙尔

【问题讨论】:

    标签: python tensorflow jupyter-notebook google-colaboratory image-manipulation


    【解决方案1】:
    1. 使用os.walk(directory)按字母顺序获取文件名列表
    2. 读取 csv 文件并生成带有类标签的labels_list 列表,其顺序与文件名相同。 使用
    3. 使用tf.keras.preprocessing.image_dataset_from_directory() 和参数label=labels_list

    这将为您提供一个tf.data.Dataset,您可以将其提供给训练函数。

    【讨论】:

      【解决方案2】:

      我认为您可以使用 ID 标签迭代 csv 文件来读取图像。 例如:

      import csv 
      
      csv_path = 'your_csv_path'
      images_base_path = 'your_images_path'
      
      images=[]
      labels=[] 
      
      with open(csv_path, newline='',encoding="utf8") as csvfile:
            spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|')
            for row in spamreader:
                # And than you can do like this:
                # images_complete_path = images_base_path +  row[0]
                # images.append(imread(images_complete_path))
                # labels.append(row[1])
      

      然后您获得图像和标签。 这只是一个想法,您可以轻松实现它。 希望对您有所帮助。

      【讨论】:

      • 是的,这可行,但对于大型数据集,它需要更多的计算能力
      • 我认为问题可能更多地与内存错误而不是计算能力有关,因此在这种情况下,您可以尝试对创建多个数据集的批量图像使用相同的过程。如果您使用的是 google colab,则不应该有计算问题。
      • 我正在使用 Kaggle 的笔记本,如果我运行一个循环,它会花费太多时间来运行整个数据。因为我每 10k 数据运行一次,所以它需要将近 7 分钟。
      • 我认为这么大的数据集需要太多时间是正常的。另一种解决方案如下:如果您使用的数据集是已知数据集,也许您可​​以找到已标记的在线版本(h5py 数据集)。
      • 如果数据训练需要更多时间这是正常的,但数据操作也需要更多时间,这是没有意义的
      【解决方案3】:

      您可以使用 ImageDataGenerator 的 flow_from_dataframe 方法通过 CSV 文件加载图像。
      代码:

      import tensorflow as tf
      import pandas as pd
      
      df = pd.read_csv('data/img/new.csv')
      
      # Data augmentation pipeline
      train_datagen = tf.keras.preprocessing.image.ImageDataGenerator()
      
      # Reading files from path in data frame
      train_ds = train_datagen.flow_from_dataframe(df,directory = 'data/img/new', x_col = 'filename', y_col = 'label')
      

      Dataframe 如下所示:

          filename    label
      0   Capture.PNG 0
      

      如果您的文件名中只有 id。您可以使用 pandas 的 apply 方法来添加 jpg 扩展名。

      df['id'] = df['id'].apply(lambda x: '{}.jpg'.format(x))
      

      ImageDataGenerator提供的一整套数据增强选项,可以看this

      有关flow_from_dataframe的完整选项集,您可以查看this

      有了这个,您不必担心标签不匹配,因为这是一种内置的 TensorFlow 方法。此外,文件会在必要时加载,以避免使您的主内存混乱。

      对于培训,您可以简单地使用:

      model.fit(
              train_ds,
              steps_per_epoch=2000,
              epochs=50,
              validation_data=validation_ds,
              validation_steps=800)
      

      【讨论】:

      • train_datagen.flow_from_dataframe(df,directory = 'data/img/new', x_col = 'filename', y_col = 'label') 如果我不传递目录并将 x_col 中的所有图像路径作为文件路径而不是 train_datagen.flow_from_dataframe(df,x_col = 'filepath', y_col = 'label') 之类的文件名传递,是否可行?
      • 是的,因为我的df 只包含capture.png 而这个文件位于data/img/new 我使用了一个目录参数。但是如果你有完整的文件路径,比如data/img/new/capture.png,你可以跳过使用directory 属性。注意x_coly_col是数据框的列名。
      猜你喜欢
      • 2017-12-19
      • 2020-05-23
      • 2021-07-01
      • 2022-12-23
      • 1970-01-01
      • 2021-02-10
      • 2020-12-08
      • 2021-11-30
      • 2020-05-07
      相关资源
      最近更新 更多