#python #pandas #tensorflow #machine-learning #tf.keras
Вопрос:
У меня есть данные в 2 папках (Обучение с 10000 изображениями и проверка с 1000 изображениями), и в каждой из этих папок у меня есть 10 папок (соответствующие классы). Я поместил все эти данные в фрейм данных, чтобы использовать их позже. Оказывается, что некоторые изображения в определенных папках на данный момент я использую «flow_from_dataframe» в Tensorflow, как предполагается, имеют недопустимые имена и поэтому игнорируются.
И я пытаюсь получить доступ к любому изображению за пределами Tensorflow, например, просто открыв изображение, и я все еще не могу получить доступ к определенным файлам, когда путь полностью правильный
from PIL import Image
im = Image.open("D:Ensino SuperiorISCTE-IULMestrado em Engenharia InformaticaTeseTestagemTomatoLeafDiseasedataTrainTomato___Tomato_mosaic_virusTomato___Tomato_mosaic_virus_original_f16eeb0f-5219-4a81-9941-351b3d9ba5fc___PSU_CG 2089.JPG_a88e521f-cec2-4755-871f-782de8192056.JPG")
im.show()
Вывод при попытке доступа к изображению вне кода Tensorflow
Я исследовал и увидел, что использование пути abs может помочь и заставить его работать, однако даже в этом случае некоторые изображения игнорируются, что я могу сделать, чтобы ни одно изображение не игнорировалось ?
Код перед выводом с ошибкой:
def create_gen():
train_generator = tf.keras.preprocessing.image.ImageDataGenerator(
preprocessing_function=tf.keras.applications.mobilenet_v2.preprocess_input,
validation_split=0.2
)
test_generator = tf.keras.preprocessing.image.ImageDataGenerator(
preprocessing_function=tf.keras.applications.mobilenet_v2.preprocess_input
)
train_images = train_generator.flow_from_dataframe(
dataframe=train_df,
x_col='Filepath',
y_col='Class',
target_size=(224, 224),
color_mode='rgb',
class_mode='categorical',
batch_size=32,
shuffle=True,
seed=0,
subset='training',
rotation_range=30, # Uncomment to use data augmentation
zoom_range=0.15,
width_shift_range=0.2,
height_shift_range=0.2,
shear_range=0.15,
horizontal_flip=True,
fill_mode="nearest"
)
val_images = train_generator.flow_from_dataframe(
dataframe=train_df,
x_col='Filepath',
y_col='Class',
target_size=(224, 224),
color_mode='rgb',
class_mode='categorical',
batch_size=32,
shuffle=True,
seed=0,
subset='validation',
rotation_range=30, # Uncomment to use data augmentation
zoom_range=0.15,
width_shift_range=0.2,
height_shift_range=0.2,
shear_range=0.15,
horizontal_flip=True,
fill_mode="nearest"
)
test_images = test_generator.flow_from_dataframe(
dataframe=validation_df,
x_col='Filepath',
y_col='Class',
target_size=(224, 224),
color_mode='rgb',
class_mode='categorical',
batch_size=32,
shuffle=False
)
return train_generator,test_generator,train_images
pretrained_model = tf.keras.applications.MobileNetV2(
input_shape=(224, 224, 3),
include_top=False,
weights='imagenet',
pooling='avg'
train_generator,test_generator,train_images,val_images,test_images = create_gen()
Вывод после использования «flow_from_data_frame» с Tensorflow
Ответ №1:
Ваши генераторы неверны. Например, у вас есть этот код.
train_images = train_generator.flow_from_dataframe(
dataframe=train_df,
x_col='Filepath',
y_col='Class',
target_size=(224, 224),
color_mode='rgb',
class_mode='categorical',
batch_size=32,
shuffle=True,
seed=0,
subset='training',
rotation_range=30, # Uncomment to use data augmentation
zoom_range=0.15,
width_shift_range=0.2,
height_shift_range=0.2,
shear_range=0.15,
horizontal_flip=True,
fill_mode="nearest"
Параметры rotation_range, width_shift_range, height_shift_range, shear_range, horizontal_flip и fill_mode не относятся к .flow_from_dataframe. Они должны быть помещены в ImageDataGenerator, как показано ниже
train_generator = tf.keras.preprocessing.image.ImageDataGenerator( preprocessing_function=tf.keras.applications.mobilenet_v2.preprocess_input,
validation_split=0.2, rotation_range=30, zoom_range=0.15,
width_shift_range=0.2, height_shift_range=0.2, shear_range=0.15,
horizontal_flip=True, fill_mode="nearest" )
Для решения проблемы с путями к изображениям попробуйте запустить это. Я использую sdir в качестве каталога, содержащего ваши данные, просто подставьте правильное имя каталога.
import os
from PIL import Image
sdir=r'C:Tempballstrain' # set this to you directory
good_image_count=0
bad_image_count=0
processed_count=0
bad_image_list=[]
classlist=os.listdir(sdir)
for klass in classlist:
print ('processing class directory ', klass)
classpath=os.path.join(sdir, klass)
if os.path.isdir(classpath):
flist=os.listdir(classpath)
print (' number of files in class directory ', klass,' is ', len(flist))
for f in flist:
processed_count =1
fpath=os.path.join(classpath, f)
if os.path.isfile(fpath):
try:
image=Image.open(fpath)
image.verify()
good_image_count =1
except:
bad_image_count =1
bad_image_list.append(fpath)
else:
print('in class directory ', klass, ' you have sub directories, you should only have files in it')
else:
print ('In the sdir you have files, you should only have class subdirectories in sdir')
print(processed_count, ' files were processed')
print(good_image_count, ' files were valid image files')
print(bad_image_count, ' files were invalid images or paths did not exist')
for f in bad_image_list:
print (f)
Комментарии:
1. Спасибо Джири П. Но я уже сделал это, чтобы подтвердить и сравнить, и да, количество напечатанных файлов-это количество файлов, которые действительно находятся в папке.
2. см. Измененный ответ
3. Я использую ваш код, и в нем говорится, что у меня есть подкаталоги в одной из папок trains («вирус Tomato__Tomato_mosaic_»), но у меня там только файлы. Если вы хотите увидеть набор данных, который я использую, набор данных вот этот kaggle.com/kaustubhb999/tomatoleaf и за то, что я вижу папку с файлами, которые создают проблемы в вашем коде и в моем коде, когда попытка получить доступ ко всем файлам-это «вирус Tomato__Tomato_mosaic_».
4. Должно быть, вы неправильно скопировали набор данных. Перейдите к набору данных на Kagle и выберите код, затем выберите Точность теста notebook EfficientNet B3=99% или перейдите непосредственно к kaggle.com/gpiosenka/efficientnet-b3-test-accuracy-99 . В нем есть полный код для тестирования изображений, построения фреймов данных, построения генераторов, построения модели и ее обучения.
5. Извините, но этой страницы не существует
Ответ №2:
Разобрались. Это было связано с тем, что путь к изображениям и само название изображения были слишком длинными.