首页 > 解决方案 > 我可以使用 Keras for CNN 从图像名称中提取图像数据集的标签吗?

问题描述

我想设计一个 CNN 模型来对具有 200,000 种不同字体和字母的图像数据集进行分类。图像位于 8 个不同的文件夹中,文件夹名称为 1 类到 8 类。我想对这个文件夹中的图像进行分类,以了解图像显示的字母。如果没有任何显示字母的文件,我怎么能做到这一点?

train_ds = tf.keras.preprocessing.image_dataset_from_directory(
  directory, label = None, 
  validation_split=0.2,
  subset="training",
  seed=123,
  image_size=(32, 32),
  batch_size=batch_size
  )

我使用此代码将我的数据集用于训练和验证。我的目录是这样的

main_directory/
...class_a/
......a_image_1.jpg
.
.
......a_image_1000.jpg
......b_image_1.jpg
.
......b_image_1000.jpg
.
.
.
......y_image_1.jpg
.
.
......y_image_1000.jpg
......z_image_1.jpg
.
.
......z_image_1000.jpg
...class_b/
......a_image_1000.jpg
.
.
......a_image_2000.jpg
......b_image_1000.jpg
.
......b_image_2000.jpg
.
.
.
......y_image_1000.jpg
.
.
......y_image_2000.jpg
......z_image_1000.jpg
.
.
......z_image_2000.jpg

这不会让我看到标签train_ds

标签: pythontensorflowkerasdeep-learningconv-neural-network

解决方案


Keras 通常不会一次加载所有数据以节省内存,它不能有命名解体。

由于文件未排序,您可以尝试使用下面的代码片段shutilos相应地隔离文件并加载基于文件夹的数据生成器以将数据提供给模型

import os
from shutil import move

folder = 'data folder path'
for clas in os.listdir(folder):
    for file in os.listdir(os.path.join(folder, clas)):
        class_label = file.split('_')[0]
        class_folder = os.path.join(folder, 'class_{}'.format(class_label))
        os.makedirs(class_folder, exist_ok=True)
        move(os.path.join(folder,clas, file), os.path.join(folder, class_folder, file))




# load and iterate training dataset
train_it = datagen.flow_from_directory('data/train/', class_mode='binary', batch_size=64)
# load and iterate validation dataset
val_it = datagen.flow_from_directory('data/validation/', class_mode='binary', batch_size=64)
# load and iterate test dataset
test_it = datagen.flow_from_directory('data/test/', class_mode='binary', batch_size=64)

推荐阅读