Как ввести несколько изображений с помощью flow_from_dataframe в керасе? - PullRequest
1 голос
/ 27 июня 2019

Я пытался создать сиамскую модель для нахождения сходства изображений между 2 изображениями (у него 2 входных изображения). Сначала я проверил его с небольшим набором данных, он уместился в моей оперативной памяти, и он работал довольно хорошо. Теперь я хочу увеличить размер обучающей выборки и для этого я создал файл images.csv. В этом файле у меня есть 3 столбца: image_1, image_2, similarity

image_1 и image_2 являются абсолютными путями к изображениям. similarity это либо 0, либо 1.

Я пытался

generator.flow_from_dataframe(dataframe, target_size=(64, 64, 1), x_col=['image_1', 'image_2'],
                                                    y_col='similarity',
                                                    class_mode='sparse', subset='training')

но получил эту ошибку:

ValueError: Все значения в столбце x_col = ['image_1', 'image_2'] должны быть строки.

после удаления image_2 и ошибки x_col=image_1 исчезли, но у нее только 1 входное изображение.

Что мне делать?

Ответы [ 2 ]

1 голос
/ 27 июня 2019

Вы не можете передавать два изображения из одного генератора, используя этот метод, он предназначен для обработки одного, из документации :

x_col: строка, столбец в кадре данных, который содержит имена файлов (или абсолютные пути, если каталог отсутствует).

Вместо этого вы можете создать два генератора и, что более целесообразно, разрешить вашей сети иметь двавходные данные :

in1 = generator.flow_from_dataframe(dataframe, target_size=(64, 64, 1), x_col='image_1',
                                                    y_col='similarity',
                                                    class_mode='sparse', subset='training')

in2 = generator.flow_from_dataframe(dataframe, target_size=(64, 64, 1), x_col='image_2',
                                                    y_col='similarity',
                                                    class_mode='sparse', subset='training')

А затем создайте модель, используя функциональный API , который принимает два изображения:

input_image1 = Input(shape=(64, 64, 1))
input_image2 = Input(shape=(64, 64, 1))
# ... all other layers to create output_layer
model = Model([input_image1, input_image2], output)
# ...

Это больше отражает вашу модельфактически имеет 2 входа в качестве изображений.

0 голосов
/ 28 июня 2019

С помощью @nuric я смог ввести несколько изображений.Вот полный код для создания потока:

def get_flow_from_dataframe(generator, dataframe,
                            image_shape=(64, 64),
                            subset='training',
                            color_mode='grayscale', batch_size=64):
    train_generator_1 = generator.flow_from_dataframe(dataframe, target_size=image_shape,
                                                      color_mode=color_mode,
                                                      x_col='image_1',
                                                      y_col='prediction',
                                                      class_mode='binary',
                                                      shuffle=True,
                                                      batch_size=batch_size,
                                                      seed=7,
                                                      subset=subset, drop_duplicates=False)

    train_generator_2 = generator.flow_from_dataframe(dataframe, target_size=image_shape,
                                                      color_mode=color_mode,
                                                      x_col='image_2',
                                                      y_col='prediction',
                                                      class_mode='binary',
                                                      shuffle=True,
                                                      batch_size=batch_size,
                                                      seed=7,
                                                      subset=subset, drop_duplicates=False)
    while True:
        x_1 = train_generator_1.next()
        x_2 = train_generator_2.next()

        yield [x_1[0], x_2[0]], x_1[1]

Полный код fit_generator:

train_gen = get_flow_from_dataframe(generator, dataframe, image_shape=(64, 64),
                                        color_mode='rgb',
                                        batch_size=batch_size)
valid_gen = get_flow_from_dataframe(generator, dataframe, image_shape=(64, 64),
                                        color_mode='rgb',
                                        batch_size=batch_size,
                                        subset='validation')

model.fit_generator(train_gen, epochs=50,
                        steps_per_epoch=step_size,
                        validation_data=valid_gen,
                        validation_steps=step_size,
                        callbacks=get_call_backs('../models/model_1.h5', monitor='val_acc'),
                        )

Также, как я вижу, потребление памяти огромно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...