PyTorch目标检测使用Albumentations做数据增强触发AttributeError怎么解决?
问题原因
- 核心原因:Albumentations 进行预处理时需要读取图像的
shape属性来获取宽高信息,该属性仅 numpy 数组类型的图像具备,而 PyTorch 官方目标检测教程默认使用 PIL 库读取图像,得到的是PIL.Image类型对象,本身没有shape属性,所以触发该报错。 - 附加代码笔误:你当前的
__getitem__方法还存在两个明显笔误,后续也会触发报错:- 第48行变量名错误,
transformer应为调用变换后得到的transformed - 第49行数据类型错误,不存在
torch.float332类型,应为torch.float32
- 第48行变量名错误,
- 验证集变换不统一:你当前验证集使用的
ToTensor()如果是 torchvision 提供的实现,和训练集使用的 Albumentations 提供的ToTensorV2()输出格式存在差异,会导致后续训练出现格式不匹配问题。
解决方法
- PIL图像转numpy数组
在数据集__getitem__方法中,读取PIL图像后、传入数据增强逻辑前,新增转换代码:
import numpy as np # 原读取图像代码 img = Image.open(image_path).convert("RGB") # 新增转换为numpy数组代码 img = np.array(img) # 后续正常构造image_data传入self.transforms即可
- 修正两处代码笔误
将__getitem__中对应的两行代码修改为:
img = transformed['image'] target['boxes'] = torch.as_tensor(transformed['bboxes'], dtype=torch.float32)
- 统一验证集数据变换逻辑
将验证集的变换改为和训练集同体系的Albumentations实现:
else: return A.Compose([ ToTensorV2() ])
内容的提问来源于stack exchange,提问作者Atia
相关产品推荐
相关产品推荐

