Вопрос или проблема
Я новичок в глубоком обучении в области обработки изображений. Вот фрагмент кода, который я использую для генераторов данных для обучения и тестирования
classes = ['глиома', 'менингиома', 'аденома', 'нетопухоли']
train_dirs = [
'Data/Training/glioma',
'Data/Training/glioma',
'Data/Training/meningioma',
'Data/Training/pituitary',
'Data/Training/notumor'
]
test_dirs = [
'Data/Testing/glioma',
'Data/Testing/meningioma',
'Data/Testing/pituitary',
'Data/Testing/notumor'
]
print([len(os.listdir(train_dir)) for train_dir in train_dirs])
def get_data_generators(train_dirs, test_dirs, target_size=(224, 224), batch_size=32):
train_datagen = ImageDataGenerator(rescale=1.0 / 255.0)
test_datagen = ImageDataGenerator(rescale=1.0 / 255.0)
train_generators = []
for train_dir in train_dirs:
print(f"Загрузка обучающих данных из: {train_dir}")
train_gen = train_datagen.flow_from_directory(
train_dir,
target_size=target_size,
batch_size=batch_size,
class_mode="categorical",
shuffle=True
)
train_generators.append(train_gen)
test_generators = []
for test_dir in test_dirs:
print(f"Загрузка тестовых данных из: {test_dir}")
test_gen = test_datagen.flow_from_directory(
test_dir,
target_size=target_size,
batch_size=batch_size,
class_mode="categorical",
shuffle=False
)
test_generators.append(test_gen)
return train_generators, test_generators
train_generators, test_generators = get_data_generators(train_dirs, test_dirs)
А вывод следующий
[1321, 1321, 1339, 1457, 1595]
Загрузка обучающих данных из: Data/Training/glioma
Найдено 0 изображений, относящихся к 0 классам.
Загрузка обучающих данных из: Data/Training/glioma
Найдено 0 изображений, относящихся к 0 классам.
Загрузка обучающих данных из: Data/Training/meningioma
Найдено 0 изображений, относящихся к 0 классам.
Загрузка обучающих данных из: Data/Training/pituitary
Найдено 0 изображений, относящихся к 0 классам.
Загрузка обучающих данных из: Data/Training/notumor
Найдено 0 изображений, относящихся к 0 классам.
Загрузка тестовых данных из: Data/Testing/glioma
Найдено 0 изображений, относящихся к 0 классам.
Загрузка тестовых данных из: Data/Testing/meningioma
Найдено 0 изображений, относящихся к 0 классам.
Загрузка тестовых данных из: Data/Testing/pituitary
Найдено 0 изображений, относящихся к 0 классам.
Загрузка тестовых данных из: Data/Testing/notumor
Найдено 0 изображений, относящихся к 0 классам.
Я проверил структуру папок на блоге keras и моя структура совпадает, файлы имеют допустимые расширения, такие как jpg. Какова может быть возможная ошибка, я хочу научиться, спасибо заранее.
Ответ или решение
Проблема, с которой вы столкнулись, заключается в том, что метод flow_from_directory
ожидает определенную структуру директорий для корректной работы. Давайте разберем возможные причины, почему метод не находит изображения, несмотря на то, что os.listdir()
показывает правильное количество файлов.
1. Проверка структуры каталогов
Метод flow_from_directory
требует, чтобы папка, переданная в качестве аргумента, была организована следующим образом:
Data/
Training/
glioma/
img1.jpg
img2.jpg
...
meningioma/
img1.jpg
img2.jpg
...
pituitary/
img1.jpg
...
notumor/
img1.jpg
...
Testing/
glioma/
img1.jpg
...
meningioma/
img1.jpg
...
pituitary/
img1.jpg
...
notumor/
img1.jpg
...
Убедитесь, что в каждом из указанных каталогов изображений действительно находятся соответствующие подкаталоги, а не все изображения находятся в одной папке.
2. Исправление кода для генераторов
В вашем коде, когда вы передаете train_dir
и test_dir
в flow_from_directory
, вы указываете путь к подкаталогам изображений. Вы должны передавать путь к каталогу, который содержит подкаталоги классов. Это означает, что вместо этого:
train_dirs = [
'Data/Training/glioma',
'Data/Training/glioma',
'Data/Training/meningioma',
'Data/Training/pituitary',
'Data/Training/notumor'
]
у вас должен быть такой список:
train_dir = 'Data/Training/'
test_dir = 'Data/Testing/'
3. Изменение функции генераторов
Ваша функция get_data_generators
также нуждается в изменениях. Она должна использовать общий путь к тренеровочным и тестовым данным:
def get_data_generators(train_dir, test_dir, target_size=(224, 224), batch_size=32):
train_datagen = ImageDataGenerator(rescale=1.0 / 255.0)
test_datagen = ImageDataGenerator(rescale=1.0 / 255.0)
print(f"Loading training data from: {train_dir}")
train_gen = train_datagen.flow_from_directory(
train_dir,
target_size=target_size,
batch_size=batch_size,
class_mode="categorical",
shuffle=True
)
print(f"Loading testing data from: {test_dir}")
test_gen = test_datagen.flow_from_directory(
test_dir,
target_size=target_size,
batch_size=batch_size,
class_mode="categorical",
shuffle=False
)
return train_gen, test_gen
train_gen, test_gen = get_data_generators('Data/Training/', 'Data/Testing/')
4. Проверка форматов изображений
Также убедитесь, что все файлы изображений имеют правильные расширения (например, .jpg
, .png
) и что эти файлы не повреждены. Иногда файлы могут иметь неправильное расширение или быть недоступными для чтения.
5. Правильное использование классов
Ваша исходная структура должна соответствовать ожидаемым классам. Убедитесь, что папки glioma
, meningioma
, pituitary
и notumor
содержат изображения, соответствующие соответствующим классам.
Следуя этим рекомендациям, вы сможете устранить проблему с отсутствием изображений при использовании метода flow_from_directory
. Если проблема все еще сохраняется, проверьте вывод ошибок и убедитесь, что ваши пути правильные и доступны для чтения.