ImageDataGenerator не видит картинок

Рейтинг: 1Ответов: 1Опубликовано: 19.05.2023

Пишу генератор картинок (картинки и маски) для U-net сети. В папках pics_to_train и masks_to_train имеются картинки, которые видны при вызове команды !ls в среде colab. Картинки в формате .jpg и лежат непосредственно в этих директориях. Для создания генераторов использую вот такой код:

Y = 720
X = 1280

data_gen_args = dict(rescale=1./255,)

pics_train_datagen = ImageDataGenerator(**data_gen_args)
masks_train_datagen = ImageDataGenerator(**data_gen_args)

pics_train_datagen = pics_train_datagen.flow_from_directory('pics_to_train',
                                                            target_size = (Y, X),
                                                            batch_size = 16,
                                                            class_mode=None)
masks_train_datagen = masks_train_datagen.flow_from_directory('masks_to_train',
                                                             target_size = (Y, X),
                                                             batch_size = 16,
                                                             class_mode=None)

Однако получаю вот такой вывод:

Found 0 images belonging to 0 classes.
Found 0 images belonging to 0 classes.

В документации вроде как всё так же: https://www.tensorflow.org/api_docs/python/tf/keras/preprocessing/image/ImageDataGenerator (раздел Example of transforming images and masks together.)

Не пойму, что не так. Заранее спасибо.

Ответы

▲ 2Принят

Проблема возникает, потому что ImageDataGenerator ожидает структуру директорий, где каждая поддиректория соответствует отдельному классу. В вашем случае, похоже, что директории pics_to_train и masks_to_train не содержат поддиректорий, соответствующих классам, поэтому генератор не может найти изображения.

Если Ваши изображения не принадлежат к каким-либо классам, а должны быть просто обработаны как входные и выходные данные для U-net сети, вы можете использовать flow_from_directory с фиктивным классом. Вот как можно модифицировать ваш код:

import numpy as np

Y = 720
X = 1280

data_gen_args = dict(rescale=1./255)

pics_train_datagen = ImageDataGenerator(**data_gen_args)
masks_train_datagen = ImageDataGenerator(**data_gen_args)

pics_train_generator = pics_train_datagen.flow_from_directory(
    'pics_to_train',
    classes=[''],  # Фиктивный класс
    target_size=(Y, X),
    batch_size=16,
    class_mode=None,
    shuffle=False  # Важно сохранить порядок изображений
)

masks_train_generator = masks_train_datagen.flow_from_directory(
    'masks_to_train',
    classes=[''],  # Фиктивный класс
    target_size=(Y, X),
    batch_size=16,
    class_mode=None,
    shuffle=False  # Важно сохранить порядок масок
)

# Объединяем изображения и маски в один генератор
train_generator = zip(pics_train_generator, masks_train_generator)

# Итерируемся по генератору и выводим примеры
for pics, masks in train_generator:
    # pics содержит входные изображения
    # masks содержит соответствующие маски
    print(f"Batch shape - pics: {pics.shape}, masks: {masks.shape}")

В этом случае мы используем фиктивный класс [''], чтобы генератор мог работать без реальных классов изображений. Ключевой аргумент shuffle=False сохраняет порядок изображений и масок.

Обратите внимание, что в данном примере только выводится информация о форме батчей в генераторе. Вы можете дальше обрабатывать эти батчи по вашим нуждам внутри цикла for.