(keras)在ImageDataGenerator中实现图片随机裁剪改变大小

场景:假设存在一个写好的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):
        # 略
    
        
    

你可能感兴趣的:(深度学习)