OSError: файл изображения обрезан - PullRequest
0 голосов
/ 08 марта 2020

Когда я обрабатываю кучу изображений, на одном из них я получаю эту ошибку

File "/home/tensorflowpython/firstmodel/yololoss.py", line 153, in data_generator
    image, box = get_random_data(annotation_lines[i], input_shape, random=True)
  File "/home/tensorflowpython/firstmodel/yololoss.py", line 226, in get_random_data
    image = image.resize((nw,nh), Image.BICUBIC)
  File "/home/tensorflowpython/kenv/lib/python3.6/site-packages/PIL/Image.py", line 1858, in resize
    self.load()
  File "/home/tensorflowpython/kenv/lib/python3.6/site-packages/PIL/ImageFile.py", line 247, in load
    "(%d bytes not processed)" % len(b)
OSError: image file is truncated (25 bytes not processed)

Я уже попробовал предложенное решение здесь , но оно не работает

мой код выглядит следующим образом

from PIL import Image

def get_random_data(annotation_line, input_shape, random=True, max_boxes=20, jitter=.3, hue=.1, sat=1.5, val=1.5, proc_img=True):
    Image.LOAD_TRUNCATED_IMAGES = True    
    line = annotation_line.split()
    image = Image.open(line[0])
    iw, ih = image.size
    h, w = input_shape
    box = np.array([np.array(list(map(int,box.split(',')))) for box in line[1:]])
    try:
       image.load()
    except IOError:
        pass # You can always log it to logger
    if not random:
        # resize image
        scale = min(w/iw, h/ih)
        nw = int(iw*scale)
        nh = int(ih*scale)
        dx = (w-nw)//2
        dy = (h-nh)//2
        image_data=0
        if proc_img:
            image = image.resize((nw,nh), Image.BICUBIC)
            new_image = Image.new('RGB', (w,h), (128,128,128))
            new_image.paste(image, (dx, dy))
            image_data = np.array(new_image)/255.

        # correct boxes
        box_data = np.zeros((max_boxes,5))
        if len(box)>0:
            np.random.shuffle(box)
            if len(box)>max_boxes: box = box[:max_boxes]
            box[:, [0,2]] = box[:, [0,2]]*scale + dx
            box[:, [1,3]] = box[:, [1,3]]*scale + dy
            box_data[:len(box)] = box

        return image_data, box_data

    # resize image
    new_ar = w/h * rand(1-jitter,1+jitter)/rand(1-jitter,1+jitter)
    scale = rand(.25, 2)
    if new_ar < 1:
        nh = int(scale*h)
        nw = int(nh*new_ar)
    else:
        nw = int(scale*w)
        nh = int(nw/new_ar)

    image = image.resize((nw,nh), Image.BICUBIC) #error occurs here

Разница между моей ошибкой и предыдущим решением заключается в том, что мое говорит об ошибке ОС, а решение об ошибке ввода-вывода

РЕДАКТИРОВАТЬ: I выяснили изображение, которое вызывает эту ошибку, его можно скачать по этой ссылке

1 Ответ

1 голос
/ 08 марта 2020

Я попробовал решение, которое вы связали с усеченным изображением, и оно сработало. Вы допустили небольшую ошибку, пытаясь применить это решение: вы должны установить ImageFile.LOAD_TRUNCATED_IMAGES=True, а не Image.LOAD_TRUNCATED_IMAGES.

LOAD_TRUNCATED_IMAGES изначально не существует в модуле Image, поэтому, когда вы делаете Image.LOAD_TRUNCATED_IMAGES=True вы устанавливаете новую переменную, которая не используется библиотекой.

Так что я думаю, что вы должны сделать это:

from PIL import ImageFile, Image
ImageFile.LOAD_TRUNCATED_IMAGES = True

image = Image.open("00090.jpg")
# resize now doesn't fail
image.resize((h, w), Image.BICUBIC)
...