Keras[1]-图像预处理

这篇文章主要介绍了keras中的图像生成器ImageDataGenerator的用法,详细介绍了每个参数什么意思,哪些参数 比较常用,这个函数也是工程中一般都会用的。

ImageDataGenerator

位于from tensorflow.keras.preprocessing.image import ImageDataGenerator

参数介绍:

  • featurewise_center:使输入的均值为0,这个是以整个数据集的分布来处理的,所以变换后整体变化不大
  • samplewise_center:使每个样本的均值为0,这个是针对每幅图片进行的,处理后的图像与原图差别很大
  • featurewise_std_normalization:输入除以自身标准差
  • samplewise_std_normalization:每个样本除以自身标准差
  • zca_epsilon:ZCA白化中的epsilon参数,默认为1e-6
  • zca_whitening:是否开启ZCA白化,取出图像颜色的冗余信息
  • rotation_range:随机旋转的角度范围,整型,范围为[0,target]
  • width_shift_range:图像水平偏移的范围
  • height_shift_range:图像垂直偏移的范围,这两个一般不用
  • brightness_range:亮度变化范围,包含两个浮点型的tuple或者list#旋转
  • shear_range:错切变换,保持所有点的x坐标(或者y坐标)保持不变,而对应的y坐标(或者x坐标)则按比例发生平移,且平移的大小和该点到x轴(或y轴)的垂直距离成正比,效果像是图像被拉伸
  • zoom_range:让图片在长或宽的方向进行放大,可以理解为某方向的resize,参数大于0小于1时,执行的是放大操作,当参数大于1时,执行的是缩小操作
  • channel_shift_range:随机的通道偏移
  • fill_mode:填充模式,”constant”, “nearest”, “reflect” or “wrap”,默认是”nearest”,比如在旋转时,超出尺寸的部分会怎么处理
  • cval:填充的值,只有在fill_mode = "constant"时才有作用
  • horizontal_flip:随机水平翻转
  • vertical_flip:随机垂直翻转
  • rescale:缩放因子,会乘在像素值上,默认是None
  • preprocessing_function:自定义的处理函数,在其它预处理方法之后运行
  • data_format:这个设置的是通道的模式,有channels_firstchannels_last两种
  • validation_split:生成验证集的比例(在0和1之间)
  • dtype:制定生成的数据格式

flow_from_directory,只介绍一般情况下用到的参数

  • directory:数据的路径,要求:将数据分为train和test两个文件夹,每个文件夹下每一类别再存放进一个子文件夹
  • target_size:读取的每个图片都会resize到这个尺寸
  • color_mode:默认rgb,一般不改变
  • classes:识别的类别名称,类似于[“dog”,”cat”,”fish”],训练和测试要一致
  • class_mode:分类模式,默认是categorical,表示多分类
  • batch_size:一批的大小
  • shuffle:是否打乱数据,这个是必须的,默认为True
  • seed:随机操作的随机种子

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
train_generator = ImageDataGenerator(rotation_range=5, #旋转
                                     horizontal_flip=True, #翻转
                                     vertical_flip=True)
test_generator = ImageDataGenerator()#一般情况下,测试图像不做增强


train_generator = train_generator.flow_from_directory('./re/train/',
                                                      target_size=(144,144),
                                                      batch_size=32,
                                                      classes=['bus','dinosaurs','elephants','flowers','horse']) #注意这里的classes貌似必须要声明,但是源码里说的是,不声明时,安装目录下的文件夹名来当做class。就我测试而言,同样的程序,不显式定义classes的话,准确率在80,显然是不正常的,显式声明的话,就达到99,所以我猜测是train_generator和test_generator都是读取子文件夹的名称为类别名,估计是按照读取的顺序来确定类别顺序,这样的话,上下两个flow_from_directory得到的类别列表就有可能不一样
test_generator = test_generator.flow_from_directory('./re/test/',
                                                    target_size=(144,144),
                                                    batch_size=32,
                                                    classes=['bus', 'dinosaurs', 'elephants', 'flowers', 'horse'])
                                                    
#此处是在网络中使用数据,fit_generator是将数据一批一批的送往GPU
history_tl = model.fit_generator(train_generator,
                                 epochs=10,
                                 steps_per_epoch=400/32,
                                 validation_data=test_generator)