如何使用Keras的flow_from_dataframe方法生成增强图像

时间:2020-06-17 22:32:42

标签: python tensorflow image-processing keras

训练数据集仅包含364个具有8个类别的图像。我尝试在不进行图像增强的情况下进行测试,并且在测试集(156张图像)上获得了69%的准确性。但是,当我使用ImageDataGenerator时,测试集的准确度仅为13%。我使用过flow_from_dataframe方法生成图像。有人可以告诉我我做错了吗?以及代码是否正确编写?还是预测方法错误?还是不增加图像。另外,我已经检查并且标签正确映射。我的目的是在至少3640个图像上训练模型,以便每个图像具有10个增强图像。因此,我的最终预测可能会有所改善。 tensorflow的版本是2.2.0。

尝试使用flow_from_dataframe扩充图像

datagen = ImageDataGenerator(rotation_range=45,width_shift_range=0.3,height_shift_range=0.3,shear_range=0.2,
    zoom_range=0.2,fill_mode="nearest",horizontal_flip=True,rescale=1/255.,
    preprocessing_function=tf.keras.applications.vgg16.preprocess_input,validation_split=0.2)

train_generator = datagen.flow_from_dataframe(dataframe=df_train, directory=train_dir,x_col='Image',
        y_col='target',target_size=(224,224),class_mode='categorical',batch_size=10,subset='training',seed=42)

validation_generator = datagen.flow_from_dataframe(dataframe=df_train, directory=train_dir,x_col='Image',
        y_col='target',target_size=(224,224),class_mode='categorical',batch_size=10,subset='validation',seed=42)

test_datagen = ImageDataGenerator(rotation_range=45,width_shift_range=0.3,height_shift_range=0.3,shear_range=0.2,
    zoom_range=0.2,channel_shift_range=0.0,fill_mode="nearest",horizontal_flip=True,rescale=1/255.,
    preprocessing_function=tf.keras.applications.vgg16.preprocess_input)

test_generator = test_datagen.flow_from_dataframe(dataframe=df_test, directory=test_dir,x_col='Image',
    target_size=(224,224),class_mode=None,batch_size=1,seed=42)

使用model.fit方法将VGG16模型安装到火车发电机上

IMG_SHAPE=(224,224,3)
def base_model(IMG_SHAPE,CNN_type):
  model = CNN_type(input_shape=IMG_SHAPE, include_top=False, weights="imagenet")
  model.trainable = False
  global_average_layer = GlobalAveragePooling2D()(model.output)
  dropout_layer = Dropout(0.4)(global_average_layer)
  prediction_layer = Dense(units=8, activation='softmax')(dropout_layer)
  model = Model(inputs=model.input, outputs=prediction_layer)
  model.compile(optimizer="adam", loss="categorical_crossentropy", metrics=["categorical_accuracy"])
  return model
model=base_model(IMG_SHAPE,VGG19)
train_steps = train_generator.n//train_generator.batch_size
validation_steps = validation_generator.n//validation_generator.batch_size

history = model.fit(train_generator,steps_per_epoch=train_steps, epochs=100,
                              validation_data=validation_generator,validation_steps=validation_steps)

使用model.predict方法进行的预测

STEP_SIZE_TEST=test_generator.n//test_generator.batch_size
test_generator.reset()
pred=model.predict(test_generator,steps=STEP_SIZE_TEST,verbose=1)
predicted_class_indices=np.argmax(pred,axis=1)
labels = (train_generator.class_indices)
labels = dict((v,k) for k,v in labels.items())
predictions = [labels[k] for k in predicted_class_indices]
df_test['target']=predictions
df_test.to_csv('./dataset/data_vgg19_100.csv',index=False)

0 个答案:

没有答案