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

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

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

An upright image that was used during the training

在训练之后,当我想发送下面这样的一张图片时,我的模型无法正确预测它的类别。

wrong predicted image

如下所示,我将 horizontal_flip = True 传递给 ImageDataGenerator。
train_datagen = ImageDataGenerator( 
                rescale = 1. / 255, 
                 shear_range = 0.2, 
                  zoom_range = 0.2, 
            horizontal_flip = True
            )

我该如何修改我的代码,使其能够预测翻转后的图像?或者我应该在训练数据集中使用手动翻转的图像吗?

2个回答

5
我会使用 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度。

(np.rot90()函数通过第二个参数来控制图像旋转的角度。-1表示-90度,0表示不旋转,1表示90度,2表示180度。)


谢谢你的回答。但是我该如何设置rotation_range的值呢?我想要向右和向左旋转90度。所以我应该设置为90吗? - undefined
是的,但我相信这将从[-90,90]旋转,希望这没问题。 - undefined
1
这个函数可以将我的图像在-90度到90度之间进行旋转(各种旋转)。但是我如何设置函数只能旋转+90度和-90度呢? - undefined

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

apply_affine_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函数将导致异常,因为在90°和270°旋转后,输入大小将不匹配。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接