You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从不同子文件夹加载图像分类训练数据并匹配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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 14:24:04