实现批量数据增强 | keras ImageDataGenerator使用

本文探讨了数据不均衡问题及其对机器学习模型的影响,介绍了常见解决方案,并详细讲解了使用Keras的ImageDataGenerator进行图像数据增强的具体方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

微信公众号:AI算法与图像处理
关注和置顶公众号可第一时间了解公众号最新咨询
如果你觉得推文对你有帮助,欢迎分享和转载,转载请注明出处和公众号二维码

内容目录(由[TOC]自动生成)

什么是数据不均衡问题这里简单说明一下,重点是操作和应用:1、数据不均衡问题2、常见的解决方法函数说明准备工作功能说明参数说明参数完整代码效果展示总结

什么是数据不均衡问题

详细说明,请参考:https://blog.youkuaiyun.com/Yaphat/article/details/60348946

这里简单说明一下,重点是操作和应用:
1、数据不均衡问题

在大部分情况下,我们认为不同类别的数据是均匀分布的,很多算法也是基于这个假设,但是在真实的情况下,往往都不是如此的。例如,机器发送故障的情况是我们想要预测的,但实际上故障的概率是很低的,所以导致故障的样本量很少,即使你将所有的预测结果都设置为正常,准确率依然很高,但这个模型是一个没有用的模型,这种类似的例子是非常常见的。

2、常见的解决方法

解决的方案很多,主要从两个方面考虑(面试的时候可能会问)
1)数据层面
2)算法层面

在项目中,我们可能没那么多时间去思考从算法方面去解决,更多的时候想的是能用就行,但是网上很多的例子很多是基于内置的数据,这是非常让人难受的,或者是基于一张图片进行数据增强,很痛苦。更一般的情况是,对训练集下的某一个文件夹的所有图片进行数据增强,这就是我写这个的理由。
这部分的理论,可以参考:https://blog.youkuaiyun.com/mieleizhi0522/article/details/82191331

函数说明

准备工作

所使用的环境
Python3.6、tensorflow-gpu 1.5.0、keras2.2.4

功能说明

1)ImageDataGenerator 图片生成器
2)flow_from_directory 以文件夹路径为参数,生成经过数据提升/归一化后的数据,在一个无限循环中无限产生batch数据

参数说明

备注:对于单张图片的数据增强,可以参看ImageDataGenerator和flow的使用说明:https://blog.youkuaiyun.com/hnu2012/article/details/54017564
1)ImageDataGenerator 图片生成器

from keras.preprocessing.image import ImageDataGenerator

datagen = ImageDataGenerator(
        rotation_range=40,
        width_shift_range=0.2,
        height_shift_range=0.2,
        rescale=1./255,
        shear_range=0.2,
        zoom_range=0.2,
        horizontal_flip=True,
        fill_mode='nearest'
        cval=0,
        channel_shift_range=0,
        horizontal_flip=False,
        vertical_flip=False,
        rescale=None)
复制代码
参数

rotation_range:整数,数据提升时图片随机转动的角度
width_shift_range:浮点数,图片宽度的某个比例,数据提升时图片水平偏移的幅度
height_shift_range:浮点数,图片高度的某个比例,数据提升时图片竖直偏移的幅度
rescale: 重放缩因子,默认为None. 如果为None或0则不进行放缩,否则会将该数值乘到数据上(在应用其他变换之前)
shear_range:浮点数,剪切强度(逆时针方向的剪切变换角度)
zoom_range:浮点数或形如[lower,upper]的列表,随机缩放的幅度,若为浮点数,则相当于[lower,upper] = [1 - zoom_range, 1+zoom_range]
fill_mode:‘constant’‘nearest’,‘reflect’或‘wrap’之一,当进行变换时超出边界的点将根据本参数给定的方法进行处理
cval:浮点数或整数,当fill_mode=constant时,指定要向超出边界的点填充的值
channel_shift_range: Float. Range for random channel shifts.
horizontal_flip:布尔值,进行随机水平翻转
vertical_flip:布尔值,进行随机竖直翻转
rescale: 重放缩因子,默认为None. 如果为None或0则不进行放缩,否则会将该数值乘到数据上(在应用其他变换之前

2)flow_from_directory

gen = datagen.flow_from_directory(
                           path,
                           target_size=(224224),
                           batch_size=15,
                           save_to_dir=dst_path,#生成后的图像保存路径
                           save_prefix='xx',
                           save_format='jpg')

