自定义数据集、数据加载器、采样器或其他?

Custom Dataset, Dataloader, Sampler, or something else?

我正在开展一个项目,该项目需要在非常大的图像数据集上训练 PyTorch 框架神经网络。其中一些图像与问题完全无关,但这些不相关的图像并没有被标记为这样。但是,如果它们不相关,我可以使用一些指标来计算(例如,将所有像素值相加可以让我很好地了解哪些是相关图像,哪些不是)。我最想做的是拥有一个可以接收数据集 class 并仅使用相关图像创建批次的数据加载器。数据集 class 只会知道图像列表及其标签,而数据加载器会解释与它一起制作批次的图像是否相关,然后只会与相关图像一起制作批次。

为了将此应用于示例,假设我有一个黑白图像数据集。白色图像是无关紧要的,但它们没有这样标记。我希望能够从文件位置加载批次,并让这些批次仅包含黑色图像。我可以在某个时候通过对所有像素求和并发现它等于 0 来进行过滤。

我想知道自定义数据集、数据加载器或采样器是否能够为我解决此任务?我已经编写了一个自定义数据集,用于存储所有已保存图像的目录,以及该目录中所有图像的列表,并且可以 return 带有标签的图像 getitem 函数。我应该在那里添加更多内容以过滤掉某些图像吗?还是应该在自定义 Dataloader 或 Sampler 中应用该过滤器?

谢谢!

我假设您的图像数据集属于两个 classes(0 或 1),但它没有标记。正如@PranayModukuru 提到的那样,您可以通过在游览自定义数据集 getitem 函数中使用某种度量(例如,聚合图像的所有像素强度值,如您所提到的)来确定相似性 class.

但是,在训练模型时确定 getitem 函数中的相似性会使训练过程非常缓慢。因此,我建议您在开始训练之前估计相似度(而不是在 getitem 函数中)。此外,如果您的图像数据集由复杂图像(不是黑白图像)组成,最好使用预训练的深度学习模型(例如 resnet 或自动编码器)进行降维,然后应用聚类方法(例如凝聚聚类)来标记您的图像。

在第二种方法中,您只需要准确标记图像一次,如果您在训练时对图像应用增强,则无需重新确定 中的相似性(标签) getitem 函数。另一方面,在第一种方法中,您需要在 getitem 函数中每次(在对图像应用变换之后)确定相似性(标签),这是多余的、不必要的和耗时的。

希望这会有所帮助。

听起来你的目标是从训练中完全删除不相关的图像。

处理这个问题的最好方法是预先找出所有相关图像的文件名,并将它们的文件名保存到 csv 或其他文件中。然后只将好的文件名传递给您的数据集。

原因是您将在训练期间多次 运行 遍历您的数据集。这意味着您将一遍又一遍地加载、分析和丢弃不相关的图像,这是一种计算浪费。

这种 preprocessing/filtering 最好提前做一次。