微信公众号:AI算法与图像处理
关注和置顶公众号可第一时间了解公众号最新咨询
若是你以为推文对你有帮助,欢迎分享和转载,转载请注明出处和公众号二维码python
什么是数据不均衡问题这里简单说明一下,重点是操做和应用:一、数据不均衡问题二、常见的解决方法函数说明准备工做功能说明参数说明参数完整代码效果展现总结git
详细说明,请参考:https://blog.csdn.net/Yaphat/article/details/60348946github
在大部分状况下,咱们认为不一样类别的数据是均匀分布的,不少算法也是基于这个假设,可是在真实的状况下,每每都不是如此的。例如,机器发送故障的状况是咱们想要预测的,但实际上故障的几率是很低的,因此致使故障的样本量不多,即便你将全部的预测结果都设置为正常,准确率依然很高,但这个模型是一个没有用的模型,这种相似的例子是很是常见的。面试
解决的方案不少,主要从两个方面考虑(面试的时候可能会问)
1)数据层面
2)算法层面算法
在项目中,咱们可能没那么多时间去思考从算法方面去解决,更多的时候想的是能用就行,可是网上不少的例子不少是基于内置的数据,这是很是让人难受的,或者是基于一张图片进行数据加强,很痛苦。更通常的状况是,对训练集下的某一个文件夹的全部图片进行数据加强,这就是我写这个的理由。
这部分的理论,能够参考:https://blog.csdn.net/mieleizhi0522/article/details/82191331微信
所使用的环境
Python3.六、tensorflow-gpu 1.5.0、keras2.2.4app
1)ImageDataGenerator 图片生成器
2)flow_from_directory 以文件夹路径为参数,生成通过数据提高/归一化后的数据,在一个无限循环中无限产生batch数据dom
备注:对于单张图片的数据加强,能够参看ImageDataGenerator和flow的使用说明:https://blog.csdn.net/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则不进行放缩,不然会将该数值乘到数据上(在应用其余变换以前spa
2)flow_from_directory
gen = datagen.flow_from_directory(
path,
target_size=(224, 224),
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=(224, 224),
batch_size=15,
save_to_dir=dst_path,#生成后的图像保存路径
save_prefix='xx',
save_format='jpg')
for i in range(6):
gen.next()
复制代码
一、能基本实现咱们须要的数据加强的要求
二、可是实际上数据加强的手段不止这些(有兴趣能够继续探索)
这里须要强调一点,ImageDataGenerator里面应该是每一张图片进去都会随机有可能受到全部的操做(例如裁剪,旋转等)的做用
但愿每一篇用心写的推文都能帮助到你,可能你已是大神了,这些对你没啥用,可是这倒是新手一开始都会遇到的难题,不想你们由于一点小小的挫折就放弃,因此推文一方面是记录本身真实遇到的坑,另外一面也但愿可以提高本身的表达能力。
代码已经更新到:github.com/SCUTPZW/AI_…
但愿可以获得大家一颗真心的star(还没被点过)