繁体   English   中英

使用 ImageDataGenerator 进行随机正交、90 度旋转

[英]Random orthogonal, 90 degrees rotation with ImageDataGenerator

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

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) 

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

训练期间使用的直立图像

训练后,当我想发送如下图像时,我的 model 无法预测其正确的 class。

错误的预测图像

如下所示,我将 Horizontal_flip = True 发送到ImageDataGenerator

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

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

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

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

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

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

train_generator = ImageDataGenerator(
    preprocessing_function=orthogonal_rot)

此 function 将旋转 -90、0 或 90 度。

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

文档 apply_affin_transform
文档 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 function 将导致异常,因为在 90° 和 270° 旋转后输入尺寸将不匹配。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM