3

问题

我有以下问题:

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

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

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

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

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

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

注意事项

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

1 回答 1

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)

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

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

于 2021-04-22T09:18:06.550 回答