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
方法的一种更简单的方法。
我在 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
方法的一种更简单的方法。