首页 > 解决方案 > 使用 ImageDataGenerator 进行随机正交、90 度旋转

问题描述

我使用以下代码用发票图像训练我的 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
            )

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

标签: pythontensorflowimage-processingkerasconv-neural-network

解决方案


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

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

或者,您可以传递一个预处理函数,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 度。


推荐阅读