原始代码:
# 构建一个能够加载数据集的类
class MyDataset(Dataset): # 继承Dataset
# 得到一个包含图像和标签的列表
def __init__(self, root, label_root,transform=None,is_aug=None,fix_size=(244, 244)): # 初始化一些属性
data_list = get_data(root) # 得到数据的名字列表
label = get_label(label_root)
self.data_list = data_list
self.label = label
self.transform = transform
self.is_aug = is_aug
self.fix_size = fix_size
def __len__(self):
return len(self.data_list)
# 翻转
def img_flip(self, img, axi): # axi=0:上下翻转 axi=1:左右翻转
img = np.flip(img, axis=axi).copy()
return img
# 旋转
def img_rotate(self, img):
angle = random.randint(0, 360)
h, w = img.shape[:2]
M = cv2.getRotationMatrix2D((h / 2, w / 2), angle, 1)
img = cv2.warpAffine(img, M, (h, w))
return img
# 得到每个元素的图像像素矩阵和标签
def __getitem__(self,index):
x_idx = self.data_list[index] # 获取图像的索引
img = cv2.imread(x_idx, 1) # 加载图像
# 把image设为固定尺寸
img = cv2.resize(img, dsize=self.fix_size)
label = self.label[index]
# 数据增强(翻转,旋转)
if self.is_aug:
p_f = torch.rand(1)
if p_f > 0.2: # 翻转
axi = random.choice([0, 1]) # axi=0:上下翻转 axi=1:左右翻转
img = self.img_flip(img, axi)
p_ro = torch.rand(1)
if p_ro > 0.5: # 旋转
img = self.img_rotate(img)
# 数据变换
img = self.transform(img)
return img, label
# 数据batch处理
def processing(train_root,train_label_root, test_root,test_label_root, bs):
train_sets,label_train = MyDataset(train_root,train_label_root,
transform=transforms.Compose([transforms.ToPILImage(),
transforms.Resize((244, 244)),
transforms.ToTensor()]),
is_aug=True
)
train_dataset = TensorDataset(train_sets,label_train)
train_loaders = DataLoader(train_dataset, batch_size=bs, shuffle=True) # shuffle = true就是要洗牌随机取,而不是按顺序取。
# 验证集不需要做数据增强,但要保证图像大小一致
test_sets,label_test = MyDataset(test_root,test_label_root,
transform=transforms.Compose([transforms.ToPILImage(),
transforms.Resize((244, 244)), transforms.ToTensor()]),
is_aug = False
)
test_dataset = TensorDataset(test_sets,label_test)
test_loaders = DataLoader(test_dataset, batch_size=bs, shuffle=True)
return train_loaders, test_loaders
##报错,ValueError: too many values to unpack (expected 2)
##报错行 is_aug=True,运行三次,能够出来三个结果(print train_path和label),但是第四个就print不出来了
##错误原因,虽然上面是return img,label,但是使用dataloader是返回一个迭代器,可以将数据图像和label堆在一起,后面train的时候才一代一代地对应取出来
##更改: train_sets = MyDataset(train_root,train_label_root,
transform=transforms.Compose([transforms.ToPILImage(),
transforms.Resize((244, 244)),
transforms.ToTensor()]),is_aug=True)
去掉train_dataset = TensorDataset(train_sets,label_train)
还有train_loaders = DataLoader(train_sets, batch_size=bs, shuffle=True)
不会报错。
【记第一次写文章】
在使用Python进行FPGA开发的计算机视觉项目中,遇到Dataloader报错:ValueError: too many values to unpack (expected 2)。错误出现在尝试解包数据时,原本的代码返回了多个值,但预期只有2个。通过修改MyDataset类的返回值,将数据集与标签组合,并使用DataLoader处理,避免了直接堆叠TensorDataset导致的问题。解决方案是移除TensorDataset和相应代码,直接使用DataLoader加载处理后的数据集,解决了报错问题。
635





