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

Keras中ImageDataGenerator的flow_from_directory生成文件名如何管理?

解决Keras ImageDataGenerator.flow_from_directory 数据增强保留原始文件名的方案

原生flow_from_directory开启save_to_dir参数时,默认生成的文件名仅包含前缀、序号、随机哈希值,无法关联原始文件名,我们可以通过关闭自动保存、手动生成并命名增强图像的方式实现需求,具体方案如下:

核心思路

  • 先实例化数据生成器,关闭随机打乱(必须将shuffle参数设为False),保证迭代顺序和生成器内置的filenames列表顺序完全对应
  • 去掉save_to_dir参数,自己处理增强后的图像保存逻辑,自定义文件名规则保留原始文件名信息

可直接运行的修改后代码

from tensorflow.keras.preprocessing.image import ImageDataGenerator
from PIL import Image
import os
import numpy as np

# 原有增强配置保持不变
aug = ImageDataGenerator(
    rotation_range=20,
    zoom_range=0.15,
    width_shift_range=0.2,
    height_shift_range=0.2,
    shear_range=0.15,
    horizontal_flip=True,
    fill_mode="nearest"
)

# 实例化数据生成器,注意关闭shuffle
data_gen = aug.flow_from_directory(
    extract_dir, 
    batch_size=1, 
    color_mode='grayscale', 
    target_size=(28, 28),
    shuffle=False,
    class_mode=None
)

# 提前创建保存目录
save_root = os.path.join(extract_dir, 'augmented')
os.makedirs(save_root, exist_ok=True)

# 可自定义配置:每张原始图像生成的增强图像数量
aug_count_per_img = 10
# 可自定义配置:总共生成的增强图像上限
total_aug_limit = 100

generated_count = 0
for img_idx in range(len(data_gen.filenames)):
    # 获取当前迭代对应的原始文件名
    original_full_name = os.path.basename(data_gen.filenames[img_idx])
    name_no_ext, ext = os.path.splitext(original_full_name)
    
    # 生成单张原图对应的多组增强图
    for aug_idx in range(aug_count_per_img):
        # 取出增强后的图像数据
        aug_img = next(data_gen)[0].astype(np.uint8)
        # 灰度图去掉最后一维的通道数
        if aug_img.ndim == 3 and aug_img.shape[-1] == 1:
            aug_img = aug_img.squeeze(-1)
        
        # 自定义保存文件名,保留原始文件名信息
        save_name = f"{name_no_ext}_aug_{aug_idx}{ext}"
        save_path = os.path.join(save_root, save_name)
        Image.fromarray(aug_img).save(save_path)
        
        generated_count += 1
        if generated_count >= total_aug_limit:
            break
    if generated_count >= total_aug_limit:
        break

扩展优化方案

如果需要保留原始文件的分类目录结构,方便后续直接按目录分类,可在保存时增加子目录创建逻辑:

  • 解析原始文件的父目录:original_subdir = os.path.dirname(data_gen.filenames[img_idx])
  • 拼接完整保存目录:final_save_dir = os.path.join(save_root, original_subdir)
  • 提前创建目录:os.makedirs(final_save_dir, exist_ok=True)
  • 保存路径改为os.path.join(final_save_dir, save_name)即可

内容的提问来源于stack exchange,提问作者talha06

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 11:48:02