pytorch Dataloader-如果输入数据返回多个训练实例



问题

我有以下问题:

我想使用pytorchs DataLoader(以类似于这里的方式(,但我的设置有点不同:

在我的数据文件夹中,我有不同街道情况的图像(我们称之为image_total(,我想在离相机足够近的人周围使用裁剪图像(称为image_crop_[idx](。因此,可能会发生这样的情况,有些图像给我一个或多个裁剪图像,而另一些图像给我零图像,因为它们没有显示任何人或太远了。

由于我有很多图像,我想使实现尽可能高效。

我希望有可能使用这样的东西:

我想加载image_total并检查其中是否有有用的裁剪。如果是,我提取裁剪的图像并获得类似[image_crop_0, image_crop_1, image_crop_2,...]的列表

现在我的问题:这可能与pytorchs DataLoader兼容吗?我看到的问题是,类的```getitem```方法将向任意实例返回零。我想使用恒定的批量进行训练。

注意事项

  • 也许DataLoader支持此功能(但我没有找到(
  • 我必须使用缓冲区或类似的东西
  • 后备方案是预处理数据,但这不是最有效的解决方案

后备方案是预处理数据,但这不是最有效的解决方案

事实上,这可能是最简单有效的解决方案。您的数据集当前具有动态大小,这与DataLoader不兼容,DataLoader应该输出固定大小的数据进行训练。

另一种解决方案可能是预处理pytorch数据集__init__中的数据,以创建所有人的列表及其相应的图像:

[("img1", p1), ("img1", p2), ..., ("imgn", pk)]

其中pi是图像中的人物边界框。然后,在__getitem__方法中,您可以读取图像并裁剪相应的人:

class PersonDataset(Dataset):

def __init__(self):
self.images = ["img1", "img2", ..., "image"]
self.persons = [("img1", p1), ("img1", p2), ..., ("imgn", pk)]
def __getitem__(self, index):
img, box = self.persons[index]
img = rad_image(img)
return crop(img, box)
def __len__(self):
return len(self.persons)

这不是最有效的方法,因为它可能会导致图像被多次读取,但如果使用DataLoader使用多个工作者,这不应该成为瓶颈。

您必须实现如何创建self.persons。基本上,您必须读取所有的注释文件,并提取图像的人员边界框列表。

最新更新