Как решить ошибку cannot identify image file <_io.BytesIO object at 0x 0C910BD0>?

Скачал изображения для обучения модели в keras. Использовал код для изменения размера.

from PIL import Image
import os, sys

path = "C:\\Users\\Администратор\\AppData\\Local\\Programs\\Python\\Python36-32\\1\\"
out = "C:\\Users\\Администратор\\AppData\\Local\\Programs\\Python\\Python36-32\\1_resized\\"


dirs = os.listdir( path )

def resize():
    for item in dirs:
        if os.path.isfile(path+item):
            im = Image.open(path+item)
            f, e = os.path.splitext(path+item)
            imResize = im.resize((36,36), Image.ANTIALIAS)
            imResize.save(out + item, 'JPEG', quality=90)

resize()

А затем запустил основной код.

import numpy as np
from PIL import Image
from matplotlib import pyplot as plt
import os
import keras 
import joblib
from keras.preprocessing.image import ImageDataGenerator


train_images = 'C:\\Users\\Администратор\\AppData\\Local\\Programs\\Python\\Python36-32\\train_images'

model = keras.Sequential([
    keras.layers.Flatten(input_shape=(36, 36, 3)),
    keras.layers.Dense(128, activation='relu'),
    keras.layers.Dropout(0.5),
    keras.layers.Dense(1, activation='sigmoid')
])

model.compile(optimizer='adam',
              loss='binary_crossentropy',
              metrics=['accuracy'])

datagen = ImageDataGenerator(rescale = 1. /255)

train_generator = datagen.flow_from_directory(
  train_images,
  target_size = (36,36),
  batch_size = 4,
  class_mode = 'binary')

model.fit(np.array(train_generator), epochs=10, validation_split = 0.1)

Ошибка.

...
  File "C:\Users\Администратор\AppData\Local\Programs\Python\Python36-32\lib\sit
e-packages\keras_preprocessing\image\utils.py", line 114, in load_img
    img = pil_image.open(io.BytesIO(f.read()))
  File "C:\Users\Администратор\AppData\Local\Programs\Python\Python36-32\lib\sit
e-packages\PIL\Image.py", line 2944, in open
    "cannot identify image file %r" % (filename if filename else fp)
PIL.UnidentifiedImageError: cannot identify image file <_io.BytesIO object at 0x
0C910BD0>

Добавил часть кода, на которую ссылается ошибка.

with open(path, 'rb') as f:
        img = pil_image.open(io.BytesIO(f.read()))
        if color_mode == 'grayscale':
            # if image is not already an 8-bit, 16-bit or 32-bit grayscale image
            # convert it to an 8-bit grayscale image.
            if img.mode not in ('L', 'I;16', 'I'):
                img = img.convert('L')
        elif color_mode == 'rgba':
            if img.mode != 'RGBA':
                img = img.convert('RGBA')
        elif color_mode == 'rgb':
            if img.mode != 'RGB':
                img = img.convert('RGB')
        else:
            raise ValueError('color_mode must be "grayscale", "rgb", or "rgba"')
        if target_size is not None:
            width_height_tuple = (target_size[1], target_size[0])
            if img.size != width_height_tuple:
                if interpolation not in _PIL_INTERPOLATION_METHODS:
                    raise ValueError(
                        'Invalid interpolation method {} specified. Supported '
                        'methods are {}'.format(
                            interpolation,
                            ", ".join(_PIL_INTERPOLATION_METHODS.keys())))
                resample = _PIL_INTERPOLATION_METHODS[interpolation]
                img = img.resize(width_height_tuple, resample)
        return img

Ответы (1 шт):

Автор решения: Алекс

Было найдено битое изображение с помощью данного кода. Удаление изображения решило проблему.

import glob
from PIL import Image

imagepath = 'C:\\Users\\Администратор\\AppData\\Local\\Programs\\Python\\Python36-32\\train_images\\' 

imgs_names = glob.glob(imagepath+'\\*.jpg')

for imgname in imgs_names: 
    img = Image.open(imgname) 
    if img is None:     
        print(imgname)
→ Ссылка