Keras中ImageDataGenerator加载文件夹图片及数据增强问题咨询
解决Keras加载整个文件夹图片并应用数据增强的问题
嘿,我来帮你搞定这个问题!你说得对,load_img本身就是用来加载单张图片的工具,要批量处理文件夹里的10张图片并应用数据增强,Keras有两种非常实用的方案,我给你详细拆解一下:
方案一:用flow_from_directory(推荐,最便捷)
这个方法是Keras专门为批量处理文件夹图片设计的,它会自动遍历指定文件夹下的所有图片,同时应用你定义的数据增强规则。
假设你的图片文件夹结构是这样的(即使只有一类图片,也建议套一层子文件夹,符合Keras的预期格式):
your_image_folder/ all_images/ img1.jpg img2.jpg ... img10.jpg
修改后的代码如下:
from keras.preprocessing.image import ImageDataGenerator # 定义数据增强参数,和你之前的设置一致 datagen = ImageDataGenerator( rotation_range=40, width_shift_range=0.2, height_shift_range=0.2, shear_range=0.2, zoom_range=0.2, horizontal_flip=True, fill_mode='nearest' ) # 从文件夹批量加载图片并应用增强 # target_size:统一图片尺寸,根据你的需求调整 # batch_size:每次生成多少张增强后的图片 # class_mode:因为只有一类图片,设为'input'或者'None' generator = datagen.flow_from_directory( 'your_image_folder', # 父文件夹路径 target_size=(150, 150), batch_size=10, class_mode='input' # 如果不需要分类标签,用这个;如果是多分类用'categorical' ) # 如果你想把增强后的图片保存下来,可以这样做 # 生成20张增强后的图片(你可以按需调整数量) for i in range(20): # 获取一批增强后的图片 batch = generator.next() # 遍历这批图片并保存 for j in range(batch[0].shape[0]): img = array_to_img(batch[0][j]) img.save(f'augmented_img_{i}_{j}.jpg')
方案二:手动遍历文件夹加载图片,再用flow方法
如果你需要更灵活地处理图片(比如加载前先做自定义预处理),可以手动遍历文件夹加载所有图片,再传入datagen.flow来应用增强:
import os from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img import numpy as np datagen = ImageDataGenerator( rotation_range=40, width_shift_range=0.2, height_shift_range=0.2, shear_range=0.2, zoom_range=0.2, horizontal_flip=True, fill_mode='nearest' ) # 存储所有图片的数组 images = [] img_dir = 'your_image_folder/all_images' # 直接指向图片所在文件夹 # 遍历文件夹里的所有图片 for img_name in os.listdir(img_dir): if img_name.endswith('.jpg') or img_name.endswith('.png'): # 过滤图片文件 img_path = os.path.join(img_dir, img_name) img = load_img(img_path, target_size=(150, 150)) # 加载单张图片并统一尺寸 x = img_to_array(img) # 转成数组 x = x.reshape((1,) + x.shape) # 增加一个维度,变成(1, height, width, channels) images.append(x) # 把所有图片数组合并成一个大数组 images_array = np.vstack(images) # 生成增强图片的生成器 generator = datagen.flow( images_array, batch_size=10, save_to_dir='augmented_images', # 可选:保存增强后的图片到这个文件夹 save_prefix='aug', save_format='jpg' ) # 生成增强图片,比如生成5批(每批10张,总共50张) for _ in range(5): generator.next()
关键说明
flow_from_directory不需要你手动遍历文件夹,Keras会自动处理,适合大多数场景;- 两种方案都能批量应用你定义的所有数据增强规则(旋转、平移、翻转等);
- 如果你是为训练模型准备数据,直接把生成器传入
model.fit()就可以,不用手动保存图片。
内容的提问来源于stack exchange,提问作者user2975921
相关产品推荐
相关产品推荐

