Keras ImageDataGenerator: PIL.Ошибка неопознанного изображения

#tensorflow #keras #deep-learning #computer-vision #python-imaging-library

#tensorflow #keras #глубокое обучение #компьютерное зрение #python-imaging-library

Вопрос:

Я пытался использовать ImageDataGenerator для создания изображений генератора для обучения моей модели, но я не могу этого сделать из-за PIL.Ошибка неопознанного изображения. Я пробовал разные наборы данных, и проблема относится только к моему набору данных.

Теперь я, к сожалению, не могу удалить все обучающие / тестовые изображения в качестве предложенного ответа, но я могу удалить файлы, вызывающие эту проблему. Как я могу обнаружить файлы, вызывающие ошибку?

Комментарии:

1. Создайте скрипт, который открывает каждое изображение итеративно с помощью PIL, а затем выведите, какие из них завершаются с ошибкой.

2. Иногда вместе с изображениями существуют другие файлы конфигурации, особенно в больших наборах данных. Создайте пользовательский цикл, выполните итерацию по каждой вложенной папке и изображению и проверьте, правильно ли указано расширение.

Ответ №1:

Это распространенная проблема, особенно если вы загружаете изображения, скажем, из Google. Я разработал функцию, которая, учитывая каталог, просматривает все подкаталоги и проверяет файлы в каждом подкаталоге, чтобы убедиться, что они имеют правильные расширения и являются допустимыми файлами изображений. Код приведен ниже. Он возвращает два списка. good_list — это список допустимых файлов изображений, а bad_list — список недопустимых файлов изображений. У вас должен быть установлен Opencv.Если он у вас не установлен, используйте pip install opencv-contrib-python.

 def test_images(dir):
    import os
    import cv2
    bad_list=[]
    good_list=[]
    good_exts=['jpg', 'png', 'bmp','tiff','jpeg', 'gif'] # make a list of acceptable image file types
    for klass in os.listdir(dir) :  # iterate through the sub directories 
        class_path=os.path.join (dir, klass) # create path to sub directory 
        if os.path.isdir(class_path):
            for f in os.listdir(class_path): # iterate through image files
                    f_path=os.path.join(class_path, f) # path to image files
                    ext=f[f.rfind('.') 1:] # get the files extension
                    if ext  not in good_exts:
                            print(f'file {f_path}  has an invalid extension {ext}')
                            bad_list.append(f_path)                    
                    else:
                        try:
                            img=cv2.imread(f_path)
                            size=img.shape
                            good_list.append(f_path)
                        except:
                            print(f'file {f_path} is not a valid image file ')
                            bad_list.append(f_path)
        else:
            print(f'** WARNING ** directory {dir} has files in it, it should only contain sub directories')

    return good_list, bad_list
  

Комментарии:

1. Спасибо. Это помогло.