场景:假设存在一个写好的ImageDataGenerator并调用了flow_from_directory来实现读取与增强,在这个过程的第一步需要添加随机裁剪功能,使得原本大小为A*B的图片裁剪为a*b,此处由于水平有限只实现了train_on_batch的调用方式
思路:这个随机裁剪函数本身不难,但是如果将这个函数硬塞到ImageDataGenerator的那个预处理参数里面,会因为前后尺寸变化报错,所以采用了一种折衷的办法
有感觉不对的地方可以自行根据实际需要修改
def my_random_crop(image):
# 定义的随机裁剪函数将1080*1920裁成512*512
ret = []
for i in range(len(image)):
y = int(np.random.randint(1080 - 512 + 1))
x = int(np.random.randint(1920 - 512 + 1))
h = 512
w = 512
image_crop = image[i, y:y + h, x:x + w, :]
if image_crop.shape[0] != 512 or image_crop.shape[1] != 512:
print('image size error')
ret.append(image_crop)
return np.array(ret)
datagen = ImageDataGenerator(
# 不设置参数
)
it = datagen.flow_from_directory(
data_path,
# 数据路径
batch_size=batch_size,
class_mode="categorical",
shuffle=True,
target_size=(1080, 1920))
# 原始图片大小
)
dataaug = ImageDataGenerator(
# 设置原本想要的变换参数
)
for i in range(epochs):
for j in range(train_batch_num):
# train_batch_num需要自己计算,该值和ImageDataGenerator中的某参数有关
# 当然如果很不确定的话最好还是把验证集的比例设置为0,然后再另外跑验证集
print(u"\r", 'epoch', i, 'batch', j, end="")
x, y = it.next()
x = my_random_crop(x)
for k in range(len(x)):
x[k] = dataaug.random_transform(x[k])
model.train_on_batch(x, y)
for j in range(val_batch_num):
# 略