基于python的图片数据扩充
借鉴:https://blog.csdn.net/jdzwanghao/article/details/80861590
我的数据一共分为两个文件夹,放在E盘的picture下面,一个文件命名为“0”,代表0类;另一个命名为“1”,代表1类;
# 导入需要用到的库
from keras.preprocessing.image import ImageDataGenerator
from keras.preprocessing import image
import matplotlib.pyplot as plt
import os
import numpy as np
import cv2
# 指定参数
# rotation_range 旋转
# width_shift_range 左右平移
# height_shift_range 上下平移
# zoom_range 随即放大或缩小
# 定义图片生成器,我只用了旋转,大家如果需要平移或者缩放可以自己设置。
img_generator = ImageDataGenerator(rotation_range=90)
# ImageDataGenerator()中不设置参数就表示 不操作,后面生成batch就是直接在原数据集上抽取图片。
# 输入数据的准备
X = []
Y = []
for i in range(0, 2):
# 遍历文件夹,读取图片
for f in os.listdir("E://picture//%s" % i):
# 读入每一个图片
Images = cv2.imread("E://picture//%s//%s" % (i, f))
# 缩放为长和宽为(256, 256)
image = cv2.resize(Images, (256, 256), interpolation=cv2.INTER_CUBIC) # interpolation是插值方法
# 标准化
image = np.array(image, np.float32) / 255
X.append(image)
Y.append(i)
# 将数据集转为数组
X = np.array(X)
Y = np.array(Y)
print(X.shape)
print(Y.shape)
# 生成图片:其中,gen可以作为生成器,用model.fit_generate(generate,)来训练。
# [生成图片]: 其中,gen可以作为生成器,用model.fit_generate(generate,)中来训练。
gen = img_generator.flow(X, Y, batch_size=1) # 我理解的batch_size,就是每次生成batch_size张图片。
# 看看每个batch中生成的图片都是咋样的
x = []
y = []
plt.figure()
for i in range(1000): # 迭代1000,生成1000个
x_batch, y_batch = next(gen) # 每次next()一下,返回一个batch: x_batch, y_batch
x.append(x_batch)
y.append(y_batch)
print('\n')
print('x_batch', x_batch)
print('\n')
print('x_batch.shape:', x_batch.__class__)
print('\n')
print('x_batch.shape:', x_batch.shape)
print('\n')
print('y_batch', y_batch)
print('\n')
# plt.imshow(x_batch[0]) # batch中的第一张图片
# plt.show()
x = np.array(x)
y = np.array(y)
x = x.reshape(1000, 256, 256, 3)
y = y.reshape(1000)
# x是扩充的1000张图片,y是对应类别