Почему некоторые из моих изображений игнорируются в Tensorflow, когда у меня есть изображения, которые не игнорируются в тех же папках?

#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:

Разобрались. Это было связано с тем, что путь к изображениям и само название изображения были слишком длинными.