for i in range(6):
    gen.next()
"""
path:文件读入的路径,必须是子文件夹的上一级(这里是个坑,不过试一哈就懂了)
target_size:图片resize成的尺寸,不设置会默认设置为(256.256)
batch_size:每次输入的图片的数量,例如batch_size=32,一次进行增强的数量为32,
个人经验:batch_size的大小最好是应该和文件的数量是可以整除的关系
save_to_dir:增强后图片的保存位置
save_prefix:文件名加前缀,方便查看
save_format:保存图片的数据格式
产生的图片总数:batch_size*6(即range中的数字)
"""

复制代码

完整代码

from keras.preprocessing.image import ImageDataGenerator

path = 'E:/C3D_Data/train' # 类别子文件夹的上一级
dst_path = 'E:/C3D_Data/train_result'
#  图片生成器
datagen = ImageDataGenerator(

    rotation_range=5,
    width_shift_range=0.02,
    height_shift_range=0.02,
    shear_range=0.02,
    horizontal_flip=True,
    vertical_flip=True
)

gen = datagen.flow_from_directory(
                           path,
                           target_size=(224224),
                           batch_size=15,
                           save_to_dir=dst_path,#生成后的图像保存路径
                           save_prefix='xx',
                           save_format='jpg')

for i in range(6):
    gen.next()
复制代码
效果展示

总结

1、能基本实现我们需要的数据增强的要求
2、但是实际上数据增强的手段不止这些(有兴趣可以继续探索)

这里需要强调一点,ImageDataGenerator里面应该是每一张图片进去都会随机有可能受到所有的操作(例如裁剪,旋转等)的作用

希望每一篇用心写的推文都能帮助到你,可能你已经是大神了,这些对你没啥用,但是这却是新手一开始都会遇到的难题,不想大家因为一点小小的挫折就放弃,所以推文一方面是记录自己真实遇到的坑,另一面也希望能够提升自己的表达能力。

代码已经更新到:github.com/SCUTPZW/AI_…

希望能够得到你们一颗真心的star(还没被点过)

### 实现训练集和验证集的图像归一化、数据增强批量生成 在 TensorFlow 和 Keras 中,`ImageDataGenerator` 是一种用于处理图像数据的强大工具。该类不仅支持实时数据增强,还能够方便地进行图像预处理操作。 对于图像归一化,在 `ImageDataGenerator` 的初始化过程中可以通过参数指定特定的操作来完成这一目标。例如,通过设置 `featurewise_center=True` 可使输入数据去中心化(即均值为零),而 `featurewise_std_normalization=True` 则会进一步标准化这些数据使得标准差变为1[^3]。 关于数据增强方面,可以利用种变换选项来自定义增强策略。比如旋转范围 (`rotation_range`) 控制随机旋转的角度区间;宽度和平移比例 (`width_shift_range`, `height_shift_range`) 定义水平或垂直方向上的平移程度;以及是否启用水平翻转 (`horizontal_flip`) 等特性都可以用来增加模型泛化能力[^2]。 为了高效地提供批量化数据给神经网络训练过程,`ImageDataGenerator` 提供了 `.flow()` 方法用于创建批次迭代器对象。此方法接收原始样本数组及其标签作为输入,并返回一个无限循环遍历整个数据集的生成器实例。每次调用都会产出一批次大小等于设定好的 `batch_size` 参数的新鲜增广后的图片与对应的真实类别信息[^4]。 下面是具体的代码示例: ```python from tensorflow.keras.preprocessing.image import ImageDataGenerator # 初始化带有不同配置项的数据生成器 train_datagen = ImageDataGenerator( featurewise_center=True, featurewise_std_normalization=True, rotation_range=20, width_shift_range=0.2, height_shift_range=0.2, horizontal_flip=True) val_datagen = ImageDataGenerator() # 假设已经准备好训练集 (trainX, trainY) 和验证集 (valX, valY),并指定了 batch_size training_generator = train_datagen.flow(trainX, trainY, batch_size=batch_size, shuffle=True) validation_generator = val_datagen.flow(valX, valY, batch_size=batch_size, shuffle=False) ``` 上述代码片段展示了如何针对训练集应用复杂的图像预处理流程,而对于验证集仅执行基本的归一化而不做额外的数据扩增。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值