(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):
        # 略
    
        
    
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
效果。 好的,关于你提出的问题,我可以回答你。使用自带的fashion_mnist数据集来实现图像增强,可以通过ImageDataGenerator类来实现ImageDataGenerator类是一个Keras的图像数据生成器,可以根据我们指定的参数对图像数据进行增强处理,包括随机裁剪、旋转、缩放等处理。 这些处理可以使得我们的数据集更加多样化,从而提高我们的机器学习模型的准确性和泛化能力。 以下是实现这个问题的基本代码: ``` from keras.datasets import fashion_mnist from keras.preprocessing.image import ImageDataGenerator import numpy as np import matplotlib.pyplot as plt (X_train, y_train), (X_test, y_test) = fashion_mnist.load_data() # 归一化,将像素值压缩在0-1之间 X_train = X_train.astype('float32') / 255 X_test = X_test.astype('float32') / 255 # 定义ImageDataGenerator变量并设置参数 datagen = ImageDataGenerator( rotation_range=20, # 随机旋转度数(-20~20) zoom_range = 0.2, # 随机缩放范围(0.8~1.2) width_shift_range=0.2, # 随机水平偏移量 height_shift_range=0.2, # 随机竖直偏移量 horizontal_flip=True, # 水平翻转 vertical_flip=False # 竖直翻转 ) # 利用生成器增强数据集 datagen.fit(X_train.reshape(-1, 28, 28, 1)) # 类别个数 num_classes = len(np.unique(y_train)) # 展示增强后的数据 fig, axs = plt.subplots(3, 3, figsize=(10, 10)) fig.tight_layout() for i in range(3): for j in range(3): axs[i][j].imshow(datagen.random_transform(X_train[0]).reshape(28, 28)) axs[i][j].axis('off') plt.show() ``` 这里我们将fashion_mnist数据集的像素值归一化到0-1之间,使用ImageDataGenerator的各种参数来进行图像增强。使用fit()函数来根据生成器增强训练数据。最后使用循环来展示增强后的数据。 注意,这里将ImageDataGenerator应用于fashion_mnist数据集的图像,以实现数据增强。这里展示的是随机变换后的图像。 希望这个回答能够解决你的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值