加载图像数据集

Load Image Dataset

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

CSV:
id,lable
abf20a,CAR
dsf8sd,BIKE

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

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

训练模型

谢谢

维沙尔

  1. 使用 os.walk(directory)
  2. 按字母顺序获取文件名列表
  3. 读取 csv 文件并生成 labels_list 列表,其中 class 标签与文件名的顺序相同。 使用
  4. 使用 tf.keras.preprocessing.image_dataset_from_directory() 和参数 label=labels_list

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

我认为您可以使用 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])

然后你获得图像和标签。 这只是一个想法,你可以很容易地实现它。 希望对你有帮助。

您可以使用 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)