【问题标题】:Random orthogonal, 90 degrees rotation with ImageDataGenerator使用 ImageDataGenerator 进行随机正交、90 度旋转
【发布时间】:2020-08-01 21:37:43
【问题描述】:

我使用以下代码用发票图像训练我的 CNN 模型。

train_datagen = ImageDataGenerator( 
                rescale = 1. / 255, 
                 shear_range = 0.2, 
                  zoom_range = 0.2, 
            horizontal_flip = True
            ) 

test_datagen = ImageDataGenerator(rescale = 1. / 255) 

train_generator = train_datagen.flow_from_directory(train_data_dir, 
                              target_size =(img_width, img_height), 
                     batch_size = batch_size) 

validation_generator = test_datagen.flow_from_directory( 
                                    validation_data_dir, 
                   target_size =(img_width, img_height), 
          batch_size = batch_size) 

model.fit_generator(train_generator, 
    steps_per_epoch = nb_train_samples // batch_size, 
    epochs = epochs, validation_data = validation_generator, 
    validation_steps = nb_validation_samples // batch_size) 

问题是我在训练数据集中只使用了直立图像。我所有的图片都如下图所示:

当我想发送如下图的训练后,我的模型无法预测其正确的类别。

如下所示,我将 Horizo​​ntal_flip = True 发送到 ImageDataGenerator

train_datagen = ImageDataGenerator( 
                rescale = 1. / 255, 
                 shear_range = 0.2, 
                  zoom_range = 0.2, 
            horizontal_flip = True
            )

如何更改我的代码,以便它甚至可以预测翻转的图像。还是应该在我的训练数据集中使用手动翻转的图像?

【问题讨论】:

    标签: python tensorflow image-processing keras conv-neural-network


    【解决方案1】:

    我会用ImageDataGenerator 随机旋转图像。只需指定以下参数:

    rotation_range:诠释。随机旋转的度数范围。

    或者,您可以将预处理函数传递给ImageDataGenerator,从而为您提供更大的灵活性。

    def orthogonal_rot(image):
        return np.rot90(image, np.random.choice([-1, 0, 1]))
    
    train_generator = ImageDataGenerator(
        preprocessing_function=orthogonal_rot)
    

    此函数将旋转 -90、0 或 90 度。

    【讨论】:

    • 感谢您的回答。但是如何设置 rotation_range 值。我想左右旋转90度。那我应该设置 90 吗?
    • 是的,但我相信这会从 [-90, 90] 轮换,希望没关系
    • 这会在 -90 和 90 之间旋转我的图像(各种旋转)。但是如何将功能设置为仅旋转 +90 和 -90 度。
    【解决方案2】:

    如果只需要直角旋转,可以通过使用 keras apply_affine_transform 函数的预处理函数进行设置。然后,您可以通过preprocessing_function 参数将预处理函数传递给ImageDataGenerator。使用这种方法,您还可以使用相同的fill_mode 进行正确的旋转和数据生成。

    Documentation apply_affine_transform
    Documentation ImageDataGenerator

    from tensorflow.keras.preprocessing.image import ImageDataGenerator
    from tensorflow.keras.preprocessing.image import apply_affine_transform
    
    FILL_MODE = 'nearest'
    
    def right_angle_rotate(input_image):
        angle = random.choice([0, 90, 180, 270])
        if angle != 0:
            input_image = apply_affine_transform(
                input_image, theta=angle, fill_mode=FILL_MODE)
        return input_image
    
    data_gen = ImageDataGenerator(
        fill_mode=FILL_MODE,
        preprocessing_function=right_angle_rotate)
    

    但是,如果您的输入图像是矩形图像,numpy.rot90 函数会导致异常,因为在 90° 和 270° 旋转后输入尺寸将不匹配。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-21
      • 1970-01-01
      • 1970-01-01
      • 2018-02-26
      • 2021-09-22
      相关资源
      最近更新 更多