ImageDataGenerator не видит картинок
Пишу генератор картинок (картинки и маски) для 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.)
Не пойму, что не так. Заранее спасибо.
Ответы (1 шт):
Проблема возникает, потому что 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.