本文重点讲述了ImageDataGenerator类的应用与测试;在理解该类的原理后编写俩种生成器作为示例方便未来适应多种场景下的数据增强。
ImageDataGenerator参数初始化
参考Keras中文手册其初始化如下:
1 | #ImageDataGenerator是 数据扩增类;下面代码即是类的初始化 |
图像仿射变换对应的矩阵操作
数据扩增示例
下载猫狗大战数据集
划分数据集参考我的博客python小工具
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27#建立data文件夹,如下树状结构(不要包含其他文件夹)
data/
train/
dog/
cat/
val/
dog/
cat/
import os
import shutil
dog_iamge_list = os.listdir('./data/Dog/')
cat_iamge_list = os.listdir('./data/Cat/')
dog_nums = len(dog_iamge_list)#狗狗图片数目
cat_nums = len(cat_iamge_list)#...
train_path = './data/train/'
val_path = './data/val/'
for idx,img in enumerate(dog_iamge_list):
if idx < 1000:
shutil.move('./data/Dog/'+img,'./data/'+'train/dog/') #移动文件到文件夹
else:#可以稍微设置下验证集的数量,不然训练测试速度比较慢
shutil.move('./data/Dog/'+img,'./data/'+'val/dog/')
for idx,img in enumerate(cat_iamge_list):
if idx < 1000:
shutil.move('./data/Cat//'+img,'./data/'+'train/cat/')
else:
shutil.move('./data/Cat//'+img,'./data/'+'val/cat/')测试数据增强效果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21#测试数据增强效果
from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img
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')
img = load_img('./data/train/cat/1.jpg') # 导入数据
x = img_to_array(img) # 转成Numpy array格式 (3,150,150)
x = x.reshape((1,) + x.shape) # Reshape为 (1, 3, 150, 150)
# datagen.flow() 生成器 参考我前面的博客,用for分批读取
i = 0
for batch in datagen.flow(x, batch_size=1,save_to_dir='./test_gen_img', save_prefix='cat', save_format='jpeg'):
i += 1
if i > 17:
break
使用ImageDataGenerator进行实战
1 | #build model |
1 | #构建生成器 |
1 | #训练模型 |
编写自定义生成器
总结一下就是继承keras.utils.Sequence基类,重写__getitem__函数,[示例](https://github.com/yu4u/noise2noise)如下:
1 | from keras.utils import Sequence |
Reference
- Keras Blog 使用超小数据集构建模型 建议完成该博客所有代码分析
- 其他参考均以贴上连接