Как сгенерировать дополненные изображения с помощью метода keras flow_from_dataframe - PullRequest
0 голосов
/ 18 июня 2020

Набор обучающих данных содержит всего 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)

Установка модели VGG16 на генератор поезда с помощью метода model.fit

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)
...