tensorflow2.0-从文件夹中读取图片数据
keras中有直接的图片生成器读取类,keras.preprocessing.image.ImageDataGenerator
1. ImageDataGenerator
在读取时可以给图片添加的一些强化从而更好满足要求。
keras.preprocessing.image.ImageDataGenerator(
rescale = 1. / 255, # 数值归一化
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', # 填补方式
featurewise_center = False, # 设置输入图像的均值为0
featurewise_std_normalization = False, # 设置输入图像的方差为1
zca_whitening = False # 白化处理
)
当构建训练集时,可以将图像数据进行一些强化处理;当构建验证集和测试集时往往只需要rescale数值归一化就可以了。
2.读取方法
2.1 fit 和 flow
当featurewise_center、featurewise_std_normalization、zca_whitening被设置时才需fit。flow则是将已经成为变量的图像数据以生成器的方式送入模型。
# 数据读取
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
y_train = np_utils.to_categorical(y_train, num_classes)
y_test = np_utils.to_categorical(y_test, num_classes)
# 迭代起构建
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)
# 生成器适应
datagen.fit(x_train)
# 送入模型
model.fit_generator(datagen.flow(x_train, y_train, batch_size=32),
steps_per_epoch=len(x_train) / 32, epochs=epochs)
2.2 直接从文件夹读取
从文件夹中读取数据,使用flow_from_directory方法。
这种方法需要我们将数据组织为:
-/train/
-/clasee_name1
-/clasee_name2
-/clasee_name3
…
-/val/
-/clasee_name1
-/clasee_name2
-/clasee_name3
…
# 下面是方法的参数介绍
flow_from_directory(
directory, # 根目录的位置,根目录下的,包含有子目录
target_size=(256, 256), # 图像大小
color_mode='rgb',
classes=None,
class_mode='categorical', # 类别标签的编码格式,这里是One-Hot编码后的格式,‘binary’代表了类似于1,2,3,...这样的一维编码
batch_size=32,
shuffle=True,
seed=None,
save_to_dir=None,
save_prefix='',
save_format='png',
follow_links=False,
subset=None,
interpolation='nearest'
)
每次生成器的会生成一个元组,(image,label),image是四维的数据(batch,height,width,channle);label的维度为二维(batch,label_id)。
完成生成器后,直接想生成器送入模型(model.fit_generator)即可
2.3 从路径DF读取图片数据
从DataFrame中读取,需要预先有存储这文件信息的DataFrame。这个DF需要至少两列,一列是输入图像的位置,一列是输入图像的标签。同理,调用flow_from_dataframe方法:
flow_from_dataframe(
dataframe, # 存储数据信息的DF名称
directory=None, # 文件夹位置,如果DF中写的为绝对路径这里可以省略为None
x_col='filename', # 图像绝对路径列
y_col='class', # 标签列
weight_col=None,
target_size=(256, 256),
color_mode='rgb',
classes=None,
class_mode='categorical',
batch_size=32,
shuffle=True,
seed=None,
save_to_dir=None,
save_prefix='',
save_format='png',
subset=None,
interpolation='nearest',
validate_filenames=True,
**kwargs
)