python影像库截断影像问题

python imaging library truncated image problem

我在 python 中使用 PIL 加载大量图像并调整其大小,以提供给 CNN。但是在加载过程中出现了这个错误:

---------------------------------------------------------------------------
OSError                                   Traceback (most recent call last)
<ipython-input-1-9e7a5298cd3e> in <module>
      3 dog_names = ip.labels("dogImages/train")
      4 
----> 5 trn_data, trn_targets = ip.data_loader('dogImages/train', (224, 224))
      6 val_data, val_targets = ip.data_loader('dogImages/valid', (224, 224))
      7 tst_data, tst_targets = ip.data_loader('dogImages/test', (224, 224))

...my address...\libs\img_preprocessing.py in data_loader(path, size)
     48             cat_target.append([1 if pre_label(im)==label else 0 for label in labels(total)])
     49             img = Image.open(im)
---> 50             img = Image.Image.resize(img, size=size)
     51             img = np.array(img)
     52             arr.append(img)

C:\ProgramData\Anaconda3\lib\site-packages\PIL\Image.py in resize(self, size, resample, box, reducing_gap)
   1922             return im.convert(self.mode)
   1923 
-> 1924         self.load()
   1925 
   1926         if reducing_gap is not None and resample != NEAREST:

C:\ProgramData\Anaconda3\lib\site-packages\PIL\ImageFile.py in load(self)
    247                                     break
    248                                 else:
--> 249                                     raise OSError(
    250                                         "image file is truncated "
    251                                         f"({len(b)} bytes not processed)"

OSError: image file is truncated (150 bytes not processed)

我看到了一些关于添加此代码的建议:

from PIL import ImageFile
ImageFile.LOAD_TRUNCATED_IMAGES = False

但我认为它允许有缺陷的数据进入我们的模型。我不想要那个。我想在不使程序崩溃的情况下跳过损坏的图像,并加载所有其余图像,但我无法弄清楚。 我使用的代码是这样的:

def data_loader(path, size):
    '''
    loading image data
    parameters:
        path => image directory path
        size => output size in tuple
    '''
    total = glob(path + "/*")
    arr = []
    for _dir in total:
        for im in glob(_dir+"/*"):
            img = Image.open(im)
            img = Image.Image.resize(img, size=size)
            img = np.array(img)
            arr.append(img)
    return np.array(arr)

由于在您尝试调整大小时发生错误,请将该行括在 try/except 中。当您收到错误时,continue 会跳过当前迭代的其余部分并继续处理下一个图像文件。

from glob import glob

import numpy as np
from PIL import Image

def load_data(path, size):
    '''
    loading image data
    parameters:
        path => image directory path
        size => output size in tuple
    '''
    total = glob(path + "/*")
    images = []
    for subdir in total:
        for im in glob(subddir + "/*"):
            img = Image.open(im)
            try:
                img = img.resize(size)
            except OSError:
                continue
            img = np.array(img)
            images.append(img)
    return np.array(images)

我更改的其他一些小东西:

  • data_loader 听起来更像是 class 而不是函数。我推荐使用动词来表示功能,或者至少不推荐听起来像是执行动作的名词。
  • 作为变量名,arr 既是通用的(里面有什么?)又具有误导性(它是列表,而不是数组)。
  • 按照惯例,以 _ 开头的变量通常用于“私有”属性。
  • img.resize(size) 只是调用 resize 方法的一种更简单的方法。