PyTorch DataLoader遍历图像文件夹报错:AttributeError求助
问题:加载ants_and_bees数据集遍历DataLoader时出现AttributeError
尝试加载ants_and_bees数据集,在Google Colab上遍历DataLoader时触发AttributeError,但本地Python 3.9.13环境可正常运行,推测是Colab环境或Python版本导致的问题。
使用的代码
training_dataset = datasets.ImageFolder('ants_and_bees/train', transform=transform_train) validation_dataset = datasets.ImageFolder('ants_and_bees/val', transform=transform) training_loader = torch.utils.data.DataLoader(training_dataset, batch_size=20, shuffle=True) validation_loader = torch.utils.data.DataLoader(validation_dataset, batch_size = 20, shuffle=False) def im_convert(tensor): image = tensor.cpu().clone().detach().numpy() image = image.transpose(1, 2, 0) image = image * np.array((0.5, 0.5, 0.5)) + np.array((0.5, 0.5, 0.5)) image = image.clip(0, 1) return image classes = ('ant', 'bee') dataiter = iter(training_loader) images, labels = next(dataiter) fig = plt.figure(figsize=(25, 4)) for idx in np.arange(20): ax = fig.add_subplot(2, 10, idx+1, xticks=[], yticks=[]) plt.imshow(im_convert(images[idx])) ax.set_title(classes[labels[idx].item()])
错误信息
--------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-58-fb882084a0d1> in <module> 1 dataiter = iter(training_loader) ----> 2 images, labels = next(dataiter) 3 fig = plt.figure(figsize=(25, 4)) 4 5 for idx in np.arange(20): 10 frames /usr/local/lib/python3.8/dist-packages/PIL/TgaImagePlugin.py in _open(self) 64 flags = i8(s[17]) 65 ---> 66 self.size = i16(s[12:]), i16(s[14:]) 67 68 # validate header fields AttributeError: can't set attribute
解决办法
原因分析
这个错误源于Colab中PIL(Pillow)库的版本问题:新版Pillow中Image类的size属性改为了只读,而旧版允许直接赋值。数据集里存在TGA格式的图片,Colab使用的高版本Pillow在处理TGA图片时,TgaImagePlugin.py里的代码尝试直接设置self.size,触发了只读属性的赋值错误。
方案1:降级Pillow版本
在Colab中执行以下命令安装兼容版本,之后重启运行时再重新执行代码:
!pip install pillow==9.5.0
方案2:过滤TGA格式图片
自定义ImageFolder子类,跳过数据集里的TGA文件,避免触发该错误:
from torchvision.datasets import ImageFolder class FilteredImageFolder(ImageFolder): def is_valid_file(self, path): # 跳过所有.tga后缀的文件 return not path.lower().endswith('.tga') # 使用自定义类加载数据集 training_dataset = FilteredImageFolder('ants_and_bees/train', transform=transform_train) validation_dataset = FilteredImageFolder('ants_and_bees/val', transform=transform)
方案3:修改Pillow的TgaImagePlugin代码(临时方案)
在Colab中找到/usr/local/lib/python3.8/dist-packages/PIL/TgaImagePlugin.py文件,将第66行的self.size = i16(s[12:]), i16(s[14:])修改为self._size = i16(s[12:]), i16(s[14:]),保存后重启运行时。此方法需手动修改库文件,不如前两个方案便捷。
内容的提问来源于stack exchange,提问作者Thadeu Melo
相关产品推荐
相关产品推荐

