正确的数据加载器设置以训练 fasterrcnn-resnet50 以使用 pytorch 进行对象检测

Proper dataloader setup to train fasterrcnn-resnet50 for object detection with pytorch

我正在尝试训练 pytorches torchvision.models.detection.fasterrcnn_resnet50_fpn 来检测我自己图像中的对象。

根据 documentation,这个模型需要一个图像列表和一个字典列表 'boxes' 和 'labels' 作为键。所以我的数据加载器 __getitem__() 看起来像这样:

def __getitem__(self, idx):
    # load images
    _, img = self.images[idx].getImage()
    img = Image.fromarray(img, mode='RGB')
    objects = self.images[idx].objects

    boxes = []
    labels = []
    for o in objects:
        # append bbox to boxes
        boxes.append([o.x, o.y, o.x+o.width, o.y+o.height])
        # append the 4th char of class_id, the number of lights (1-4)
        labels.append(int(str(o.class_id)[3]))

    # convert everything into a torch.Tensor
    boxes = torch.as_tensor(boxes, dtype=torch.float32)
    labels = torch.as_tensor(labels, dtype=torch.int64)

    target = {}
    target["boxes"] = boxes
    target["labels"] = labels

    # transforms consists only of transforms.Compose([transforms.ToTensor()]) for the time being
    if self.transforms is not None:
        img = self.transforms(img)

    return img, target

据我所知,returns 正是所要求的。我的数据加载器看起来像这样

data_loader = torch.utils.data.DataLoader(
    dataset, batch_size=4, shuffle=False, num_workers=2)

但是,到了这个阶段: for images, targets in dataloaders[phase]: 它提高了

RuntimeError: invalid argument 0: Sizes of tensors must match except in dimension 0. Got 12 and 7 in dimension 1 at C:\w\s\windows\pytorch\aten\src\TH/generic/THTensor.cpp:689

有人能给我指出正确的方向吗?

@jodag 是对的,我必须编写一个单独的整理函数,以便网络能够像预期的那样接收数据。在我的例子中,我只需要绕过默认函数。