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

Ome*_*lan 3 python image-processing conv-neural-network keras tensorflow

我使用以下代码使用发票图像训练 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) 
Run Code Online (Sandbox Code Playgroud)

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

训练期间使用的直立图像

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

错误的预测图像

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

train_datagen = ImageDataGenerator( 
                rescale = 1. / 255, 
                 shear_range = 0.2, 
                  zoom_range = 0.2, 
            horizontal_flip = True
            )
Run Code Online (Sandbox Code Playgroud)

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

Nic*_*ais 5

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

旋转范围:整数。随机旋转的度数范围。

或者,您可以传递一个预处理函数,ImageDataGenerator这会给您带来更大的灵活性。

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

train_generator = ImageDataGenerator(
    preprocessing_function=orthogonal_rot)
Run Code Online (Sandbox Code Playgroud)

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

(该np.rot90()函数将图像旋转 90 度乘以第二个参数。相应地,-1 为 -90 度,0 为不旋转,1 为 90 度,2 为 180 度。)