Как обрабатывать данные, созданные ImageDataGenerator? - PullRequest
0 голосов
/ 07 мая 2019

Я пытаюсь использовать Keras ImageDataGenerator для тренировки моей модели с большим стереофоническим набором данных.

Для каждой сцены у меня есть два изображения RGB, я должен разделить их и объединить, чтобы иметь 6 одноканальных изображений в качестве входных данных для моей модели (то есть этой формы (6,224,224,1)). Для небольших наборов данных это легко, потому что я могу загрузить два набора данных в память и обработать объединение изображений в виде ndarrays. Но с ImageDataGenerator это не одно и то же, так как я должен убедиться, что он принимает одинаковые пакеты из двух наборов данных, и иметь возможность обрабатывать конкатенацию перед передачей ввода в мою модель.

Вдохновленный этим постом , я попробовал этот код:

input_imgen = ImageDataGenerator()

def generate_generator_multiple(generator,dir1, dir2, batch_size):
    genX1 = generator.flow_from_directory(directory=dir1,
                                          color_mode="rgb",
                                          batch_size=batch_size,
                                          class_mode="categorical",
                                          shuffle=False)



    genX2 = generator.flow_from_directory(directory=dir2,
                                          color_mode="rgb",
                                          batch_size=batch_size,
                                          class_mode="categorical",
                                          shuffle=False)
    while True:
            X1i = genX1.next()
            X2i = genX2.next()
            yield [X1i[0], X2i[0]], X2i[1]  

В моем случае, как я могу обработать две серии X1i [0] и X2i [0] с пакетами изображений размером (224,224,3), чтобы иметь размер X1Sum (6,224,224), и вместо: выход [X1i [0], X2i [0]], X2i [1] У меня будет: выход X1Sum, X2i [1]

1 Ответ

1 голос
/ 07 мая 2019

Мне кажется, что вы можете просто преобразовать список в массивы, а затем использовать np.concatenate для объединения каналов и np.swapaxes для размещения каналов впереди. Пример кода с выводом:

import numpy as np

list_a = []
list_b = []

for i in range(5):
    list_a.append(np.random.rand(4, 4, 3))
    list_b.append(np.random.rand(4, 4, 3))

a = np.array(list_a)
b = np.array(list_b)
print(a.shape)
print(b.shape)
c = np.concatenate((a, b), axis=-1)
print(c.shape)
c = np.swapaxes(c, 0, -1)
print(c.shape)

Вывод:

(5, 4, 4, 3)
(5, 4, 4, 3)
(5, 4, 4, 6)
(6, 4, 4, 5)

Полагаю, это то, что вы хотите сделать.

...