数据增强非常重要,特别是在面对一个分布不是很均匀的数据集的时候。一个好的训练数据集是训练一个良好模型的前提,训练数据做好了在后面的模型训练时往往能够事半功倍。
不多说,上代码
"""
Created on Tue May 7 08:38:42 2019
@author: LZY
"""
from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img
import matplotlib.pyplot as plt
import os
datagen = ImageDataGenerator(
rotation_range=20,
width_shift_range=0.1,
height_shift_range=0.1,
shear_range=0.1,
zoom_range=0.1,
horizontal_flip=True,
fill_mode='nearest')
dir='E:/BaiduNetdiskDownload/fer2013/train/6'
for filename in os.listdir(dir): #listdir的参数是文件夹的路径
print(filename)
img = load_img(dir+'/'+filename) # 这是一个PIL图像
x = img_to_array(img) # 把PIL图像转换成一个numpy数组,形状为(3, 150, 150)
x = x.reshape((1,) + x.shape) # 这是一个numpy数组,形状为 (1, 3, 150, 150)
# 下面是生产图片的代码
# 生产的所有图片保存在 `preview/` 目录下
i = 0
for batch in datagen.flow(x, batch_size=1,
save_to_dir='fer2013TrainDataAdd/6',
save_prefix='6',
save_format='jpeg'):
i += 1
if i > 5:
break # 否则生成器会退出循环
还是使用的Keras框架,其中封装的 ImageDataGenerator就是我们需要的。正常想要做数据增强一般都需要自己写代码,对图片做一些诸如翻转,平移,旋转之类的操作,而使用ImageDataGenerator会在你设定的参数范围内做随机的变换,大大增多了数据量,数据增强的好处是能提供更多不同的训练数据,对提高最后的识别精度有很大的好处。
我简单介绍以下这段代码,dir是你想要进行数据增强的文件夹,save_to_dir是增强后的图片存放的位置,save_prefix是图片的前缀,这个无所谓,只是自己容易归类和区分而已,save_format是保存格式,就存为jpeg就行,亲测没有问题。ImageDataGenerator里的参数设置建议去看Keras文档,我这里就不赘述了,大体上就是规定了变换的范围,如旋转角度之类的。
给你们看看我处理完的效果。
这些都是生成的数据,直接把这些图片复制到训练数据集对应分类的文件夹中就行了,经过一轮的数据增强之后,我的训练数据从约为28000飙升到了80000左右,精度也提升了很多,特别是对disgust分类的识别精度提高了很多,可以看我的精度对比柱状图,纵坐标为精度提升的百分比。disgust分类的识别精度提升了之前精度的40%。
上图是现在各分类的识别精度,可以和我上一篇博客中未经过数据增强的训练集训练的模型的各分类识别精度做个对比,上一节的图片我就不放了,想要了解可以点击这个链接跳转。
https://blog.youkuaiyun.com/qq_38279908/article/details/89952461
下一节我就要搭建模型训练数据了,做好准备!