【问题标题】:pytorch Dataloader - if input data returns multiple training instancespytorch Dataloader - 如果输入数据返回多个训练实例
【发布时间】:2021-07-16 11:34:05
【问题描述】:

问题

我有以下问题:

我想使用 pytorchs DataLoader(类似于here),但我的设置有所不同:

在我的数据文件夹中,我有图像(我们称它们为 image_total 不同的街道情况,我想使用裁剪图像(称为 image_crop_[idx] 在离相机足够近的人周围。所以可能会发生一些图像给出给我一张或多张裁剪的图像,而其他人给我零张图像,因为它们没有显示任何人或者它们距离很远。

因为我有很多图片,所以我想让实现尽可能高效。

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

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

的列表

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

注意事项

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

【问题讨论】:

    标签: pytorch pytorch-dataloader


    【解决方案1】:

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

    确实,这可能是最简单有效的解决方案。您的数据集当前具有动态大小,这与 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)
    

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

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

    【讨论】:

    • 感谢您的回答。如果没有其他解决方案,这就是我将实施的。我想我用这种方法试试。唯一令人不安的是我必须始终存储每个边界框(但我认为这最终不是问题)
    • 可以不将边界框存储在内存中,但如果您的数据集不是很大,这可能不是问题。
    猜你喜欢
    • 1970-01-01
    • 2022-01-23
    • 2019-04-27
    • 2020-07-14
    • 1970-01-01
    • 2020-11-29
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    相关资源
    最近更新 更多