RuntimeError: stack expects each tensor to be equal size, but got [3, 640, 1064] at entry 0 and [3,

在笔者复现DBnet时出现如题错误。

问题出在 torch.stack 的调用上

此时运行的是自己的数据集,解决方法为

  1. 统一尺寸,在数据预处理阶段将所有图像调整到相同的尺寸,或者可以直接将数据集处理成相同大小
  2. 如果你希望保持图像的原始尺寸,并且在模型中处理不同尺寸的图像,可以引入动态填充逻辑。这通常涉及到找到最大尺寸,并将所有图像填充到这一尺寸,此改动通常在DB\data_loader\__init__.py文件中,找到ICDARCollectFN改动
  • import torch
    from torchvision.transforms.functional import pad
    
    class ICDARCollectFN:
        def __init__(self, *args, **kwargs):
            pass
    
        def __call__(self, batch):
            data_dict = {}
            to_tensor_keys = []
    
            # 收集数据并找到最大尺寸
            max_shape = [0, 0]
            for sample in batch:
                for k, v in sample.items():
                    if k not in data_dict:
                        data_dict[k] = []
                    if isinstance(v, (np.ndarray, torch.Tensor, PIL.Image.Image)):
                        if k not in to_tensor_keys:
                            to_tensor_keys.append(k)
                        if isinstance(v, PIL.Image.Image):
                            v = transforms.ToTensor()(v)  # 将PIL Image转换为Tensor
                        if v.dim() == 3:
                            max_shape[0] = max(max_shape[0], v.size(1))  # height
                            max_shape[1] = max(max_shape[1], v.size(2))  # width
                    data_dict[k].append(v)
    
            # 填充数据
            for k in to_tensor_keys:
                if k == 'img':  # 假设'img'是图像数据
                    padded_tensors = []
                    for img in data_dict[k]:
                        padding = (0, max_shape[1] - img.size(2), 0, max_shape[0] - img.size(1))
                        padded_img = pad(img, padding, fill=0, padding_mode='constant')
                        padded_tensors.append(padded_img)
                    data_dict[k] = torch.stack(padded_tensors, 0)
                else:
                    data_dict[k] = torch.stack(data_dict[k], 0)
    
            return data_dict

    并且之后我又将数据集的配置文件改为了DB\config\icdar2015_resnet18_FPN_DBhead_polyLR.yaml,算法成功跑通!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值