如何从不同子文件夹加载图像分类训练数据并匹配CSV标签
方案1:构造全路径DataFrame后直接使用flow_from_dataframe
这是改动最小的适配方案,无需调整现有文件存储结构,只需把CSV标签和对应子文件夹下的图像路径做匹配,生成包含「完整图像路径」「对应标签」的新DataFrame即可,flow_from_dataframe本身不限制文件存储结构,只要传入正确的样本路径和标签就能正常使用。
import os import pandas as pd from tensorflow.keras.preprocessing.image import ImageDataGenerator # 读取原始标签CSV label_df = pd.read_csv("你的标签文件存储路径.csv") # 定义训练数据根目录 train_root = "你的Train data文件夹绝对路径" all_samples = [] for idx, row in label_df.iterrows(): subfolder_name = str(row["subfolder"]) label = row["labels"] subfolder_path = os.path.join(train_root, subfolder_name) # 遍历当前子文件夹下所有JPG图像 for img_name in os.listdir(subfolder_path): if img_name.endswith(".jpg"): full_img_path = os.path.join(subfolder_path, img_name) all_samples.append({ "img_path": full_img_path, "label": label }) # 转换为DataFrame train_df = pd.DataFrame(all_samples) # 正常使用ImageDataGenerator加载数据 datagen = ImageDataGenerator( rescale=1./255, # 可补充其他图像增强参数,如rotation_range、width_shift_range等 ) train_generator = datagen.flow_from_dataframe( dataframe=train_df, x_col="img_path", y_col="label", target_size=(224, 224), # 替换为实际需要的图像输入尺寸 batch_size=32, # 替换为实际需要的批次大小 class_mode="raw" # 二分类/多分类直接用raw即可,如需自动做one-hot编码可改为"categorical"并将label转为字符串类型 )
方案2:用tf.data.Dataset构建自定义加载流水线
数据量较大时该方案效率更高、扩展性更强,可灵活自定义预处理、增强逻辑:
import tensorflow as tf import pandas as pd import os label_df = pd.read_csv("你的标签文件存储路径.csv") train_root = "你的Train data文件夹绝对路径" # 生成所有图像路径和对应标签的列表 img_paths = [] labels = [] for idx, row in label_df.iterrows(): subfolder_path = os.path.join(train_root, str(row["subfolder"])) for img_name in os.listdir(subfolder_path): if img_name.endswith(".jpg"): img_paths.append(os.path.join(subfolder_path, img_name)) labels.append(row["labels"]) # 定义图像加载和预处理函数 def load_and_preprocess(img_path, label): img = tf.io.read_file(img_path) img = tf.image.decode_jpeg(img, channels=3) img = tf.image.resize(img, (224, 224)) # 替换为实际需要的图像输入尺寸 img = img / 255.0 # 归一化,可在此处补充自定义图像增强逻辑 return img, label # 构建数据集流水线 dataset = tf.data.Dataset.from_tensor_slices((img_paths, labels)) # 多线程并行预处理 dataset = dataset.map(load_and_preprocess, num_parallel_calls=tf.data.AUTOTUNE) # 打乱、分批次、预取优化 dataset = dataset.shuffle(buffer_size=len(img_paths)).batch(32).prefetch(tf.data.AUTOTUNE)
可选方案:调整目录结构适配flow_from_directory
如果不想编写路径匹配逻辑,也可以迁移文件适配flow_from_directory的要求:新建按标签命名的子文件夹(如train/0/、train/1/),把所有标签为0的图像统一挪到train/0/目录下,标签为1的图像挪到train/1/目录下,之后直接调用flow_from_directory即可。该方案需要额外复制/迁移文件,数据量大时耗时较高,仅适合小数据集场景。
内容的提问来源于stack exchange,提问作者dotawan
相关产品推荐
相关产品推荐

