Классификация изображений с использованием Keras flow_from_dataframe - PullRequest
0 голосов
/ 30 декабря 2018

Я работаю над проблемой классификации классов с использованием Keras.Обучающие и тестовые изображения находятся в 2 отдельных папках, т.е. training_set & test_set.У меня также есть 2 CSV-файла train.csv и test.csv , который содержит детали изображений.Я использую метод Keras flow_from_dataframe.

Я дал код, который я использую для этой задачи ниже.Это дает оценку перекрестной проверки около 75%, но результаты тестового набора очень плохие (точность только 20%).Я знаю, что переоснащение - это одна из возможностей, но я также думаю, что в приведенном ниже коде я упускаю также некоторые важные детали (возможно, с imagedatagenerator).Потому что, когда я пытаюсь решить другую классификацию изображений с помощью flow_from_dataframe, там также я получаю очень плохие результаты на тестовом наборе.

Может ли кто-нибудь подсказать мне, что мне не хватает, или предоставить указатели.

model = Sequential()
model.add(Conv2D(32, (3, 3), input_shape=(64, 64, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(32, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(64, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Flatten())  # this converts our 3D feature maps to 1D feature vectors

model.add(Dense(64))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(6))
model.add(Activation('softmax'))

model.compile(loss='categorical_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])

# this is the augmentation configuration we will use for training
train_datagen = ImageDataGenerator(rescale=1./255,
                                   shear_range=0.20,
                                   zoom_range=0.20,
                                   horizontal_flip=True,
                                   vertical_flip=True)

# this is the augmentation configuration we will use for testing:
test_datagen = ImageDataGenerator(rescale=1./255)

train_generator = train_datagen.flow_from_dataframe(dataframe=train_df,
                                                    directory='train/',
                                                    x_col='image_name',
                                                    y_col='label',
                                                    has_ext=True,
                                                    seed=42,
                                                    target_size=(64, 64),
                                                    batch_size=16,
                                                    shuffle=False,
                                                    class_mode='categorical')

test_generator = test_datagen.flow_from_dataframe(dataframe=test_df,
                                                  directory='test/Test set/',
                                                  x_col='image_name',
                                                  y_col=None,
                                                  has_ext=True,
                                                  target_size=(64, 64),
                                                  class_mode=None,
                                                  batch_size=1,
                                                  shuffle=False, 
                                                  seed=42)

STEP_SIZE_TRAIN=train_generator.n//train_generator.batch_size

model.fit_generator(generator=train_generator,
                    steps_per_epoch=STEP_SIZE_TRAIN,
                    epochs=10)

test_generator.reset()
pred = model.predict_generator(test_generator, 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]

test_df['label'] = pd.DataFrame(data=predictions)
submission_df.to_csv('submission.csv', index=False)

1 Ответ

0 голосов
/ 02 января 2019

После некоторых исследований я смог найти проблему.Порядок, в котором flow_from_dataframe или flow_from_directory читает файл, отличается от порядка, в котором файлы хранятся в папке.Из-за этого прогнозы были неверно сопоставлены в представлении.Чтобы решить эту проблему, я добавил нули к именам файлов, чтобы порядок, в котором flow_from_dataframe считывал файлы, соответствовал файлам, хранящимся в локальной системе.

Напечатайте имена файлов генератора test_generator.filenames и сравните его с os.listdir.Если вы видите разницу в порядке файлов, нам нужно исправить это, чтобы решить эту проблему.

Используемый ниже код для переименования файлов:

for i in os.listdir(folder):
    filename, extension = (os.path.splitext(i))
    filenumber = filename.zfill(5)
    new_filename = (f'{filenumber}{extension}')
    os.rename(i, new_filename)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...