Keras ImageDataGenerator - несколько генераторов, текущих из каталога - PullRequest
0 голосов
/ 12 июля 2020

У меня есть папка с 15000 уникальных изображений, и я использую подход сиамского CNN с потерями триплетов без / под контролем.

Мне нужно создать набор привязанных, положительных и отрицательных эталонных изображений для каждого из 15 000 изображений, где привязка и негатив не могут быть одним и тем же изображением, а положительное эталонное изображение представляет собой расширенную версию привязки. По сути, обучающий набор = [15 000 привязок, 15 000 положительных, 15 0000 отрицательных изображений].

Как вы можете использовать ImageDataGenerator таким образом, чтобы гарантировать привязку! = Отрицательный, одновременно увеличивая привязку на лету для получения положительного эталонное изображение?

как следующий код (хотя это не работает):

def gen_trips(b_size = 24, flow_dir = data_dir):

    # basic generator
    datagen = ImageDataGenerator(dtype = np.float32)
    
    # data augmentation generator
    datagen_p = ImageDataGenerator(rotation_range = 45,
                                   horizontal_flip = True,
                                   fill_mode = 'nearest')

    # generate a
    a = datagen.flow_from_directory(directory = flow_dir,
                                    target_size = (224, 224),
                                    class_mode = None,
                                    batch_size = b_size,
                                    shuffle = True,
                                    seed = 42).next()

    # generate n           
    n = datagen.flow_from_directory(directory = flow_dir,
                                    target_size = (224, 224),
                                    class_mode = None,
                                    batch_size = b_size,
                                    shuffle = True,
                                    seed = 0).next()
    
    # generate p
    p = datagen_p.flow(a, 
                       shuffle = False, 
                       batch_size = b_size, 
                       seed = 42).next()

    yield [a, p, n]

a и n перемешиваются с разными начальными числами - так что, надеюсь, одни и те же два изображения никогда не попадают в тот же набор, а p использует генератор увеличения данных, а не генератор basi c.

Очевидная проблема с этой реализацией заключается в том, что она просто воспроизводит одни и те же изображения в диапазоне b_size, поскольку .next () применяется к a и n.

Если я удалю .next () - все изображения будут загружены, что приведет к OOM (поскольку генераторы проходят итерацию.

В идеале, я ' Я хотел бы иметь возможность передавать пакеты размером b_size, которые проходят через весь каталог, в model.fit. Другими словами; циклически проходить через .next ()?

Как можно ли этого достичь?

Любая помощь приветствуется!

...